~/f/rstudio/RPMS.2017 ~/f/rstudio
~/f/rstudio
RPMS.2017/rstudio-1.4.1106-0.0.x86_64.rpm RPMS/rstudio-1.4.1106-0.0.x86_64.rpm differ: byte 225, line 1
Comparing rstudio-1.4.1106-0.0.x86_64.rpm to rstudio-1.4.1106-0.0.x86_64.rpm
comparing the rpm tags of rstudio
--- old-rpm-tags
+++ new-rpm-tags
@@ -1539,7 +1539,7 @@
 /usr/libexec/rstudio/www/js/inert-polyfill.min.js 132777e166d15884b14a891aacd314e6311f8993539e8eabf33adb57f0851eb1 0
 /usr/libexec/rstudio/www/js/panmirror  0
 /usr/libexec/rstudio/www/js/panmirror/panmirror.js 6f7eb23c966fb8636f54d78d226a365e8002e09db2ad45f4138762695e34910c 0
-/usr/libexec/rstudio/www/js/panmirror/panmirror_quantum.js.map 18e25f7358156a7d2cc512334db730b8c390d5220a164111758037e141a4e008 0
+/usr/libexec/rstudio/www/js/panmirror/panmirror_quantum.js.map a1453b1cda74f8b3cbe47babbb4c7e7a02369bf0c4ab27f98d5d5e7529196c0a 0
 /usr/libexec/rstudio/www/js/panmirror/prosemirror-dev-tools.min.js 9824b68839f97d36106f1149625e3267deee661ba469f556f6378e8686f031b9 0
 /usr/libexec/rstudio/www/js/text.min.js c4a439dde03ebbabb987cb548737f63b091c31beefb5ba9fdca7ebcbc6bfb72f 0
 /usr/libexec/rstudio/www/js/workers  0
comparing rpmtags
comparing RELEASE
comparing PROVIDES
comparing scripts
comparing filelist
comparing file checksum
creating rename script
RPM file checksum differs.
Extracting packages
/usr/libexec/rstudio/www/js/panmirror/panmirror_quantum.js.map differs (UTF-8 Unicode text, with very long lines, with no line terminators)
--- old//usr/libexec/rstudio/www/js/panmirror/panmirror_quantum.js.map	2021-04-06 00:00:00.000000000 +0000
+++ new//usr/libexec/rstudio/www/js/panmirror/panmirror_quantum.js.map	2021-04-06 00:00:00.000000000 +0000
@@ -1 +1 @@
-{"version":3,"sources":["src/polyfill/index.ts","src/polyfill/isconnected.ts","src/index.ts","src/polyfill/custom-event.ts","src/editor/editor.ts","src/api/cite.ts","src/api/doi.ts","src/api/ui-dialogs.ts","src/api/pandoc_attr.ts","src/api/extension.ts","src/api/pandoc_capabilities.ts","src/api/pandoc.ts","src/api/quote.ts","src/api/math.ts","src/api/code.ts","src/api/node.ts","src/api/link.ts","src/api/html.ts","src/api/events.ts","src/api/event-types.ts","src/api/pandoc_format.ts","src/api/yaml.ts","src/api/format.ts","src/api/object.ts","src/api/log.ts","src/api/basekeys.ts","src/api/selection.ts","src/api/transaction.ts","src/api/slice.ts","src/api/platform.ts","src/api/outline.ts","src/api/rmd.ts","src/api/mark.ts","src/api/text.ts","src/api/list.ts","src/api/command.ts","src/api/location.ts","src/api/ui.ts","src/api/util.ts","src/api/dom.ts","src/api/scroll.ts","src/api/navigation.ts","src/api/xref.ts","src/api/pandoc_id.ts","src/api/raw.ts","src/api/image.ts","src/api/fixup.ts","src/api/css.ts","src/api/change.ts","src/api/input_rule.ts","src/api/wrap.ts","src/nodes/yaml_metadata/yaml_metadata-title.ts","src/behaviors/outline.ts","src/behaviors/find.ts","src/behaviors/omni_insert/omni_insert.ts","src/api/completion.ts","src/behaviors/omni_insert/omni_insert-completion.tsx","src/api/omni_insert.ts","src/api/placeholder.ts","src/behaviors/completion/completion.ts","src/behaviors/completion/completion-popup.tsx","src/api/widgets/popup.tsx","src/api/promise.ts","src/behaviors/spelling/spelling-interactive.ts","src/behaviors/spelling/spelling.ts","src/api/spelling.ts","src/behaviors/spelling/spelling-realtime.ts","src/pandoc/pandoc_converter.ts","src/api/pandoc_capsule.ts","src/api/base64.ts","src/pandoc/pandoc_to_prosemirror.ts","src/pandoc/pandoc_from_prosemirror.ts","src/api/fragment.ts","src/editor/editor-extensions.ts","src/nodes/text.ts","src/nodes/paragraph.ts","src/api/paragraph.ts","src/nodes/heading.ts","src/nodes/blockquote.ts","src/nodes/code_block.ts","src/nodes/list/list.ts","src/nodes/list/list-commands.ts","src/nodes/list/list-checked.ts","src/nodes/list/list-pandoc.ts","src/nodes/image/image.ts","src/nodes/image/image-dialog.ts","src/nodes/image/image-util.ts","src/nodes/image/image-textsel.ts","src/nodes/image/figure.ts","src/api/decoration.ts","src/nodes/image/image-view.ts","src/nodes/image/image-resize.ts","src/api/widgets/widgets.ts","src/nodes/image/figure-keys.ts","src/nodes/image/image-events.ts","src/nodes/hr.ts","src/nodes/hard_break.ts","src/nodes/null.ts","src/marks/em.ts","src/marks/strong.ts","src/marks/code.ts","src/marks/link/link.ts","src/marks/link/link-command.ts","src/marks/link/link-auto.ts","src/api/clipboard.ts","src/marks/link/link-headings.ts","src/marks/link/link-popup.tsx","src/api/widgets/tooltip.ts","src/api/widgets/button.tsx","src/api/text-popup.ts","src/api/widgets/react.ts","src/api/widgets/decoration.ts","src/behaviors/select_all.ts","src/behaviors/history.ts","src/behaviors/cursor.ts","src/behaviors/clear_formatting.ts","src/behaviors/smarty.ts","src/behaviors/attr_duplicate_id.ts","src/behaviors/trailing_p.ts","src/behaviors/empty_mark.ts","src/behaviors/escape_mark.ts","src/behaviors/code_block_input.ts","src/behaviors/paste_text.ts","src/behaviors/bottom_padding.ts","src/behaviors/insert_symbol/insert_symbol-plugin-symbol.tsx","src/api/unicode.ts","src/behaviors/insert_symbol/insert_symbol-plugin.tsx","src/behaviors/insert_symbol/insert_symbol-popup.tsx","src/api/focus.ts","src/api/widgets/select.tsx","src/api/widgets/text.tsx","src/behaviors/insert_symbol/insert_symbol-grid.tsx","src/behaviors/insert_symbol/insert_symbol-grid-cell.tsx","src/behaviors/insert_symbol/insert_symbol-grid-preview.tsx","src/behaviors/insert_symbol/symbols.ts","src/behaviors/insert_symbol/insert_symbol-plugin-emoji.tsx","src/api/emoji.ts","src/api/emojis-all.ts","src/marks/emoji/emoji.ts","src/marks/emoji/emoji-completion.tsx","src/behaviors/insert_symbol/insert_symbol-emoji-skintone.tsx","src/behaviors/insert_symbol/insert_special_characters.ts","src/behaviors/nbsp.ts","src/behaviors/remove_section.ts","src/marks/strikeout.ts","src/marks/superscript.ts","src/marks/subscript.ts","src/marks/smallcaps.ts","src/marks/underline.ts","src/marks/raw_inline/raw_inline.ts","src/marks/raw_inline/raw_tex.ts","src/api/mark-highlight.ts","src/api/tex.ts","src/marks/raw_inline/raw_html.ts","src/marks/math/math.ts","src/marks/math/math-commands.ts","src/marks/math/math-transaction.ts","src/marks/math/math-highlight.ts","src/marks/math/math-popup.ts","src/marks/math/math-view.ts","src/marks/cite/cite.ts","src/api/bibliography/bibliography.ts","src/api/bibliography/bibliography-provider_local.ts","src/api/path.ts","src/api/bibliography/bibDB.ts","src/api/csl.ts","src/api/crossref.ts","src/api/csl-text.ts","src/api/bibtex/bibtex.ts","src/api/bibtex/fields.ts","src/api/bibtex/language.ts","src/api/bibtex/types.ts","src/api/bibtex/formatting.ts","src/api/bibtex/characters.ts","src/api/bibliography/bibliography-provider_zotero.ts","src/api/zotero.ts","src/marks/cite/cite-completion.tsx","src/api/widgets/completion.tsx","src/marks/cite/cite-bibliography_entry.ts","src/marks/cite/cite-highlight.ts","src/marks/cite/cite-completion_doi.tsx","src/api/widgets/completion-detailed.tsx","src/marks/cite/cite-doi.ts","src/marks/cite/cite-popup.tsx","src/marks/cite/cite-commands.ts","src/behaviors/insert_citation/insert_citation.tsx","src/api/widgets/tag-input.tsx","src/api/widgets/navigation-tree.tsx","src/api/widgets/dialog-buttons.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel.ts","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-bibliography.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-typeahead-search.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list-item.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-doi.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-latent-search.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list-item-detailed.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-crossref.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-pubmed.tsx","src/api/pubmed.ts","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-datacite.tsx","src/api/datacite.ts","src/behaviors/insert_citation/insert_citation-bibliography-picker.tsx","src/api/widgets/checkbox-input.tsx","src/marks/span.ts","src/marks/xref/xref.ts","src/marks/xref/xref-completion.tsx","src/marks/xref/xref-popup.tsx","src/marks/raw_inline/raw_html_comment.ts","src/marks/shortcode.ts","src/nodes/footnote/footnote.ts","src/api/shortcode.ts","src/nodes/footnote/footnote-editor.ts","src/nodes/footnote/footnote-transaction.ts","src/nodes/raw_block.ts","src/nodes/yaml_metadata/yaml_metadata.ts","src/nodes/yaml_metadata/yaml_metadata-capsule.ts","src/nodes/rmd_chunk/rmd_chunk.ts","src/nodes/rmd_chunk/rmd_chunk-image.ts","src/nodes/rmd_chunk/rmd_chunk-capsule.ts","src/nodes/div.ts","src/nodes/line_block.ts","src/nodes/table/table.ts","src/nodes/table/table-commands.ts","src/nodes/table/table-nodes.ts","src/nodes/table/table-pandoc.ts","src/nodes/table/table-columns.ts","src/nodes/table/table-capsule.ts","src/nodes/table/table-contextmenu.ts","src/nodes/table/table-paste.ts","src/nodes/definition_list/definition_list.ts","src/nodes/definition_list/definition_list-commands.ts","src/nodes/definition_list/definition_list-insert.ts","src/nodes/definition_list/definition-list-keys.ts","src/nodes/definition_list/definition_list-inputrule.ts","src/api/position.ts","src/nodes/definition_list/definition_list-pandoc.ts","src/nodes/shortcode_block.ts","src/nodes/html_preserve.ts","src/optional/ace/ace.ts","src/api/cursor.ts","src/optional/ace/ace-render-queue.ts","src/optional/ace/ace-placeholder.ts","src/optional/ace/ace-node-views.ts","src/behaviors/attr_edit/attr_edit.ts","src/behaviors/attr_edit/attr_edit-command.ts","src/behaviors/attr_edit/attr_edit-decoration.tsx","src/editor/editor-theme.ts","src/editor/editor-images.ts","src/editor/editor-menus.ts","src/api/table.ts","src/editor/editor-schema.ts"],"names":["_f9dd","f","r","id","cached","m","exports","Object","isFrozen","input","default","module","editor_1","Editor","UITools","mod","__esModule","value","custom_event_1","__importDefault","isconnected_1","t","_","label","ops","push","op","pop","trys","body","call","thisArg","e","y","done","__spreadArrays","this","s","i","il","arguments","length","Array","k","a","j","jl","defineProperty","prosemirror_inputrules_1","prosemirror_keymap_1","prosemirror_model_1","prosemirror_state_1","prosemirror_view_1","prosemirror_utils_1","cite_1","ui_dialogs_1","find_1","completion_1","spelling_interactive_1","spelling_realtime_1","pandoc_converter_1","EditorCommands","command_1","EditorCommandId","attr","propsToInput","attrPropsToInput","inputToProps","attrInputToProps","pandocAutoIdentifier","text","pandoc_id_1","image","validUnits","percentUnit","css_1","kPercentUnit","unitToPixels","image_1","pixelsToUnit","roundUnit","format","parseFormatConfig","pandoc_format_1","pandocFormatConfigFromCode","citation","citeUI","PluginKey","parent","context","options","pandocFormat","pandocCapabilities","_this","maxContentWidth","events","events_1","DOMEditorEvents","keybindings","initExtensions","editorSchema","extensions","EditorState","create","initialDoc","attributes","dispatchTransaction","bind","EditorDOMParser","schema","view","dom","add","editor_theme_1","defaultTheme","PandocConverter","server","pandoc","setAttribute","addEventListener","event_types_1","ScrollEvent","pandocFmt","editor","_a","spellCheck","codeEditor","rmdImagePreview","hideFormatComment","className","codeChunks","bookdownXRef","bookdownPart","blogdownMathInCode","rmdExtensions","hugoExtensions","__assign","shortcodes","docTypes","ui","images","defaultImages","omni_insert","sent","resolve","event","handler","subscribe","eventName","title","setTitle","state","setMarkdown","markdown","emitUpdate","Promise","doc","line_wrapping","unrecognized","unparsed_meta","loc","tr_1","i_1","getMarkdownTr","canonical","location","pandocConverter","toProsemirror","result","isInitialDoc","plugins","updateState","getEditingLocation","pos","nodeSize","dispatch","applyFixups","fixup_1","FixupContext","Load","emitEvent","StateChangeEvent","tr","getMarkdownCode","prototype","attrs","initial","getMarkdown","__generator","code","outline_1","getEditingOutlineLocation","getHTML","getTitle","getSelection","navigation_id","navigationIdForSelection","setEditingLocation","outlineLocation","previousLocation","getOutline","getFindReplace","selectCurrent","selectFirst","selectNext","selectPrevious","replace","getSpellingDoc","pandocMarks","spelling","spellingInvalidateAllWords","invalidateAllWords","spellingInvalidateWord","word","invalidateWord","extensionFixups","getSelectedText","replaceSelection","marks","selection","$from","replaceSelectionWith","trSetSel","setSelection","sel","getYamlFrontMatter","nodes","yaml_metadata","yaml_1","yamlFrontMatter","applyYamlFrontMatter","yaml","focus","blur","insertChunk","chunkPlaceholder","rowOffset","colOffset","navigate","type","recordCurrent","animate","NavigateEvent","nav","resize","applyFixupsOnResize","ResizeEvent","initFn","getMenus","commands","commandKeys","map","command","keymap","isActive","isEnabled","plural","execute","keepFocus","applyTheme","theme","classList","toggle","darkMode","setMaxContentWidth","maxWidth","minPadding","minContentPadding","syncContentWidth","setKeybindings","keyBindings","reconfigure","createPlugins","getEditorFormat","getPandocFormat","getPandocFormatConfig","isRmd","pandocFormatConfigFromDoc","lastTrSelectionOnly","selectionSet","docChanged","apply","storedMarksSet","getMeta","transaction_1","kFixupTransaction","UpdateEvent","outline_2","previousOutline","OutlineChangeEvent","DispatchEvent","eventType","detail","emit","editor_extensions_1","pandocExtensions","navigation","registerCompletionExtension","register","omni_insert_1","omniInsertExtension","omniInserters","markFilter","registerRealtimeSpelling","registerPlugins","realtimeSpellingPlugin","baseKeysPlugin","baseKeys","appendTransactionsPlugin","appendTransactions","hooks","Plugin","inputRulesPlugin","input_rule_1","markInputRuleFilter","plugin","inputRules","rules","handleTextInput","props","from","to","domEventsPlugin","key","handleDOMEvents","FocusEvent","keydown","prefs","tabKeyMoveFocus","pluginKeys","forEach","keys","ctrlKeyCodes","keyCombo","match","keyCode","toUpperCase","prosemirrorKeydownHandler","keydownHandler","keybindingsPlugin","keyEvent","ctrlKey","keyCommand","defaultKeys","clientWidth","applyPadding","LayoutEvent","fixups","fixup","nodeFromJSON","content","__awaiter","fromProsemirror","outlineNode","reverse","find","node","_super","DOMParser","fromSchema","parse","parseSlice","preserveWhitespace","kInvalidCiteKeyChars","createUniqueCiteId","existingIds","baseId","charCodeAt","char","asciiOnlyBaseId","includes","proposedId","count","safeBaseId","String","fromCharCode","suggestCiteId","csl","citeIdLeading","author","family","literal","shortTitle","substr","Math","min","issued","yearIssued","datePart","formatForPreview","pairs","name","undefined","dateParts","formatIssuedDate","containerTitle","volume","page","cslAny","charAt","slice","URL","DOI","doi_1","urlForDOI","formatAuthors","authors","maxLength","_b","_c","_d","previous","endsWith","index","current","substring","array","addAuthorOrEtAl","previousAuthorStr","newAuthorStr","authorStr","etAlStr","lastSpace","lastIndexOf","etAl","date","singleDatePart","citeProps","suggestedId","previewFields","kCrossrefMatches","findDOI","token","regex","hasDOI","doi","asPandocClass","clz","asHtmlId","startsWith","asHtmlClass","kAlertTypeInfo","kAlertTypeWarning","keyvalue","classes","split","style","pandoc_attr_1","pandocAttrKeyvalueFromText","kv","join","kPandocAttrId","kPandocAttrClasses","kPandocAttrKeyvalue","separator","convertedText","inQuotes","ch","trim","line","parts","kWidthAttrib","kHeightAttrib","kStyleAttrib","kCodeBlockText","kSpanAttr","kSpanChildren","pandocAttrSpec","pandocAttrFrom","pandocAttr","pandocAttrInSpec","spec","tok","c","pandocAttrToDomAttr","marker","domAttr","el","forceAttrs","excludedNames","includedNames","hasAttribute","getAttribute","filter","val","resolveCurrent","remainder","partitioned","partition","base","extension_1","extensionIfEnabled","extension","kPandocAttrExtensions","extensionEnabled","getPandocCapabilities","getCapabilities","version","api_version","output_formats","pandoc_1","parsePandocListOutput","highlight_languages","PandocTokenType","quote_1","math_1","code_1","link_1","tokens","hasOwnProperty","isArray","mapValue","mapToken","mappedTok","tokenHasChildren","imageAttributesAvailable","link_attributes","raw_html","output","entry","kRawBlockFormat","stringifyTokens","unemoji","elem","Str","Space","SoftBreak","LineBreak","kLinkChildren","Span","Quoted","kQuoteType","stringifyMath","Code","kCodeText","forEachToken","mapTokens","tokenTextEscaped","marksByPriority","markWriters","aPriority","priority","QuoteType","DoubleQuote","quotesForType","kSingleQuotes","SingleQuote","kSingleQuoteRegEx","RegExp","begin","end","kDoubleQuotes","fancyQuotesToSimple","Inline","MathType","typeset","math","isConnected","then","timerId_1","setInterval","clearInterval","kMathType","clipboardTextParser","$context","_i","codeViews","codeViewType","codeView","createFromPastePattern","test","textNode","codeNode","nodeType","createAndFill","Slice","Fragment","n","p","canInsertNode","canInsertNodeAtPos","asSelection","$pos","d","depth","canReplaceWith","findTopLevelBodyNodes","predicate","findNodeOfTypeInSelection","foundNode","lastNode","last","nodeIsActive","findSelectedNodeOfType","findParentNode","kLinkTarget","LinkType","ids","headings","findChildren","findChildrenByType","heading","level","textContent","escapeHTMLAttribute","div","appendChild","innerHTML","kHTMLCommentRegEx","isHTMLComment","html","noEmptyAttribs","tag","attribs","selfClosing","DOMSerializer","serializeNode","generateHTML","matchPandocFormatComment","pandocFormatConfigFromYamlInCode","firstYamlBlock","object_1","findValue","yamlMarkdownOptions","yamlFormatConfig","readPandocFormatConfig","mdExtensions","formatConfig","pandocFormatConfigFromCommentInCode","keyValueRegEx","field","fields","keyValueMatch","variables_1","source","obj","toString","mode","asString","rmd_extensions","doctype","str","references","references_location","references_prefix","prefix","toLowerCase","asBoolean","parseExtensions","re","enabled","exec","splitPandocFormatString","optionsPos","indexOf","commonmarkExtensions","rawHTML","format_1","kHugoDocType","kMarkdownGithubFormat","kGfmFormat","kCommonmarkFormat","kCommonmarkXFormat","yamlMetadataNodes","pandocFormatConfigFromYamlInDoc","foundFirstRawInline","config","pandocFormatConfigFromCommentInDoc","warnings","baseName","formatOptions","variant","validOptionNames","fullName","includeTexMathDollars","invalidFormat","invalidOptions","pandocMode","kMarkdownMmdFormat","kMarkdownStrictFormat","kMarkdownVariants","listExtensions","option","pandocFormatWith","hasFencedCodeBlocks","backtick_code_blocks","fenced_code_blocks","isYamlMetadataNode","kYamlMetadataTitleRegex","firstYaml","firstYamlNode","yamlText","updatedYaml","replaceRangeWith","updatedYamlNode","insert","titleFromYamlMetadataNode","titleMatch","yamlMetadataNameValueRegex","valueMatch","parseYaml","kFirstYamlBlockRegex","yamlCode","js_yaml_1","safeLoad","onWarning","log_1","logException","stripYamlDelimeters","yamlParsed","safeDump","object","some","ignoreKey","homeKey","editingNode","head","coordsAtPos","beginDocPos","isOnPreviousLine","setTextSelection","endKey","node_1","editingRootNode","start","endDocPos","top","bottom","arrowBodyNodeBoundary","dir","endOfTextblock","selection_1","selectionIsBodyTopLevel","side","$head","nextRootNode","editingRootNodeClosestToPos","nextPos","currentRootNode","BaseKey","Enter","prosemirror_commands_1","splitBlock","liftEmptyBlock","createParagraphNear","Backspace","selectNodeBackward","joinBackward","deleteSelection","Tab","ShiftTab","Delete","selectNodeForward","joinForward","platform_1","kPlatformMac","Home","End","ArrowLeft","ArrowUp","ArrowDown","ModArrowDown","endTopLevelBodyNodeBoundary","undoInputRule","x","commandMap","baseKey","unshift","values","_e","isTextblock","cursorOffset","parentOffset","nodeText","prosemirror_gapcursor_1","selectionIsWithinRange","range","anchor","nodeWithPos","selectionHasRange","parentNode","GapCursor","NodeSelection","selectionIsEmptyParagraph","slice_1","kPasteTransaction","kSetMarkdownTransaction","kNavigationTransaction","kInsertSymbolTransaction","kInsertCompletionTransaction","MarkTransaction","addMark","mark","removeStoredMark","insertText","transactionsDocChanged","transactions","transaction","transactionsChangeSet","oldState","newState","transactions_1","changeSet","addSteps","mapping","maps","complete","oldSize","old","childCount","curSize","cur","outer","scan","offset","child","sameMarkup","nodesBetween","size","step","sliceContentLength","handlers","handlers_1","nodeAt","nodeFilter","haveChange","changes","change","fromA","toA","checkForChange","append","_loop_1","handlers_2","trTransform","prosemirror_transform_1","Transform","transactionsAreTypingChange","hasNode","descendants","navigator","platform","outlineNodes","bodyNodes","bodyNode","bullet_list","ordered_list","list_item","listItemNode","rmd_chunk","rmdChunkNode","isOutlineNode","kYamlMetadataOutlineItemType","itemsWithPos","getDocumentOutline","item","active","position","kRmdchunkOutlineItemType","chunk","rmd_1","rmdChunkEngineAndLabel","kHeadingOutlineItemType","foundActive","items","getOutlineNodes","findParentNodeOfType","table","activeRmdChunk","rmdNode","rmdChunk","previousRmdChunks","chunks","rmdChunkNodes_1","lines","trimLeft","meta","matchLang","lang","idx","canInsertRmdChunk","insertRmdChunk","toggleBlockType","paragraph","list_1","precedingListItemInsertPos","offsetChars","reduce","rmdText","util_1","uuidv4","prevListItemPos","precedingListItemInsert","selPos","activeChunk","localeCompare","sensitivity","kEvalFalseRegEx","haveTableCellsWithInlineRcode","table_cell","table_header","cell","rangeHasMark","markedNode","markedRange","mark_1","getMarkRange","textBetween","text_1","link","startIndex","startPos","endIndex","isInSet","endPos","markIsActive","empty","storedMarks","markItem","markType","findChildrenByMark","removeMark","validLength","nd","markRange","detectAndApplyMarks","mergedTextNodes","_node","_pos","allowsMarkType","refText","lastIndex","textNodes","nodeIndex","isText","str1","str2","ListType","extendStatics","__extends","b","setPrototypeOf","__proto__","__","constructor","assign","prosemirror_schema_list_1","ui_1","ProsemirrorCommand","omniInsert","MarkCommand","toggleMarkType","NodeCommand","BlockCommand","blockType","toggleType","WrapCommand","wrapType","toggleWrap","scrollIntoView","InsertCharacterCommand","codeRange","defaultToggleMark","pandocAttrAvailable","wrapIn","listType","itemType","blockRange","$to","parentList","isList","validContent","setNodeMarkup","tight","listSpacing","kListSpacingTight","exitNode","sameParent","$anchor","allowKey","endCaptionPos","above","after","abs","dom_1","outlineItemSimillarToNode","outlineItem","docOutlneNode","nodeA","nodeB","scrollTop","docOutlineLocationNode","documentOutline","docOutlineNode","locationIsBetweenDocOutlineNodes","restoreSelection","scroll_1","scrollToPos","cs","getComputedStyle","asNumber","parseFloat","paddingX","paddingLeft","paddingRight","paddingY","paddingTop","paddingBottom","borderY","borderTopWidth","borderBottomWidth","width","offsetWidth","borderX","height","offsetHeight","onElementRemoved","container","onRemoved","mutationsList","mutation","removedNodes","center","parentDiv","findParentNodeOfTypeClosestToPos","resultPos","before","resultNode","nodeDOM","scroller","zenscroll_1","createScroller","containerEl","duration","onDone","intoView","HTMLElement","editingRoot","xref_1","navigateToId","navigateToHref","href","navigateToXRef","xref","xrefPosition","xrefPos","prevPos","max","dest","parentElement","navigateToPos","NavigationType","navigateTo","Pos","Id","Href","navigateToHeading","XRef","raw_1","xrefKey","suffix","colonPos","xrefTypeAndId","xrefInfo","id_1","locator_1","xrefPositionLocators","markType_1","hasXRef","h2","headingLocator","h3","h4","h5","h6","fig","nodeTypes","rmdChunkHasXRef","tab","kTexFormat","cnj","thereomLocator","def","engine","pattern","pandocAsciify","newch","chars","len","asciify","gfmAutoIdentifier","editRawBlockCommand","raw_block","setBlockType","action","rawBlock","raw","prevSel","createRawNode","asyncEditRawBlock","containerWidth","kPixelUnit","ImageType","isValidImageSizeUnit","unit","kValidUnits","imageSizePropWithUnit","prop","isNaturalAspectRatio","dims","defaultValue","naturalWidth","naturalHeight","pixels","round","attrib","_match","p1","p2","removeStyleAttrib","extractSizeStyles","keyvalues","newKeyvalues","getValue","pair","_attrib","setProperty","replaceClassWithStyle","contains","remove","removeAttribute","children_1","children","EditorChangeType","diff_match_patch_1","diffChars","timeout","dmp","diff_match_patch","Diff_Timeout","diff_main","diff","DIFF_INSERT","Insert","DIFF_EQUAL","DIFF_DELETE","regexp","getAttrs","InputRule","Function","textStart","delete","markInputRule","delimiterMarkInputRule","prefixMask","delim","contentPattern","textEnd","maskOffset","noInputRules","marksWithNoInputRules","marksInRange_1","maskedMarkTypes","maskedMarkTypes_1","conditionalWrappingInputRule","wrappingRule","wrappingInputRule","joinPredicate","wrapSentencesTransform","sentence","hardBreak","hardBreakPos","wrapSentences","titleFromState","yamlNodes_2","yamlMetadataTitlePlugin","init","_config","foundTitle","titleLine","yamlNode","hasOutlineIdsTransaction","Set","usedIds","outlineId","setMeta","GoToPreviousSection","goToSectionCommand","editorOutline","transactionsHaveChange","transactionsAffectOutline","outline","target","navigation_1","sequence","Map","rootOutlineItem","defaultLevel","typename","sequenceLast","getState","FindPlugin","instance","DecorationSet","updating","update","prevState","clearResultObserver","isResultSelected","term","resultElement","resultObserver","resultObserverTimer","updateResults","decorations","selectResult","afterSelection","matchesTerm","selectedText","wrap","searchTo","decorationSet","withResultUpdates","searchFrom","nextDecoration","lastDecoration","tr_3","decoration","tr_4","selectionMarks","marksAcross","replaceAll","replaced","hasTerm","tr_5","clear","kAddToHistoryTransaction","resultDecorations","search","findRegEx","Decoration","inline","class","TextSelection","watchForSelectedResult","MutationObserver","records","observer","ele","isResultNode","scrollToSelectedResult","observe","childList","window","setTimeout","disconnect","clearTimeout","querySelector","scrollElement","nextParent","offsetParent","caseSensitive","findPlugin","inclusive","parseDOM","toDOM","readers","writer","writeInlines","OmniInsertCommand","inputRuleFilter","completionHandlers","omni_insert_completion_1","omniInsertCompletionHandler","OmniInsert","selectionAllowsCompletions","kCompletionDefaultMaxVisible","prevHandler","scope","Node","replacement","omniInsertCompletions","inserter","keywords","keyword","sort","thenby_1","firstBy","omniInsertGroupCompare","thenBy","omniInsertPriorityCompare","direction","completion","deleteRange","selectionOffset","removeCommandText","component","OmniInserterView","kOmniInsertRegex","isOmniInsertCommandActive","query","placeholder_1","placeholderDecoration","translateText","completions","OmniInsertGroup","placeholder","pluginKey","set","emptyNode","textBefore","completionTextBeforeCursor","prevToken","isPaste","scrollUnsubscribe","removeEventListener","clearCompletions","pluginState","handled","horizontal","completionsActive","kbEvent","insertCompletion","selectedIndex","renderCompletions","forwardKey","completionPageSize","preventDefault","stopPropagation","promise_1","PromiseQueue","resetSelection","setAllCompletions","updatedCompletions","requestVersion_1","setDisplayedCompletions","displayedCompletions","updateCompletions","completionStream_1","stream","filteredCompletions","allCompletions","requestAllCompletions_1","hideNoResults","completionPopup","completion_popup_1","createCompletionPopup","renderCompletionPopup","performCompletionReplacement","CompletionPlugin","__importStar","document","createElement","zIndex","popup","completionPopupSize","positionStyles","selectionCoords","left","innerHeight","innerWidth","cursorCoords","completionPopupPositionStyles","applyStyles","render","react_1","CompletionPopup","destroyCompletionPopup","unmountComponentAtNode","concat","popup_1","Popup","CompletionList","kCompletionDefaultItemHeight","useRef","containerRef","scrollToRow","getElementsByClassName","ref","completionCount","header","completionHeader","headerProps","message","lineHeight","colSpan","completionsHeader","itemHeight","kNoResultsHeight","noResults","completionsNoResults","verticalCompletions","itemEventHandler","completionItemCell","onClick","onMouseMove","onHover","cellWidths","maxVisible","kCompletionDefaultWidth","headerHeight","horizontalCellWidths","total","contentEditable","queue","catch","err","running","reject","dequeue","spelling_1","excludedMarks","onCheckBegin","getWords","excluded","spellingDocPlugin","createAnchor","getText","wordRange","fromCoords","toCoords","spellingDocKey","get","SpellingDocPlugin","checking","anchors","setPosition","getPosition","SpellingAnchor","onCheckEnd","excludeWord","classifier","findBeginWord","findEndWord","beginPos","classifyCharacter","currentPos","advanceToWord","endWordPos","wordText","words","breakWords","hasNext","next","shift","spellcheckerWord","kCharClassWord","kCharClassBoundary","kCharClassNonWord","spelling_2","hasFocus","realtimeEnabled","hasBeenFocused","word_1","wordDecos","decos","prosemirror_changeset_1","ChangeSet","steps","AddMarkStep","RemoveMarkStep","markStep","markRanges","removeRanges_1","fromPos","toPos","fromB","toB","spellingDecorations","cursor","cursorDecos","realtimeSpellingKey","contextmenu","spellingSuggestionContextMenuHandler","focusUnsubscribe","updateSpelling","excludeCursor","checkWord","wordCheck","menuItems","clientX","clientY","schema_1","deco","from_1","to_1","word_2","suggestionList","suggestion","pandocPreprocessors","pandocPostprocessors","pandocTokensFilters","pandocBlockReaders","pandocInlineHTMLReaders","original","autoIds","gfm_auto_identifiers","adjustedFormat","preprocessor","blockCapsuleFilters","pandoc_capsule_1","pandocMarkdownWithBlockCapsules","pandoc_to_prosemirror_1","pandocToProsemirror","ast","tokensFilters","blockReaders","inlineHTMLReaders","postprocessor","pandocOptions","referenceLocation","disabledTableTypes","disabledFormatOptions","atxHeaders","dpi","column","parseInt","wrapOptions","astToMarkdown","ext","newFormat","kBlockCapsuleSentinel","handleText","encodedBlockCapsuleRegex","flags","envelopeLen","base64_1","base64Decode","record","fieldValue","blockCapsuleSourceWithoutPrefix","capsuleFilter","p3","p4","originalPos","positions","discard","extract","defaultExtractor","capsule","base64Encode","enclose","encodedRecord","decodeBlockCapsuleText","filters","blockCapsuleTextHandler","textFilter","stripPrefix","CodeBlock","RawBlock","parsePandocBlockCapsule","blockCapsuleParagraphTokenHandler","tokenRegex","Para","codeUnits","Uint16Array","Uint8Array","buffer","bytes","binary","Parser","createHandlers","ParserState","parser","closeNode","addNode","openMark","closeMark","writeText","hasInlineHTMLWriter","writeTokens","logUnrecognized","isNodeOpen","Null","blocks","prevTok","lineBreaks","columnBreaks","sentenceBreaks","targetAst","heading_ids","hasShortcutHeadingLinks","equalsIgnoreCase","autoIdentifier","ascii_identifiers","headingIds","has","toLocaleLowerCase","Link","astBlocks","Header","pandocAttrReadAST","heading_1","kHeadingAttr","kHeadingLevel","kHeadingChildren","resolveHeadingIds","lineWrapping","targetTokens","writeToken","blockCapsule","writeNode","reader","getChildren","this_1","block","blockReaders_1","blockReader","nodeType_2","openNode","Error","code_block","kCodeBlockAttr","readers_1","stack","Mark","none","unrecognizedTokens","merged","info","isInline","addToSet","removeFromSet","openNoteNode","note","maybeMerge","sameSet","pandocFromProsemirror","apiVersion","nodeWriters","notesNode","PandocWriter","writeNodes","notes","initEscapeCharacters","write","writeSpaces","spaceAfter","output_1","spaceBefore","outputText","trimRight","writeArray","writeAttr","preventEscapeCharacters","flushTextRun","textRun_1","smart","manualEscapeCharacters","writeNote","Note","noteBody","fragment","currentChild","childIndex","markedNodes","nextNode","activeMarks","md","fragment_1","fragmentText","escapeSymbols","escaped","escapeCharacters","RawInline","withOption","fill","tex_math_single_backslash","allEscapeCharacters","emjojiMark","emoji","emojihint","paragraph_1","blockquote_1","code_block_1","figure_1","hr_1","hard_break_1","null_1","em_1","strong_1","history_1","select_all_1","cursor_1","clear_formatting_1","smarty_1","attr_duplicate_id_1","trailing_p_1","empty_mark_1","escape_mark_1","code_block_input_1","manager","ExtensionManager","paste_text_1","bottom_padding_1","insert_symbol_plugin_symbol_1","insert_special_characters_1","nbsp_1","remove_section_1","footnote_1","yaml_metadata_1","rmd_chunk_1","table_1","definition_list_1","raw_block_1","shortcode_block_1","html_preserve_1","superscript_1","code_2","codeViewClipboardPlugin","tokensFilter","inlineHTMLReader","blockCapsuleFilter","pandocReaders","collectFrom","pandocMarkWriters","pandocNodeWriters","pandocNodes","code_view","views","attrEditors","collect","appendMarkTransactions","appendMarkTransaction","collector","visitor","results","flatMap","quote","group","Plain","insertParagraph","HeadingCommand","headingCommandFn","heading1OmniInsert","heading1","heading1_dark","heading2OmniInsert","headingOmniInsert","heading2","heading2_dark","heading3","heading4OmniInsert","heading4","heading4_dark","headingName","pandocAttrSupported","pandocAttrParseDom","header_attributes","mmd_header_identifiers","headingAttrs","headingAttr","data-link","partMatch","cut","writeBookdownH1","Heading1","Heading5","Heading6","textblockTypeInputRule","kHeadingLevels","pandocAttrParseText","emptyHeadingPlaceholderPlugin","CodeBlockFormat","codeBlockFormatCommandFn","languages","code_block_dark","fenced_code_attributes","potentialLang","codeBlockProps","dialogs","editCodeBlock","applyProps","newProps","propsWithLangClass","codeBlock","tags","right","editFn","codeNodeSpec","hasAttr","codeBlockLang","attrEditFn","codeBlockAttrEdit","CodeBlockFormatCommand","exitCode","ListNumberStyle","listAttrEdit","capabilities","list_commands_1","editListPropertiesCommandFn","task_lists","fancy_lists","startnum","tasks","checked","list_pandoc_1","readPandocList","number_delim","ListNumberDelim","DefaultDelim","order","number_style","typeToNumberStyle","numberDelim","fancy","DefaultStyle","Decimal","UpperAlpha","LowerRoman","UpperRoman","Example","OrderedList","writePandocOrderedList","nodeViews","ListCommand","BulletList","bulletListOmniInsert","orderedListOmniInsert","ListItemSink","sinkListItem","ListItemLift","liftListItem","ListItemSplit","splitListItem","list_checked_1","CheckedListItemCommand","CheckedListItemToggleCommand","basekeys_1","isNotInHeading","tightFn","listItemType","autoJoin","toggleList","TightListCommand","CheckedListItemNodeView","getPos","disabled","editable","ev","contentDOM","checkedListItemCommandFn","itemNode","setItemChecked","checkedListItemToggleCommandFn","check","baseInputRule","fragmentWithCheck","raw_inline","mappedTokens","lastWasChecked","writeListItemInlines","example","childAttrs","childWithChecked","writePandocListItem","figure","imageAttributes","src","decodeURI","readPandocTitle","alt","requireHTML","writeRawMarkdown","linkTo","writeFigure","writeLink","imageInlineHTMLReader","isImage","image_util_1","inlineHTMLIsImage","imageAttrsFromHTML","imageDOMOutputSpec","imageDOMAttributes","parseFromString","imageCommand","editorUI","img","imgDimensions","selectionIsImageNode","pandocImageHandler","imagePandocOutputWriter","imageNodeAttrsSpec","imageAttr","imageAttrsFromDOM","Image","attr_edit","noDecorator","_schema","imageTextSelectionPlugin","imageEventsPlugin","imagePropsWithSizes","linkMark","Figure","editImage","units","isNaturalHeight","newImage","imageProps","insertAndSelectNode","partitionedKeyvalue","sizeWithUnit","ensureContainerWidth","imagePos","findParentNodeClosestToPos","domAtPos","resizeContainer","elementInnerDimensions","resizeEl","definition_list","convertImagesToFigure","imagesToFiguresTransform","linkAttrs","getMarkAttrs","mappedImagePos","writerHasProhibitedFigureParent","contentElement","kRawBlockContent","html_1","isSingleLineHTML","fixupContext","appendTransaction","figureKeys","image_view_1","imageNodeViewPlugins","ImageNodeView","editorEvents","unregisterWatchImg","implicitFigures","implicit_figures","resizeUI","selectOnClick","imgBroken","onerror","onclick","ondblclick","image_dialog_1","imageDialog","imageDimensionsFromImg","updateImg","figcaption","noPropagateClick","manageFigcaption","ondragstart","initResizeContainer","updateImageSize","destroy","clearSizeOnVisibleTimer","detachResizeUI","selectNode","draggable","image_resize_1","isResizeUICompatible","detach","attachResizeUI","ignoreMutation","mapResourceToURL","updateImageViewSize","isFigure","sizeOnVisibleTimer","imageContainerWidth","noImplicitFigures","emptyFigcaption","selectionInFigcaption","hide","display","minHeight","margin","widthWithUnit","heightWithUnit","overflow","incompatibleWidth","incompatibleHeight","imageNode","imgContainerWidth","updateImageNodeFromShelf","hasPercentWidth","updateImageNodeSize","shelf","onInit","onWidthChanged","onHeightChanged","onUnitsChanged","onEditImage","uiImages","widgets_1","createPopup","editorContainer","updatePosition","editorBox","getBoundingClientRect","imageBox","editingScrollContainerEl","editingRootScrollContainerElement","positionTimer","panel","createHorizontalPanel","addToPanel","widget","addHorizontalPanelCell","paddingSpan","createInputLabel","wLabel","createTextInput","inputClasses","hLabel","hInput","onchange","hAutoLabel","unitsSelect","checkboxWrapper","lockCheckbox","lockLabel","createImageButton","properties","onload","manageUnitsUI","percentSizing","isNaN","getDim","wInput","shelfSizeFromImage","setWidth","setHeight","lock","resizeShelf","sync","lockRatio","prevUnits","widthPixels","widthInUnits","handle","onSizing","onSizingComplete","setPointerCapture","pageX","movedX","startX","movedY","pageY","startY","startWidth","startHeight","onPointerUp","havePointerEvents","releasePointerCapture","pointerId","onPointerMove","onPointerDown","resizeHandle","cssFloat","marginRight","marginLeft","liftStyle","liftImgStyle","widthProp","heightProp","kAlignAttrib","verticalAlign","onDestroyed","observer_1","subtree","button","imageEl","optionEl","widthChars","atEnd","selectFigureCaption","selectFigure","Selection","near","verticalArrowCanAdvanceWithinTextBlock","isWithinEmptyCaption","parentIndex","previousNode","parentTextBlock","figureSelection","nodePos","arrowHandler","ArrowRight","clipboardEvent","clipboardData","types","getData","clipboardUris","uris","handleImageUris","dragEvent","dataTransfer","coordinates","posAtCoords","uriList","droppedUris","imageUris","uri","handlePaste","imagePaste","Content","horizontal_rule_dark","horizontal_rule","HorizontalRule","insertNode","hrOmniInsert","br","ShiftEnter","atom","selectable","Emph","_mark","writeMark","Em","em","Strong","strong","inline_code_attributes","codeAttrs","autolink_bare_uris","citations","linkAttr","data-heading","extraAttr","kLinkTargetUrl","kLinkTargetTitle","linkCommand","onEditLink","result_1","Heading","asyncEditLink","link_dark","clipboard_1","autoLink","headingLink","linkEnd","matchText","copy","fromArray","linkText_1","attrs_1","matchedHeading_1","headingText","headingPos","linkPos","tooltip_1","button_1","linkCmd","removeLinkCmd","kMaxLinkWidth","React","LinkPopup","maxLinkWidth","openURL","clipboard","linkText","isSupported","LinkButton","showCopyButton","ImageButton","on","grav","show","tabIndex","onKeyDown","forwardRef","specKey","dismissOnEdit","makeLinksAccessible","onCmdClick","_oldState","kRestoreLocationTransaction","target_1","decorationPosition_1","decoration_1","textRangePopupDecorationPosition","editorView","ignoreSelection","stopEvent","textPopupDecorator","decorationEl","visibility","reactRenderForEditorView","links","getElementsByTagName","onkeydown","click","ReactDOM","element","editingBox","editingEl","editingBoxStyle","topPadding","popupStyle","rangeCoords","rightPos","prosemirror_history_1","history","SelectAll","selectAll","findBlockNodes","childBlocksSelection","gapArrowHandler","gapCursor","prosemirror_dropcursor_1","dropCursor","$divPos","createGapCursor","mouseEvent","clickPos","$clickPos_1","inside","divNode","stopImmediatePropagation","kFormattingMarks","markName","setStoredMarks","definition_list_term","definition_list_description","nodeRange","targetLiftDepth","liftTarget","lift","clearFormatting","enDash","ellipsis","emDash","hasAttrId","attrNode","mk","markRange_1","scannedRanges","extensionIfPandocAttrEnabled","requiresTrailingP","insertTrailingP","insertTrailingPTransform","firstChild","fencedAttributes","langAttrib","codeBlockInputRuleEnter","canApplyCodeBlockInputRule","pasteTextPlugin","bodyEl","bodyElement","toY","scrollHeight","insert_symbol_plugin_1","symbol_dark","symbol","filterPlaceholderHint","symbolGroups","symbols_1","insertSymbolTransaction","symbolCharacter","searchTerm","UnicodeSymbolDataProvider","symbolGroupNames","symbolGroup","flat","codepoint","groupName","symbols","unicode_1","parseCodepoint","filterText","filteredSymbols","fromCodePoint","Symbol","performInsertSymbol","symbolOmniInsert","InsertSymbolPlugin","isValidCodepoint","hexOnlyText","hexValue","Number","valueOf","showPopup","closePopup","focusChanged","panelPositionStylesForCurrentSelection","react_dom_1","insertSymbolPopup","editorRect","maximumTopPosition","minimumTopPosition","popupTopPosition","maximumLeftPosition","minimumLeftPosition","searchImage","searchPlaceholder","dataProvider","insert_symbol_grid_preview_1","InsertSymbolPopup","popupHeight","popupWidth","useState","setFilterText","selectedSymbolGroup","setSelectedSymbolGroup","selectedSymbolIndex","setSelectedSymbolIndex","preferenceChanged","setPreferenceChanged","symbolDataProvider","getSymbols","useMemo","filterSymbols","useEffect","focusElement","textRef","handleSelectedSymbolCommitted","onInsertSymbol","preferencesProps","onPreferencesChanged","preferenceRef","lastElement","onClose","shiftKey","focus_1","isElementFocused","gridRef","altKey","newIndex","insert_symbol_grid_1","newIndexForKeyboardEvent","gridWidth","TextInput","iconAdornment","onChange","selectRef","selectedOptions","selectedGroupName","symbolIndex","activeElement","SelectInput","characterWidth","onKeyUp","onKeyPress","onFocus","onPaste","SymbolCharacterGrid","columnWidth","floor","numberOfColumns","characterCellData","onSelectionChanged","selectedItemClassName","scrollToItem","rowIndex","symbolCharacters","react_window_1","FixedSizeGrid","columnCount","rowCount","ceil","rowHeight","itemData","SymbolCharacterCell","numberOfCells","prevRow","currentIndex","nextRow","nextPage","prevPage","itemIndex","characterGridCellItemData","onSelectionCommitted","symbolPreviewStyle","fontSize","insert_symbol_emoji_skintone_1","SymbolEmojiPreferencesPanel","bestAlias","aliases","alias","emoji_2","nodeForEmoji","kCategoryAll","emoji_1","emojiCategories","EmojiSymbolDataProvider","skinTone","emojiSkinTone","symbolForEmoji","description","hasMarkdownRepresentation","Emoji","emojiOmniInsert","emojis_all_1","emojis","emojiWithSkinTone","supportsSkinTone","emojiRaw","category","characterForSkinTone","SkinTone","Default","None","hasSkinTone","kEmojiAttr","kEmojiContent","catgegory","categories","emojiString","emojiWithSkinTonePreference","emojiFromChar","emojiAlias","kEmojis_1","emojiForAllSkinTones","Light","MediumLight","Medium","MediumDark","Dark","hint","prompt","emojiMark","emojiChar","emojiFromAlias","emojiName","emojiCompletionHandler","emojiSkintonePreferenceCompletionHandler","charLoc","skinToneEmoji","Save","markTr","markFrom","EmojiView","kEmojiCompletionRegEx","prefix_1","completions_1","setEmojiSkinTone","EmojiSkintonePreferenceHeaderView","kHeaderHeight","pref","kCellWidth","emojiText","selectedSkinTone","setSelectedSkinTone","previewEmoji","setSelectSkinTone","getCurrentSkinToneIndex","previewEmojiWithSkinTones","findIndex","nextSkinTone","selectSkinTone","commitSkinTonePreference","skinToneSelectedClass","handleButtonClick","EmDash","pastePluginKey","transformPastedHTML","highlightNode","forChangedNodes","highlightPluginKey","ReplaceStep","isRemoval","isSectionRemoval","fullySelectedDiv","divSelFrom","divSelTo","fullySelectedDivSection","Strikeout","strikeout","Superscript","superscript","Subscript","subscript","SmallCaps","Smallcaps","smallcaps","RawInlineInsertCommand","defaultFormat","outputFormats","editRawInline","raw_inline_dark","RawInlineCommand","kRawInlineFormat","kRawInlineContent","raw_attribute","rawTexMark","raw_tex","texText","texMatchLength","tex_1","texLength","addStoredMark","startTex","InsertInlineLatexCommand","TexInline","setTexSelectionAfterInsert","raw_inline_1","mark_highlight_1","markHighlightDecorations","latexHighlightingPlugin","splitInvalidatedMarks","texInputRule","braces","highlighter","decorationsForDoc","removeDecorations","addDecorations","markDecorations","rehighlightParent_1","braceLevel","isLetter","inBraces","inBrackets","bracketLevel","rawhtmlMark","endLoc","startLoc","isHTMLTag","close","void","isVoidTag","endTag","tagStartLoc","inSingleQuote","inDoubleQuote","rawHtmlInputRule","isRawHTMLFormat","writeInlineHTML","writeInlneHTML","isSingleTag","data-type","spellcheck","delimiterForType","kMathContent","delimter","mathText","delimiter","InlineMath","DisplayMath","Display","kInlineMathRegex","mathLength","startMath","math_commands_1","InsertInlineMathCommand","InsertDisplayMathCommand","singleLineDisplayMath","math_transaction_1","mathAppendMarkTransaction","math_highlight_1","mathHighlightPlugin","math_popup_1","MathPopupPlugin","math_view_1","mathViewPlugins","allowNewline","insertMathCommand","math_display_dark","math_display","displayMathOmniInsert","para","maths_1","mathRange","mathAttr","selectionIsWithin","lodash_debounce_1","updatePopup","updatePopupTimer","resizeUnsubscribe","mousemove","lastRenderedMath","$mousePos","equationPreview","rangeEndCoords","rangeStartCoords","editingElStyle","styles","inlineMath","error","autoscollPopup","popupBox","mathBottom","editorEl","mathText_1","mathjaxDiv","isActiveTab","_transactions","prevMathRange","delta","verticalArrowHandler","lodash_uniqby_1","bibliography_1","csl_1","kCiteIdBasePattern","bibManager","_event","cite_id","parsedDOI","cite_doi_1","doiFromSlice","doiText","findDoiInLocalBibliography","allowsWrites","citeIdInputRule","citeIdLen","citeIdLength","citeStart","citeEnd","readPandocCite","citeMark","cite","writeCitation","citationPrefix","suppress","citationMode","CitationMode","SuppressAuthor","citeIdMark","citationId","inTextSuffix","AuthorInText","citationSuffix","kNoteCiteRegex","kInTextCiteRegex","kInTextCiteWithSuffixRegEx","kCiteId","provider","load","performCiteCompletionReplacement","existingEntry","bibliographyFiles","writableBibliographyFiles","writableFile","insertCite","writableBiblios","thisWritableBiblio","writable","displayPath","bibliographyFile","fullPath","writableBiblioPath","isProject","project","providerKey","ensureSourcesInBibliography","idText","sources","providersWithWarnings","zoteroUseBetterBibtex","isBibTexBibliography","all","withWarning","warning","warningForProvider","yesNoMessage","every","kCitationIdRegex","citeText","idMark","BibliographyManager","zotero","prefixMatch","Cite","closeCite","parentText","beginBracketPos","cite_commands_1","InsertCitationCommand","bibliographyManager","kFindInTextCiteRegex","kFindFullCiteRegex","citeIdDashInputRule","citationDoiCompletionHandler","citationCompletionHandler","cite_highlight_1","citeHighlightPlugin","cite_popup_1","citePopupPlugin","bibliography_provider_local_1","bibliographyFileForPath","path","bibliographyTypes","defaultBiblioType","bibliographyDefaultType","displayName","kFields","weight","zoteroServer","BibliographyDataProviderZotero","refreshCollectionData","parsedYamlNodes","docPath","providersNeedUpdate","providersEntries","idSort","parseYamlNodes","providers","getDefaultResourceDir","prev","curr","isWritable","hasSources","allSources","kLocalBiliographyProviderKey","sourcesForProvider","sourcesForProviderCollection","collectionKey","localSources","bibFile","localProviders","providerName","prov","dataProviderBibTeX","generateBibTeX","bibDB_1","toBibTeX","warningMessage","warningProvider","findIdInLocalBibliography","searchProviderCollection","searchProvider","searchSources","limit","searchIndex","kSearchOptions","$or","bibliographiesRelative","bibliographyFilesFromDoc","yamlBlocks","path_1","expandPaths","resourcePath","parsedYamls","refBlockParsedYamls","parsedYaml","lastReferenceParsedYaml","referenceBlockFromYaml","getBibliography","bibliographiesAbsolute","refBlock","etag","bibliography","updateIndex","collections","collectionKeys","itemsForCollection","project_biblios","kPermissableFileExtensions","projectBiblio","getExtension","bibliographyFilesFromDocument","BibliographyDataProviderLocal","bibliographyValues","valueFromYamlText","ensureBibliographyFileForDoc","biblioNode","createBiblographyYamlNode","firstBlock","yamlWithBib","joinPaths","root","rootPath","paths","fileName","lastDot","changeExtension","biblatex_csl_converter_1","BibTypes","bibTypeKey","cslType","bibType","misc","keySortOrder","publisher","enumerableCSL","aOrder","bOrder","cslKey","biblatex","BibFieldTypes","bibFieldKey","bibField","cslFieldName","bibFieldDatas","bibFieldData","nodeValue_1","cslDate","edtfDate","cslDateToEDTFDate","options_1","optionKey","options_2","rangeArray","given","bibDBFieldName","required","optional","eitheror","shouldIncludeField","bibObject","pmNode","csl_text_1","cslTextToProsemirrorNode","nodes_1","BibLatexExporter","bibDB","traditionalNames","cslToBibDB","bibtex_1","bibDbToBibTeX","crossref_1","ensureValidCSLType","cslTypes","crossRefTypeToCSLType","sanitizeForCiteproc","sanitizeProperties","property","license","abstract","cslFromDoc","cslParsedYamls","part","partStr","_f","_g","_h","_j","_k","_l","_m","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z","article","articleJournal","articleMagazine","articleNewspaper","review","reviewBook","article_dark","bill","legislation","legalCase","treaty","legal","legal_dark","book","manuscript","thesis","book_dark","broadcast","broadcast_dark","dataset","data","data_dark","entryDictionary","entryEncylopedia","entry_dark","image_dark","map_dark","motionPicture","movie","movie_dark","musicalScore","song","song_dark","post","postWeblog","webpage","web","web_dark","paperConference","interview","pamphlet","personalCommunication","report","speech","other","other_dark","chapter","graphic","patent","kCrossrefItemsPerPage","imageForCrossrefType","crossRefTypes","monograph","journalArticle","journalVolume","journal","journalIssue","proceedingsArticle","dissertation","reportSeries","editedBook","bookChapter","bookSet","bookTrack","referenceBook","referenceEntry","postedContent","standard","standardSeries","peerReview","proceedingsSeries","proceedings","prettyType","bookSection","bookPart","bookSeries","kCslDOMParser","cslDOMParser","tagSpec","sup","sub","spanSpec","nocase","keysToExport","entryObject","csl_type","types_1","typeMapping","bibtex","bib_type","bibTexType","entry_key","fieldsForExport","fieldKey","fields_1","FieldMap","fieldType","typeReader","bibtexKey_1","outputFields","bibtexValue","year","month","formatText","formatRange","formatKey","escapeNonAscii","bibtexEntry","bibtexEntries","toBibtex","entries","bibTexStr","sortedKeys","rawValue","booktitle","number","codePointAt","characterMap","characters_1","ungrouped","latex","thisNodeMarks","closing","closeTags","lastNodeMarks","closeTag","formatting_1","FormattingTags","open","opening","formattedText","verbatim","doNotEscape","names","formattedNames","bookauthor","language_1","lanagugeMappings","series","swedish","thai","BibTextTypes","phdthesis","unpublished","inproceedings","techreport","fieldsRequired","fieldsOptional","booklet","fieldsEitherOr","character","decimal","731","780","__rest","kZoteroProviderKey","_resourcePath","useCache_1","newCollections","specResult","zoteroConfig","getCollections","collectionSpecs","status","collection","existingCollection","allCollections","col","allCollectionSpecs","toBibliographyCollection","hasUpdates","zoteroSpec","parentKey","bibliographyPaths","bibTeX","betterBibtexExport","zotero_1","kZoteroBibTeXTranslator","libraryID","managerEntries","loadedEntries_1","cite_bibliography_entry_1","entryForSource","kCitationCompleteScope","citationCompletions","_state","tokenWithoutEndPunctuation","searchAllSources","insertCitation","CompletionWarningHeaderView","BibliographySourceView","kCiteCompletionWidth","authorsFormatter","issuedDateFormatter","CompletionItemView","imageAdornment","htmlTitle","bibliography_provider_zotero_1","completion_detailed_1","cslEntry","CompletionItemDetailedView","subTitle","bibMgr","citeId","citationHTML","getDocumentPath","JSON","stringify","previewHtml","finalHtml","rootDiv","classNames","ensureSafeLinkIsPresent","url","urlForCitation","CitePopup","Citation","alreadyInCite","includeWrapper","wrapperText","preCiteIdRange","endOfWrapper","initialSelectionKey","selectionKey","setCitationDefaultInText","intextCitationStyle","bibliographySources","bibliographySources_1","citeIdText","performInsertCitations","initiallySelectedNodeKey","doiSourcePanel","crossrefSourcePanel","crossref","pubmedSourcePanel","pubmed","bibliographySourcePanel","InsertCitationPanel","onOk","requiresProgress","bibliographySourceProviders","sourceProvider","isSlowGeneratingBibliographySource","showProgress","toBibliographySource","hideProgress","onCancel","cancel","configuration","insertCitationConfiguration","setInsertCitationConfiguration","treeNode","citationsToAdd","defaultNode","selectedPanelProvider","statusMessage","placeHolderMessage","existingBibliographyFile","createBibliographyFile","citationDefaultInText","setInsertCitationPanelState","insertCitationPanelState","updatedState","displayedCitations","panelRef","defaultResults","insert_citation_source_panel_1","CitationSourceListStatus","streamTimerId","panelProvider","panelForNode","selectedNode","setSelectedPanelProvider","refreshSearchCallback","typeAheadSearch","existingCitationIds","searchResult","citationProps","panelHeight","mergedCitationsToAdd","onSearchTermChanged","memoizedTypeaheadSearch","onExecuteSearch","searchCanceled","inProgress","progressMessage","onAddCitation","newCitations","deleteCitation","filteredCitations","totalCitationCount","panelToDisplay","navigation_tree_1","NavigationTree","treeSourceData","suggestedPanel","tag_input_1","TagInput","displayText","isEditable","isIdEditable","targetSource","currentlySelectedCitation","onTagValidate","insert_citation_bibliography_picker_1","CitationBibliographyPicker","onCreateBibliographyFileNameChanged","biblographyFile","dialog_buttons_1","DialogButtons","nodeForKey","childNode","selected","toAdd","Tag","onTagDeleted","onTagChanged","editing","setEditing","editingText","setEditingText","setDisplayText","restoreFocusAfterCancel","useLayoutEffect","editTextInput","onEditClick","validationMessage","alert","kAlertTypeError","showingValidationError","commitTagEdit","pathToNode","expanded","visibleNodes","vizNodes","fixedList","stepNode","onSelectedNodeChanged","FixedSizeList","itemCount","itemSize","showSelection","preventFocus","indentLevel","indentStyle","nodeList","allNodes","increment","containsChild","existingSource","imageForType","finalId","rootImageForProvider","zotero_root","bibligraphy","toTree","containers","folderImage","treeMap","currentNode","hasParent","rootNodes","zotero_collection","bibligraphy_folder","folderImageForProvider","local_sources","providerNodes","collectionKeyForNode","useBetterBibTex","zoteroOverlay","toCitationListEntries","_searchTerm","_selectedNode","_existingCitationIds","insert_citation_source_panel_typeahead_search_1","CitationSourceTypeheadSearchPanel","onSelectedIndexChanged","onConfirm","listContainer","searchBoxRef","focusSearch","insert_citation_source_panel_list_1","CitationSourceList","focusPrevious","insert_citation_source_panel_list_item_1","CitationSourcePanelListItem","currentCitation","handleListKeyDown","handleIncrementIndex","itemsPerPage","onBlur","onRemoveCitation","showSeparator","itemProvider","search_progress","citationListData","citationEntry","maxIdLength","e_1","matchExistingSourceCitationListEntry","toCitationListEntry","errorForStatus","insert_citation_source_panel_list_item_detailed_1","pasted","performSearch","lastSearch","initialFocusSet","CitationSourcePanelListItemDetailed","alreadyAdded","doiServer","dedupeCitationIds_1","citationEntries","works","work","coercedCSL","crossrefWork","crossrefWorkTitle","pubMedResult","docs","pubmed_1","pubTypes","doiResult","sanitizedCSL","noResultsMessage","sortFirstAuthor","pubDate","creators","creator","fetchCSL","dataciteResult","familyName","publicationYear","span","getSelectionMarkRange","native_spans","data-span","all_symbols_escapable","stripRefBackslashTransform","potentialXRef","bookdownXRefUI","xref_popup_1","xrefPopupPlugin","xref_completion_1","xrefCompletionHandler","insertRef","cross_reference_dark","cross_reference","FuseIndex","xrefCompletions","xrefView","xrefs","fuse","createIndex","typeQuery","colonLoc","isCaseSensitive","shouldSort","withSavedDocument","refs","kXRefTypes","generic","h1","xrefs_1","xref_2","xrefForId","kMaxWidth","file","InsertHTMLCommentCommand","HTMLComment","raw_html_comment","comment_dark","comment","data-format","isComment","kHTMLCommentMarkRegEx","removeInvalidatedMarks","commentMarkAttribs","detectAndCreateShortcodes","shortcode_1","kShortcodeRegEx","shortcode","noSpelling","excludes","markTr_1","kShortcodePattern","writePandocNote","noteNode","footnote","footnoteOmniInsert","References","footnote_dark","selectedFootnote","findNoteNode","data-ref","data-content","footnote_editor_1","footnoteEditorActivationPlugin","footnoteEditorNodeViews","filterTransaction","footnote_transaction_1","footnoteFilterTransaction","footnoteSelectNoteAppendTransaction","Footnote","canInsertFootnote","edit","selectedNote","footnoteNode","ref_1","matching","ref_2","nodeDecoration","findFootnoteNode","NoteEditorView","footnoteEditorKeyDownHandler","firstNode","lastTextBlock","selectFootnote","findNotesContainer","noteWithPos","footnotes","findAllFootnotes","notesContainer","findAllNotes","toJSON","newNote","fromJSON","allNotes","footnoteFixupTransform","activeNote","RawBlockCommand","rawAttribute","textTrimmed","isSingleLineTex","readPandocRawBlock","isSingleChildParagraph","isParagraphWrappingMultilineRaw","rawTok","FormatRawBlockCommand","HTMLBlock","kHTMLFormat","Blocks","html_block_dark","html_block","TexBlock","tex_block_dark","tex_block","YamlMetadata","yaml_block_dark","yaml_block","yaml_metadata_capsule_1","yamlMetadataBlockCapsuleFilter","YamlMetadataCommand","yaml_metadata_title_1","RmdChunkCommand","Chunks","RChunkCommand","r_chunk_dark","r_chunk","PythonChunkCommand","python_chunk","BashChunkCommand","bash_chunk_dark","bash_chunk","d3_chunk","D3ChunkCommand","StanChunkCommand","StanCodeChunk","stan_chunk","md_index","firstLineMeta","lineNumbers","lineNumberFormatter","lineNumber","lineCount","bookdownTheorems","kBookdownDocType","rmd_chunk_capsule_1","rmdChunkBlockCapsuleFilter","RcppChunkCommand","SQLChunkCommand","rmd_chunk_image_1","RmdChunkImagePreviewPlugin","uiContext","imagePreviewDecorations","isRmdChunkNode","firstLine","widthMatch","width_1","stripQuotes","alignCenter_1","imagePath_1","unsubscribe","watchResource","kBlockCapsuleTextRegEx","kBlockCapsuleType","isFullDivSelection","createDiv","editDiv","defining","data-div","divCommand","Div","indexAfter","canApplyDivInputRule","attribMatch","attrProps","InsertDiv","LineBlock","line_block","line_block_dark","table_captions","grid_tables","multiline_tables","table_nodes_1","tableNode","tableCaptionNode","tableCellNode","tableHeaderNode","tableRowNode","TableInsertTable","table_commands_1","insertTable","insertTableOmniInsert","TablePreviousCell","prosemirror_tables_1","goToNextCell","TableColumnCommand","TableAddColumnAfter","addColumns","TableAddColumnBefore","TableRowCommand","TableAddRowAfter","addRows","TableAddRowBefore","TableDeleteRow","deleteRow","TableColumnAlignmentCommand","TableAlignColumnRight","CssAlignment","Right","TableAlignColumnCenter","Center","TableAlignColumnDefault","TableToggleCaptionCommand","headerOptional","columnResizing","handleWidth","table_paste_1","tablePaste","table_contextmenu_1","TableContextMenuPlugin","multiline","ModEnter","table_container","table_caption","numRows","rows","cells","cellType","tableCaption","tableContainer","selectionPos","cols","inactive","caption","Lists","table_dark","deleteTable","columns","rect","selectedRect","addRow","alignments_1","rowNode","cellPos","cellOffset","cellNode","align","colIndex","TableToggleHeaderCommand","TableToggleHeader","toggleHeader","isInTable","TableToggleCaption","tr_2","left_1","right_1","selectionCell","tableStart","TableMap","CellSelection","rectBetween","$anchorCell","$headCell","tableGroup","getFromDOM","textAlign","kDefaultCellClasses","Table","table_pandoc_1","readPandocTable","writePandocTableContainer","table_capsule_1","tableBlockCapsuleFilter","colgroup","childElementCount","colpercents","firstRow","colWidth","colWidths","table_columns_1","tableColumnWidths","writePandocTable","writePandocTableCaption","table_row","writePandocTableNodes","writePandocTableHeaderNodes","alignments","AlignLeft","Left","AlignRight","AlignCenter","AlignDefault","tableToken","ColWidth","columnPercents","parseRow","row","captionBlock","lastChild","widths","ColWidthDefault","headerCut","tableColumnAlignments","colwidth","defaultWidth","totalWidth","tables_1","kTableBlockCapsuleType","capsuleText","DefinitionList","definition","unparsedTable_1","TableDeleteColumn","subMenu","TableAlignColumnLeft","menuVisible","sliceHasNode","fixupTableWidths","currentColumn","columnAlignments","headerPos","childPos","definition_lists","definition_list_pandoc_1","writePandocDefinitionListDescription","readPandocDefinitionList","writePandocDefinitionList","definition_list_inputrule_1","definitionInputRule","definition_list_insert_1","insertDefinitionListAppendTransaction","emptyNodePlaceholderPlugin","termText","insertTermText","insertDefinitionList","createDefinitionDescription","definition_list_dark","InsertDefinitionList","InsertDefinitionListItemCommand","createFn","dlTypes","insertPos","InsertDefinitionTerm","InsertDefinitionDescription","lists_1","listPos","list","listParent","listIndex","definitionList","prevCursor","definitionListEnter","parentTerm","selectionNode","isParagraph","isEmpty","position_1","isLastChild","descriptionNode","endOfDescriptionEnter","isOnlyChild","emptyTermBackspace","emptyDescriptionBackspace","advancePos","definitionListShiftTab","backwardPos","prevNode","listNode","depthOffset","isParagraphAfterParagraph","prevPara","writeCurrent","writePandocDefinitionListTerm","kShortcodeBlockCapsuleType","_p3","shortcode_block","borderColorClass","isParaWrappingShortcode","Shortcode","shortcodeNode","htmlPreserveBlockCapsuleFilter","kHtmlPreserveBlockCapsuleType","handleToken","html_preserve","ace_placeholder_1","ace_node_views_1","acePlugins","aceRenderQueue","ace_render_queue_1","AceRenderQueue","aceNodeViews","AceNodeViews","AceNodeView","handleClick","editorOptions","gapCursorPending","selectionMarker","queuedSelection","subscriptions","renderedWidth","scrollRow","mouseDown","preview","AcePlaceholder","getElement","updateMode","onEditorDispatch","initEditor","renderQueue","unsub","_decos","editSession","getDocument","computeChange","AceRange","fromPoints","indexToPosition","findMarkers","removeMarker","findPluginState","markerFrom","markerTo","aceEditor","escaping","require","Range","setSelectionRange","QueuedSelection","pending","_mutation","forwardSelection","asProseMirrorSelection","session","getRange","positionToIndex","highlightSelectionAcross","addMarker","getContents","replaceWith","offsetTop","viewTop","viewBottom","scrollCursorIntoView","clearSelection","getSession","valueChanged","cursorDirty","addCommand","bindKey","arrowMaybeEscape","backspaceMaybeDeleteNode","undo","redo","win","mac","getCursorPosition","executeSelection","renderer","metrics","$fontMetrics","$observer","setContainer","debounceResize","evt","resizeTimer","setMode","execCommand","getLength","innerText","getCursor","containerRect","cursorRect","down","up","oldEnd","oldVal","newEnd","newVal","nodeBefore","nodeAfter","cursorPos","prevNodePos","nextNodePos","nextNodeTextBlock","nextNodeCode","targetPos","renderCompleted","updateTimer","needsSort","bypass","visible","onUpdate","IntersectionObserver","entries_1","processRenderQueue","isIntersecting","cancelTimer","onScroll","scheduleRender","isRenderCompleted","renderTimer","delayMs","nodeView","prevNodePos_1","nv","ndView","setGapCursorPending","AttrEditCommand","editors","editMarkAttrs","editAttr","attr_edit_1","kEditAttrShortcut","properties_deco_dark","properties_deco","ed","parentWithAttrs","editorNode","attrTags","rightPaddingOffset","attrsEl","attrsNode","offsetParentStyle","AttrEditDecorationPlugin","gutterBackgroundColor","gutterTextColor","textColor","surfaceWidgetTextColor","lightTextColor","linkTextColor","invisibleTextColor","markupTextColor","findTextBackgroundColor","findTextBorderColor","blockBorderColor","focusOutlineColor","paneBorderColor","fixedWidthFont","fixedWidthFontSizePt","proportionalFont","proportionalFontSizePt","atomColor","tagColor","attributeColor","hrColor","linkColor","errorColor","setStyleElement","css","styleEl","getElementById","defaults","backgroundColor","borderBackgroundColor","placeholderTextColor","selectionColor","cursorColor","metadataBackgroundColor","chunkBackgroundColor","spanBackgroundColor","divBackgroundColor","commentColor","commentBackgroundColor","nodeSelectionColor","padding","copy_png_1","properties_png_1","properties_deco_png_1","properties_deco_dark_png_1","removelink_png_1","runchunk_png_1","runprevchunks_png_1","search_png_1","search_progress_gif_1","generic_png_1","heading1_png_1","heading1_dark_png_1","heading2_png_1","heading2_dark_png_1","heading3_png_1","heading3_dark_png_1","heading4_png_1","heading4_dark_png_1","bullet_list_png_1","bullet_list_dark_png_1","ordered_list_png_1","ordered_list_dark_png_1","blockquote_png_1","blockquote_dark_png_1","math_inline_png_1","math_inline_dark_png_1","math_display_png_1","math_display_dark_png_1","html_block_png_1","html_block_dark_png_1","line_block_png_1","line_block_dark_png_1","emoji_png_1","emoji_dark_png_1","comment_png_1","comment_dark_png_1","div_png_1","div_dark_png_1","code_block_png_1","code_block_dark_png_1","footnote_png_1","footnote_dark_png_1","citation_png_1","citation_dark_png_1","cross_reference_png_1","cross_reference_dark_png_1","symbol_png_1","symbol_dark_png_1","table_png_1","table_dark_png_1","definition_list_png_1","definition_list_dark_png_1","horizontal_rule_png_1","horizontal_rule_dark_png_1","image_png_1","image_dark_png_1","link_png_1","link_dark_png_1","paragraph_png_1","paragraph_dark_png_1","raw_block_png_1","raw_block_dark_png_1","raw_inline_png_1","raw_inline_dark_png_1","tex_block_png_1","tex_block_dark_png_1","yaml_block_png_1","yaml_block_dark_png_1","python_chunk_png_1","sql_chunk_png_1","d3_chunk_png_1","stan_chunk_png_1","bash_chunk_png_1","bash_chunk_dark_png_1","r_chunk_png_1","r_chunk_dark_png_1","rcpp_chunk_png_1","rcpp_chunk_dark_png_1","heading3_dark","bullet_list_dark","ordered_list_dark","blockquote","blockquote_dark","math_inline","math_inline_dark","emoji_dark","div_dark","citation_dark","paragraph_dark","raw_block_dark","sql_chunk","rcpp_chunk_dark","book_dark_png_1","formatMenu","Underline","ListItemCheck","ListItemCheckToggle","EditListProperties","Blockquote","haveAnyOf","HTMLInline","ClearFormatting","AttrEdit","RCodeChunk","PythonCodeChunk","BashCodeChunk","RcppCodeChunk","SQLCodeChunk","D3CodeChunk","DefinitionTerm","DefinitionDescription","ParagraphInsert","commands_1","editorMenus","TableDeleteTable"],"mappings":"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K,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,WACE,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEFA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,UACA,KAEF,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,MACA,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,UACH,UACA,KAEFA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,UACH,UACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,UACH,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,WACE,UACA,KAEF,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,IACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACH,WACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,KACLA,EAAK,IACH,WACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,UACH,UACA,KAEF,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,UACH,UACA,KAEFA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,UACA,KAEF,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,UACH,KACAA,EAAA,IAEF,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Tz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAA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E,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,OAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,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SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA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F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,gBAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,gBAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,gBAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,WAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,UAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,UAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,gBAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,WAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,WAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,UAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,eAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,eAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,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BAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,w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AAI,YAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F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","sourcesContent":["/*\n * index.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport polyfillIsConnected from './isconnected';\nimport polyfillCustomEvent from './custom-event';\n\nfunction polyfill() {\n  polyfillIsConnected();\n  polyfillCustomEvent();\n}\n\nexport default polyfill;\n","/*\n * Node.isConnected polyfill for IE and EdgeHTML\n * 2020-02-04\n *\n * By Eli Grey, https://eligrey.com\n * Public domain.\n * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n */\n\nfunction polyfill() {\n  if (!('isConnected' in Node.prototype)) {\n    Object.defineProperty(Node.prototype, 'isConnected', {\n      get() {\n        return (\n          !this.ownerDocument ||\n          !(\n            // tslint:disable-next-line: no-bitwise\n            (this.ownerDocument.compareDocumentPosition(this) & this.DOCUMENT_POSITION_DISCONNECTED)\n          )\n        );\n      },\n    });\n  }\n}\n\nexport default polyfill;\n","// apply polyfills\nimport polyfill from './polyfill/index';\npolyfill();\n\n// objects instantiated by the IDE\nexport { Editor, UITools } from './editor/editor';\n","/**\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n *\n * From https://developer.mozilla.org/en-US/docs/MDN/About:\n * \"Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/\"\n */\nexport default function() {\n  if (typeof window.CustomEvent === 'function') return false;\n\n  function CustomEvent(event: any, params: any) {\n    params = params || { bubbles: false, cancelable: false, detail: null };\n    var evt = document.createEvent('CustomEvent');\n    evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n    return evt;\n  }\n\n  window.CustomEvent = CustomEvent as any;\n}\n","/*\n * editor.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { inputRules } from 'prosemirror-inputrules';\nimport { keydownHandler } from 'prosemirror-keymap';\nimport { Node as ProsemirrorNode, Schema, DOMParser, ParseOptions } from 'prosemirror-model';\nimport { EditorState, Plugin, PluginKey, TextSelection, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport 'prosemirror-view/style/prosemirror.css';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { citeUI } from '../api/cite';\nimport { EditorOptions } from '../api/options';\nimport { ProsemirrorCommand, CommandFn, EditorCommand } from '../api/command';\nimport { EditorUI } from '../api/ui';\nimport {\n  attrPropsToInput,\n  attrInputToProps,\n  AttrProps,\n  AttrEditInput,\n  InsertCiteProps,\n  InsertCiteUI,\n} from '../api/ui-dialogs';\n\nimport { Extension } from '../api/extension';\nimport { PandocWriterOptions } from '../api/pandoc';\nimport { PandocCapabilities, getPandocCapabilities } from '../api/pandoc_capabilities';\nimport { fragmentToHTML } from '../api/html';\nimport { DOMEditorEvents, EventType, EventHandler } from '../api/events';\nimport {\n  ScrollEvent,\n  UpdateEvent,\n  OutlineChangeEvent,\n  StateChangeEvent,\n  ResizeEvent,\n  LayoutEvent,\n  FocusEvent,\n  DispatchEvent,\n  NavigateEvent,\n  BlurEvent,\n} from '../api/event-types';\nimport {\n  PandocFormat,\n  resolvePandocFormat,\n  PandocFormatConfig,\n  pandocFormatConfigFromCode,\n  pandocFormatConfigFromDoc,\n} from '../api/pandoc_format';\nimport { baseKeysPlugin } from '../api/basekeys';\nimport {\n  appendTransactionsPlugin,\n  appendMarkTransactionsPlugin,\n  kFixupTransaction,\n  kAddToHistoryTransaction,\n  kSetMarkdownTransaction,\n} from '../api/transaction';\nimport { EditorOutline, getOutlineNodes, EditingOutlineLocation, getEditingOutlineLocation } from '../api/outline';\nimport { EditingLocation, getEditingLocation, setEditingLocation } from '../api/location';\nimport { navigateTo, NavigationType } from '../api/navigation';\nimport { FixupContext } from '../api/fixup';\nimport { unitToPixels, pixelsToUnit, roundUnit, kValidUnits } from '../api/image';\nimport { kPercentUnit } from '../api/css';\nimport { EditorFormat } from '../api/format';\nimport { diffChars, EditorChange } from '../api/change';\nimport { markInputRuleFilter } from '../api/input_rule';\nimport { editorMath } from '../api/math';\nimport { EditorEvents } from '../api/events';\nimport { insertRmdChunk } from '../api/rmd';\nimport { EditorServer } from '../api/server';\nimport { pandocAutoIdentifier } from '../api/pandoc_id';\nimport { wrapSentences } from '../api/wrap';\nimport { yamlFrontMatter, applyYamlFrontMatter } from '../api/yaml';\nimport { EditorSpellingDoc } from '../api/spelling';\n\nimport { getTitle, setTitle } from '../nodes/yaml_metadata/yaml_metadata-title';\nimport { getOutline } from '../behaviors/outline';\nimport {\n  FindOptions,\n  find,\n  matchCount,\n  selectFirst,\n  selectNext,\n  selectPrevious,\n  replace,\n  replaceAll,\n  clear,\n  selectCurrent,\n} from '../behaviors/find';\n\nimport { omniInsertExtension } from '../behaviors/omni_insert/omni_insert';\nimport { completionExtension } from '../behaviors/completion/completion';\n\nimport { getSpellingDoc } from '../behaviors/spelling/spelling-interactive';\nimport { realtimeSpellingPlugin, invalidateAllWords, invalidateWord } from '../behaviors/spelling/spelling-realtime';\n\nimport { PandocConverter, PandocLineWrapping } from '../pandoc/pandoc_converter';\n\nimport { ExtensionManager, initExtensions } from './editor-extensions';\nimport { defaultTheme, EditorTheme, applyTheme, applyPadding } from './editor-theme';\nimport { defaultEditorUIImages } from './editor-images';\nimport { editorMenus, EditorMenus } from './editor-menus';\nimport { editorSchema } from './editor-schema';\n\n// import styles before extensions so they can be overriden by extensions\nimport './styles/frame.css';\nimport './styles/styles.css';\n\nexport interface EditorCode {\n  code: string;\n  selection_only: boolean;\n  location: EditingOutlineLocation;\n}\n\nexport interface EditorSetMarkdownResult {\n  // editor view of markdown (as it will be persisted)\n  canonical: string;\n\n  // line wrapping\n  line_wrapping: PandocLineWrapping;\n\n  // unrecoginized pandoc tokens\n  unrecognized: string[];\n\n  // unparsed meta\n  unparsed_meta: { [key: string]: any };\n\n  // updated outline \n  location: EditingOutlineLocation;\n}\n\nexport interface EditorContext {\n  readonly server: EditorServer;\n  readonly ui: EditorUI;\n  readonly hooks?: EditorHooks;\n  readonly extensions?: readonly Extension[];\n}\n\nexport interface EditorHooks {\n  isEditable?: () => boolean;\n}\n\nexport interface EditorKeybindings {\n  [id: string]: string[];\n}\n\nexport interface EditorSelection {\n  from: number;\n  to: number;\n  navigation_id: string | null;\n}\n\nexport interface EditorFindReplace {\n  find: (term: string, options: FindOptions) => boolean;\n  matches: () => number;\n  selectFirst: () => boolean;\n  selectCurrent: () => boolean;\n  selectNext: () => boolean;\n  selectPrevious: () => boolean;\n  replace: (text: string) => boolean;\n  replaceAll: (text: string) => number;\n  clear: () => boolean;\n}\n\nexport { EditorCommandId as EditorCommands } from '../api/command';\n\nexport interface UIToolsAttr {\n  propsToInput(attr: AttrProps): AttrEditInput;\n  inputToProps(input: AttrEditInput): AttrProps;\n  pandocAutoIdentifier(text: string): string;\n}\n\nexport interface UIToolsImage {\n  validUnits(): string[];\n  percentUnit(): string;\n  unitToPixels(value: number, unit: string, containerWidth: number): number;\n  pixelsToUnit(pixels: number, unit: string, containerWidth: number): number;\n  roundUnit(value: number, unit: string): string;\n}\n\nexport interface UIToolsFormat {\n  parseFormatConfig(markdown: string, isRmd: boolean): PandocFormatConfig;\n}\n\nexport interface UIToolsSource {\n  diffChars(from: string, to: string, timeout: number): EditorChange[];\n}\n\nexport interface UIToolsCitation {\n  citeUI(citeProps: InsertCiteProps): InsertCiteUI;\n}\n\nexport class UITools {\n  public readonly attr: UIToolsAttr;\n  public readonly image: UIToolsImage;\n  public readonly format: UIToolsFormat;\n  public readonly source: UIToolsSource;\n  public readonly citation: UIToolsCitation;\n\n  constructor() {\n    this.attr = {\n      propsToInput: attrPropsToInput,\n      inputToProps: attrInputToProps,\n      pandocAutoIdentifier: (text: string) => pandocAutoIdentifier(text, false),\n    };\n\n    this.image = {\n      validUnits: () => kValidUnits,\n      percentUnit: () => kPercentUnit,\n      unitToPixels,\n      pixelsToUnit,\n      roundUnit,\n    };\n\n    this.format = {\n      parseFormatConfig: pandocFormatConfigFromCode,\n    };\n\n    this.source = {\n      diffChars,\n    };\n\n    this.citation = {\n      citeUI,\n    };\n  }\n}\n\nconst keybindingsPlugin = new PluginKey('keybindings');\n\nexport class Editor {\n  // core context passed from client\n  private readonly parent: HTMLElement;\n  private readonly context: EditorContext;\n  private readonly events: EditorEvents;\n\n  // options (derived from defaults + config)\n  private readonly options: EditorOptions;\n\n  // format (pandocFormat includes additional diagnostics based on the validity of\n  // provided mode + extensions)\n  private readonly format: EditorFormat;\n  private readonly pandocFormat: PandocFormat;\n\n  // pandoc capabilities\n  private pandocCapabilities: PandocCapabilities;\n\n  // core prosemirror state/behaviors\n  private readonly extensions: ExtensionManager;\n  private readonly schema: Schema;\n  private state: EditorState;\n  private readonly view: EditorView;\n  private readonly pandocConverter: PandocConverter;\n\n  // setting via setKeybindings forces reconfiguration of EditorState\n  // with plugins recreated\n  private keybindings: EditorKeybindings;\n\n  // content width constraints (if unset uses default editor CSS)\n  private maxContentWidth = 0;\n  private minContentPadding = 0;\n\n  // keep track of whether the last transaction was selection-only\n  private lastTrSelectionOnly = false;\n\n  // create the editor -- note that the markdown argument does not substitute for calling\n  // setMarkdown, rather it's used to read the format comment to determine how to\n  // initialize the various editor features\n  public static async create(\n    parent: HTMLElement,\n    context: EditorContext,\n    format: EditorFormat,\n    options: EditorOptions,\n  ): Promise<Editor> {\n    // provide option defaults\n    options = {\n      autoFocus: false,\n      spellCheck: false,\n      codeEditor: 'codemirror',\n      rmdImagePreview: false,\n      hideFormatComment: false,\n      className: '',\n      ...options,\n    };\n\n    // provide format defaults\n    format = {\n      pandocMode: format.pandocMode || 'markdown',\n      pandocExtensions: format.pandocExtensions || '',\n      rmdExtensions: {\n        codeChunks: false,\n        bookdownXRef: false,\n        bookdownXRefUI: false,\n        bookdownPart: false,\n        blogdownMathInCode: false,\n        ...format.rmdExtensions,\n      },\n      hugoExtensions: {\n        shortcodes: false,\n        ...format.hugoExtensions,\n      },\n      docTypes: format.docTypes || [],\n    };\n\n    // provide context defaults\n    const defaultImages = defaultEditorUIImages();\n    context = {\n      ...context,\n      ui: {\n        ...context.ui,\n        images: {\n          ...defaultImages,\n          ...context.ui.images,\n          omni_insert: {\n            ...defaultImages.omni_insert,\n            ...context.ui.images,\n          },\n          citations: {\n            ...defaultImages.citations,\n            ...context.ui.images,\n          },\n        },\n      },\n    };\n\n    // resolve the format\n    const pandocFmt = await resolvePandocFormat(context.server.pandoc, format);\n\n    // get pandoc capabilities\n    const pandocCapabilities = await getPandocCapabilities(context.server.pandoc);\n\n    // create editor\n    const editor = new Editor(parent, context, options, format, pandocFmt, pandocCapabilities);\n\n    // return editor\n    return Promise.resolve(editor);\n  }\n\n  private constructor(\n    parent: HTMLElement,\n    context: EditorContext,\n    options: EditorOptions,\n    format: EditorFormat,\n    pandocFormat: PandocFormat,\n    pandocCapabilities: PandocCapabilities,\n  ) {\n    // initialize references\n    this.parent = parent;\n    this.events = new DOMEditorEvents(parent);\n    this.context = context;\n    this.options = options;\n    this.format = format;\n    this.keybindings = {};\n    this.pandocFormat = pandocFormat;\n    this.pandocCapabilities = pandocCapabilities;\n\n    // create core extensions\n    this.extensions = this.initExtensions();\n\n    // create schema\n    this.schema = editorSchema(this.extensions);\n\n    // register completion handlers (done in a separate step b/c omni insert\n    // completion handlers require access to the initializezd commands that\n    // carry omni insert info)\n    this.registerCompletionExtension();\n\n    // register realtime spellchecking (done in a separate step b/c it\n    // requires access to PandocMark definitions to determine which\n    // marks to exclude from spellchecking)\n    this.registerRealtimeSpelling();\n\n    // create state\n    this.state = EditorState.create({\n      schema: this.schema,\n      doc: this.initialDoc(),\n      plugins: this.createPlugins(),\n    });\n\n    // additional dom attributes for editor node\n    const attributes: { [name: string]: string } = {};\n    if (options.className) {\n      attributes.class = options.className;\n    }\n\n    // create view\n    this.view = new EditorView(this.parent, {\n      state: this.state,\n      dispatchTransaction: this.dispatchTransaction.bind(this),\n      domParser: new EditorDOMParser(this.schema),\n      attributes,\n    });\n\n    // add custom restoreFocus handler to the view -- this provides a custom\n    // handler for RStudio's FocusContext, necessary because the default\n    // ProseMirror dom mutation handler picks up the focus and changes the\n    // selection.\n    Object.defineProperty(this.view.dom, 'restoreFocus', {\n      value: () => {\n        this.focus();\n      },\n    });\n\n    // add proportinal font class to parent\n    this.parent.classList.add('pm-proportional-font');\n\n    // apply default theme\n    this.applyTheme(defaultTheme());\n\n    // create pandoc translator\n    this.pandocConverter = new PandocConverter(\n      this.schema,\n      this.extensions,\n      context.server.pandoc,\n      this.pandocCapabilities,\n    );\n\n    // focus editor immediately if requested\n    if (this.options.autoFocus) {\n      setTimeout(() => {\n        this.focus();\n      }, 10);\n    }\n\n    // disale spellcheck if requested\n    if (!this.options.spellCheck) {\n      this.parent.setAttribute('spellcheck', 'false');\n    }\n\n    {\n      // scroll event optimization, as recommended by\n      // https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n      let ticking = false;\n      this.parent.addEventListener(\n        'scroll',\n        () => {\n          if (!ticking) {\n            window.requestAnimationFrame(() => {\n              this.emitEvent(ScrollEvent);\n              ticking = false;\n            });\n            ticking = true;\n          }\n        },\n        { capture: true },\n      );\n    }\n  }\n\n  public destroy() {\n    this.view.destroy();\n  }\n\n  public subscribe<TDetail>(event: EventType<TDetail> | string, handler: EventHandler<TDetail>): VoidFunction {\n    if (typeof event === 'string') {\n      return this.events.subscribe({ eventName: event }, handler);\n    } else {\n      return this.events.subscribe(event, handler);\n    }\n  }\n\n  public setTitle(title: string) {\n    const tr = setTitle(this.state, title);\n    if (tr) {\n      this.view.dispatch(tr);\n    }\n  }\n\n  public async setMarkdown(\n    markdown: string,\n    options: PandocWriterOptions,\n    emitUpdate: boolean,\n  ): Promise<EditorSetMarkdownResult> {\n    // get the result\n    const result = await this.pandocConverter.toProsemirror(markdown, this.pandocFormat);\n    const { doc, line_wrapping, unrecognized, unparsed_meta } = result;\n\n    // if we are preserving history but the existing doc is empty then create a new state\n    // (resets the undo stack so that the initial setting of the document can't be undone)\n    if (this.isInitialDoc()) {\n      this.state = EditorState.create({\n        schema: this.state.schema,\n        doc,\n        plugins: this.state.plugins,\n      });\n      this.view.updateState(this.state);\n    } else {\n      // note current editing location\n      const loc = this.getEditingLocation();\n\n      // replace the top level nodes in the doc\n      const tr = this.state.tr;\n      tr.setMeta(kSetMarkdownTransaction, true);\n      let i = 0;\n      tr.doc.descendants((node, pos) => {\n        const mappedPos = tr.mapping.map(pos);\n        tr.replaceRangeWith(mappedPos, mappedPos + node.nodeSize, doc.child(i));\n        i++;\n        return false;\n      });\n      // set selection to previous location if it's still valid\n      if (loc.pos < tr.doc.nodeSize) {\n        // eat exceptions that might result from an invalid position\n        try {\n          setTextSelection(loc.pos)(tr);\n        } catch(e) {\n          // do-nothing, this error can happen and shouldn't result in \n          // a failure to setMarkdown\n        }\n      }\n      // dispatch\n      this.view.dispatch(tr);\n    }\n\n    // apply fixups\n    this.applyFixups(FixupContext.Load);\n\n    // notify listeners if requested\n    if (emitUpdate) {\n      this.emitEvent(UpdateEvent);\n      this.emitEvent(OutlineChangeEvent);\n      this.emitEvent(StateChangeEvent);\n    }\n\n    // return our current markdown representation (so the caller know what our\n    // current 'view' of the doc as markdown looks like\n    const getMarkdownTr = this.state.tr;\n    const canonical = await this.getMarkdownCode(getMarkdownTr, options);\n    const location = getEditingOutlineLocation(this.state);\n\n    // return\n    return {\n      canonical,\n      line_wrapping,\n      unrecognized,\n      unparsed_meta,\n      location\n    };\n  }\n\n  // flag indicating whether we've ever had setMarkdown (currently we need this\n  // because getMarkdown can only be called after setMarkdown b/c it needs\n  // the API version retreived in setMarkdown -- we should remedy this)\n  public isInitialDoc() {\n    return this.state.doc.attrs.initial;\n  }\n\n  public async getMarkdown(options: PandocWriterOptions): Promise<EditorCode> {\n    // get the code\n    const tr = this.state.tr;\n    const code = await this.getMarkdownCode(tr, options);\n\n    // return code + perhaps outline location\n    return {\n      code,\n      selection_only: this.lastTrSelectionOnly,\n      location: getEditingOutlineLocation(this.state),\n    };\n  }\n\n  public getEditingOutlineLocation(): EditingOutlineLocation {\n    return getEditingOutlineLocation(this.state);\n  }\n\n  public getHTML(): string {\n    return fragmentToHTML(this.state.schema, this.state.doc.content);\n  }\n\n  public getTitle() {\n    return getTitle(this.state);\n  }\n\n  public getSelection(): EditorSelection {\n    const { from, to } = this.state.selection;\n    return {\n      from,\n      to,\n      navigation_id: navigationIdForSelection(this.state),\n    };\n  }\n\n  public getEditingLocation(): EditingLocation {\n    return getEditingLocation(this.view);\n  }\n\n  public setEditingLocation(outlineLocation?: EditingOutlineLocation, previousLocation?: EditingLocation) {\n    setEditingLocation(this.view, outlineLocation, previousLocation);\n  }\n\n  public getOutline(): EditorOutline {\n    return getOutline(this.state) || [];\n  }\n\n  public getFindReplace(): EditorFindReplace {\n    return {\n      find: (term: string, options: FindOptions) => find(this.view, term, options),\n      matches: () => matchCount(this.view),\n      selectCurrent: () => selectCurrent(this.view),\n      selectFirst: () => selectFirst(this.view),\n      selectNext: () => selectNext(this.view),\n      selectPrevious: () => selectPrevious(this.view),\n      replace: (text: string) => replace(this.view, text),\n      replaceAll: (text: string) => replaceAll(this.view, text),\n      clear: () => clear(this.view),\n    };\n  }\n\n  public getSpellingDoc(): EditorSpellingDoc {\n    return getSpellingDoc(this.view, this.extensions.pandocMarks(), this.context.ui.spelling);\n  }\n\n  public spellingInvalidateAllWords() {\n    invalidateAllWords(this.view);\n  }\n\n  public spellingInvalidateWord(word: string) {\n    invalidateWord(this.view, word);\n  }\n\n  // get a canonical version of the passed markdown. this method doesn't mutate the\n  // visual editor's state/view (it's provided as a performance optimiation for when\n  // source mode is configured to save a canonical version of markdown)\n  public async getCanonical(markdown: string, options: PandocWriterOptions): Promise<string> {\n    // convert to prosemirror doc\n    const result = await this.pandocConverter.toProsemirror(markdown, this.pandocFormat);\n\n    // create a state for this doc\n    const state = EditorState.create({\n      schema: this.schema,\n      doc: result.doc,\n      plugins: this.state.plugins,\n    });\n\n    // apply load fixups (eumlating what a full round trip will do)\n    const tr = state.tr;\n    this.extensionFixups(tr, FixupContext.Load);\n\n    // return markdown (will apply save fixups)\n    return this.getMarkdownCode(tr, options);\n  }\n\n  public getSelectedText(): string {\n    return this.state.doc.textBetween(this.state.selection.from, this.state.selection.to);\n  }\n\n  public replaceSelection(value: string): void {\n    // retrieve properties we need from selection\n    const { from, empty } = this.view.state.selection;\n\n    // retrieve selection marks\n    const marks = this.view.state.selection.$from.marks();\n\n    // insert text\n    const tr = this.view.state.tr.replaceSelectionWith(this.view.state.schema.text(value, marks), false);\n    this.view.dispatch(tr);\n\n    // update selection if necessary\n    if (!empty) {\n      const sel = TextSelection.create(this.view.state.doc, from, from + value.length);\n      const trSetSel = this.view.state.tr.setSelection(sel);\n      this.view.dispatch(trSetSel);\n    }\n  }\n\n  public getYamlFrontMatter() {\n    if (this.schema.nodes.yaml_metadata) {\n      return yamlFrontMatter(this.view.state.doc);\n    } else {\n      return '';\n    }\n  }\n\n  public applyYamlFrontMatter(yaml: string) {\n    if (this.schema.nodes.yaml_metadata) {\n      applyYamlFrontMatter(this.view, yaml);\n    }\n  }\n\n  public focus() {\n    this.view.focus();\n  }\n\n  public blur() {\n    (this.view.dom as HTMLElement).blur();\n  }\n\n  public insertChunk(chunkPlaceholder: string, rowOffset: number, colOffset: number) {\n    const insertCmd = insertRmdChunk(chunkPlaceholder, rowOffset, colOffset);\n    insertCmd(this.view.state, this.view.dispatch, this.view);\n    this.focus();\n  }\n\n  public navigate(type: NavigationType, location: string, recordCurrent = true, animate = false) {\n    // perform navigation\n    const nav = navigateTo(this.view, type, location, animate);\n\n    // emit event\n    if (nav !== null) {\n      if (!recordCurrent) {\n        nav.prevPos = -1;\n      }\n      this.emitEvent(NavigateEvent, nav);\n    }\n  }\n\n  public resize() {\n    this.syncContentWidth();\n    this.applyFixupsOnResize();\n    this.emitEvent(ResizeEvent);\n  }\n\n  public enableDevTools(initFn: (view: EditorView, stateClass: any) => void) {\n    initFn(this.view, { EditorState });\n  }\n\n  public getMenus(): EditorMenus {\n    return editorMenus(this.context.ui, this.commands());\n  }\n\n  public commands(): EditorCommand[] {\n    // get keybindings (merge user + default)\n    const commandKeys = this.commandKeys();\n\n    return this.extensions.commands(this.schema).map((command: ProsemirrorCommand) => {\n      return {\n        id: command.id,\n        keymap: commandKeys[command.id],\n        isActive: () => command.isActive(this.state),\n        isEnabled: () => command.isEnabled(this.state),\n        plural: () => command.plural(this.state),\n        execute: () => {\n          command.execute(this.state, this.view.dispatch, this.view);\n          if (command.keepFocus) {\n            this.focus();\n          }\n        },\n      };\n    });\n  }\n\n  public applyTheme(theme: EditorTheme) {\n    // set global mode classes\n    this.parent.classList.toggle('pm-dark-mode', !!theme.darkMode);\n    this.parent.classList.toggle('pm-solarized-mode', !!theme.solarizedMode);\n    // apply the rest of the theme\n    applyTheme(theme);\n  }\n\n  public setMaxContentWidth(maxWidth: number, minPadding = 10) {\n    this.maxContentWidth = maxWidth;\n    this.minContentPadding = minPadding;\n    this.syncContentWidth();\n  }\n\n  public setKeybindings(keyBindings: EditorKeybindings) {\n    // validate that all of these keys can be rebound\n\n    this.keybindings = keyBindings;\n    this.state = this.state.reconfigure({\n      schema: this.state.schema,\n      plugins: this.createPlugins(),\n    });\n  }\n\n  public getEditorFormat() {\n    return this.format;\n  }\n\n  public getPandocFormat() {\n    return this.pandocFormat;\n  }\n\n  public getPandocFormatConfig(isRmd: boolean): PandocFormatConfig {\n    return pandocFormatConfigFromDoc(this.state.doc, isRmd);\n  }\n\n  private dispatchTransaction(tr: Transaction) {\n    // track previous outline\n    const previousOutline = getOutline(this.state);\n\n    // track whether this was a selection-only transaction\n    this.lastTrSelectionOnly = tr.selectionSet && !tr.docChanged;\n\n    // apply the transaction\n    this.state = this.state.apply(tr);\n    this.view.updateState(this.state);\n\n    // notify listeners of state change\n    this.emitEvent(StateChangeEvent);\n\n    // notify listeners of updates\n    if (tr.docChanged || tr.storedMarksSet) {\n      // fire updated (unless this was a fixup)\n      if (!tr.getMeta(kFixupTransaction)) {\n        this.emitEvent(UpdateEvent);\n      }\n\n      // fire outline changed if necessary\n      if (getOutline(this.state) !== previousOutline) {\n        this.emitEvent(OutlineChangeEvent);\n      }\n    }\n\n    this.emitEvent(DispatchEvent, tr);\n\n    this.emitEvent(LayoutEvent);\n  }\n\n  private emitEvent<TDetail>(eventType: EventType<TDetail>, detail?: TDetail) {\n    this.events.emit(eventType, detail);\n  }\n\n  private initExtensions() {\n    return initExtensions(\n      {\n        format: this.format,\n        options: this.options,\n        ui: this.context.ui,\n        math: this.context.ui.math.typeset ? editorMath(this.context.ui) : undefined,\n        events: {\n          subscribe: this.subscribe.bind(this),\n          emit: this.emitEvent.bind(this),\n        },\n        pandocExtensions: this.pandocFormat.extensions,\n        pandocCapabilities: this.pandocCapabilities,\n        server: this.context.server,\n        navigation: {\n          navigate: this.navigate.bind(this),\n        },\n      },\n      this.context.extensions,\n    );\n  }\n\n  private registerCompletionExtension() {\n    // mark filter used to screen completions from noInputRules marks\n    const markFilter = markInputRuleFilter(this.schema, this.extensions.pandocMarks());\n\n    // register omni insert extension\n    this.extensions.register([\n      omniInsertExtension(this.extensions.omniInserters(this.schema), markFilter, this.context.ui),\n    ]);\n\n    // register completion extension\n    this.extensions.register([\n      completionExtension(this.extensions.completionHandlers(), markFilter, this.context.ui, this.events),\n    ]);\n  }\n\n  private registerRealtimeSpelling() {\n    this.extensions.registerPlugins(\n      [realtimeSpellingPlugin(this.schema, this.extensions.pandocMarks(), this.context.ui, this.events)],\n      true,\n    );\n  }\n\n  private createPlugins(): Plugin[] {\n    return [\n      baseKeysPlugin(this.extensions.baseKeys(this.schema)),\n      this.keybindingsPlugin(),\n      appendTransactionsPlugin(this.extensions.appendTransactions(this.schema)),\n      appendMarkTransactionsPlugin(this.extensions.appendMarkTransactions(this.schema)),\n      ...this.extensions.plugins(this.schema),\n      this.inputRulesPlugin(),\n      this.editablePlugin(),\n      this.domEventsPlugin(),\n    ];\n  }\n\n  private editablePlugin() {\n    const hooks = this.context.hooks || {};\n    return new Plugin({\n      key: new PluginKey('editable'),\n      props: {\n        editable: hooks.isEditable || (() => true),\n      },\n    });\n  }\n\n  private inputRulesPlugin() {\n    // filter for disabling input rules for selected marks\n    const markFilter = markInputRuleFilter(this.schema, this.extensions.pandocMarks());\n\n    // create the defautl inputRules plugin\n    const plugin = inputRules({ rules: this.extensions.inputRules(this.schema) });\n    const handleTextInput = plugin.props.handleTextInput!;\n\n    // override to disable input rules as requested\n    // https://github.com/ProseMirror/prosemirror-inputrules/commit/b4bf67623aa4c4c1e096c20aa649c0e63751f337\n    plugin.props.handleTextInput = (view: EditorView, from: number, to: number, text: string) => {\n      if (!markFilter(view.state)) {\n        return false;\n      }\n      return handleTextInput(view, from, to, text);\n    };\n    return plugin;\n  }\n\n  private domEventsPlugin(): Plugin {\n    return new Plugin({\n      key: new PluginKey('domevents'),\n      props: {\n        handleDOMEvents: {\n          blur: (view: EditorView, event: Event) => {\n            this.emitEvent(BlurEvent);\n            return false;\n          },\n          focus: (view: EditorView, event: Event) => {\n            this.emitEvent(FocusEvent, view.state.doc);\n            return false;\n          },\n          keydown: (view: EditorView, event: Event) => {\n            const kbEvent = event as KeyboardEvent;\n            if (kbEvent.key === 'Tab' && this.context.ui.prefs.tabKeyMoveFocus()) {\n              return true;\n            } else {\n              return false;\n            }\n          },\n        },\n      },\n    });\n  }\n\n  private keybindingsPlugin(): Plugin {\n    // get keybindings (merge user + default)\n    const commandKeys = this.commandKeys();\n\n    // command keys from extensions\n    const pluginKeys: { [key: string]: CommandFn } = {};\n    const commands = this.extensions.commands(this.schema);\n    commands.forEach((command: ProsemirrorCommand) => {\n      const keys = commandKeys[command.id];\n      if (keys) {\n        keys.forEach((key: string) => {\n          pluginKeys[key] = command.execute;\n        });\n      }\n    });\n\n    // for windows desktop, build a list of control key handlers b/c qtwebengine\n    // ends up corrupting ctrl+ keys so they don't hit the ace keybinding\n    // (see: https://github.com/rstudio/rstudio/issues/7142)\n    const ctrlKeyCodes: { [key: string]: CommandFn } = {};\n    Object.keys(pluginKeys).forEach(keyCombo => {\n      const match = keyCombo.match(/^Mod-([a-z\\\\])$/);\n      if (match) {\n        const key = match[1];\n        const keyCode = key === '\\\\' ? 'Backslash' : `Key${key.toUpperCase()}`;\n        ctrlKeyCodes[keyCode] = pluginKeys[keyCombo];\n      }\n    });\n\n    // create default prosemirror handler\n    const prosemirrorKeydownHandler = keydownHandler(pluginKeys);\n\n    // return plugin\n    return new Plugin({\n      key: keybindingsPlugin,\n      props: {\n        handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n          // workaround for Ctrl+ keys on windows desktop\n          if (this.context.ui.context.isWindowsDesktop()) {\n            const keyEvent = event as KeyboardEvent;\n            if (keyEvent.ctrlKey) {\n              const keyCommand = ctrlKeyCodes[keyEvent.code];\n              if (keyCommand && keyCommand(this.view.state)) {\n                keyCommand(this.view.state, this.view.dispatch, this.view);\n                return true;\n              }\n            }\n          }\n          // default handling\n          return prosemirrorKeydownHandler(view, event);\n        },\n      },\n    });\n  }\n\n  private commandKeys(): { [key: string]: readonly string[] } {\n    // start with keys provided within command definitions\n    const commands = this.extensions.commands(this.schema);\n    const defaultKeys = commands.reduce((keys: { [key: string]: readonly string[] }, command: ProsemirrorCommand) => {\n      keys[command.id] = command.keymap;\n      return keys;\n    }, {});\n\n    // merge with user keybindings\n    return {\n      ...defaultKeys,\n      ...this.keybindings,\n    };\n  }\n\n  // update parent padding based on content width settings (if specified)\n  private syncContentWidth() {\n    if (this.maxContentWidth && this.parent.clientWidth) {\n      const minContentPadding = this.minContentPadding || 10;\n      const parentWidth = this.parent.clientWidth;\n      if (parentWidth > this.maxContentWidth + 2 * minContentPadding) {\n        applyPadding(`calc((100% - ${this.maxContentWidth}px)/2)`);\n      } else {\n        applyPadding(this.minContentPadding + 'px');\n      }\n    }\n  }\n\n  private applyFixupsOnResize() {\n    const docChanged = this.applyFixups(FixupContext.Resize);\n    if (!docChanged) {\n      // If applyFixupsOnResize returns true, then layout has already\n      // been fired; if it hasn't, we must do so now\n      this.emitEvent(LayoutEvent);\n    }\n  }\n\n  private applyFixups(context: FixupContext) {\n    let tr = this.state.tr;\n    tr = this.extensionFixups(tr, context);\n    if (tr.docChanged) {\n      tr.setMeta(kAddToHistoryTransaction, false);\n      tr.setMeta(kFixupTransaction, true);\n      this.view.dispatch(tr);\n      return true;\n    }\n    return false;\n  }\n\n  private extensionFixups(tr: Transaction, context: FixupContext) {\n    this.extensions.fixups(this.schema, this.view).forEach(fixup => {\n      tr = fixup(tr, context);\n    });\n    return tr;\n  }\n\n  private initialDoc(): ProsemirrorNode {\n    return this.schema.nodeFromJSON({\n      type: 'doc',\n      attrs: {\n        initial: true,\n      },\n      content: [\n        { type: 'body', content: [{ type: 'paragraph' }] },\n        { type: 'notes', content: [] },\n      ],\n    });\n  }\n\n  private async getMarkdownCode(tr: Transaction, options: PandocWriterOptions) {\n    // apply save fixups\n    this.extensionFixups(tr, FixupContext.Save);\n\n    // apply sentence wrapping if requested\n    if (options.wrap === 'sentence') {\n      wrapSentences(tr);\n    }\n\n    // get code\n    return this.pandocConverter.fromProsemirror(tr.doc, this.pandocFormat, options);\n  }\n}\n\nfunction navigationIdForSelection(state: EditorState): string | null {\n  const outline = getOutlineNodes(state.doc);\n  const outlineNode = outline.reverse().find(node => node.pos < state.selection.from);\n  if (outlineNode) {\n    return outlineNode.node.attrs.navigation_id;\n  } else {\n    return null;\n  }\n}\n\n// custom DOMParser that preserves all whitespace (required by display math marks)\nclass EditorDOMParser extends DOMParser {\n  constructor(schema: Schema) {\n    super(schema, DOMParser.fromSchema(schema).rules);\n  }\n  public parse(dom: Node, options?: ParseOptions) {\n    return super.parse(dom, { ...options, preserveWhitespace: 'full' });\n  }\n\n  public parseSlice(dom: Node, options?: ParseOptions) {\n    return super.parseSlice(dom, { ...options, preserveWhitespace: 'full' });\n  }\n}\n","/*\n * cite.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CSLName, CSLDate, CSL } from './csl';\nimport { InsertCiteProps, InsertCiteUI } from './ui-dialogs';\nimport { urlForDOI } from './doi';\n\nexport const kInvalidCiteKeyChars = /[\\]\\[\\s@',\\\\\\#}{~%&\\$\\^_]/g;\nconst kCiteIdLeadingLength = 8;\n\nexport function createUniqueCiteId(existingIds: string[], baseId: string): string {\n  let count = 0;\n\n  // Remove any non-8bit ascii characters\n  let asciiOnlyBaseId = '';\n  for (let i = 0; i < baseId.length; i++) {\n    const char = baseId.charCodeAt(i);\n    if (char <= 255) {\n      asciiOnlyBaseId = asciiOnlyBaseId + String.fromCharCode(char);\n    }\n  }\n\n  // If there are no characters left, just used a placeholder\n  if (asciiOnlyBaseId.length === 0) {\n    asciiOnlyBaseId = 'cite';\n  }\n\n  // The base ID but with invalid characters replaced\n  let safeBaseId = asciiOnlyBaseId.replace(kInvalidCiteKeyChars, '');\n\n  // Ensure that this is a valid citation, stripping any invalid characters\n  let proposedId = safeBaseId;\n\n  // If there is a conflict with an existing id, we will append\n  // the following character and try again. If the conflict continues with\n  // the postfix character added, we'll increment and keep going through the\n  // alphabet\n  const disambiguationStartCharacter = 97; // a\n\n  while (existingIds.includes(proposedId)) {\n    // If we've wrapped around to a and we haven't found a unique entry\n    // Add an 'a' to the end and try again. Will ultimately create an entry like\n    // Teague2012aaaf\n    if (count !== 0 && count % 26 === 0) {\n      safeBaseId = safeBaseId + String.fromCharCode(disambiguationStartCharacter);\n    }\n\n    const postfix = String.fromCharCode(disambiguationStartCharacter + (count % 26));\n    proposedId = safeBaseId + postfix;\n    count++;\n  }\n  return proposedId;\n}\n\n// Suggests a bibliographic identifier based upon the source\nexport function suggestCiteId(existingIds: string[], csl: CSL) {\n  const author = csl.author;\n  const issued = csl.issued;\n\n  // Try to get the last name\n  let citeIdLeading = '';\n  if (author && author.length > 0) {\n    if (author[0].family) {\n      citeIdLeading = author[0].family;\n    } else if (author[0].literal) {\n      citeIdLeading = author[0].literal;\n    }\n  }\n\n  // If we can't use author information, try using short title,\n  // the title, or perhaps the type to construct a leading part of the\n  // citeId.\n  if (citeIdLeading.length === 0) {\n    const shortTitle = csl['short-title'];\n    if (shortTitle && shortTitle?.length > 0) {\n      citeIdLeading = shortTitle.substr(0, Math.min(kCiteIdLeadingLength, shortTitle.length));\n    } else if (csl.title) {\n      citeIdLeading = csl.title.substr(0, Math.min(kCiteIdLeadingLength, csl.title.length));\n    } else {\n      citeIdLeading = csl.type;\n    }\n  }\n\n  // Try to get the publication year\n  let datePart = '';\n  if (issued && issued['date-parts'] && issued['date-parts'].length > 0) {\n    const yearIssued = issued['date-parts'][0][0];\n    // Sometimes, data arrives with a null value, ignore null\n    if (yearIssued) {\n      datePart = yearIssued + '';\n    }\n  }\n\n  // Create a deduplicated string against the existing entries\n  let baseId = `${citeIdLeading.toLowerCase()}${datePart}`;\n  if (baseId.length === 0) {\n    baseId = 'untitled';\n  }\n\n  return createUniqueCiteId(existingIds, baseId);\n}\n\nexport interface CiteField {\n  name: string;\n  value: string;\n}\n\nexport function urlForCitation(csl: CSL): string | undefined {\n  if (csl.URL) {\n    return csl.URL;\n  } else if (csl.DOI) {\n    return urlForDOI(csl.DOI);\n  }\n}\n\nexport function formatForPreview(csl: CSL): CiteField[] {\n  const pairs = new Array<CiteField>();\n  if (csl.title) {\n    pairs.push({ name: 'Title', value: csl.title });\n  }\n  pairs.push({ name: 'Authors', value: formatAuthors(csl.author, 255) });\n  if (csl.issued && isValidDate(csl.issued)) {\n    pairs.push({ name: 'Issue Date', value: formatIssuedDate(csl.issued) });\n  }\n\n  const containerTitle = csl['container-title'];\n  if (containerTitle) {\n    pairs.push({ name: 'Publication', value: containerTitle });\n  }\n\n  const volume = csl.volume;\n  if (volume) {\n    pairs.push({ name: 'Volume', value: volume });\n  }\n\n  const page = csl.page;\n  if (page) {\n    pairs.push({ name: 'Page(s)', value: page });\n  }\n\n  const cslAny = csl as { [key: string]: any };\n  Object.keys(csl).forEach(key => {\n    if (!kFilteredFields.includes(key)) {\n      const value = cslAny[key];\n      // Don't display complex fields or fields that aren't strings\n      if (typeof value === 'string') {\n        // Capitalize preview names\n        const name = key.charAt(0).toUpperCase() + key.slice(1);\n        pairs.push({ name, value });\n      }\n    }\n  });\n\n  return pairs;\n}\n\nconst kFilteredFields = [\n  'id',\n  'title',\n  'author',\n  'issued',\n  'container-title',\n  'volume',\n  'page',\n  'abstract',\n  'provider',\n];\n\n// Sometimes, data arrives with a null value\n// This function will validate that the year (required) doesn't\n// contain null\nfunction isValidDate(date: CSLDate): boolean {\n  const dateParts = date['date-parts'];\n  if (dateParts) {\n    const invalidElement = dateParts.find(datePart => datePart[0] === null);\n    return invalidElement === undefined;\n  }\n  return true;\n}\n\n// TODO: Needs to support localization of the templated strings\nconst kEtAl = 'et al.';\nexport function formatAuthors(authors?: CSLName[], maxLength?: number): string {\n  // No author(s) specified\n  if (!authors || authors.length === 0) {\n    return '';\n  }\n\n  return authors\n    .map(author => {\n      if (author.literal?.length) {\n        return author.literal;\n      } else if (author.given?.length && author.family?.length) {\n        // Family and Given name\n        return `${author.family}, ${author.given.substring(0, 1)}`;\n      } else if (author.family?.length) {\n        // Family name only\n        return `${author.family}`;\n      } else {\n        return '';\n      }\n    })\n    .reduce((previous, current, index, array) => {\n      // Ignore any additional authors if the string\n      // exceeds the maximum length\n      if ((maxLength && previous.length >= maxLength) || previous.endsWith(kEtAl)) {\n        return previous;\n      }\n\n      if (index === 0) {\n        // Too long, truncate\n        if (maxLength && current.length > maxLength) {\n          return `${current.substring(0, maxLength - 1)}…`;\n        }\n        // The first author\n        return current;\n      } else if (index > 0 && index === array.length - 1) {\n        // The last author\n        return addAuthorOrEtAl(previous, `${previous}, and ${current}`, maxLength);\n      } else {\n        // Middle authors\n        return addAuthorOrEtAl(previous, `${previous}, ${current}`, maxLength);\n      }\n    });\n}\n\nfunction addAuthorOrEtAl(previousAuthorStr: string, newAuthorStr: string, maxLength?: number) {\n  // if adding the string would make it too long, truncate\n  if (maxLength && newAuthorStr.length > maxLength) {\n    return etAl(previousAuthorStr, maxLength);\n  }\n  return newAuthorStr;\n}\n\nfunction etAl(authorStr: string, maxLength: number) {\n  // First try just using et al., then shorten existing\n  // author to accomodate\n  const etAlStr = `${authorStr} ${kEtAl}`;\n  if (maxLength && etAlStr.length > maxLength) {\n    // First try to truncate to a space\n    const lastSpace = authorStr.lastIndexOf(' ');\n    if (lastSpace) {\n      return `${authorStr.substr(0, lastSpace)} ${kEtAl}`;\n    } else {\n      // As a last resort, truncate with ellipsis\n      const excessLength = etAlStr.length - maxLength - 1;\n      return `${authorStr.substr(0, authorStr.length - excessLength)}… ${kEtAl}`;\n    }\n  }\n  return etAlStr;\n}\n\n// TODO: Needs to support localization of the templated strings\nexport function formatIssuedDate(date: CSLDate | undefined): string {\n  // No issue date for this\n  if (!date) {\n    return '';\n  }\n\n  const dateParts = date['date-parts'];\n  if (dateParts) {\n    switch (dateParts.length) {\n      // There is a date range\n      case 2:\n        return `${dateParts[0][0]}-${dateParts[1][0]}`;\n      // Only a single date\n      case 1:\n        // Note that it is possible to receive an entry with a single null entry\n        // For examples:\n        // 10.1163/1874-6772_seg_a44_588\n        const singleDatePart = dateParts[0][0];\n        return `${singleDatePart ? singleDatePart : ''}`;\n\n      // Seems like a malformed date :(\n      case 0:\n      default:\n        return '';\n    }\n  }\n  return '';\n}\n\nexport function citeUI(citeProps: InsertCiteProps): InsertCiteUI {\n  if (citeProps.csl) {\n    const suggestedId = suggestCiteId(citeProps.existingIds, citeProps.csl);\n    const previewFields = formatForPreview(citeProps.csl);\n    return {\n      suggestedId,\n      previewFields,\n    };\n  } else {\n    // This should never happen - this function should always be called with a work\n    return {\n      suggestedId: '',\n      previewFields: [],\n    };\n  }\n}\n","/*\n * doi.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface DOIResult {\n  status: 'ok' | 'notfound' | 'nohost' | 'error';\n  message: any | null;\n  error: string;\n}\n\nexport interface DOIServer {\n  fetchCSL: (doi: string, progressDelay: number) => Promise<DOIResult>;\n}\n\n// ^10.\\d{4,9}/[-._;()/:A-Z0-9]+$\n// Core regexes come from https://www.crossref.org/blog/dois-and-matching-regular-expressions/\nconst kModernCrossrefDOIRegex = /10.\\d{4,9}\\/[-._;()/:A-Z0-9]+$/i;\nconst kEarlyWileyCrossrefDOIRegex = /10.1002\\/[^\\s]+$/i;\nconst kOtherCrossrefDOIRegex1 = /10.\\\\d{4}\\/\\d+-\\d+X?(\\d+)\\d+<[\\d\\w]+:[\\d\\w]*>\\d+.\\d+.\\w+;\\d$/i;\nconst kOtherCrossrefDOIRegex2 = /10.1021\\/\\w\\w\\d+$/i;\nconst kOtherCrossrefDOIRegex3 = /10.1207\\/[\\w\\d]+\\&\\d+_\\d+$/i;\n\nconst kCrossrefMatches = [\n  kModernCrossrefDOIRegex,\n  kEarlyWileyCrossrefDOIRegex,\n  kOtherCrossrefDOIRegex1,\n  kOtherCrossrefDOIRegex2,\n  kOtherCrossrefDOIRegex3,\n];\n\n// Determines whether a a given string may be a DOI\n// Note that this will validate the form of the string, but not\n// whether it is actually a registered DOI\nexport function hasDOI(token: string): boolean {\n  return findDOI(token) !== undefined;\n}\n\nexport function findDOI(token: string): string | undefined {\n  let match = null;\n  kCrossrefMatches.find(regex => {\n    match = token.match(regex);\n    return match && match[0].length > 0;\n  });\n\n  if (match === null) {\n    return undefined;\n  } else {\n    return match[0];\n  }\n}\n\nexport function urlForDOI(doi: string): string {\n  return `https://doi.org/${doi}`;\n}\n","/*\n * ui-dialogs.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { LinkTargets, LinkCapabilities, LinkType } from './link';\nimport { ImageDimensions } from './image';\nimport { ListCapabilities, ListType } from './list';\nimport { TableCapabilities } from './table';\nimport { CSL } from './csl';\nimport { CiteField } from './cite';\nimport { kStyleAttrib, attrPartitionKeyvalue, pandocAttrKeyvalueFromText } from './pandoc_attr';\n\nexport interface EditorDialogs {\n  alert: AlertFn;\n  yesNoMessage: YesNoMessageFn;\n  editLink: LinkEditorFn;\n  editImage: ImageEditorFn;\n  editCodeBlock: CodeBlockEditorFn;\n  editList: ListEditorFn;\n  editAttr: AttrEditorFn;\n  editSpan: AttrEditorFn;\n  editDiv: DivAttrEditorFn;\n  editRawInline: RawFormatEditorFn;\n  editRawBlock: RawFormatEditorFn;\n  insertTable: InsertTableFn;\n  insertCite: InsertCiteFn;\n  htmlDialog: EditorHTMLDialogFn;\n}\n\nexport type EditorHTMLDialogFn = (\n  title: string,\n  okText: string | null,\n  create: EditorHTMLDialogCreateFn,\n  focus: VoidFunction,\n  validate: EditorHTMLDialogValidateFn,\n) => Promise<boolean>;\n\nexport type EditorHTMLDialogCreateFn = (\n  containerWidth: number,\n  containerHeight: number,\n  confirm: VoidFunction,\n  cancel: VoidFunction,\n  showProgress: (message: string) => void,\n  hideProgress: VoidFunction,\n) => HTMLElement;\n\nexport type EditorHTMLDialogValidateFn = () => string | null;\n\nexport const kAlertTypeInfo = 1;\nexport const kAlertTypeWarning = 2;\nexport const kAlertTypeError = 3;\n\nexport type AlertFn = (message: string, title: string, type: number) => Promise<boolean>;\n\nexport type YesNoMessageFn = (\n  message: string,\n  title: string,\n  type: number,\n  yesLabel: string,\n  noLabel: string,\n) => Promise<boolean>;\n\nexport type AttrEditorFn = (attr: AttrProps, idHint?: string) => Promise<AttrEditResult | null>;\n\nexport type DivAttrEditorFn = (attr: AttrProps, removeEnabled: boolean) => Promise<AttrEditResult | null>;\n\nexport type LinkEditorFn = (\n  link: LinkProps,\n  targets: LinkTargets,\n  capabilities: LinkCapabilities,\n) => Promise<LinkEditResult | null>;\n\nexport type ImageEditorFn = (\n  image: ImageProps,\n  dims: ImageDimensions | null,\n  editAttributes: boolean,\n) => Promise<ImageEditResult | null>;\n\nexport type CodeBlockEditorFn = (\n  codeBlock: CodeBlockProps,\n  attributes: boolean,\n  languages: string[],\n) => Promise<CodeBlockEditResult | null>;\n\nexport type ListEditorFn = (list: ListProps, capabilities: ListCapabilities) => Promise<ListEditResult | null>;\n\nexport type RawFormatEditorFn = (raw: RawFormatProps, outputFormats: string[]) => Promise<RawFormatResult | null>;\n\nexport type InsertTableFn = (capabilities: TableCapabilities) => Promise<InsertTableResult | null>;\n\nexport type InsertCiteFn = (props: InsertCiteProps) => Promise<InsertCiteResult | null>;\n\nexport interface AttrProps {\n  readonly id?: string;\n  readonly classes?: string[];\n  readonly keyvalue?: Array<[string, string]>;\n}\n\nexport interface AttrEditResult {\n  readonly action: 'edit' | 'remove';\n  readonly attr: AttrProps;\n}\n\nexport interface LinkProps extends AttrProps {\n  readonly type: LinkType;\n  readonly text: string;\n  readonly href: string;\n  readonly heading?: string;\n  readonly title?: string;\n}\n\nexport interface LinkEditResult {\n  readonly action: 'edit' | 'remove';\n  readonly link: LinkProps;\n}\n\nexport interface ImageProps extends AttrProps {\n  src: string | null;\n  title?: string;\n  alt?: string;\n  linkTo?: string;\n  width?: number;\n  height?: number;\n  units?: string;\n  lockRatio?: boolean;\n}\n\nexport type ImageEditResult = ImageProps;\n\nexport interface CodeBlockProps extends AttrProps {\n  lang: string;\n}\n\nexport type CodeBlockEditResult = CodeBlockProps;\n\nexport interface ListProps {\n  type: ListType;\n  tight: boolean;\n  order: number;\n  number_style: string;\n  number_delim: string;\n}\n\nexport type ListEditResult = ListProps;\n\nexport interface InsertTableResult {\n  rows: number;\n  cols: number;\n  header: boolean;\n  caption?: string;\n}\n\nexport interface InsertCiteProps {\n  doi: string;\n  existingIds: string[];\n  bibliographyFiles: string[];\n  provider?: string;\n  csl?: CSL;\n  citeUI?: InsertCiteUI;\n}\n\nexport interface InsertCiteUI {\n  suggestedId: string;\n  previewFields: CiteField[];\n}\n\nexport interface InsertCiteResult {\n  id: string;\n  bibliographyFile: string;\n  csl: CSL;\n}\n\nexport interface RawFormatProps {\n  content: string;\n  format: string;\n}\n\nexport interface RawFormatResult {\n  readonly action: 'edit' | 'remove';\n  readonly raw: RawFormatProps;\n}\n\nexport interface AttrEditInput {\n  id?: string;\n  classes?: string;\n  style?: string;\n  keyvalue?: string;\n}\n\nexport function attrInputToProps(attr: AttrEditInput): AttrProps {\n  const classes = attr.classes ? attr.classes.split(/\\s+/) : [];\n  let keyvalue: Array<[string, string]> | undefined;\n  if (attr.keyvalue || attr.style) {\n    let text = attr.keyvalue || '';\n    if (attr.style) {\n      text += `\\nstyle=${attr.style}\\n`;\n    }\n    keyvalue = pandocAttrKeyvalueFromText(text, '\\n');\n  }\n  return {\n    id: asPandocId(attr.id || ''),\n    classes: classes.map(asPandocClass),\n    keyvalue,\n  };\n}\n\nfunction asPandocId(id: string) {\n  return id.replace(/^#/, '');\n}\n\nfunction asPandocClass(clz: string) {\n  return clz.replace(/^\\./, '');\n}\n\nexport function attrPropsToInput(attr: AttrProps): AttrEditInput {\n  let style: string | undefined;\n  let keyvalue: string | undefined;\n  if (attr.keyvalue) {\n    const partitionedKeyvalue = attrPartitionKeyvalue([kStyleAttrib], attr.keyvalue);\n    if (partitionedKeyvalue.partitioned.length > 0) {\n      style = partitionedKeyvalue.partitioned[0][1];\n    }\n    keyvalue = attrTextFromKeyvalue(partitionedKeyvalue.base);\n  }\n\n  return {\n    id: asHtmlId(attr.id) || undefined,\n    classes: attr.classes ? attr.classes.map(asHtmlClass).join(' ') : undefined,\n    style,\n    keyvalue,\n  };\n}\n\nfunction attrTextFromKeyvalue(keyvalue: Array<[string, string]>) {\n  return keyvalue.map(kv => `${kv[0]}=${kv[1]}`).join('\\n');\n}\n\nfunction asHtmlId(id: string | undefined) {\n  if (id) {\n    if (id.startsWith('#')) {\n      return id;\n    } else {\n      return '#' + id;\n    }\n  } else {\n    return id;\n  }\n}\n\nfunction asHtmlClass(clz: string | undefined) {\n  if (clz) {\n    if (clz.startsWith('.')) {\n      return clz;\n    } else {\n      return '.' + clz;\n    }\n  } else {\n    return clz;\n  }\n}\n","/*\n * pandoc_attr.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeSpec, MarkSpec } from 'prosemirror-model';\n\nimport { PandocToken, PandocExtensions } from './pandoc';\nimport { extensionEnabled, extensionIfEnabled, Extension } from './extension';\n\nexport const kPandocAttrId = 0;\nexport const kPandocAttrClasses = 1;\nexport const kPandocAttrKeyvalue = 2;\n\nconst kDataPmPandocAttr = 'data-pm-pandoc-attr';\n\nexport const kWidthAttrib = 'width';\nexport const kHeightAttrib = 'height';\nexport const kStyleAttrib = 'style';\nexport const kAlignAttrib = 'align';\n\nexport const kCodeBlockAttr = 0;\nexport const kCodeBlockText = 1;\n\nexport const kSpanAttr = 0;\nexport const kSpanChildren = 1;\n\nexport interface PandocAttr {\n  id: string;\n  classes: string[];\n  keyvalue: Array<[string, string]>;\n}\n\nexport const pandocAttrSpec = {\n  id: { default: null },\n  classes: { default: [] },\n  keyvalue: { default: [] },\n};\n\nexport function pandocAttrAvailable(attrs: any) {\n  return !!attrs.id || (attrs.classes && attrs.classes.length > 0) || (attrs.keyvalue && attrs.keyvalue.length > 0);\n}\n\nexport function pandocAttrFrom(attrs: any) {\n  const pandocAttr: any = {};\n  if (attrs.id) {\n    pandocAttr.id = attrs.id;\n  }\n  if (attrs.classes) {\n    pandocAttr.classes = attrs.classes;\n  }\n  if (attrs.keyvalue) {\n    pandocAttr.keyvalue = attrs.keyvalue;\n  }\n\n  return pandocAttr;\n}\n\nexport function pandocAttrInSpec(spec: NodeSpec | MarkSpec) {\n  const keys = Object.keys((spec.attrs as object) || {});\n  return keys.includes('id') && keys.includes('classes') && keys.includes('keyvalue');\n}\n\nexport function pandocAttrReadAST(tok: PandocToken, index: number) {\n  const pandocAttr = tok.c[index];\n  return {\n    id: pandocAttr[kPandocAttrId] || undefined,\n    classes: pandocAttr[kPandocAttrClasses],\n    keyvalue: pandocAttr[kPandocAttrKeyvalue],\n  };\n}\n\nexport function pandocAttrToDomAttr(attrs: any, marker = true) {\n  // id and class\n  const domAttr: any = {};\n  if (attrs.id) {\n    domAttr.id = attrs.id;\n  }\n  if (attrs.classes && attrs.classes.length > 0) {\n    domAttr.class = attrs.classes.join(' ');\n  }\n\n  // keyvalue pairs\n  attrs.keyvalue.forEach((keyvalue: [string, string]) => {\n    domAttr[keyvalue[0]] = keyvalue[1];\n  });\n\n  // marker\n  if (marker) {\n    domAttr[kDataPmPandocAttr] = '1';\n  }\n\n  return domAttr;\n}\n\nexport function pandocAttrParseDom(el: Element, attrs: { [key: string]: string | null }, forceAttrs = false) {\n  // exclude any keys passed to us\n  const excludedNames = Object.keys(attrs);\n\n  // if this isn't from a prosemirror pandoc node then include only src and alt\n  const includedNames: string[] = [];\n  if (!forceAttrs && !el.hasAttribute(kDataPmPandocAttr)) {\n    includedNames.push('src', 'alt');\n  }\n\n  // read attributes\n  const attr: any = {};\n  attr.classes = [];\n  attr.keyvalue = [];\n  el.getAttributeNames().forEach(name => {\n    const value: string = el.getAttribute(name) as string;\n    // exclude attributes already parsed and prosemirror internal attributes\n    if (excludedNames.indexOf(name) === -1 && !name.startsWith('data-pm')) {\n      // if we have an include filter then use it\n      if (!includedNames.length || includedNames.includes(name)) {\n        if (name === 'id') {\n          attr.id = value;\n        } else if (name === 'class') {\n          attr.classes = value\n            .split(/\\s+/)\n            .filter(val => !!val.length)\n            .filter(val => !val.startsWith('pm-'));\n        } else {\n          attr.keyvalue.push([name, value]);\n        }\n      }\n    }\n  });\n  return attr;\n}\n\nexport function pandocAttrParseText(attr: string): PandocAttr | null {\n  attr = attr.trim();\n\n  let id = '';\n  const classes: string[] = [];\n  let remainder = '';\n\n  let current = '';\n  const resolveCurrent = () => {\n    const resolve = current;\n    current = '';\n\n    if (resolve.length === 0) {\n      return true;\n    } else if (resolve.startsWith('#')) {\n      if (id.length === 0 && resolve.length > 1) {\n        id = resolve.substr(1);\n        return true;\n      } else {\n        return false;\n      }\n    } else if (resolve.startsWith('.')) {\n      if (resolve.length > 1) {\n        classes.push(resolve.substr(1));\n        return true;\n      } else {\n        return false;\n      }\n    } else {\n      remainder = resolve;\n      return true;\n    }\n  };\n\n  for (let i = 0; i < attr.length; i++) {\n    let inQuotes = false;\n    const ch = attr[i];\n    inQuotes = ch === '\"' ? !inQuotes : inQuotes;\n    if (ch !== ' ' && !inQuotes) {\n      current += ch;\n    } else if (resolveCurrent()) {\n      // if we have a remainder then the rest of the string is the remainder\n      if (remainder.length > 0) {\n        remainder = remainder + attr.substr(i);\n        break;\n      }\n    } else {\n      return null;\n    }\n  }\n\n  if (resolveCurrent()) {\n    if (id.length === 0 && classes.length === 0) {\n      remainder = attr;\n    }\n    return {\n      id,\n      classes,\n      keyvalue: remainder.length > 0 ? pandocAttrKeyvalueFromText(remainder, ' ') : [],\n    };\n  } else {\n    return null;\n  }\n}\n\nexport function pandocAttrKeyvalueFromText(text: string, separator: ' ' | '\\n'): Array<[string, string]> {\n  // if the separator is a space then convert unquoted spaces to newline\n  if (separator === ' ') {\n    let convertedText = '';\n    let inQuotes = false;\n    for (let i = 0; i < text.length; i++) {\n      let ch = text.charAt(i);\n      if (ch === '\"') {\n        inQuotes = !inQuotes;\n      } else if (ch === ' ' && !inQuotes) {\n        ch = '\\n';\n      }\n      convertedText += ch;\n    }\n    text = convertedText;\n  }\n\n  const lines = text.trim().split('\\n');\n  return lines.map(line => {\n    const parts = line.trim().split('=');\n    return [parts[0], (parts[1] || '').replace(/^\"/, '').replace(/\"$/, '')];\n  });\n}\n\nexport interface AttrKeyvaluePartitioned {\n  base: Array<[string, string]>;\n  partitioned: Array<[string, string]>;\n}\n\nexport function attrPartitionKeyvalue(partition: string[], keyvalue: Array<[string, string]>): AttrKeyvaluePartitioned {\n  const base = new Array<[string, string]>();\n  const partitioned = new Array<[string, string]>();\n\n  keyvalue.forEach(kv => {\n    if (partition.includes(kv[0])) {\n      partitioned.push(kv);\n    } else {\n      base.push(kv);\n    }\n  });\n\n  return {\n    base,\n    partitioned,\n  };\n}\n\nexport function extensionIfPandocAttrEnabled(extension: Extension) {\n  return extensionIfEnabled(extension, kPandocAttrExtensions);\n}\n\nexport function pandocAttrEnabled(pandocExtensions: PandocExtensions) {\n  return extensionEnabled(pandocExtensions, kPandocAttrExtensions);\n}\n\nconst kPandocAttrExtensions = [\n  'link_attributes',\n  'mmd_link_attributes',\n  'mmd_header_identifiers',\n  'header_attributes',\n  'fenced_code_attributes',\n  'inline_code_attributes',\n  'bracketed_spans',\n  'native_spans',\n  'fenced_divs',\n  'native_divs',\n];\n","/*\n * extension.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Schema } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ProsemirrorCommand } from './command';\nimport { PandocMark } from './mark';\nimport { PandocNode } from './node';\nimport { EditorUI } from './ui';\nimport { BaseKeyBinding } from './basekeys';\nimport { AppendTransactionHandler, AppendMarkTransactionHandler } from './transaction';\nimport { EditorOptions } from './options';\nimport { PandocExtensions } from './pandoc';\nimport { FixupFn } from './fixup';\nimport { EditorEvents } from './events';\nimport { PandocCapabilities } from './pandoc_capabilities';\nimport { EditorFormat } from './format';\nimport { MarkInputRuleFilter } from './input_rule';\nimport { CompletionHandler } from './completion';\nimport { EditorNavigation } from './navigation';\nimport { EditorMath } from './math';\nimport { EditorServer } from './server';\n\nexport interface Extension {\n  marks?: PandocMark[];\n  nodes?: PandocNode[];\n  baseKeys?: (schema: Schema) => readonly BaseKeyBinding[];\n  inputRules?: (schema: Schema, markFilter: MarkInputRuleFilter) => readonly InputRule[];\n  commands?: (schema: Schema) => readonly ProsemirrorCommand[];\n  plugins?: (schema: Schema) => readonly Plugin[];\n  appendTransaction?: (schema: Schema) => readonly AppendTransactionHandler[];\n  appendMarkTransaction?: (schema: Schema) => readonly AppendMarkTransactionHandler[];\n  fixups?: (schema: Schema, view: EditorView) => Readonly<FixupFn[]>;\n  completionHandlers?: () => readonly CompletionHandler[];\n}\n\nexport interface ExtensionContext {\n  pandocExtensions: PandocExtensions;\n  pandocCapabilities: PandocCapabilities;\n  server: EditorServer;\n  ui: EditorUI;\n  math?: EditorMath;\n  format: EditorFormat;\n  options: EditorOptions;\n  events: EditorEvents;\n  navigation: EditorNavigation;\n}\n\nexport type ExtensionFn = (context: ExtensionContext) => Extension | null;\n\n// create an ExtensionFn for a given extension and format option that must be enabled\nexport function extensionIfEnabled(extension: Extension, name: string | string[]) {\n  return (context: ExtensionContext) => {\n    if (extensionEnabled(context.pandocExtensions, name)) {\n      return extension;\n    } else {\n      return null;\n    }\n  };\n}\n\nexport function extensionEnabled(pandocExtensions: PandocExtensions, name: string | string[]) {\n  // match single extension name\n  if (typeof name === 'string') {\n    if (pandocExtensions[name]) {\n      return true;\n    }\n\n    // match any one of several names\n  } else if (Array.isArray(name)) {\n    for (const nm of name) {\n      if (pandocExtensions[nm]) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n","/*\n * pandoc_capabilities.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PandocServer, parsePandocListOutput, PandocApiVersion } from './pandoc';\n\nexport interface PandocCapabilitiesResult {\n  version: string;\n  api_version: PandocApiVersion;\n  output_formats: string;\n  highlight_languages: string;\n}\n\nexport interface PandocCapabilities {\n  version: string;\n  api_version: PandocApiVersion;\n  output_formats: string[];\n  highlight_languages: string[];\n}\n\nexport async function getPandocCapabilities(server: PandocServer) {\n  const result = await server.getCapabilities();\n  return {\n    version: result.version,\n    api_version: result.api_version,\n    output_formats: parsePandocListOutput(result.output_formats),\n    highlight_languages: parsePandocListOutput(result.highlight_languages),\n  };\n}\n","/*\n * pandoc.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Node as ProsemirrorNode, Schema, NodeType } from 'prosemirror-model';\n\nimport { PandocAttr, pandocAttrReadAST, kSpanChildren, kSpanAttr } from './pandoc_attr';\nimport { PandocCapabilitiesResult } from './pandoc_capabilities';\nimport { kQuoteType, kQuoteChildren, QuoteType } from './quote';\nimport { BibliographyResult } from './bibliography/bibliography-provider_local';\n\nimport { stringifyMath } from './math';\nimport { kCodeText } from './code';\nimport { kLinkChildren } from './link';\n\nexport interface PandocServer {\n  getCapabilities(): Promise<PandocCapabilitiesResult>;\n  markdownToAst(markdown: string, format: string, options: string[]): Promise<PandocAst>;\n  astToMarkdown(ast: PandocAst, format: string, options: string[]): Promise<string>;\n  listExtensions(format: string): Promise<string>;\n  getBibliography(\n    file: string | null,\n    bibliography: string[],\n    refBlock: string | null,\n    etag: string | null,\n  ): Promise<BibliographyResult>;\n  addToBibliography(\n    bibliography: string,\n    project: boolean,\n    id: string,\n    sourceAsJson: string,\n    sourceAsBibTeX: string,\n  ): Promise<boolean>;\n  citationHTML(file: string | null, sourceAsJson: string, csl: string | null): Promise<string>;\n}\n\nexport interface PandocWriterReferencesOptions {\n  location?: string; // block | section | document\n  prefix?: string;\n}\n\nexport interface PandocWriterOptions {\n  atxHeaders?: boolean;\n  references?: PandocWriterReferencesOptions;\n  wrap?: string;\n  dpi?: number;\n}\n\nexport interface PandocExtensions {\n  abbreviations: boolean;\n  all_symbols_escapable: boolean;\n  amuse: boolean;\n  angle_brackets_escapable: boolean;\n  ascii_identifiers: boolean;\n  auto_identifiers: boolean;\n  autolink_bare_uris: boolean;\n  backtick_code_blocks: boolean;\n  blank_before_blockquote: boolean;\n  blank_before_header: boolean;\n  bracketed_spans: boolean;\n  citations: boolean;\n  compact_definition_lists: boolean;\n  definition_lists: boolean;\n  east_asian_line_breaks: boolean;\n  emoji: boolean;\n  empty_paragraphs: boolean;\n  epub_html_exts: boolean;\n  escaped_line_breaks: boolean;\n  example_lists: boolean;\n  fancy_lists: boolean;\n  fenced_code_attributes: boolean;\n  fenced_code_blocks: boolean;\n  fenced_divs: boolean;\n  footnotes: boolean;\n  four_space_rule: boolean;\n  gfm_auto_identifiers: boolean;\n  grid_tables: boolean;\n  hard_line_breaks: boolean;\n  header_attributes: boolean;\n  ignore_line_breaks: boolean;\n  implicit_figures: boolean;\n  implicit_header_references: boolean;\n  inline_code_attributes: boolean;\n  inline_notes: boolean;\n  intraword_underscores: boolean;\n  latex_macros: boolean;\n  line_blocks: boolean;\n  link_attributes: boolean;\n  lists_without_preceding_blankline: boolean;\n  literate_haskell: boolean;\n  markdown_attribute: boolean;\n  markdown_in_html_blocks: boolean;\n  mmd_header_identifiers: boolean;\n  mmd_link_attributes: boolean;\n  mmd_title_block: boolean;\n  multiline_tables: boolean;\n  native_divs: boolean;\n  native_spans: boolean;\n  native_numbering: boolean;\n  ntb: boolean;\n  old_dashes: boolean;\n  pandoc_title_block: boolean;\n  pipe_tables: boolean;\n  raw_attribute: boolean;\n  raw_html: boolean;\n  raw_tex: boolean;\n  shortcut_reference_links: boolean;\n  simple_tables: boolean;\n  smart: boolean;\n  space_in_atx_header: boolean;\n  spaced_reference_links: boolean;\n  startnum: boolean;\n  strikeout: boolean;\n  subscript: boolean;\n  superscript: boolean;\n  styles: boolean;\n  task_lists: boolean;\n  table_captions: boolean;\n  tex_math_dollars: boolean;\n  tex_math_double_backslash: boolean;\n  tex_math_single_backslash: boolean;\n  yaml_metadata_block: boolean;\n  gutenberg: boolean;\n  // attributes: boolean; (not yet)\n  [key: string]: boolean;\n}\n\nexport function imageAttributesAvailable(pandocExtensions: PandocExtensions) {\n  return pandocExtensions.link_attributes || pandocExtensions.raw_html;\n}\n\nexport function parsePandocListOutput(output: string) {\n  return output.split(/\\r?\\n/).filter(entry => entry.length);\n}\n\nexport interface PandocAst {\n  blocks: PandocToken[];\n  'pandoc-api-version': PandocApiVersion;\n  meta: any;\n  heading_ids?: string[]; // used only for reading not writing\n}\n\nexport type PandocApiVersion = number[];\n\nexport interface PandocToken {\n  t: string;\n  c?: any;\n}\n\n// https://github.com/jgm/pandoc-types/blob/master/Text/Pandoc/Definition.hs\nexport enum PandocTokenType {\n  Str = 'Str',\n  Space = 'Space',\n  Strong = 'Strong',\n  Emph = 'Emph',\n  Code = 'Code',\n  Superscript = 'Superscript',\n  Subscript = 'Subscript',\n  Strikeout = 'Strikeout',\n  SmallCaps = 'SmallCaps',\n  Underline = 'Underline',\n  Quoted = 'Quoted',\n  RawInline = 'RawInline',\n  RawBlock = 'RawBlock',\n  LineBlock = 'LineBlock',\n  Para = 'Para',\n  Plain = 'Plain',\n  Header = 'Header',\n  CodeBlock = 'CodeBlock',\n  BlockQuote = 'BlockQuote',\n  BulletList = 'BulletList',\n  OrderedList = 'OrderedList',\n  DefinitionList = 'DefinitionList',\n  Image = 'Image',\n  Link = 'Link',\n  Note = 'Note',\n  Cite = 'Cite',\n  Table = 'Table',\n  AlignRight = 'AlignRight',\n  AlignLeft = 'AlignLeft',\n  AlignDefault = 'AlignDefault',\n  AlignCenter = 'AlignCenter',\n  ColWidth = 'ColWidth',\n  ColWidthDefault = 'ColWidthDefault',\n  HorizontalRule = 'HorizontalRule',\n  LineBreak = 'LineBreak',\n  SoftBreak = 'SoftBreak',\n  Math = 'Math',\n  InlineMath = 'InlineMath',\n  DisplayMath = 'DisplayMath',\n  Div = 'Div',\n  Span = 'Span',\n  Null = 'Null',\n}\n\nexport interface PandocTokenReader {\n  // pandoc token name (e.g. \"Str\", \"Emph\", etc.)\n  readonly token: PandocTokenType;\n\n  // If present, gives a chance for the reader to decide whether it actually\n  // wants to handle the token, based on factors other than the PandocTokenType\n  readonly match?: (tok: PandocToken) => boolean;\n\n  // one and only one of these values must also be set\n  readonly text?: boolean;\n  readonly node?: string;\n  readonly block?: string;\n  readonly mark?: string;\n  readonly code_block?: boolean;\n\n  // functions for getting attributes and children\n  getAttrs?: (tok: PandocToken) => any;\n  getChildren?: (tok: PandocToken) => any[];\n  getText?: (tok: PandocToken) => string;\n\n  // lower-level handler function that overrides the above handler attributes\n  // (they are ignored when handler is specified)\n  handler?: (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => void;\n\n  // post-processor for performing fixups that rely on seeing the entire\n  // document (e.g. recognizing implicit header references)\n  postprocessor?: PandocPostprocessorFn;\n}\n\n// constants used to read the contents of raw blocks\nexport const kRawBlockFormat = 0;\nexport const kRawBlockContent = 1;\n\n// filter sequences of tokens (e.g. for reducing some adjacent tokens to a single token)\nexport type PandocTokensFilterFn = (tokens: PandocToken[], writer: ProsemirrorWriter) => PandocToken[];\n\n// special reader that gets a first shot at blocks (i.e. to convert a para w/ a single image into a figure)\nexport type PandocBlockReaderFn = (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => boolean;\n\n// reader that gets a first shot at inline html (e.g. image node parsing an <img> tag)\nexport type PandocInlineHTMLReaderFn = (schema: Schema, html: string, writer?: ProsemirrorWriter) => boolean;\n\nexport interface ProsemirrorWriter {\n  // open (then close) a node container\n  openNode(type: NodeType, attrs: {}): void;\n  closeNode(): ProsemirrorNode;\n\n  // special open call for note node containers\n  openNoteNode(ref: string): void;\n\n  // add a node to the current container\n  addNode(type: NodeType, attrs: {}, content: ProsemirrorNode[]): ProsemirrorNode | null;\n\n  // open and close marks\n  openMark(mark: Mark): void;\n  closeMark(mark: Mark): void;\n\n  // add text to the current node using the current mark set\n  writeText(text: string): void;\n\n  // write tokens into the current node\n  writeTokens(tokens: PandocToken[]): void;\n\n  // see if any inline HTML readers want to handle this html\n  hasInlineHTMLWriter(html: string): boolean;\n  writeInlineHTML(html: string): void;\n\n  // log an unrecoginzed token type\n  logUnrecognized(token: string): void;\n\n  // query whether a given node type is open\n  // (useful for e.g. conditional behavior when in a list or table)\n  isNodeOpen(type: NodeType): boolean;\n}\n\nexport interface PandocNodeWriter {\n  readonly name: string;\n  readonly write: PandocNodeWriterFn;\n}\n\nexport type PandocNodeWriterFn = (output: PandocOutput, node: ProsemirrorNode) => void;\n\nexport type PandocPreprocessorFn = (markdown: string) => string;\n\nexport type PandocPostprocessorFn = (doc: ProsemirrorNode) => ProsemirrorNode;\n\nexport interface PandocMarkWriter {\n  // pandoc mark name\n  readonly name: string;\n\n  // The 'priority' property allows us to dicate the order of nesting\n  // for marks (this is required b/c Prosemirror uses a flat structure\n  // whereby multiple marks are attached to text nodes). This allows us\n  // to e.g. ensure that strong and em always occur outside code.\n  readonly priority: number;\n\n  // writer function\n  readonly write: PandocMarkWriterFn;\n}\n\nexport type PandocMarkWriterFn = (output: PandocOutput, mark: Mark, parent: Fragment) => void;\n\nexport type PandocOutputOption = 'writeSpaces';\n\nexport interface PandocOutput {\n  extensions: PandocExtensions;\n  write(value: any): void;\n  writeToken(type: PandocTokenType, content?: (() => void) | any): void;\n  writeMark(type: PandocTokenType, parent: Fragment, expelEnclosingWhitespace?: boolean): void;\n  writeArray(content: () => void): void;\n  writeAttr(id?: string, classes?: string[], keyvalue?: [[string, string]]): void;\n  writeText(text: string | null): void;\n  writeLink(href: string, title: string, attr: PandocAttr | null, f: () => void): void;\n  writeNode(node: ProsemirrorNode): void;\n  writeNodes(parent: ProsemirrorNode): void;\n  writeNote(note: ProsemirrorNode): void;\n  writeInlines(fragment: Fragment): void;\n  writeRawMarkdown(markdown: Fragment | string, escapeSymbols?: boolean): void;\n  withOption(option: PandocOutputOption, value: boolean, f: () => void): void;\n}\n\n// collect the text from a collection of pandoc ast\n// elements (ignores marks, useful for ast elements\n// that support marks but whose prosemirror equivalent\n// does not, e.g. image alt text)\n// https://github.com/jgm/pandoc/blob/83880b0dbc318703babfbb6905b1046fa48f1216/src/Text/Pandoc/Shared.hs#L439\nexport function stringifyTokens(c: PandocToken[], unemoji = false): string {\n  return c\n    .map(elem => {\n      if (elem.t === PandocTokenType.Str) {\n        return elem.c;\n      } else if (\n        elem.t === PandocTokenType.Space ||\n        elem.t === PandocTokenType.SoftBreak ||\n        elem.t === PandocTokenType.LineBreak\n      ) {\n        return ' ';\n      } else if (elem.t === PandocTokenType.Link) {\n        return stringifyTokens(elem.c[kLinkChildren]);\n      } else if (elem.t === PandocTokenType.Span) {\n        const attr = pandocAttrReadAST(elem, kSpanAttr);\n        if (unemoji && attr.classes && attr.classes[0] === 'emoji') {\n          return attr.keyvalue[0][1];\n        } else {\n          return stringifyTokens(elem.c[kSpanChildren]);\n        }\n      } else if (elem.t === PandocTokenType.Quoted) {\n        const type = elem.c[kQuoteType].t;\n        const quote = type === QuoteType.SingleQuote ? \"'\" : '\"';\n        return quote + stringifyTokens(elem.c[kQuoteChildren]) + quote;\n      } else if (elem.t === PandocTokenType.Math) {\n        return stringifyMath(elem);\n      } else if (elem.t === PandocTokenType.Code) {\n        return elem.c[kCodeText];\n      } else if (elem.c) {\n        return stringifyTokens(elem.c);\n      } else {\n        return '';\n      }\n    })\n    .join('');\n}\n\nexport function forEachToken(tokens: PandocToken[], f: (tok: PandocToken) => void) {\n  mapTokens(tokens, (tok: PandocToken) => {\n    f(tok);\n    return tok;\n  });\n}\n\nexport function mapTokens(tokens: PandocToken[], f: (tok: PandocToken) => PandocToken) {\n  function isToken(val: any) {\n    if (val !== null && typeof val === 'object') {\n      return val.hasOwnProperty('t');\n    } else {\n      return false;\n    }\n  }\n\n  function tokenHasChildren(tok: PandocToken) {\n    return tok !== null && typeof tok === 'object' && Array.isArray(tok.c);\n  }\n\n  function mapValue(val: any): any {\n    if (isToken(val)) {\n      return mapToken(val);\n    } else if (Array.isArray(val)) {\n      return val.map(mapValue);\n    } else {\n      return val;\n    }\n  }\n\n  function mapToken(tok: PandocToken): PandocToken {\n    const mappedTok = f(tok);\n    if (tokenHasChildren(mappedTok)) {\n      mappedTok.c = mappedTok.c.map(mapValue);\n    }\n    return mappedTok;\n  }\n\n  return tokens.map(mapToken);\n}\n\nexport function tokenTextEscaped(t: PandocToken) {\n  return t.c.replace(/\\\\/g, `\\\\\\\\`);\n}\n\n// sort marks by priority (in descending order)\nexport function marksByPriority(marks: Mark[], markWriters: { [key: string]: PandocMarkWriter }) {\n  return marks.sort((a: Mark, b: Mark) => {\n    const aPriority = markWriters[a.type.name].priority;\n    const bPriority = markWriters[b.type.name].priority;\n    if (aPriority < bPriority) {\n      return 1;\n    } else if (bPriority < aPriority) {\n      return -1;\n    } else {\n      return 0;\n    }\n  });\n}\n","/*\n * quote.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kQuoteType = 0;\nexport const kQuoteChildren = 1;\n\nexport enum QuoteType {\n  SingleQuote = 'SingleQuote',\n  DoubleQuote = 'DoubleQuote',\n}\n\nexport function quotesForType(type: QuoteType) {\n  const dblQuote = type === QuoteType.DoubleQuote;\n  return {\n    begin: dblQuote ? '“' : '‘',\n    end: dblQuote ? '”' : '’',\n  };\n}\n\n// create regexs for removing quotes\nconst kSingleQuotes = quotesForType(QuoteType.SingleQuote);\nconst kSingleQuoteRegEx = new RegExp(`[${kSingleQuotes.begin}${kSingleQuotes.end}]`, 'g');\nconst kDoubleQuotes = quotesForType(QuoteType.DoubleQuote);\nconst kDoubleQuoteRegEx = new RegExp(`[${kDoubleQuotes.begin}${kDoubleQuotes.end}]`, 'g');\n\nexport function fancyQuotesToSimple(text: string) {\n  return text.replace(kSingleQuoteRegEx, \"'\").replace(kDoubleQuoteRegEx, '\"');\n}\n","/*\n * math.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUI } from './ui';\nimport { PandocToken } from './pandoc';\n\nexport const kMathType = 0;\nexport const kMathContent = 1;\n\nexport enum MathType {\n  Inline = 'InlineMath',\n  Display = 'DisplayMath',\n}\n\nexport interface EditorMath {\n  typeset: (el: HTMLElement, math: string, priority: boolean) => Promise<boolean>;\n}\n\nexport function editorMath(ui: EditorUI): EditorMath {\n  // return a promise that will typeset this node's math (including retrying as long as is\n  // required if the element is not yet connected to the DOM)\n  return {\n    typeset: (el: HTMLElement, math: string, priority: boolean): Promise<boolean> => {\n      return new Promise(resolve => {\n        // regular typeset if we are already connected\n        if (el.isConnected) {\n          ui.math.typeset!(el, math, priority).then(resolve);\n        } else {\n          // otherwise wait 100ms then retry\n          const timerId = setInterval(() => {\n            if (el.isConnected) {\n              clearInterval(timerId);\n              ui.math.typeset!(el, math, priority).then(resolve);\n            }\n          }, 100);\n        }\n      });\n    },\n  };\n}\n\nexport function delimiterForType(type: string) {\n  if (type === MathType.Inline) {\n    return '$';\n  } else {\n    return '$$';\n  }\n}\n\nexport function stringifyMath(tok: PandocToken) {\n  const delimter = delimiterForType(tok.c[kMathType].t);\n  return delimter + tok.c[kMathContent] + delimter;\n}\n","/*\n * code.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\n\nimport { CodeViewOptions, canInsertNodeAtPos } from './node';\nimport { ResolvedPos, Slice, Fragment } from 'prosemirror-model';\n\nexport const kCodeAttr = 0;\nexport const kCodeText = 1;\n\nexport function codeNodeSpec() {\n  return {\n    content: 'text*',\n    group: 'block',\n    marks: '',\n    code: true,\n    defining: true,\n    isolating: true,\n  };\n}\n\nexport function codeViewClipboardPlugin(codeViews: { [key: string]: CodeViewOptions }) {\n  return new Plugin({\n    key: new PluginKey('code-view-clipboard'),\n    props: {\n      clipboardTextParser: (text: string, $context: ResolvedPos): any => {\n        // see if any of the code views want to handle this text\n        for (const codeViewType of Object.keys(codeViews)) {\n          const codeView = codeViews[codeViewType];\n          if (codeView.createFromPastePattern && codeView.createFromPastePattern.test(text)) {\n            const schema = $context.node().type.schema;\n            const nodeType = schema.nodes[codeViewType];\n            if (canInsertNodeAtPos($context, nodeType)) {\n              const textNode = schema.text(text);\n              const codeNode = nodeType.createAndFill({}, textNode);\n              return new Slice(Fragment.from(codeNode), 0, 0);\n            }\n          }\n        }\n        return null;\n      },\n    },\n  });\n}\n","/*\n * node.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeSpec, NodeType, ResolvedPos, Slice } from 'prosemirror-model';\nimport { EditorState, Selection, NodeSelection } from 'prosemirror-state';\nimport {\n  findParentNode,\n  findSelectedNodeOfType,\n  ContentNodeWithPos,\n  NodeWithPos,\n  findParentNodeOfType,\n  findChildrenByType,\n  findChildren,\n  findParentNodeOfTypeClosestToPos,\n} from 'prosemirror-utils';\n\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n  PandocTokenReader,\n  PandocNodeWriterFn,\n  PandocPreprocessorFn,\n  PandocBlockReaderFn,\n  PandocInlineHTMLReaderFn,\n  PandocTokensFilterFn,\n} from './pandoc';\nimport { PandocBlockCapsuleFilter } from './pandoc_capsule';\n\nimport { AttrEditOptions } from './attr_edit';\nimport { CommandFn } from './command';\nimport { ExecuteRmdChunkFn } from './rmd';\n\nexport interface PandocNode {\n  readonly name: string;\n  readonly spec: NodeSpec;\n  readonly code_view?: CodeViewOptions;\n  readonly attr_edit?: () => AttrEditOptions | null;\n  readonly pandoc: {\n    readonly readers?: readonly PandocTokenReader[];\n    readonly writer?: PandocNodeWriterFn;\n    readonly preprocessor?: PandocPreprocessorFn;\n    readonly tokensFilter?: PandocTokensFilterFn;\n    readonly blockReader?: PandocBlockReaderFn;\n    readonly inlineHTMLReader?: PandocInlineHTMLReaderFn;\n    readonly blockCapsuleFilter?: PandocBlockCapsuleFilter;\n  };\n}\n\nexport interface CodeViewOptions {\n  lang: (node: ProsemirrorNode, content: string) => string | null;\n  attrEditFn?: CommandFn;\n  createFromPastePattern?: RegExp;\n  classes?: string[];\n  borderColorClass?: string;\n  firstLineMeta?: boolean;\n  lineNumbers?: boolean;\n  bookdownTheorems?: boolean;\n  lineNumberFormatter?: (lineNumber: number, lineCount?: number, line?: string) => string;\n}\n\nexport type NodeTraversalFn = (\n  node: Node,\n  pos: number,\n  parent: Node,\n  index: number,\n) => boolean | void | null | undefined;\n\nexport function findTopLevelBodyNodes(doc: ProsemirrorNode, predicate: (node: ProsemirrorNode) => boolean) {\n  const body = findChildrenByType(doc, doc.type.schema.nodes.body, false)[0];\n  const offset = body.pos + 1;\n  const nodes = findChildren(body.node, predicate, false);\n  return nodes.map(value => ({ ...value, pos: value.pos + offset }));\n}\n\nexport function findNodeOfTypeInSelection(selection: Selection, type: NodeType): ContentNodeWithPos | undefined {\n  return findSelectedNodeOfType(type)(selection) || findParentNode((n: ProsemirrorNode) => n.type === type)(selection);\n}\n\nexport function firstNode(parent: NodeWithPos, predicate: (node: ProsemirrorNode) => boolean) {\n  let foundNode: NodeWithPos | undefined;\n  parent.node.descendants((node, pos) => {\n    if (!foundNode) {\n      if (predicate(node)) {\n        foundNode = {\n          node,\n          pos: parent.pos + 1 + pos,\n        };\n        return false;\n      }\n    } else {\n      return false;\n    }\n  });\n  return foundNode;\n}\n\nexport function lastNode(parent: NodeWithPos, predicate: (node: ProsemirrorNode) => boolean) {\n  let last: NodeWithPos | undefined;\n  parent.node.descendants((node, pos) => {\n    if (predicate(node)) {\n      last = {\n        node,\n        pos: parent.pos + 1 + pos,\n      };\n    }\n  });\n  return last;\n}\n\nexport function nodeIsActive(state: EditorState, type: NodeType, attrs = {}) {\n  const predicate = (n: ProsemirrorNode) => n.type === type;\n  const node = findSelectedNodeOfType(type)(state.selection) || findParentNode(predicate)(state.selection);\n\n  if (!Object.keys(attrs).length || !node) {\n    return !!node;\n  }\n\n  return node.node.hasMarkup(type, attrs);\n}\n\nexport function canInsertNode(context: EditorState | Selection, nodeType: NodeType) {\n  const selection = asSelection(context);\n  const $from = selection.$from;\n  return canInsertNodeAtPos($from, nodeType);\n}\n\nexport function canInsertNodeAtPos($pos: ResolvedPos, nodeType: NodeType) {\n  for (let d = $pos.depth; d >= 0; d--) {\n    const index = $pos.index(d);\n    if ($pos.node(d).canReplaceWith(index, index, nodeType)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport function canInsertTextNode(context: EditorState | Selection) {\n  const selection = asSelection(context);\n  return canInsertNode(selection, selection.$head.parent.type.schema.nodes.text);\n}\n\nexport function insertAndSelectNode(view: EditorView, node: ProsemirrorNode) {\n  // create new transaction\n  const tr = view.state.tr;\n\n  // insert the node over the existing selection\n  tr.ensureMarks(node.marks);\n  tr.replaceSelectionWith(node);\n\n  // set selection to inserted node (or don't if our selection calculate was off,\n  // as can happen when we insert into a list bullet)\n  const selectionPos = tr.doc.resolve(tr.mapping.map(view.state.selection.from, -1));\n  const selectionNode = tr.doc.nodeAt(selectionPos.pos);\n  if (selectionNode && selectionNode.type === node.type) {\n    tr.setSelection(new NodeSelection(selectionPos));\n  }\n\n  // dispatch transaction\n  view.dispatch(tr);\n}\n\nexport function editingRootNode(selection: Selection) {\n  const schema = selection.$head.node().type.schema;\n  return findParentNodeOfType(schema.nodes.body)(selection) || findParentNodeOfType(schema.nodes.note)(selection);\n}\n\nexport function editingRootNodeClosestToPos($pos: ResolvedPos) {\n  const schema = $pos.node().type.schema;\n  return (\n    findParentNodeOfTypeClosestToPos($pos, schema.nodes.body) ||\n    findParentNodeOfTypeClosestToPos($pos, schema.nodes.note)\n  );\n}\n\nexport function editingRootScrollContainerElement(view: EditorView) {\n  const editingNode = editingRootNode(view.state.selection);\n  if (editingNode) {\n    const editingEl = view.domAtPos(editingNode.pos + 1).node;\n    return editingEl.parentElement;\n  } else {\n    return undefined;\n  }\n}\n\nfunction asSelection(context: EditorState | Selection) {\n  return context instanceof EditorState ? context.selection : context;\n}\n","/*\n * link.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildren, findChildrenByType } from 'prosemirror-utils';\n\nexport const kLinkTargetUrl = 0;\nexport const kLinkTargetTitle = 1;\n\nexport const kLinkAttr = 0;\nexport const kLinkChildren = 1;\nexport const kLinkTarget = 2;\n\nexport enum LinkType {\n  URL = 0,\n  Heading = 1,\n  ID = 2,\n}\n\nexport interface LinkCapabilities {\n  headings: boolean;\n  attributes: boolean;\n  text: boolean;\n}\n\nexport interface LinkTargets {\n  readonly ids: string[];\n  readonly headings: LinkHeadingTarget[];\n}\n\nexport interface LinkHeadingTarget {\n  readonly level: number;\n  readonly text: string;\n}\n\nexport async function linkTargets(doc: ProsemirrorNode) {\n  const ids = findChildren(doc, node => !!node.attrs.id).map(value => value.node.attrs.id);\n\n  const headings = findChildrenByType(doc, doc.type.schema.nodes.heading).map(heading => ({\n    level: heading.node.attrs.level,\n    text: heading.node.textContent,\n  }));\n\n  return {\n    ids,\n    headings,\n  };\n}\n","/*\n * html.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMSerializer, Fragment } from 'prosemirror-model';\n\nexport const kHTMLCommentRegEx = /(?:^|[^`])(<!--([\\s\\S]*?)-->)/;\n\nexport function isHTMLComment(html: string) {\n  return !!html.match(kHTMLCommentRegEx);\n}\n\nexport function isSingleLineHTML(html: string) {\n  return html.trimRight().split('\\n').length === 1;\n}\n\nexport function asHTMLTag(\n  tag: string,\n  attribs: { [key: string]: string },\n  selfClosing = false,\n  noEmptyAttribs = false,\n) {\n  const attribsHTML = Object.keys(attribs)\n    .filter(name => !noEmptyAttribs || attribs[name])\n    .map(name => `${name}=\"${escapeHTMLAttribute(attribs[name])}\"`)\n    .join(' ');\n  return `<${tag} ${attribsHTML}${selfClosing ? '/' : ''}>`;\n}\n\nexport function escapeHTMLAttribute(value: string) {\n  return value\n    .replace(/&/g, '&amp;') // must be first replacement\n    .replace(/'/g, '&apos;')\n    .replace(/\"/g, '&quot;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n}\n\nexport function nodeToHTML(schema: Schema, node: ProsemirrorNode) {\n  return generateHTML(() => DOMSerializer.fromSchema(schema).serializeNode(node));\n}\n\nexport function fragmentToHTML(schema: Schema, fragment: Fragment) {\n  return generateHTML(() => DOMSerializer.fromSchema(schema).serializeFragment(fragment));\n}\n\nfunction generateHTML(generator: () => Node | DocumentFragment) {\n  const div = document.createElement('div');\n  const output = generator();\n  div.appendChild(output);\n  return div.innerHTML;\n}\n","/*\n * events.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n/**\n * Represents an event type; only a single instance of this should exist per\n * event type (akin to PluginKey) and it should be visible to everyone who wants\n * to subscribe to or emit events of that type. Do not create one of these\n * directly, instead use makeEventType().\n */\nexport interface EventType<TDetail> {\n  readonly eventName: string;\n  // This field is needed only to prevent TDetail from being ignored by the type\n  // checker; if TDetail isn't used, tsc acts as if EventType isn't generic.\n  readonly dummy?: TDetail;\n}\n\n/**\n * Type signature of event-handler functions; the TDetail must match with the\n * EventType<TDetail> being subscribed to.\n *\n * (Note that the detail is always optional. I couldn't figure out how to make\n * it mandatory for some event types, forbidden for others, and optional for\n * still others, so it's just optional for everyone.)\n */\nexport type EventHandler<TDetail> = (detail?: TDetail) => void;\n\n/**\n * Generic interface for objects that support eventing.\n *\n * TODO: I don't see a reason why this interface should support both\n * subscription *and* emitting, the latter seems like something private.\n */\nexport interface EditorEvents {\n  subscribe<TDetail>(event: EventType<TDetail>, handler: EventHandler<TDetail>): VoidFunction;\n  emit<TDetail>(event: EventType<TDetail>, detail?: TDetail): void;\n}\n\n/**\n * Creates a new type of event. Use the TDetail type parameter to indicate the\n * type of data, if any, that event handlers can expect.\n */\nexport function makeEventType<TDetail = void>(eventName: string) {\n  return { eventName: `panmirror${eventName}` } as EventType<TDetail>;\n}\n\n/**\n * An implementation of EditorEvents, using the DOM event system.\n */\nexport class DOMEditorEvents implements EditorEvents {\n  private readonly el: HTMLElement;\n\n  constructor(el: HTMLElement) {\n    this.el = el;\n  }\n\n  public emit<TDetail>(eventType: EventType<TDetail>, detail?: TDetail) {\n    // Note: CustomEvent requires polyfill for IE, see\n    // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n    const event = new CustomEvent(eventType.eventName, { detail });\n    return this.el.dispatchEvent(event);\n  }\n\n  public subscribe<TDetail>(eventType: EventType<TDetail>, handler: EventHandler<TDetail>) {\n    const listener = function(this: any, evt: Event) {\n      const detail: TDetail | undefined = (evt as CustomEvent).detail;\n      handler.call(this, detail);\n    };\n    this.el.addEventListener(eventType.eventName, listener);\n    return () => {\n      this.el.removeEventListener(eventType.eventName, listener);\n    };\n  }\n}\n","/*\n * event-types.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { makeEventType } from './events';\nimport { Navigation } from './navigation';\n\nexport const UpdateEvent = makeEventType('Update');\nexport const OutlineChangeEvent = makeEventType('OutlineChange');\nexport const StateChangeEvent = makeEventType('StateChange');\nexport const ResizeEvent = makeEventType('Resize');\nexport const LayoutEvent = makeEventType('Layout');\nexport const ScrollEvent = makeEventType('Scroll');\nexport const BlurEvent = makeEventType('Blur');\nexport const FocusEvent = makeEventType<ProsemirrorNode>('Focus');\nexport const DispatchEvent = makeEventType<Transaction>('Dispatch');\nexport const NavigateEvent = makeEventType<Navigation>('Navigate');\n","/*\n * pandoc_format.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { PandocServer, PandocExtensions } from './pandoc';\nimport { EditorFormat, kHugoDocType } from './format';\nimport { firstYamlBlock, yamlMetadataNodes } from './yaml';\nimport { findValue } from './object';\n\nexport const kMarkdownFormat = 'markdown';\nexport const kMarkdownPhpextraFormat = 'markdown_phpextra';\nexport const kMarkdownGithubFormat = 'markdown_github';\nexport const kMarkdownMmdFormat = 'markdown_mmd';\nexport const kMarkdownStrictFormat = 'markdown_strict';\nexport const kGfmFormat = 'gfm';\nexport const kCommonmarkFormat = 'commonmark';\nexport const kCommonmarkXFormat = 'commonmark_x';\n\nexport interface PandocFormat {\n  mode: string;\n  baseName: string;\n  fullName: string;\n  extensions: PandocExtensions;\n  warnings: PandocFormatWarnings;\n}\n\nexport interface PandocFormatWarnings {\n  invalidFormat: string;\n  invalidOptions: string[];\n}\n\nexport interface PandocFormatConfig {\n  mode?: string;\n  extensions?: string;\n  rmdExtensions?: string;\n  wrap?: string;\n  doctypes?: string[];\n  references_location?: string;\n  references_prefix?: string;\n  canonical?: boolean;\n}\n\nexport function matchPandocFormatComment(code: string) {\n  const magicCommentRegEx = /^<!--\\s+-\\*-([\\s\\S]*?)-\\*-\\s+-->\\s*$/m;\n  return code.match(magicCommentRegEx);\n}\n\nexport function pandocFormatConfigFromDoc(doc: ProsemirrorNode, isRmd: boolean) {\n  return pandocFormatConfigFromYamlInDoc(doc, isRmd) || pandocFormatConfigFromCommentInDoc(doc) || {};\n}\n\nexport function pandocFormatConfigFromCode(code: string, isRmd: boolean): PandocFormatConfig {\n  return pandocFormatConfigFromYamlInCode(code, isRmd) || pandocFormatConfigFromCommentInCode(code) || {};\n}\n\nfunction pandocFormatConfigFromYamlInCode(code: string, isRmd: boolean): PandocFormatConfig | null {\n  // get the first yaml block in the file\n  const yaml = firstYamlBlock(code);\n\n  // did we find yaml?\n  if (yaml) {\n    // see if we have any md_extensions defined\n    const mdExtensions = isRmd ? findValue('md_extensions', yaml?.output) : undefined;\n\n    // see if we have any markdown options defined\n    let yamlFormatConfig: PandocFormatConfig | undefined;\n    const yamlMarkdownOptions = yaml?.editor_options?.markdown;\n    if (yamlMarkdownOptions instanceof Object) {\n      yamlFormatConfig = readPandocFormatConfig(yamlMarkdownOptions);\n    }\n\n    // combine and return\n    if (mdExtensions || yamlFormatConfig) {\n      const formatConfig: PandocFormatConfig = yamlFormatConfig ? yamlFormatConfig : {};\n      if (mdExtensions) {\n        formatConfig.extensions = mdExtensions + (formatConfig.extensions || '');\n      }\n      return formatConfig;\n    } else {\n      return null;\n    }\n  } else {\n    return null;\n  }\n}\n\nfunction pandocFormatConfigFromYamlInDoc(doc: ProsemirrorNode, isRmd: boolean): PandocFormatConfig | null {\n  const yamlNodes = yamlMetadataNodes(doc);\n  if (yamlNodes.length > 0) {\n    return pandocFormatConfigFromYamlInCode(yamlNodes[0].node.textContent, isRmd);\n  } else {\n    return null;\n  }\n}\n\nfunction pandocFormatConfigFromCommentInCode(code: string): PandocFormatConfig | null {\n  const keyValueRegEx = /^([^:]+):\\s*(.*)$/;\n  const match = matchPandocFormatComment(code);\n  if (match) {\n    const comment = match[1];\n    // split into semicolons\n    const fields = comment.split(/\\s*;\\s/).map(field => field.trim());\n    const variables: { [key: string]: string } = {};\n    fields.forEach(field => {\n      const keyValueMatch = field.match(keyValueRegEx);\n      if (keyValueMatch) {\n        variables[keyValueMatch[1].trim()] = keyValueMatch[2].trim();\n      }\n    });\n    return readPandocFormatConfig(variables);\n  } else {\n    return null;\n  }\n}\n\nfunction pandocFormatConfigFromCommentInDoc(doc: ProsemirrorNode): PandocFormatConfig | null {\n  let config: PandocFormatConfig | null = null;\n  let foundFirstRawInline = false;\n  doc.descendants((node, pos) => {\n    // don't search once we've found our target\n    if (foundFirstRawInline) {\n      return false;\n    }\n\n    // if it's a text node with a raw-html then scan it for the format comment\n    const schema = doc.type.schema;\n    if (\n      node.isText &&\n      schema.marks.raw_html_comment &&\n      schema.marks.raw_html_comment.isInSet(node.marks) &&\n      node.attrs.format\n    ) {\n      foundFirstRawInline = true;\n      config = pandocFormatConfigFromCommentInCode(node.textContent);\n      return false;\n    } else {\n      return true;\n    }\n  });\n  return config;\n}\n\nfunction readPandocFormatConfig(source: { [key: string]: any }) {\n  const asString = (obj: any): string => {\n    if (typeof obj === 'string') {\n      return obj;\n    } else if (obj) {\n      return obj.toString();\n    } else {\n      return '';\n    }\n  };\n\n  const asBoolean = (obj: any) => {\n    if (typeof obj === 'boolean') {\n      return obj;\n    } else {\n      const str = asString(obj).toLowerCase();\n      return str === 'true' || str === '1';\n    }\n  };\n\n  const readWrap = () => {\n    const wrap = source.wrap || source.wrap_column || source['fill-column'];\n    if (wrap) {\n      return asString(wrap);\n    } else {\n      return undefined;\n    }\n  };\n\n  const formatConfig: PandocFormatConfig = {};\n  if (source.mode) {\n    formatConfig.mode = asString(source.mode);\n  }\n  if (source.extensions) {\n    formatConfig.extensions = asString(source.extensions);\n  }\n  if (source.rmd_extensions) {\n    formatConfig.rmdExtensions = asString(source.rmd_extensions);\n  }\n  formatConfig.wrap = readWrap();\n  if (source.doctype) {\n    formatConfig.doctypes = asString(source.doctype)\n      .split(',')\n      .map(str => str.trim());\n  }\n  if (source.references) {\n    if (typeof source.references === 'string') {\n      formatConfig.references_location = source.references;\n    } else {\n      formatConfig.references_location = source.references.location;\n      formatConfig.references_prefix = source.references.prefix;\n    }\n  }\n  if (source.canonical) {\n    formatConfig.canonical = asBoolean(source.canonical);\n  }\n  return formatConfig;\n}\n\nexport async function resolvePandocFormat(pandoc: PandocServer, format: EditorFormat): Promise<PandocFormat> {\n  // additional markdown variants we support\n  const kMarkdownVariants: { [key: string]: string[] } = {\n    [kCommonmarkFormat]: commonmarkExtensions(),\n    [kCommonmarkXFormat]: commonmarkXExtensions(),\n    [kGfmFormat]: gfmExtensions(),\n    goldmark: goldmarkExtensions(format),\n    blackfriday: blackfridayExtensions(format),\n  };\n\n  // setup warnings\n  const warnings: PandocFormatWarnings = { invalidFormat: '', invalidOptions: [] };\n\n  // alias options and basename\n  let options = format.pandocExtensions;\n  let baseName = format.pandocMode;\n\n  // validate the base format (fall back to markdown if it's not known)\n  if (\n    ![\n      kMarkdownFormat,\n      kMarkdownPhpextraFormat,\n      kMarkdownGithubFormat,\n      kMarkdownMmdFormat,\n      kMarkdownStrictFormat,\n      kGfmFormat,\n      kCommonmarkFormat,\n      kCommonmarkXFormat\n    ]\n      .concat(Object.keys(kMarkdownVariants))\n      .includes(baseName)\n  ) {\n    warnings.invalidFormat = baseName;\n    baseName = 'markdown';\n  }\n\n  // format options we will be building\n  let formatOptions: string;\n\n  // if we are using a variant then get it's base options and merge with user options\n  if (kMarkdownVariants[baseName]) {\n    const variant = kMarkdownVariants[baseName];\n    options = variant.map(option => `${option}`).join('') + options;\n    baseName = 'markdown_strict';\n  }\n\n  // query for format options\n  formatOptions = await pandoc.listExtensions(baseName);\n\n  // active pandoc extensions\n  const pandocExtensions: { [key: string]: boolean } = {};\n\n  // first parse extensions for format\n  parseExtensions(formatOptions).forEach(option => {\n    pandocExtensions[option.name] = option.enabled;\n  });\n\n  // now parse extensions for user options (validate and build format name)\n  const validOptionNames = parseExtensions(formatOptions).map(option => option.name);\n\n  let fullName = baseName;\n  parseExtensions(options).forEach(option => {\n    // validate that the option is valid\n    if (validOptionNames.includes(option.name)) {\n      // add option\n      fullName += (option.enabled ? '+' : '-') + option.name;\n      pandocExtensions[option.name] = option.enabled;\n    } else {\n      warnings.invalidOptions.push(option.name);\n    }\n  });\n\n  // return format name, enabled extensiosn, and warnings\n  return {\n    mode: format.pandocMode,\n    baseName,\n    fullName,\n    extensions: (pandocExtensions as unknown) as PandocExtensions,\n    warnings,\n  };\n}\n\nfunction parseExtensions(options: string) {\n  // remove any linebreaks\n  options = options.split('\\n').join();\n\n  // parse into separate entries\n  const extensions: Array<{ name: string; enabled: boolean }> = [];\n  const re = /([+-])([a-z_]+)/g;\n  let match = re.exec(options);\n  while (match) {\n    extensions.push({ name: match[2], enabled: match[1] === '+' });\n    match = re.exec(options);\n  }\n\n  return extensions;\n}\n\nexport function pandocFormatWith(format: string, prepend: string, append: string) {\n  const split = splitPandocFormatString(format);\n  return `${split.format}${prepend}${split.options}${append}`;\n}\n\nexport function splitPandocFormatString(format: string) {\n  // split out base format from options\n  let optionsPos = format.indexOf('-');\n  if (optionsPos === -1) {\n    optionsPos = format.indexOf('+');\n  }\n  const base = optionsPos === -1 ? format : format.substr(0, optionsPos);\n  const options = optionsPos === -1 ? '' : format.substr(optionsPos);\n  return {\n    format: base,\n    options,\n  };\n}\n\nexport function hasFencedCodeBlocks(pandocExtensions: PandocExtensions) {\n  return pandocExtensions.backtick_code_blocks || pandocExtensions.fenced_code_blocks;\n}\n\n// e.g. [My Heading] to link to ## My Heading\nexport function hasShortcutHeadingLinks(pandocExtensions: PandocExtensions) {\n  return pandocExtensions.implicit_header_references && pandocExtensions.shortcut_reference_links;\n}\n\nfunction commonmarkExtensions(rawHTML = true) {\n  const extensions = [\n    rawHTML ? '+raw_html' : '-raw_html',\n    '+all_symbols_escapable',\n    '+backtick_code_blocks',\n    '+fenced_code_blocks',\n    '+space_in_atx_header',\n    '+intraword_underscores',\n    '+lists_without_preceding_blankline',\n    '+shortcut_reference_links',\n  ];\n  return extensions;\n}\n\n// https://github.com/jgm/pandoc/commit/0aed9dd589189a9bbe5cae99e0e024e2d4a92c36\nfunction commonmarkXExtensions() {\n  const extensions = [\n    '+pipe_tables',\n    '+raw_html',\n    '+auto_identifiers',\n    '+strikeout',\n    '+task_lists',\n    '+emoji',\n    '+raw_tex',\n    '+smart',\n    '+tex_math_dollars',\n    '+superscript',\n    '+subscript',\n    '+definition_lists',\n    '+footnotes',\n    '+fancy_lists',\n    '+fenced_divs',\n    '+bracketed_spans',\n    '+raw_attribute',\n    '+implicit_header_references',\n    // '+attributes' (not yet)\n  ];\n  return extensions;\n}\n\nfunction gfmExtensions() {\n  const extensions = [\n    ...commonmarkExtensions(),\n    '+auto_identifiers',\n    '+autolink_bare_uris',\n    '+emoji',\n    '+gfm_auto_identifiers',\n    '+pipe_tables',\n    '+strikeout',\n    '+task_lists',\n  ];\n  return extensions;\n}\n\n// https://gohugo.io/getting-started/configuration-markup/#goldmark\n// https://github.com/yuin/goldmark/#html-renderer-options\nfunction goldmarkExtensions(format: EditorFormat) {\n  const extensions = [\n    // start with commonmark\n    ...commonmarkExtensions(false),\n\n    // adds most of gfm\n    '+pipe_tables',\n    '+strikeout',\n    '+autolink_bare_uris',\n    '+task_lists',\n    '+backtick_code_blocks',\n\n    // plus some extras\n    '+definition_lists',\n    '+footnotes',\n    '+smart',\n\n    // hugo preprocessor supports yaml metadata\n    '+yaml_metadata_block',\n  ];\n\n  if (includeTexMathDollars(format)) {\n    extensions.push('+tex_math_dollars');\n  }\n\n  return extensions;\n}\n\n// https://github.com/russross/blackfriday/tree/v2#extensions\nfunction blackfridayExtensions(format: EditorFormat) {\n  const extensions = [\n    '+intraword_underscores',\n    '+pipe_tables',\n    '+backtick_code_blocks',\n    '+definition_lists',\n    '+footnotes',\n    '+autolink_bare_uris',\n    '+strikeout',\n    '+smart',\n    '+yaml_metadata_block',\n  ];\n\n  if (includeTexMathDollars(format)) {\n    extensions.push('+tex_math_dollars');\n  }\n\n  return extensions;\n}\n\nfunction includeTexMathDollars(format: EditorFormat) {\n  // hugo users often sort out some way to include math so we enable it for hugo\n  return format.docTypes.includes(kHugoDocType) || format.rmdExtensions.blogdownMathInCode;\n}\n","/*\n * yaml.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { EditorView } from 'prosemirror-view';\n\nimport yaml from 'js-yaml';\n\nimport { findTopLevelBodyNodes } from './node';\nimport { logException } from './log';\n\nexport const kYamlMetadataTitleRegex = /\\ntitle:(.*)\\n/;\n\n// return yaml front matter (w/o enclosing --)\nexport function yamlFrontMatter(doc: ProsemirrorNode) {\n  const firstYaml = firstYamlNode(doc);\n  if (firstYaml) {\n    return stripYamlDelimeters(firstYaml.node.textContent);\n  } else {\n    return '';\n  }\n}\n\n// set yaml front matter (w/o enclosing ---)\nexport function applyYamlFrontMatter(view: EditorView, yamlText: string) {\n  const schema = view.state.schema;\n  const updatedYaml = `---\\n${yamlText}---`;\n  const updatedYamlNode = schema.nodes.yaml_metadata.createAndFill({}, schema.text(updatedYaml));\n  const tr = view.state.tr;\n  const firstYaml = firstYamlNode(view.state.doc);\n  if (firstYaml) {\n    tr.replaceRangeWith(firstYaml.pos, firstYaml.pos + firstYaml.node.nodeSize, updatedYamlNode);\n  } else {\n    tr.insert(1, updatedYamlNode);\n  }\n  view.dispatch(tr);\n}\n\nexport function yamlMetadataNodes(doc: ProsemirrorNode) {\n  return findTopLevelBodyNodes(doc, isYamlMetadataNode);\n}\n\nexport function isYamlMetadataNode(node: ProsemirrorNode) {\n  return node.type === node.type.schema.nodes.yaml_metadata;\n}\n\nexport function titleFromYamlMetadataNode(node: ProsemirrorNode) {\n  const titleMatch = node.textContent.match(kYamlMetadataTitleRegex);\n  if (titleMatch) {\n    let title = titleMatch[1].trim();\n    title = title.replace(/^[\"']|[\"']$/g, '');\n    title = title.replace(/\\\\\"/g, '\"');\n    title = title.replace(/''/g, \"'\");\n    return title;\n  } else {\n    return null;\n  }\n}\n\nexport function valueFromYamlText(name: string, yamlText: string) {\n  // Must start and end with either a new line or the start/end of line\n  const yamlMetadataNameValueRegex = new RegExp(`(?:\\\\n|^)${name}:(.*)(?:\\\\n|$)`);\n\n  // Find the name and value\n  const valueMatch = yamlText.match(yamlMetadataNameValueRegex);\n  if (valueMatch) {\n    // Read the matched value\n    const valueStr = valueMatch[1].trim();\n\n    // Parse the value (could be string, array, etc...)\n    const value = parseYaml(valueStr);\n    return value;\n  } else {\n    return null;\n  }\n}\n\nconst kFirstYamlBlockRegex = /\\s*---[ \\t]*\\n(?![ \\t]*\\n)([\\W\\w]*?)\\n[\\t >]*(?:---|\\.\\.\\.)[ \\t]*/m;\n\nexport function firstYamlBlock(code: string): { [key: string]: any } | null {\n  const match = code.match(kFirstYamlBlockRegex);\n  if (match && match.index === 0) {\n    const yamlCode = match[1];\n    const yamlParsed = parseYaml(yamlCode);\n    if (typeof yamlParsed === 'object') {\n      return yamlParsed;\n    } else {\n      return null;\n    }\n  } else {\n    return null;\n  }\n}\n\nexport function parseYaml(yamlCode: string) {\n  try {\n    const yamlParsed = yaml.safeLoad(yamlCode, {\n      onWarning: logException,\n    });\n    return yamlParsed;\n  } catch (e) {\n    logException(e);\n    return null;\n  }\n}\n\nexport function toYamlCode(obj: any): string | null {\n  try {\n    const yamlCode = yaml.safeDump(obj);\n    return yamlCode;\n  } catch (e) {\n    logException(e);\n    return null;\n  }\n}\n\nexport function stripYamlDelimeters(yamlCode: string) {\n  return yamlCode.replace(/^[ \\t-]+\\n/, '').replace(/\\n[ \\t-\\.]+$/, '');\n}\n\nexport interface ParsedYaml {\n  yamlCode: string;\n  yaml: any;\n  node: NodeWithPos;\n}\n\nexport function parseYamlNodes(doc: ProsemirrorNode): ParsedYaml[] {\n  const yamlNodes = yamlMetadataNodes(doc);\n\n  const parsedYamlNodes = yamlNodes.map<ParsedYaml>(node => {\n    const yamlText = node.node.textContent;\n    const yamlCode = stripYamlDelimeters(yamlText);\n    return { yamlCode, yaml: parseYaml(yamlCode), node };\n  });\n  return parsedYamlNodes;\n}\n\nfunction firstYamlNode(doc: ProsemirrorNode) {\n  const yamlNodes = yamlMetadataNodes(doc);\n  if (yamlNodes && yamlNodes.length > 0) {\n    return yamlNodes[0];\n  } else {\n    return '';\n  }\n}\n","/*\n * format.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface EditorFormat {\n  readonly pandocMode: string;\n  readonly pandocExtensions: string;\n  readonly rmdExtensions: EditorRmdExtensions;\n  readonly hugoExtensions: EditorHugoExtensions;\n  readonly docTypes: EditorExtendedDocType[];\n}\n\nexport interface EditorRmdExtensions {\n  readonly codeChunks?: boolean;\n  readonly bookdownXRef?: boolean;\n  readonly bookdownXRefUI?: boolean;\n  readonly bookdownPart?: boolean;\n  readonly blogdownMathInCode?: boolean;\n}\n\nexport interface EditorHugoExtensions {\n  readonly shortcodes?: boolean;\n}\n\nexport const kBookdownDocType = 'bookdown';\nexport const kHugoDocType = 'hugo';\n\nexport type EditorExtendedDocType = 'bookdown' | 'hugo';\n","/*\n * object.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function findValue(key: string, object?: { [key: string]: any }) {\n  if (!object) {\n    return undefined;\n  }\n\n  let value;\n\n  Object.keys(object).some(k => {\n    if (k === key) {\n      value = object[k];\n      return true;\n    }\n    if (object[k] && typeof object[k] === 'object') {\n      value = findValue(key, object[k]);\n      return value !== undefined;\n    }\n    return false;\n  });\n\n  return value;\n}\n","/*\n * log.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function logException(e: Error) {\n  // TODO: log exceptions (we don't want to use console.log in production code, so this would\n  // utilize some sort of external logging facility)\n  // console.log(e);\n}\n","/*\n * basekeys.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport {\n  splitBlock,\n  liftEmptyBlock,\n  createParagraphNear,\n  selectNodeBackward,\n  joinBackward,\n  deleteSelection,\n  selectNodeForward,\n  joinForward,\n  chainCommands,\n} from 'prosemirror-commands';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { keymap } from 'prosemirror-keymap';\nimport { EditorState, Transaction, Plugin, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { CommandFn } from './command';\nimport { editingRootNodeClosestToPos, editingRootNode } from './node';\nimport { selectionIsBodyTopLevel } from './selection';\nimport { kPlatformMac } from './platform';\n\nexport enum BaseKey {\n  Home = 'Home',\n  End = 'End',\n  Enter = 'Enter',\n  ModEnter = 'Mod-Enter',\n  ShiftEnter = 'Shift-Enter',\n  Backspace = 'Backspace',\n  Delete = 'Delete|Mod-Delete', // Use pipes to register multiple commands\n  Tab = 'Tab',\n  ShiftTab = 'Shift-Tab',\n  ArrowUp = 'Up|ArrowUp',\n  ArrowDown = 'Down|ArrowDown',\n  ArrowLeft = 'Left|ArrowLeft',\n  ArrowRight = 'Right|ArrowRight',\n  ModArrowUp = 'Mod-Up|Mod-ArrowUp',\n  ModArrowDown = 'Mod-Down|Mod-ArrowDown',\n  CtrlHome = 'Ctrl-Home',\n  CtrlEnd = 'Ctrl-End',\n  ShiftArrowLeft = 'Shift-Left|Shift-ArrowLeft',\n  ShiftArrowRight = 'Shift-Right|Shift-ArrowRight',\n  AltArrowLeft = 'Alt-Left|Alt-ArrowLeft',\n  AltArrowRight = 'Alt-Right|Alt-ArrowRight',\n  CtrlArrowLeft = 'Ctrl-Left|Ctrl-ArrowLeft',\n  CtrlArrowRight = 'Ctrl-Right|Ctrl-ArrowRight',\n  CtrlShiftArrowLeft = 'Ctrl-Shift-Left|Ctrl-Shift-ArrowLeft',\n  CtrlShiftArrowRight = 'Ctrl-Shift-Right|Ctrl-Shift-ArrowRight',\n}\n\nexport interface BaseKeyBinding {\n  key: BaseKey;\n  command: CommandFn;\n}\n\nexport function baseKeysPlugin(keys: readonly BaseKeyBinding[]): Plugin {\n  // collect all keys\n  const pluginKeys = [\n    // base enter key behaviors\n    { key: BaseKey.Enter, command: splitBlock },\n    { key: BaseKey.Enter, command: liftEmptyBlock },\n    { key: BaseKey.Enter, command: createParagraphNear },\n\n    // base backspace key behaviors\n    { key: BaseKey.Backspace, command: selectNodeBackward },\n    { key: BaseKey.Backspace, command: joinBackward },\n    { key: BaseKey.Backspace, command: deleteSelection },\n\n    // base tab key behavior (ignore)\n    { key: BaseKey.Tab, command: ignoreKey },\n    { key: BaseKey.ShiftTab, command: ignoreKey },\n\n    // base delete key behaviors\n    { key: BaseKey.Delete, command: selectNodeForward },\n    { key: BaseKey.Delete, command: joinForward },\n    { key: BaseKey.Delete, command: deleteSelection },\n\n    // base home/end key behaviors (Mac desktop default behavior advances to beginning/end of\n    // document, so we provide our own implementation rather than relying on contentEditable)\n    kPlatformMac ? { key: BaseKey.Home, command: homeKey } : null,\n    kPlatformMac ? { key: BaseKey.End, command: endKey } : null,\n\n    // base arrow key behavior (prevent traversing top-level body notes)\n    { key: BaseKey.ArrowLeft, command: arrowBodyNodeBoundary('left') },\n    { key: BaseKey.ArrowUp, command: arrowBodyNodeBoundary('up') },\n    { key: BaseKey.ArrowRight, command: arrowBodyNodeBoundary('right') },\n    { key: BaseKey.ArrowDown, command: arrowBodyNodeBoundary('down') },\n    { key: BaseKey.ModArrowDown, command: endTopLevelBodyNodeBoundary() },\n    { key: BaseKey.CtrlEnd, command: endTopLevelBodyNodeBoundary() },\n\n    // merge keys provided by extensions\n    ...keys,\n\n    // undoInputRule is always the highest priority backspace key\n    { key: BaseKey.Backspace, command: undoInputRule },\n  ].filter(x => !!x);\n\n  // build arrays for each BaseKey type\n  const commandMap: { [key: string]: CommandFn[] } = {};\n  for (const baseKey of Object.values(BaseKey)) {\n    commandMap[baseKey] = [];\n  }\n  pluginKeys.forEach(key => {\n    if (key) {\n      commandMap[key.key].unshift(key.command);\n    }\n  });\n\n  const bindings: { [key: string]: CommandFn } = {};\n  for (const baseKey of Object.values(BaseKey)) {\n    const commands = commandMap[baseKey];\n    // baseKey may contain multiple keys, separated by |\n    for (const subkey of baseKey.split(/\\|/)) {\n      bindings[subkey] = chainCommands(...commands);\n    }\n  }\n\n  // return keymap\n  return keymap(bindings);\n}\n\nexport function verticalArrowCanAdvanceWithinTextBlock(selection: Selection, dir: 'up' | 'down') {\n  const $head = selection.$head;\n  const node = $head.node();\n  if (node.isTextblock) {\n    const cursorOffset = $head.parentOffset;\n    const nodeText = node.textContent;\n    if (dir === 'down' && nodeText.substr(cursorOffset).includes('\\n')) {\n      return true;\n    }\n    if (dir === 'up' && nodeText.substr(0, cursorOffset).includes('\\n')) {\n      return true;\n    }\n  }\n  return false;\n}\n\ninterface Coords {\n  left: number;\n  right: number;\n  top: number;\n  bottom: number;\n}\n\nfunction ignoreKey(state: EditorState, dispatch?: (tr: Transaction) => void) {\n  return true;\n}\n\nfunction homeKey(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n  const selection = state.selection;\n  const editingNode = editingRootNode(selection);\n  if (editingNode && dispatch && view) {\n    const head = view.coordsAtPos(selection.head);\n    const beginDocPos = editingNode.start;\n    for (let pos = selection.from - 1; pos >= beginDocPos; pos--) {\n      const coords = view.coordsAtPos(pos);\n      if (isOnPreviousLine(head, coords) || pos === beginDocPos) {\n        const tr = state.tr;\n        setTextSelection(pos + 1)(tr);\n        dispatch(tr);\n        break;\n      }\n    }\n  }\n  return true;\n}\n\nfunction endKey(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n  const selection = state.selection;\n  const editingNode = editingRootNode(selection);\n  if (editingNode && dispatch && view) {\n    const head = view.coordsAtPos(selection.head);\n    const endDocPos = editingNode.start + editingNode.node.nodeSize;\n    for (let pos = selection.from + 1; pos < endDocPos; pos++) {\n      const coords = view.coordsAtPos(pos);\n      if (isOnNextLine(head, coords) || pos === endDocPos) {\n        const tr = state.tr;\n        setTextSelection(pos - 1)(tr);\n        dispatch(tr);\n        break;\n      }\n    }\n  }\n  return true;\n}\n\n// helpers to check for a y coordinate on a diffent line that the selection\n\n// y coorinates are sometimes off by 1 or 2 due to margin/padding (e.g. for\n// inline code spans or spelling marks) so the comparision only succeeds if\n// the vertical extents of the two coords don't overlap. If this proves to\n// still have false positives, we could lookahead to the next a few dozen\n// positions to check if we ever \"return to\" the head's baseline--only a\n// permanent change would indicate that the line has truly changed.\n\nfunction isOnNextLine(head: Coords, pos: Coords) {\n  return head.bottom < pos.top;\n}\n\nfunction isOnPreviousLine(head: Coords, pos: Coords) {\n  return head.top > pos.bottom;\n}\n\nfunction arrowBodyNodeBoundary(dir: 'up' | 'down' | 'left' | 'right') {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    if (view && view.endOfTextblock(dir) && selectionIsBodyTopLevel(state.selection)) {\n      const side = dir === 'left' || dir === 'up' ? -1 : 1;\n      const $head = state.selection.$head;\n      const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n      const currentRootNode = editingRootNodeClosestToPos($head);\n      const nextRootNode = editingRootNodeClosestToPos(nextPos.$head);\n      return currentRootNode?.node?.type !== nextRootNode?.node?.type;\n    } else {\n      return false;\n    }\n  };\n}\n\nfunction endTopLevelBodyNodeBoundary() {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const editingNode = editingRootNode(state.selection);\n    if (editingNode && selectionIsBodyTopLevel(state.selection)) {\n      if (dispatch) {\n        const tr = state.tr;\n        setTextSelection(editingNode.pos + editingNode.node.nodeSize - 2)(tr).scrollIntoView();\n        dispatch(tr);\n      }\n      return true;\n    } else {\n      return false;\n    }\n  };\n}\n","/*\n * selection.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, NodeSelection } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport { NodeWithPos, setTextSelection } from 'prosemirror-utils';\n\nimport { kAddToHistoryTransaction, kRestoreLocationTransaction } from './transaction';\n\nexport function selectionIsWithin(selection: Selection, nodeWithPos: NodeWithPos) {\n  const from = nodeWithPos.pos + 1;\n  const to = from + nodeWithPos.node.nodeSize;\n  return selectionIsWithinRange(selection, { from, to });\n}\n\nexport function selectionHasRange(selection: Selection, range: { from: number; to: number }) {\n  return selection.from === range.from && selection.to === range.to;\n}\n\nexport function selectionIsWithinRange(selection: Selection, range: { from: number; to: number }) {\n  return selection.anchor >= range.from && selection.anchor <= range.to;\n}\n\nexport function selectionIsBodyTopLevel(selection: Selection) {\n  const { $head } = selection;\n  const parentNode = $head.node($head.depth - 1);\n  return parentNode && \n         (parentNode.type === parentNode.type.schema.nodes.body ||\n          (selection instanceof GapCursor && parentNode.type === parentNode.type.schema.nodes.doc));\n}\n\nexport function selectionIsImageNode(schema: Schema, selection: Selection) {\n  return selection instanceof NodeSelection && [schema.nodes.image, schema.nodes.figure].includes(selection.node.type);\n}\n\nexport function selectionIsEmptyParagraph(schema: Schema, selection: Selection) {\n  const { $head } = selection;\n  return $head.parent.type === schema.nodes.paragraph && $head.parent.childCount === 0;\n}\n\nexport function restoreSelection(view: EditorView, pos: number) {\n  const tr = view.state.tr;\n  if (pos < view.state.doc.nodeSize) {\n    setTextSelection(pos)(tr);\n    tr.setMeta(kAddToHistoryTransaction, false);\n    tr.setMeta(kRestoreLocationTransaction, true);\n    view.dispatch(tr);\n  }\n}\n","/*\n * transaction.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction, EditorState, Plugin, PluginKey, Selection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Mark, MarkType, Slice } from 'prosemirror-model';\nimport { ChangeSet } from 'prosemirror-changeset';\nimport { ReplaceStep, Step, Transform } from 'prosemirror-transform';\n\nimport { sliceContentLength } from './slice';\n\nexport const kPasteTransaction = 'paste';\nexport const kSetMarkdownTransaction = 'setMarkdown';\nexport const kAddToHistoryTransaction = 'addToHistory';\nexport const kFixupTransaction = 'docFixup';\nexport const kRestoreLocationTransaction = 'restoreLocation';\nexport const kNavigationTransaction = 'navigationTransaction';\nexport const kInsertSymbolTransaction = 'insertSymbol';\nexport const kInsertCompletionTransaction = 'insertCompletion';\n\nexport type TransactionsFilter = (transactions: Transaction[], oldState: EditorState, newState: EditorState) => boolean;\n\nexport type TransactionNodeFilter = (\n  node: ProsemirrorNode<any>,\n  pos: number,\n  parent: ProsemirrorNode<any>,\n  index: number,\n) => boolean;\n\nexport interface AppendTransactionHandler {\n  name: string;\n  filter?: TransactionsFilter;\n  nodeFilter?: TransactionNodeFilter;\n  append: (tr: Transaction, transactions: Transaction[], oldState: EditorState, newState: EditorState) => void;\n}\n\n// wrapper for transaction that is guaranteed not to modify the position of any\n// nodes in the document (useful for grouping many disparate handlers that arne't\n// aware of each other's actions onto the same trasaction)\nexport class MarkTransaction {\n  private tr: Transaction;\n\n  constructor(tr: Transaction) {\n    this.tr = tr;\n  }\n  get doc(): ProsemirrorNode {\n    return this.tr.doc;\n  }\n  get selection(): Selection {\n    return this.tr.selection;\n  }\n  public addMark(from: number, to: number, mark: Mark): this {\n    this.tr.addMark(from, to, mark);\n    return this;\n  }\n  public removeMark(from: number, to: number, mark?: Mark | MarkType): this {\n    this.tr.removeMark(from, to, mark);\n    return this;\n  }\n  public removeStoredMark(mark: Mark | MarkType): this {\n    this.tr.removeStoredMark(mark);\n    return this;\n  }\n  public insertText(text: string, from: number): this {\n    this.tr.insertText(text, from, from + text.length);\n    return this;\n  }\n}\n\nexport interface AppendMarkTransactionHandler {\n  name: string;\n  filter: (node: ProsemirrorNode, transactions: Transaction[]) => boolean;\n  append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number, state: EditorState) => void;\n}\n\nexport function appendMarkTransactionsPlugin(handlers: readonly AppendMarkTransactionHandler[]): Plugin {\n  return new Plugin({\n    key: new PluginKey('appendMarkTransactions'),\n\n    appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n      // skip for selection-only changes\n      if (!transactionsDocChanged(transactions)) {\n        return;\n      }\n\n      // create transaction\n      const tr = newState.tr;\n\n      // create markTransaction wrapper\n      const markTr = new MarkTransaction(tr);\n\n      forChangedNodes(\n        oldState,\n        newState,\n        node => true,\n        (node: ProsemirrorNode, pos: number) => {\n          for (const handler of handlers) {\n            // get a fresh view of the node\n            node = tr.doc.nodeAt(pos)!;\n\n            // call the handler\n            if (handler.filter(node, transactions)) {\n              handler.append(markTr, node, pos, newState);\n            }\n          }\n        },\n      );\n\n      // return transaction\n      if (tr.docChanged || tr.selectionSet || tr.storedMarksSet) {\n        return tr;\n      }\n    },\n  });\n}\n\nexport function appendTransactionsPlugin(handlers: readonly AppendTransactionHandler[]): Plugin {\n  return new Plugin({\n    key: new PluginKey('appendTransactions'),\n\n    appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n      // skip for selection-only changes\n      if (!transactionsDocChanged(transactions)) {\n        return;\n      }\n\n      // create transaction\n      const tr = newState.tr;\n\n      // compute the changeSet\n      if (transactionsAreTypingChange(transactions)) {\n        const changeSet = transactionsChangeSet(transactions, oldState, newState);\n\n        // call each handler\n        for (const handler of handlers) {\n          // track whether there is a change\n          let haveChange = false;\n\n          // call filters if we have them\n          if (handler.filter || handler.nodeFilter) {\n            // first the low-level transaction filter\n            if (handler.filter) {\n              haveChange = handler.filter(transactions, oldState, newState);\n            }\n\n            // if that doesn't detect a change then try the nodeFilter if we have one\n            if (!haveChange && handler.nodeFilter) {\n              const checkForChange = (\n                node: ProsemirrorNode<any>,\n                pos: number,\n                parent: ProsemirrorNode<any>,\n                index: number,\n              ) => {\n                if (handler.nodeFilter!(node, pos, parent, index)) {\n                  haveChange = true;\n                  return false;\n                }\n              };\n\n              for (const change of changeSet.changes) {\n                oldState.doc.nodesBetween(change.fromA, change.toA, checkForChange);\n                newState.doc.nodesBetween(change.fromB, change.toB, checkForChange);\n              }\n            }\n\n            // no filters means we should always run (force haveChange to true)\n          } else {\n            haveChange = true;\n          }\n\n          // run the handler if applicable\n          if (haveChange) {\n            handler.append(tr, transactions, oldState, newState);\n          }\n        }\n\n        // run them all if this is a larger change\n      } else {\n        handlers.forEach(handler => handler.append(tr, transactions, oldState, newState));\n      }\n\n      // return transaction\n      if (tr.docChanged || tr.selectionSet || tr.storedMarksSet) {\n        return tr;\n      }\n    },\n  });\n}\n\nexport function transactionsDocChanged(transactions: Transaction[]) {\n  return transactions.some(transaction => transaction.docChanged);\n}\n\nexport function transactionsChangeSet(transactions: Transaction[], oldState: EditorState, newState: EditorState) {\n  let changeSet = ChangeSet.create(oldState.doc);\n  for (const transaction of transactions) {\n    changeSet = changeSet.addSteps(newState.doc, transaction.mapping.maps);\n  }\n  return changeSet;\n}\n\nexport function trTransform(tr: Transaction, f: (transform: Transform) => void): Transaction {\n  // create a new transform so we can do position mapping relative\n  // to the actions taken here (b/c the transaction might already\n  // have other steps so we can't do tr.mapping.map)\n  const newActions = new Transform(tr.doc);\n\n  // call the function (passing it a mapping function that uses our newActions)\n  f(newActions);\n\n  // copy the contents of newActions to the actual transaction\n  for (const step of newActions.steps) {\n    tr.step(step);\n  }\n\n  // return the transaction for chaining\n  return tr;\n}\n\nexport function transactionsHaveChange(\n  transactions: Transaction[],\n  oldState: EditorState,\n  newState: EditorState,\n  predicate: (node: ProsemirrorNode<any>, pos: number, parent: ProsemirrorNode<any>, index: number) => boolean,\n) {\n  // screen out transactions with no doc changes\n  if (!transactionsDocChanged(transactions)) {\n    return false;\n  }\n\n  // function to check for whether we have a change and set a flag if we do\n  let haveChange = false;\n  const checkForChange = (node: ProsemirrorNode<any>, pos: number, parent: ProsemirrorNode<any>, index: number) => {\n    if (predicate(node, pos, parent, index)) {\n      haveChange = true;\n      return false;\n    }\n  };\n\n  // for each change in each transaction, check for a node that matches the predicate in either the old or new doc\n  const changeSet = transactionsChangeSet(transactions, oldState, newState);\n\n  for (const change of changeSet.changes) {\n    oldState.doc.nodesBetween(change.fromA, change.toA, checkForChange);\n    newState.doc.nodesBetween(change.fromB, change.toB, checkForChange);\n    if (haveChange) {\n      break;\n    }\n  }\n\n  return haveChange;\n}\n\nexport function forChangedNodes(\n  oldState: EditorState | null,\n  newState: EditorState,\n  predicate: (node: ProsemirrorNode) => boolean,\n  f: (node: ProsemirrorNode, pos: number) => boolean | void,\n) {\n  let complete = false;\n  const handler = (node: ProsemirrorNode, pos: number) => {\n    if (complete) {\n      return;\n    }\n\n    if (!predicate || predicate(node)) {\n      if (f(node, pos) === false) {\n        complete = true;\n      }\n    }\n  };\n\n  if (!oldState) {\n    newState.doc.descendants(handler);\n  } else if (oldState.doc !== newState.doc) {\n    changedDescendants(oldState.doc, newState.doc, 0, handler);\n  }\n}\n\n// Helper for iterating through the nodes in a document that changed\n// compared to the given previous document. Useful for avoiding\n// duplicate work on each transaction.\n// from: https://github.com/ProseMirror/prosemirror-tables/blob/master/src/fixtables.js\nfunction changedDescendants(\n  old: ProsemirrorNode,\n  cur: ProsemirrorNode,\n  offset: number,\n  f: (node: ProsemirrorNode, pos: number) => void,\n) {\n  const oldSize = old.childCount;\n  const curSize = cur.childCount;\n  outer: for (let i = 0, j = 0; i < curSize; i++) {\n    const child = cur.child(i);\n    for (let scan = j, e = Math.min(oldSize, i + 3); scan < e; scan++) {\n      if (old.child(scan) === child) {\n        j = scan + 1;\n        offset += child.nodeSize;\n        continue outer;\n      }\n    }\n    f(child, offset);\n    if (j < oldSize && old.child(j).sameMarkup(child)) {\n      changedDescendants(old.child(j), child, offset + 1, f);\n    } else {\n      child.nodesBetween(0, child.content.size, f, offset + 1);\n    }\n    offset += child.nodeSize;\n  }\n}\n\nexport function transactionsAreTypingChange(transactions: Transaction[]) {\n  if (\n    transactions.length === 1 &&\n    transactions[0].steps.length === 1 &&\n    transactions[0].steps[0] instanceof ReplaceStep\n  ) {\n    // step to examine\n    const step: any = transactions[0].steps[0];\n\n    // insert single chraracter or new empty slice (e.g. from enter after a paragraph)\n    if (step.from === step.to && sliceContentLength(step.slice) <= 1) {\n      return true;\n    }\n\n    // remove single character\n    if (Math.abs(step.from - step.to) === 1 && step.slice.content.size === 0) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nexport interface RangeStep extends Step {\n  from: number;\n  to: number;\n}\n\nexport interface SliceStep extends RangeStep {\n  slice: Slice;\n}\n","/*\n * slice.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Slice, Node as ProsemirrorNode } from 'prosemirror-model';\n\nexport function sliceContentLength(slice: Slice) {\n  let length = 0;\n  for (let i = 0; i < slice.content.childCount; i++) {\n    length += slice.content.child(i).textContent.length;\n  }\n  return length;\n}\n\nexport function sliceHasNode(slice: Slice, predicate: (node: ProsemirrorNode) => boolean) {\n  let hasNode = false;\n  slice.content.descendants(node => {\n    if (predicate(node)) {\n      hasNode = true;\n      return false;\n    }\n  });\n  return hasNode;\n}\n","/*\n * platform.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kPlatformMac = typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false;\n","/*\n * outline.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\n\nimport { NodeWithPos, findChildrenByType } from 'prosemirror-utils';\n\nimport { findTopLevelBodyNodes } from './node';\nimport { titleFromYamlMetadataNode } from './yaml';\nimport { rmdChunkEngineAndLabel } from './rmd';\n\nexport interface EditorOutlineItem {\n  navigation_id: string;\n  type: EditorOutlineItemType;\n  level: number;\n  sequence: number;\n  title: string;\n  children: EditorOutlineItem[];\n}\n\nexport const kHeadingOutlineItemType = 'heading';\nexport const kRmdchunkOutlineItemType = 'rmd_chunk';\nexport const kYamlMetadataOutlineItemType = 'yaml_metadata';\n\nexport type EditorOutlineItemType = 'heading' | 'rmd_chunk' | 'yaml_metadata';\n\nexport type EditorOutline = EditorOutlineItem[];\n\nexport interface EditingOutlineLocationItem {\n  type: EditorOutlineItemType;\n  level: number;\n  title: string;\n  active: boolean;\n  position: number;\n}\n\nexport interface EditingOutlineLocation {\n  items: EditingOutlineLocationItem[];\n}\n\nexport function getEditingOutlineLocation(state: EditorState): EditingOutlineLocation {\n  // traverse document outline to get base location info\n  const itemsWithPos = getDocumentOutline(state).map(nodeWithPos => {\n    const schema = state.schema;\n    const node = nodeWithPos.node;\n    const item: EditingOutlineLocationItem = {\n      type: kYamlMetadataOutlineItemType,\n      level: 0,\n      title: '',\n      active: false,\n      position: nodeWithPos.pos,\n    };\n    if (node.type === schema.nodes.yaml_metadata) {\n      item.type = kYamlMetadataOutlineItemType;\n      item.title = titleFromYamlMetadataNode(node) || '';\n    } else if (node.type === schema.nodes.rmd_chunk) {\n      item.type = kRmdchunkOutlineItemType;\n      const chunk = rmdChunkEngineAndLabel(node.textContent);\n      if (chunk) {\n        item.title = chunk.label;\n      }\n    } else if (node.type === schema.nodes.heading) {\n      item.type = kHeadingOutlineItemType;\n      item.level = node.attrs.level;\n      item.title = node.textContent;\n    }\n    return {\n      item,\n      pos: nodeWithPos.pos,\n    };\n  });\n\n  // return the location, set the active item by scanning backwards until\n  // we find an item with a position before the cursor\n  let foundActive = false;\n  const items: EditingOutlineLocationItem[] = [];\n  for (let i = itemsWithPos.length - 1; i >= 0; i--) {\n    const item = itemsWithPos[i].item;\n    if (!foundActive && itemsWithPos[i].pos < state.selection.from) {\n      item.active = true;\n      foundActive = true;\n    }\n    items.unshift(item);\n  }\n\n  // return the outline\n  return { items };\n}\n\n// get a document outline that matches the scheme provided in EditingOutlineLocation:\n//  - yaml metadata blocks\n//  - top-level headings\n//  - rmd chunks at the top level or within a top-level list\nexport function getDocumentOutline(state: EditorState): NodeWithPos[] {\n  // get top level body nodes\n  const schema = state.schema;\n  const bodyNodes = findTopLevelBodyNodes(state.doc, node => {\n    return [\n      schema.nodes.yaml_metadata,\n      schema.nodes.rmd_chunk,\n      schema.nodes.heading,\n      schema.nodes.bullet_list,\n      schema.nodes.ordered_list,\n    ].includes(node.type);\n  });\n\n  // reduce (explode lists into contained rmd chunks)\n  const outlineNodes: NodeWithPos[] = [];\n  bodyNodes.forEach(bodyNode => {\n    // explode lists\n    if ([schema.nodes.bullet_list, schema.nodes.ordered_list].includes(bodyNode.node.type)) {\n      // look for rmd chunks within list items (non-recursive, only want top level)\n      findChildrenByType(bodyNode.node, schema.nodes.list_item, false).forEach(listItemNode => {\n        findChildrenByType(listItemNode.node, schema.nodes.rmd_chunk, false).forEach(rmdChunkNode => {\n          outlineNodes.push({\n            node: rmdChunkNode.node,\n            pos: bodyNode.pos + 1 + listItemNode.pos + 1 + rmdChunkNode.pos,\n          });\n        });\n      });\n\n      // other nodes go straight through\n    } else {\n      outlineNodes.push(bodyNode);\n    }\n  });\n\n  // return outline nodes\n  return outlineNodes;\n}\n\nexport function getOutlineNodes(doc: ProsemirrorNode) {\n  return findTopLevelBodyNodes(doc, isOutlineNode);\n}\n\nexport function isOutlineNode(node: ProsemirrorNode) {\n  if (node.type.spec.attrs) {\n    return node.type.spec.attrs.hasOwnProperty('navigation_id');\n  } else {\n    return false;\n  }\n}\n","/*\n * rmd.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport {\n  findParentNodeOfType,\n  findChildrenByType,\n  findChildren,\n  findChildrenByMark,\n  setTextSelection,\n} from 'prosemirror-utils';\n\nimport { getMarkRange } from './mark';\nimport { precedingListItemInsertPos, precedingListItemInsert } from './list';\nimport { toggleBlockType } from './command';\nimport { selectionIsBodyTopLevel } from './selection';\nimport { uuidv4 } from './util';\n\nexport interface EditorRmdChunk {\n  lang: string;\n  meta: string;\n  code: string;\n}\n\nexport type ExecuteRmdChunkFn = (chunk: EditorRmdChunk) => void;\n\nexport function canInsertRmdChunk(state: EditorState) {\n  // must either be at the body top level, within a list item, within a div, or within a\n  // blockquote (and never within a table)\n  const schema = state.schema;\n  const within = (nodeType: NodeType) => !!findParentNodeOfType(nodeType)(state.selection);\n  if (within(schema.nodes.table)) {\n    return false;\n  }\n  if (\n    !selectionIsBodyTopLevel(state.selection) &&\n    !within(schema.nodes.list_item) &&\n    !within(schema.nodes.blockquote) &&\n    schema.nodes.div && !within(schema.nodes.div)\n  ) {\n    return false;\n  }\n\n  return true;\n}\n\nexport function insertRmdChunk(chunkPlaceholder: string, rowOffset = 0, colOffset = 0) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    const schema = state.schema;\n\n    if (\n      !(state.selection instanceof GapCursor) &&\n      !toggleBlockType(schema.nodes.rmd_chunk, schema.nodes.paragraph)(state) &&\n      !precedingListItemInsertPos(state.doc, state.selection)\n    ) {\n      return false;\n    }\n\n    // must either be at the body top level, within a list item, within a div, or within a\n    // blockquote (and never within a table)\n    if (!canInsertRmdChunk(state)) {\n      return false;\n    }\n\n    if (dispatch) {\n      // compute offset\n      const lines = chunkPlaceholder.split(/\\r?\\n/);\n      const lineChars = lines.slice(0, rowOffset).reduce((count, line) => count + line.length + 1, 1);\n      const offsetChars = lineChars + colOffset;\n\n      // perform insert\n      const tr = state.tr;\n      const rmdText = schema.text(chunkPlaceholder);\n      const rmdNode = schema.nodes.rmd_chunk.create({ navigation_id: uuidv4() }, rmdText);\n      const prevListItemPos = precedingListItemInsertPos(tr.doc, tr.selection);\n      if (prevListItemPos) {\n        precedingListItemInsert(tr, prevListItemPos, rmdNode);\n      } else {\n        tr.replaceSelectionWith(rmdNode);\n        const selPos = tr.selection.from - rmdNode.nodeSize - 1 + offsetChars - 1;\n        setTextSelection(selPos)(tr);\n      }\n\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nexport function activeRmdChunk(state: EditorState): EditorRmdChunk | null {\n  if (state.schema.nodes.rmd_chunk) {\n    const rmdNode = findParentNodeOfType(state.schema.nodes.rmd_chunk)(state.selection);\n    if (rmdNode) {\n      return rmdChunk(rmdNode.node.textContent);\n    }\n  }\n  return null;\n}\n\nexport function previousExecutableRmdChunks(state: EditorState, pos = state.selection.from): EditorRmdChunk[] {\n  const activeChunk = activeRmdChunk(state);\n  const lang = activeChunk ? activeChunk.lang : 'r';\n  const kEvalFalseRegEx = /eval\\s*=\\s*F(?:ALSE)?/;\n  return previousRmdChunks(state, pos, chunk => {\n    return (\n      chunk.lang.localeCompare(lang, undefined, { sensitivity: 'accent' }) === 0 && !kEvalFalseRegEx.test(chunk.meta)\n    );\n  });\n}\n\nexport function previousRmdChunks(state: EditorState, pos: number, filter?: (chunk: EditorRmdChunk) => boolean) {\n  // chunks to return\n  const chunks: EditorRmdChunk[] = [];\n\n  // find all chunks in the document and return ones before the position that pass the specified filter\n  const schema = state.schema;\n  const rmdChunkNodes = findChildrenByType(state.doc, schema.nodes.rmd_chunk);\n  for (const rmdChunkNode of rmdChunkNodes) {\n    if (rmdChunkNode.pos + rmdChunkNode.node.nodeSize > pos) {\n      break;\n    }\n    const chunk = rmdChunk(rmdChunkNode.node.textContent);\n    if (chunk && (!filter || filter(chunk))) {\n      chunks.push(chunk);\n    }\n  }\n\n  // return chunks\n  return chunks;\n}\n\nexport function rmdChunk(code: string): EditorRmdChunk | null {\n  let lines = code.trimLeft().split('\\n');\n  if (lines.length > 0) {\n    const meta = lines[0].replace(/^[\\s`\\{]*(.*?)\\}?\\s*$/, '$1');\n    const matchLang = meta.match(/\\w+/);\n    const lang = matchLang ? matchLang[0] : '';\n\n    // remove lines, other than the first, which are chunk delimiters (start\n    // with ```). these are generally unintended but can be accidentally\n    // introduced by e.g., pasting a chunk with its delimiters into visual mode,\n    // where delimiters are implicit. if these lines aren't removed, they create\n    // nested chunks that break parsing and can corrupt the document (see case\n    // 8452)\n    lines = lines.filter((line, idx) => {\n      if (idx === 0) {\n        return true;\n      }\n      return !line.startsWith(\"```\");\n    });\n\n    // a completely empty chunk (no second line) should be returned\n    // as such. if it's not completely empty then append a newline\n    // to the result of split (so that the chunk ends w/ a newline)\n    const chunkCode = lines.length > 1 ? lines.slice(1).join('\\n') + '\\n' : '';\n\n    return {\n      lang,\n      meta,\n      code: chunkCode,\n    };\n  } else {\n    return null;\n  }\n}\n\nexport function mergeRmdChunks(chunks: EditorRmdChunk[]) {\n  if (chunks.length) {\n    const merged = {\n      lang: chunks[0].lang,\n      meta: '',\n      code: '',\n    };\n    chunks.forEach(chunk => (merged.code += chunk.code + '\\n'));\n    return merged;\n  } else {\n    return null;\n  }\n}\n\n/**\n * Attempts to extract the engine name and label from a chunk header.\n * \n * @param text The chunk header, e.g. {r foo}\n * @returns An object with `engine` and `label` properties, or null.\n */\nexport function rmdChunkEngineAndLabel(text: string) {\n  // Match the engine and label with a regex\n  const match = text.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+([a-zA-Z0-9/._='\"-]+)/);\n  if (match) {\n    // The second capturing group in the regex matches the first string after\n    // the engine. This might be a label (e.g., {r label}), but could also be\n    // a chunk option (e.g., {r echo=FALSE}). If it has an =, presume that it's\n    // an option.\n    if (match[2].indexOf(\"=\") !== -1) {\n      return null;\n    }\n    return {\n      engine: match[1],\n      label: match[2],\n    };\n  } else {\n    return null;\n  }\n}\n\nexport function haveTableCellsWithInlineRcode(doc: ProsemirrorNode) {\n  const schema = doc.type.schema;\n  const haveRCode = !!doc.type.schema.nodes.rmd_chunk;\n  if (haveRCode) {\n    const isTableCell = (node: ProsemirrorNode) =>\n      node.type === schema.nodes.table_cell || node.type === schema.nodes.table_header;\n    return findChildren(doc, isTableCell).some(cell => {\n      if (doc.rangeHasMark(cell.pos, cell.pos + cell.node.nodeSize, schema.marks.code)) {\n        const markedNodes = findChildrenByMark(cell.node, schema.marks.code, true);\n        return markedNodes.some(markedNode => {\n          const from = cell.pos + 1 + markedNode.pos;\n          const markedRange = getMarkRange(doc.resolve(from), schema.marks.code);\n          if (markedRange) {\n            const text = doc.textBetween(markedRange.from, markedRange.to);\n            return /^r[ #].+$/.test(text);\n          } else {\n            return false;\n          }\n        });\n      } else {\n        return false;\n      }\n    });\n  } else {\n    return false;\n  }\n}\n","/*\n * mark.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, MarkSpec, MarkType, ResolvedPos, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Selection, Transaction } from 'prosemirror-state';\n\nimport { PandocTokenReader, PandocMarkWriterFn, PandocInlineHTMLReaderFn } from './pandoc';\nimport { mergedTextNodes } from './text';\nimport { findChildrenByMark } from 'prosemirror-utils';\nimport { MarkTransaction } from './transaction';\n\nexport interface PandocMark {\n  readonly name: string;\n  readonly spec: MarkSpec;\n  readonly noInputRules?: boolean;\n  readonly noSpelling?: boolean;\n  readonly pandoc: {\n    readonly readers: readonly PandocTokenReader[];\n    readonly inlineHTMLReader?: PandocInlineHTMLReaderFn;\n    readonly writer: {\n      priority: number;\n      write: PandocMarkWriterFn;\n    };\n  };\n}\n\nexport function markIsActive(context: EditorState | Transaction, type: MarkType) {\n  const { from, $from, to, empty } = context.selection;\n\n  if (empty) {\n    return type && !!type.isInSet(context.storedMarks || $from.marks());\n  }\n\n  return !!context.doc.rangeHasMark(from, to, type);\n}\n\nexport function getMarkAttrs(doc: ProsemirrorNode, range: { from: number; to: number }, type: MarkType) {\n  const { from, to } = range;\n  let marks: Mark[] = [];\n\n  doc.nodesBetween(from, to, node => {\n    marks = [...marks, ...node.marks];\n  });\n\n  const mark = marks.find(markItem => markItem.type.name === type.name);\n\n  if (mark) {\n    return mark.attrs;\n  }\n\n  return {};\n}\n\nexport function getMarkRange($pos?: ResolvedPos, type?: MarkType) {\n  if (!$pos || !type) {\n    return false;\n  }\n\n  const start = $pos.parent.childAfter($pos.parentOffset);\n\n  if (!start.node) {\n    return false;\n  }\n\n  const link = start.node.marks.find((mark: Mark) => mark.type === type);\n  if (!link) {\n    return false;\n  }\n\n  let startIndex = $pos.index();\n  let startPos = $pos.start() + start.offset;\n  let endIndex = startIndex + 1;\n  let endPos = startPos + start.node.nodeSize;\n\n  while (startIndex > 0 && link.isInSet($pos.parent.child(startIndex - 1).marks)) {\n    startIndex -= 1;\n    startPos -= $pos.parent.child(startIndex).nodeSize;\n  }\n\n  while (endIndex < $pos.parent.childCount && link.isInSet($pos.parent.child(endIndex).marks)) {\n    endPos += $pos.parent.child(endIndex).nodeSize;\n    endIndex += 1;\n  }\n\n  return { from: startPos, to: endPos };\n}\n\nexport function getSelectionMarkRange(selection: Selection, markType: MarkType): { from: number; to: number } {\n  let range: { from: number; to: number };\n  if (selection.empty) {\n    range = getMarkRange(selection.$head, markType) as { from: number; to: number };\n  } else {\n    range = { from: selection.from, to: selection.to };\n  }\n  return range;\n}\n\nexport function removeInvalidatedMarks(\n  tr: MarkTransaction,\n  node: ProsemirrorNode,\n  pos: number,\n  re: RegExp,\n  markType: MarkType,\n) {\n  re.lastIndex = 0;\n  const markedNodes = findChildrenByMark(node, markType, true);\n  markedNodes.forEach(markedNode => {\n    const from = pos + 1 + markedNode.pos;\n    const markedRange = getMarkRange(tr.doc.resolve(from), markType);\n    if (markedRange) {\n      const text = tr.doc.textBetween(markedRange.from, markedRange.to);\n      if (!text.match(re)) {\n        tr.removeMark(markedRange.from, markedRange.to, markType);\n        tr.removeStoredMark(markType);\n      }\n    }\n  });\n  re.lastIndex = 0;\n}\n\nexport function splitInvalidatedMarks(\n  tr: MarkTransaction,\n  node: ProsemirrorNode,\n  pos: number,\n  validLength: (text: string) => number,\n  markType: MarkType,\n  removeMark?: (from: number, to: number) => void,\n) {\n  const hasMarkType = (nd: ProsemirrorNode) => markType.isInSet(nd.marks);\n  const markedNodes = findChildrenByMark(node, markType, true);\n  markedNodes.forEach(markedNode => {\n    const mark = hasMarkType(markedNode.node);\n    if (mark) {\n      const from = pos + 1 + markedNode.pos;\n      const markRange = getMarkRange(tr.doc.resolve(from), markType);\n      if (markRange) {\n        const text = tr.doc.textBetween(markRange.from, markRange.to);\n        const length = validLength(text);\n        if (length > -1 && length !== text.length) {\n          if (removeMark) {\n            removeMark(markRange.from + length, markRange.to);\n          } else {\n            tr.removeMark(markRange.from + length, markRange.to, markType);\n          }\n        }\n      }\n    }\n  });\n}\n\nexport function detectAndApplyMarks(\n  tr: MarkTransaction,\n  node: ProsemirrorNode,\n  pos: number,\n  re: RegExp,\n  markType: MarkType,\n  attrs: (match: RegExpMatchArray) => {},\n  filter?: (from: number, to: number) => boolean,\n  text?: (match: RegExpMatchArray) => string,\n) {\n  re.lastIndex = 0;\n  const textNodes = mergedTextNodes(node, (_node: ProsemirrorNode, _pos: number, parentNode: ProsemirrorNode) =>\n    parentNode.type.allowsMarkType(markType),\n  );\n  textNodes.forEach(textNode => {\n    re.lastIndex = 0;\n    let match = re.exec(textNode.text);\n    while (match !== null) {\n      const refText = text ? text(match) : match[0];\n      const from = pos + 1 + textNode.pos + match.index + (match[0].length - refText.length);\n      const to = from + refText.length;\n      const range = getMarkRange(tr.doc.resolve(to), markType);\n      if (\n        (!range || range.from !== from || range.to !== to) &&\n        !tr.doc.rangeHasMark(from, to, markType.schema.marks.code)\n      ) {\n        if (!filter || filter(from, to)) {\n          const mark = markType.create(attrs instanceof Function ? attrs(match) : attrs);\n          tr.addMark(from, to, mark);\n          if (tr.selection.anchor === to) {\n            tr.removeStoredMark(mark.type);\n          }\n        }\n      }\n      match = re.lastIndex !== 0 ? re.exec(textNode.text) : null;\n    }\n  });\n  re.lastIndex = 0;\n}\n","/*\n * text.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nexport interface TextWithPos {\n  readonly text: string;\n  readonly pos: number;\n}\n\nexport function mergedTextNodes(\n  doc: ProsemirrorNode,\n  filter?: (node: ProsemirrorNode, pos: number, parentNode: ProsemirrorNode) => boolean,\n): TextWithPos[] {\n  const textNodes: TextWithPos[] = [];\n  let nodeIndex = 0;\n  doc.descendants((node, pos, parentNode) => {\n    if (node.isText) {\n      // apply filter\n      if (filter && !filter(node, pos, parentNode)) {\n        return false;\n      }\n\n      // join existing contiguous range of text nodes or create a new one\n      if (textNodes[nodeIndex]) {\n        textNodes[nodeIndex] = {\n          text: textNodes[nodeIndex].text + node.text,\n          pos: textNodes[nodeIndex].pos,\n        };\n      } else {\n        textNodes[nodeIndex] = {\n          text: node.text || '',\n          pos,\n        };\n      }\n    } else {\n      nodeIndex += 1;\n    }\n  });\n  return textNodes;\n}\n\nexport function stripQuotes(text: string) {\n  return text.replace(/[\"']/g, '');\n}\n\nexport function equalsIgnoreCase(str1: string, str2: string) {\n  return str1.localeCompare(str2, undefined, { sensitivity: 'accent' }) === 0;\n}\n","/*\n * list.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, Selection } from 'prosemirror-state';\n\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nexport enum ListType {\n  Ordered = 'OrderedList',\n  Bullet = 'BulletList',\n}\n\nexport interface ListCapabilities {\n  tasks: boolean;\n  fancy: boolean;\n  example: boolean;\n  order: boolean;\n}\n\nexport function isList(node: ProsemirrorNode | null | undefined) {\n  if (node) {\n    const schema = node.type.schema;\n    return node.type === schema.nodes.bullet_list || node.type === schema.nodes.ordered_list;\n  } else {\n    return false;\n  }\n}\n\nexport function precedingListItemInsertPos(doc: ProsemirrorNode, selection: Selection) {\n  // selection just be empty\n  if (!selection.empty) {\n    return null;\n  }\n\n  // check for insert position in preceding list item (only trigger when\n  // the user is at the very beginning of a new bullet)\n  const schema = doc.type.schema;\n  const $head = selection.$head;\n  const parentListItem = findParentNodeOfType(schema.nodes.list_item)(selection);\n  if (parentListItem) {\n    const $liPos = doc.resolve(parentListItem.pos);\n    const listIndex = $liPos.index();\n    const parentIndex = $head.index($head.depth - 1);\n    const parentOffset = $head.parentOffset;\n    if (listIndex > 0 && parentIndex === 0 && parentOffset === 0) {\n      const pos = $liPos.pos - 1;\n      return pos;\n    } else {\n      return null;\n    }\n  } else {\n    return null;\n  }\n}\n\nexport function precedingListItemInsert(tr: Transaction, pos: number, node: ProsemirrorNode) {\n  tr.deleteRange(tr.selection.from, tr.selection.from + 1);\n  tr.insert(pos, node);\n  setTextSelection(tr.mapping.map(pos), -1)(tr);\n  return tr;\n}\n","/*\n * command.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { lift, setBlockType, toggleMark, wrapIn } from 'prosemirror-commands';\nimport { MarkType, Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { wrapInList, liftListItem } from 'prosemirror-schema-list';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNode, findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\nimport { EditorView } from 'prosemirror-view';\n\nimport { markIsActive, getMarkRange } from './mark';\nimport { canInsertNode, nodeIsActive } from './node';\nimport { pandocAttrInSpec, pandocAttrAvailable, pandocAttrFrom } from './pandoc_attr';\nimport { isList } from './list';\nimport { OmniInsert } from './omni_insert';\nimport { EditorUIPrefs, kListSpacingTight } from './ui';\nimport { selectionIsWithinRange, selectionHasRange } from './selection';\n\nexport enum EditorCommandId {\n  // text editing\n  Undo = '201CA961-829E-4708-8FBC-8896FDE85A10',\n  Redo = 'B6272475-04E0-48C0-86E3-DAFA763BDF7B',\n  SelectAll = 'E42BF0DA-8A02-4FCE-A202-7EA8A4833FC5',\n  ClearFormatting = 'C22D8CC4-0A9F-41D5-B540-7DAAAB80F344',\n\n  // formatting\n  Strong = '83B04020-1195-4A65-8A8E-7C173C87F439',\n  Em = '9E1B73E4-8140-43C3-92E4-A5E2583F40E6',\n  Code = '32621150-F829-4B8F-B5BD-627FABBBCF53',\n  Strikeout = 'D5F0225B-EC73-4600-A1F3-01F418EE8CB4',\n  Superscript = '0200D2FC-B5AF-423B-8B7A-4A7FC3DAA6AF',\n  Subscript = '3150428F-E468-4E6E-BF53-A2713E59B4A0',\n  Smallcaps = '41D8030F-5E8B-48F2-B1EE-6BC40FD502E4',\n  Underline = '7F0E6AE2-08F4-4594-9BA2-E6B8B27FA8F7',\n  Paragraph = '20EC2695-75CE-4DCD-A644-266E9F5F5913',\n  Heading1 = '5B77642B-923D-4440-B85D-1A27C9CF9D77',\n  Heading2 = '42985A4B-6BF2-4EEF-AA30-3E84A8B9111C',\n  Heading3 = '3F84D9DF-5EF6-484C-8615-BAAE2AC9ECE2',\n  Heading4 = 'DA76731D-1D84-4DBA-9BEF-A6F73536F0B9',\n  Heading5 = '59E24247-A140-466A-BC96-3C8ADABB57A5',\n  Heading6 = 'DB495DF5-8501-43C7-AE07-59CE9D9C373D',\n  CodeBlock = '3BA12A49-3E29-4ABC-9A49-436A3B49B880',\n  CodeBlockFormat = '07A6F2AA-01DC-41D7-9F01-AA91EAD856EE',\n  Blockquote = 'AF0717E7-E4BA-4909-9F10-17EB757CDD0F',\n  LineBlock = 'F401687C-B995-49AF-B2B0-59C158174FD5',\n  AttrEdit = '0F8A254D-9272-46BF-904D-3A9D68B91032',\n  Span = '852CF3E3-8A2B-420D-BD95-F79C54118E7E',\n  Div = '15EDB8F1-6015-4DA9-AE50-5987B24C1D96',\n  InsertDiv = 'ACA1521B-8875-4113-9D43-B47F0038B19F',\n\n  // lists\n  BulletList = 'D897FD2B-D6A4-44A7-A404-57B5251FBF64',\n  OrderedList = '3B8B82D5-7B6C-4480-B7DD-CF79C6817980',\n  TightList = 'A32B668F-74F3-43D7-8759-6576DDE1D603',\n  ListItemSink = '7B503FA6-6576-4397-89EF-37887A1B2EED',\n  ListItemLift = '53F89F57-22E2-4FCC-AF71-3E382EC10FC8',\n  ListItemSplit = '19BBD87F-96D6-4276-B7B8-470652CF4106',\n  ListItemCheck = '2F6DA9D8-EE57-418C-9459-50B6FD84137F',\n  ListItemCheckToggle = '34D30F3D-8441-44AD-B75A-415DA8AC740B',\n  EditListProperties = 'E006A68C-EA39-4954-91B9-DDB07D1CBDA2',\n\n  // tables\n  TableInsertTable = 'FBE39613-2DAA-445D-9E92-E1EABFB33E2C',\n  TableToggleHeader = 'A5EDA226-A3CA-4C1B-8D4D-C2675EF51AFF',\n  TableToggleCaption = 'C598D85C-E15C-4E10-9850-95882AEC7E60',\n  TableNextCell = '14299819-3E19-4A27-8D0B-8035315CF0B4',\n  TablePreviousCell = '0F041FB5-0203-4FF1-9D13-B16606A80F3E',\n  TableAddColumnBefore = '2447B81F-E07A-4C7D-8026-F2B148D5FF4A',\n  TableAddColumnAfter = 'ED86CFAF-D0B3-4B1F-9BB8-89987A939C8C',\n  TableDeleteColumn = 'B3D077BC-DD51-4E3A-8AD4-DE5DE686F7C4',\n  TableAddRowBefore = 'E97FB318-4052-41E5-A2F5-55B64E9826A5',\n  TableAddRowAfter = '3F28FA24-4BDD-4C13-84FF-9C5E1D4B04D6',\n  TableDeleteRow = '5F3B4DCD-5006-43A5-A069-405A946CAC68',\n  TableDeleteTable = '116D1E68-9315-4FEB-B6A0-AD25B3B9C881',\n  TableAlignColumnLeft = '0CD6A2A4-06F9-435D-B8C9-070B22B19D8',\n  TableAlignColumnRight = '86D90C12-BB12-4A9D-802F-D00EB7CEF2C5',\n  TableAlignColumnCenter = '63333996-2F65-4586-8494-EA9CAB5A7751',\n  TableAlignColumnDefault = '7860A9C1-60AF-40AD-9EB8-A10F6ADF25C5',\n\n  // insert\n  OmniInsert = '12F96C13-38C1-4266-A0A1-E871D8C709FB',\n  Link = '842FCB9A-CA61-4C5F-A0A0-43507B4B3FA9',\n  RemoveLink = '072D2084-218D-4A34-AF1F-7E196AF684B2',\n  Image = '808220A3-2B83-4CB6-BCC1-46565D54FA47',\n  Footnote = '1D1A73C0-F0E1-4A0F-BEBC-08398DE14A4D',\n  ParagraphInsert = '4E68830A-3E68-450A-B3F3-2591F4EB6B9A',\n  HorizontalRule = 'EAA7115B-181C-49EC-BDB1-F0FF10369278',\n  YamlMetadata = '431B5A45-1B25-4A55-9BAF-C0FE95D9B2B6',\n  Shortcode = '0FDDA7E8-419D-4A5D-A1F5-74061466655D',\n  InlineMath = 'A35C562A-0BD6-4B14-93D5-6FF3BE1A0C8A',\n  DisplayMath = '3E36BA99-2AE9-47C3-8C85-7CC5314A88DF',\n  Citation = 'EFFCFC81-F2E7-441E-B7FA-C693146B4185',\n  CrossReference = '48CEED4F-1D18-4AF9-8686-9FEB5DF6BCC8',\n  DefinitionList = 'CFAB8F4D-3350-4398-9754-8DE0FB95167B',\n  DefinitionTerm = '204D1A8F-8EE6-424A-8E69-99768C85B39E',\n  DefinitionDescription = 'F0738D83-8E11-4CB5-B958-390190A2D7DD',\n  Symbol = '1419765F-6E4A-4A4C-8670-D9E8578EA996',\n  Emoji = 'F73896A2-02CC-4E5D-A596-78444A1D2A37',\n  EmDash = '5B0DD33B-6209-4713-B8BB-60B5CA0BC3B3',\n  EnDash = 'C32AFE32-0E57-4A16-9C39-88EB1D82B8B4',\n  NonBreakingSpace = 'CF6428AB-F36E-446C-8661-2781B2CD1169',\n  HardLineBreak = '3606FF87-866C-4729-8F3F-D065388FC339',\n\n  // raw\n  TexInline = 'CFE8E9E5-93BA-4FFA-9A77-BA7EFC373864',\n  TexBlock = 'BD11A6A7-E528-40A2-8139-3F8F5F556ED2',\n  HTMLComment = 'F973CBA4-2882-4AC5-A642-47F4733EBDD4',\n  HTMLInline = 'C682C6B5-E58D-498C-A38F-FB07BEC3A82D',\n  HTMLBlock = '6F9F64AF-711F-4F91-8642-B51C41717F31',\n  RawInline = '984167C8-8582-469C-97D8-42CB12773657',\n  RawBlock = 'F5757992-4D33-45E6-86DC-F7D7B174B1EC',\n\n  // chunk\n  RCodeChunk = 'EBFD21FF-4A6E-4D88-A2E0-B38470B00BB9',\n  BashCodeChunk = '5FBB7283-E8AB-450C-9359-A4658CBCD136',\n  D3CodeChunk = 'C73CA46C-B56F-40B6-AEFA-DDBB30CA8C08',\n  PythonCodeChunk = '42A7A138-421A-4DCF-8A88-FE2F8EC5B8F6',\n  RcppCodeChunk = '6BD2810B-6B20-4358-8AA4-74BBFFC92AC3',\n  SQLCodeChunk = '41D61FD2-B56B-48A7-99BC-2F60BC0D9F78',\n  StanCodeChunk = '65D33344-CBE9-438C-B337-A538F8D7FCE5',\n  ExecuteCurentRmdChunk = '31C799F3-EF18-4F3A-92E6-51F7A3193A1B',\n  ExecuteCurrentPreviousRmdChunks = 'D3FDE96-0264-4364-ADFF-E87A75405B0B',\n\n  // outline\n  GoToNextSection = 'AE827BDA-96F8-4E84-8030-298D98386765',\n  GoToPreviousSection = 'E6AA728C-2B75-4939-9123-0F082837ACDF',\n}\n\nexport interface EditorCommand {\n  readonly id: EditorCommandId;\n  readonly keymap: readonly string[];\n  readonly isEnabled: () => boolean;\n  readonly isActive: () => boolean;\n  readonly plural: () => number;\n  readonly execute: () => void;\n}\n\nexport class ProsemirrorCommand {\n  public readonly id: EditorCommandId;\n  public readonly keymap: readonly string[];\n  public readonly execute: CommandFn;\n  public readonly omniInsert?: OmniInsert;\n  public readonly keepFocus: boolean;\n\n  constructor(\n    id: EditorCommandId,\n    keymap: readonly string[],\n    execute: CommandFn,\n    omniInsert?: OmniInsert,\n    keepFocus?: boolean,\n  ) {\n    this.id = id;\n    this.keymap = keymap;\n    this.execute = execute;\n    this.omniInsert = omniInsert;\n    this.keepFocus = !(keepFocus === false);\n  }\n\n  public isEnabled(state: EditorState): boolean {\n    return this.execute(state);\n  }\n\n  public isActive(state: EditorState): boolean {\n    return false;\n  }\n\n  public plural(state: EditorState): number {\n    return 1;\n  }\n}\n\nexport class MarkCommand extends ProsemirrorCommand {\n  public readonly markType: MarkType;\n  public readonly attrs: object;\n\n  constructor(id: EditorCommandId, keymap: string[], markType: MarkType, attrs = {}) {\n    super(id, keymap, toggleMarkType(markType, attrs) as CommandFn);\n    this.markType = markType;\n    this.attrs = attrs;\n  }\n\n  public isActive(state: EditorState) {\n    return markIsActive(state, this.markType);\n  }\n}\n\nexport class NodeCommand extends ProsemirrorCommand {\n  public readonly nodeType: NodeType;\n  public readonly attrs: object;\n\n  constructor(\n    id: EditorCommandId,\n    keymap: string[],\n    nodeType: NodeType,\n    attrs: object,\n    execute: CommandFn,\n    omniInsert?: OmniInsert,\n  ) {\n    super(id, keymap, execute, omniInsert);\n    this.nodeType = nodeType;\n    this.attrs = attrs;\n  }\n\n  public isActive(state: EditorState) {\n    return nodeIsActive(state, this.nodeType, this.attrs);\n  }\n}\n\nexport class BlockCommand extends NodeCommand {\n  constructor(\n    id: EditorCommandId,\n    keymap: string[],\n    blockType: NodeType,\n    toggleType: NodeType,\n    attrs = {},\n    omniInsert?: OmniInsert,\n  ) {\n    super(id, keymap, blockType, attrs, toggleBlockType(blockType, toggleType, attrs), omniInsert);\n  }\n}\n\nexport class WrapCommand extends NodeCommand {\n  constructor(id: EditorCommandId, keymap: string[], wrapType: NodeType, attrs = {}, omniInsert?: OmniInsert) {\n    super(id, keymap, wrapType, attrs, toggleWrap(wrapType, attrs), omniInsert);\n  }\n}\n\nexport class InsertCharacterCommand extends ProsemirrorCommand {\n  constructor(id: EditorCommandId, ch: string, keymap: string[]) {\n    super(id, keymap, (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n      // enable/disable command\n      const schema = state.schema;\n      if (!canInsertNode(state, schema.nodes.text)) {\n        return false;\n      }\n      if (dispatch) {\n        const tr = state.tr;\n        tr.replaceSelectionWith(schema.text(ch), true).scrollIntoView();\n        dispatch(tr);\n      }\n\n      return true;\n    });\n  }\n}\n\nexport type CommandFn = (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => boolean;\n\nexport function toggleMarkType(markType: MarkType, attrs?: { [key: string]: any }) {\n  const defaultToggleMark = toggleMark(markType, attrs);\n\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // disallow non-code marks when the selection is contained within a code mark\n    // (this is a pandoc constraint). note that we can allow them if the selection\n    // contains the code mark range entirely (as in that case the code mark will\n    // nest within the other mark)\n    if (markType !== state.schema.marks.code) {\n      if (markIsActive(state, state.schema.marks.code)) {\n        const codeRange = getMarkRange(state.selection.$anchor, state.schema.marks.code);\n        if (\n          codeRange &&\n          selectionIsWithinRange(state.selection, codeRange) &&\n          !selectionHasRange(state.selection, codeRange)\n        ) {\n          return false;\n        }\n      }\n    }\n\n    // default implementation\n    return defaultToggleMark(state, dispatch);\n  };\n}\n\nexport function toggleList(listType: NodeType, itemType: NodeType, prefs: EditorUIPrefs): CommandFn {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const { selection } = state;\n    const { $from, $to } = selection;\n    const range = $from.blockRange($to);\n\n    if (!range) {\n      return false;\n    }\n\n    const parentList = findParentNode(isList)(selection);\n\n    if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n      if (isList(parentList.node) && listType.validContent(parentList.node.content)) {\n        if (parentList.node.type !== listType) {\n          if (dispatch) {\n            const tr: Transaction = state.tr;\n            const attrs: { [key: string]: any } = {};\n            if (parentList.node.attrs.tight) {\n              attrs.tight = true;\n            }\n            tr.setNodeMarkup(parentList.pos, listType, attrs);\n            dispatch(tr);\n          }\n          return true;\n        } else {\n          return liftListItem(itemType)(state, dispatch);\n        }\n      }\n    }\n\n    // if we are in a heading then this isn't valid\n    if (findParentNodeOfType(state.schema.nodes.heading)(state.selection)) {\n      return false;\n    }\n\n    // reflect tight preference\n    const tight = prefs.listSpacing() === kListSpacingTight;\n\n    return wrapInList(listType, { tight })(state, dispatch);\n  };\n}\n\nexport function toggleBlockType(type: NodeType, toggletype: NodeType, attrs = {}): CommandFn {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n    if (!dispatch) {\n      return type === toggletype || setBlockType(type, { ...attrs })(state, dispatch);\n    }\n\n    // if the type has pandoc attrs then see if we can transfer from the existing node\n    let pandocAttr: any = {};\n    if (pandocAttrInSpec(type.spec)) {\n      const predicate = (n: ProsemirrorNode) => pandocAttrAvailable(n.attrs);\n      const node = findParentNode(predicate)(state.selection);\n      if (node) {\n        pandocAttr = pandocAttrFrom(node.node.attrs);\n      }\n    }\n\n    return setBlockType(type, { ...attrs, ...pandocAttr })(state, dispatch);\n  };\n}\n\nexport function toggleWrap(type: NodeType, attrs?: { [key: string]: any }): CommandFn {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const isActive = nodeIsActive(state, type, attrs);\n\n    if (isActive) {\n      return lift(state, dispatch);\n    }\n\n    return wrapIn(type, attrs)(state, dispatch);\n  };\n}\n\nexport function insertNode(nodeType: NodeType, attrs = {}): CommandFn {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n    if (!canInsertNode(state, nodeType)) {\n      return false;\n    }\n\n    if (dispatch) {\n      dispatch(state.tr.replaceSelectionWith(nodeType.create(attrs)));\n    }\n\n    return true;\n  };\n}\n\nexport function exitNode(\n  nodeType: NodeType,\n  depth: number,\n  allowKey: boolean,\n  filter = (_node: ProsemirrorNode) => true,\n) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // must be within the node type and pass the filter\n    const { $head, $anchor } = state.selection;\n    if ($head.parent.type !== nodeType || !filter($head.parent)) {\n      return false;\n    }\n\n    // must be empty and entirely contained by the node\n    if (!$head.sameParent($anchor) || !state.selection.empty) {\n      return !allowKey;\n    }\n\n    // must be at the end of the node\n    const node = findParentNodeOfType(nodeType)(state.selection)!;\n    const endCaptionPos = node.pos + node.node.nodeSize - 1;\n    if (state.selection.from !== endCaptionPos) {\n      return !allowKey;\n    }\n\n    // insert must be valid in container above\n    const above = $head.node(depth);\n    const after = $head.indexAfter(depth);\n    const type = above.contentMatchAt(after).defaultType!;\n    if (!above.canReplaceWith(after, after, type)) {\n      return !allowKey;\n    }\n\n    // perform insert\n    if (dispatch) {\n      const tr = state.tr;\n      const pos = node.pos + node.node.nodeSize + (Math.abs(depth) - 1);\n      tr.insert(pos, type.create());\n      setTextSelection(pos, 1)(tr);\n      dispatch(tr.scrollIntoView());\n    }\n\n    return true;\n  };\n}\n","import { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { NodeWithPos } from 'prosemirror-utils';\n\nimport { bodyElement } from './dom';\nimport {\n  kYamlMetadataOutlineItemType,\n  kHeadingOutlineItemType,\n  kRmdchunkOutlineItemType,\n  EditingOutlineLocation,\n  getDocumentOutline,\n  EditingOutlineLocationItem,\n} from './outline';\nimport { restoreSelection } from './selection';\nimport { scrollToPos } from './scroll';\n\nexport interface EditingLocation {\n  pos: number;\n  scrollTop: number;\n}\n\nexport function getEditingLocation(view: EditorView): EditingLocation {\n  const pos = view.state.selection.from;\n  const bodyEl = bodyElement(view);\n  const scrollTop = bodyEl.scrollTop;\n  return { pos, scrollTop };\n}\n\nexport function setEditingLocation(\n  view: EditorView,\n  outlineLocation?: EditingOutlineLocation,\n  previousLocation?: EditingLocation,\n) {\n  // get the current document outline\n  const documentOutline = getDocumentOutline(view.state);\n\n  // if all of the types and levels match up to the active outline item,\n  // then we have a candidate match\n  let docOutlineLocationNode: NodeWithPos | undefined;\n\n  if (outlineLocation) {\n    for (let i = 0; i < outlineLocation.items.length && i < documentOutline.length; i++) {\n      // get the item and it's peer\n      const item = outlineLocation.items[i];\n      const docOutlineNode = documentOutline[i];\n\n      // if they don't match then bail (can't resolve different interpretations of the outline)\n      if (!outlineItemSimillarToNode(item, docOutlineNode.node)) {\n        break;\n      }\n\n      // if this is the active item\n      if (item.active) {\n        // see if the previous location is actually a better target (because it's between this location and\n        // the next outline node). in that case we don't set the target node and we leave the restorePos\n        // at the previous location\n        if (!locationIsBetweenDocOutlineNodes(docOutlineNode, documentOutline[i + 1], previousLocation)) {\n          // set the target\n          docOutlineLocationNode = docOutlineNode;\n\n          // if this is an rmd chunk then advance to the second line\n          if (docOutlineNode.node.type === view.state.schema.nodes.rmd_chunk) {\n            const chunkText = docOutlineNode.node.textContent;\n            const newlineIdx = chunkText.indexOf('\\n');\n            if (newlineIdx !== -1) {\n              docOutlineLocationNode.pos += newlineIdx + 2;\n            }\n          }\n        }\n\n        break;\n      }\n    }\n  }\n\n  // do the restore\n  if (docOutlineLocationNode) {\n    restoreSelection(view, docOutlineLocationNode.pos);\n    scrollToPos(view, docOutlineLocationNode.pos);\n  } else if (previousLocation) {\n    restoreSelection(view, previousLocation.pos);\n    bodyElement(view).scrollTop = previousLocation.scrollTop;\n  }\n}\n\nfunction outlineItemSimillarToNode(outlineItem: EditingOutlineLocationItem, docOutlneNode: ProsemirrorNode) {\n  const schema = docOutlneNode.type.schema;\n  if (outlineItem.type === kYamlMetadataOutlineItemType) {\n    return docOutlneNode.type === schema.nodes.yaml_metadata;\n  } else if (outlineItem.type === kRmdchunkOutlineItemType) {\n    return docOutlneNode.type === schema.nodes.rmd_chunk;\n  } else if (outlineItem.type === kHeadingOutlineItemType) {\n    return docOutlneNode.type === schema.nodes.heading && docOutlneNode.attrs.level === outlineItem.level;\n  } else {\n    return false;\n  }\n}\n\nfunction locationIsBetweenDocOutlineNodes(nodeA: NodeWithPos, nodeB?: NodeWithPos, location?: EditingLocation) {\n  // bail if we don't have all the arguments\n  if (!nodeB || !location) {\n    return false;\n  }\n  return nodeA.pos < location.pos && nodeB.pos > location.pos;\n}\n","/*\n * ui.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { SkinTone } from './emoji';\nimport { EditorRmdChunk } from './rmd';\nimport { XRef } from './xref';\n\nimport { EditorUIImages } from './ui-images';\nimport { EditorDialogs } from './ui-dialogs';\nimport { EditorUISpelling } from './spelling';\n\nexport interface EditorUI {\n  dialogs: EditorDialogs;\n  display: EditorDisplay;\n  math: EditorUIMath;\n  context: EditorUIContext;\n  prefs: EditorUIPrefs;\n  images: EditorUIImages;\n  chunks: EditorUIChunks;\n  spelling: EditorUISpelling;\n}\n\n/**\n * Callbacks supplied to the host to interact with a code chunk and its output.\n */\nexport interface EditorUIChunkCallbacks {\n  getPos: () => number;\n  scrollIntoView: (ele: HTMLElement) => void;\n  scrollCursorIntoView: () => void;\n}\n\nexport interface EditorUIChunks {\n  // create a code chunk editor\n  createChunkEditor: (type: string, index: number, callbacks: EditorUIChunkCallbacks) => ChunkEditor;\n}\n\nexport interface ChunkEditor {\n  editor: unknown;\n  setMode(mode: string): void;\n  executeSelection(): void;\n  element: HTMLElement;\n  destroy(): void;\n}\n\nexport interface EditorUIContext {\n  // check if we are the active tab\n  isActiveTab: () => boolean;\n\n  // get the path to the current document\n  getDocumentPath: () => string | null;\n\n  // ensure the edited document is saved on the server before proceeding\n  // (note this just means that the server has a copy of it for e.g.\n  // indexing xrefs, from the user's standpoint the doc is still dirty)\n  withSavedDocument: () => Promise<boolean>;\n\n  // get the default directory for resources (e.g. where relative links point to)\n  getDefaultResourceDir: () => string;\n\n  // map from a filesystem path to a resource reference\n  mapPathToResource: (path: string) => string;\n\n  // map from a resource reference (e.g. images/foo.png) to a URL we can use in the document\n  mapResourceToURL: (path: string) => string;\n\n  // watch a resource for changes (returns an unsubscribe function)\n  watchResource: (path: string, notify: VoidFunction) => VoidFunction;\n\n  // translate a string\n  translateText: (text: string) => string;\n\n  // are there dropped uris available?\n  droppedUris: () => string[] | null;\n\n  // uris from the clipboard\n  clipboardUris: () => Promise<string[] | null>;\n\n  // image from the clipboard (returned as file path)\n  clipboardImage: () => Promise<string | null>;\n\n  // resolve image uris (make relative, copy to doc local 'images' dir, etc)\n  resolveImageUris: (uris: string[]) => Promise<string[]>;\n\n  // are we running in windows desktop mode?\n  isWindowsDesktop: () => boolean;\n}\n\nexport interface EditorMenuItem {\n  text?: string;\n  exec?: VoidFunction;\n  command?: string;\n  separator?: boolean;\n  subMenu?: {\n    items: EditorMenuItem[];\n  };\n}\n\nexport interface EditorUIMath {\n  typeset?: (el: HTMLElement, text: string, priority: boolean) => Promise<boolean>;\n}\n\nexport interface EditorDisplay {\n  openURL: (url: string) => void;\n  navigateToXRef: (file: string, xref: XRef) => void;\n  showContextMenu?: (items: EditorMenuItem[], clientX: number, clientY: number) => Promise<boolean>;\n}\n\nexport const kListSpacingTight = 'tight';\nexport const kListSpacingSpaced = 'spaced';\nexport type ListSpacing = 'tight' | 'spaced';\n\nexport interface EditorUIPrefs {\n  darkMode: () => boolean;\n  listSpacing: () => ListSpacing;\n  equationPreview: () => boolean;\n  tabKeyMoveFocus: () => boolean;\n  emojiSkinTone: () => SkinTone;\n  setEmojiSkinTone: (skinTone: SkinTone) => void;\n  zoteroUseBetterBibtex: () => boolean;\n  setBibliographyDefaultType: (type: string) => void;\n  bibliographyDefaultType: () => string;\n  citationDefaultInText: () => boolean;\n  setCitationDefaultInText: (value: boolean) => void;\n}\n","/*\n * util.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// tslint:disable:no-bitwise\nexport function uuidv4() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n","/*\n * dom.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nexport function bodyElement(view: EditorView): HTMLElement {\n  return view.dom.firstChild as HTMLElement;\n}\n\nexport function isElementVisible(el: HTMLElement) {\n  return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function elementInnerDimensions(el: HTMLElement) {\n  const cs = getComputedStyle(el);\n\n  const asNumber = (x: string | null) => (x ? parseFloat(x) : 0);\n  const paddingX = asNumber(cs.paddingLeft) + asNumber(cs.paddingRight);\n  const paddingY = asNumber(cs.paddingTop) + asNumber(cs.paddingBottom);\n  const borderX = asNumber(cs.borderLeftWidth) + asNumber(cs.borderRightWidth);\n  const borderY = asNumber(cs.borderTopWidth) + asNumber(cs.borderBottomWidth);\n\n  return {\n    width: el.offsetWidth - paddingX - borderX,\n    height: el.offsetHeight - paddingY - borderY,\n  };\n}\n\nexport function onElementRemoved(container: Node, el: HTMLElement, onRemoved: VoidFunction) {\n  const observer = new MutationObserver(mutationsList => {\n    mutationsList.forEach(mutation => {\n      mutation.removedNodes.forEach(node => {\n        if (node === el) {\n          onRemoved();\n        }\n      });\n    });\n  });\n  observer.observe(container, { attributes: false, childList: true, subtree: true });\n}\n","/*\n * scroll.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nimport zenscroll from 'zenscroll';\n\nimport { editingRootNodeClosestToPos, editingRootNode } from './node';\n\nexport function scrollIntoView(\n  view: EditorView,\n  pos: number,\n  center = true,\n  duration?: number,\n  offset?: number,\n  onDone?: VoidFunction,\n) {\n  // resolve position and determine container\n  const $pos = view.state.doc.resolve(pos);\n  const container = editingRootNodeClosestToPos($pos);\n\n  // if we have a container then do the scroll\n  if (container) {\n    const schema = view.state.schema;\n    const containerEl = view.nodeDOM(container.pos) as HTMLElement;\n    const parentList = findParentNodeOfTypeClosestToPos($pos, [schema.nodes.ordered_list, schema.nodes.bullet_list]);\n    const parentDiv = schema.nodes.div ? findParentNodeOfTypeClosestToPos($pos, schema.nodes.div) : undefined;\n    const resultPos = parentList || parentDiv ? $pos.before(2) : $pos.before();\n    const resultNode = view.nodeDOM(resultPos) as HTMLElement;\n    if (container && resultNode) {\n      const scroller = zenscroll.createScroller(containerEl, duration, offset);\n      if (center) {\n        scroller.center(resultNode, duration, offset, onDone);\n      } else {\n        scroller.intoView(resultNode, duration, onDone);\n      }\n    }\n  }\n}\n\nexport function scrollToPos(view: EditorView, pos: number, duration?: number, offset?: number, onDone?: VoidFunction) {\n  const node = view.nodeDOM(pos);\n  if (node instanceof HTMLElement) {\n    const editingRoot = editingRootNode(view.state.selection)!;\n    const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n    const scroller = zenscroll.createScroller(container, duration, offset);\n    if (duration) {\n      scroller.to(node, duration, onDone);\n    } else {\n      scroller.to(node, 0, onDone);\n    }\n  }\n}\n","/*\n * navigation.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection, Predicate, findChildren, findDomRefAtPos } from 'prosemirror-utils';\n\nimport zenscroll from 'zenscroll';\n\nimport { editingRootNode } from './node';\nimport { kNavigationTransaction } from './transaction';\nimport { xrefPosition } from './xref';\n\nexport interface EditorNavigation {\n  navigate: (type: NavigationType, location: string, animate?: boolean) => void;\n}\n\nexport enum NavigationType {\n  Pos = 'pos',\n  Id = 'id',\n  Href = 'href',\n  Heading = 'heading',\n  XRef = 'xref',\n}\n\nexport interface Navigation {\n  pos: number;\n  prevPos: number;\n}\n\nexport function navigateTo(\n  view: EditorView,\n  type: NavigationType,\n  location: string,\n  animate = true,\n): Navigation | null {\n  switch (type) {\n    case NavigationType.Pos:\n      return navigateToPos(view, parseInt(location, 10), animate);\n    case NavigationType.Id:\n      return navigateToId(view, location, animate);\n    case NavigationType.Href:\n      return navigateToHref(view, location, animate);\n    case NavigationType.Heading:\n      return navigateToHeading(view, location, animate);\n    case NavigationType.XRef:\n      return navigateToXRef(view, location, animate);\n    default:\n      return null;\n  }\n}\n\nexport function navigateToId(view: EditorView, id: string, animate = true): Navigation | null {\n  return navigate(view, node => id === node.attrs.navigation_id, animate);\n}\n\nexport function navigateToHref(view: EditorView, href: string, animate = true): Navigation | null {\n  return navigate(view, node => node.attrs.id === href, animate);\n}\n\nexport function navigateToHeading(view: EditorView, heading: string, animate = true): Navigation | null {\n  return navigate(\n    view,\n    node => {\n      return (\n        node.type === view.state.schema.nodes.heading &&\n        node.textContent.localeCompare(heading, undefined, { sensitivity: 'accent' }) === 0\n      );\n    },\n    animate,\n  );\n}\n\nexport function navigateToXRef(view: EditorView, xref: string, animate = true): Navigation | null {\n  const xrefPos = xrefPosition(view.state.doc, xref);\n  if (xrefPos !== -1) {\n    return navigateToPos(view, xrefPos, animate);\n  } else {\n    return null;\n  }\n}\n\nexport function navigateToPos(view: EditorView, pos: number, animate = true): Navigation | null {\n  // get previous position\n  const prevPos = view.state.selection.from;\n\n  // need to target at least the body\n  pos = Math.max(pos, 2);\n\n  // set selection\n  const tr = view.state.tr;\n  setTextSelection(pos)(tr);\n  tr.setMeta(kNavigationTransaction, true);\n  view.dispatch(tr);\n\n  // find a targetable dom node at the position\n  const node = findDomRefAtPos(pos, view.domAtPos.bind(view));\n  if (node instanceof HTMLElement) {\n    // auto-scroll to position (delay so we can grab the focus, as autoscrolling\n    // doesn't seem to work unless you have the focus)\n    setTimeout(() => {\n      view.focus();\n      const editingRoot = editingRootNode(view.state.selection)!;\n      const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n      const scroller = zenscroll.createScroller(container, 700, 20);\n      // some nodes' DOM elements are grandchildren rather than direct children\n      // of the scroll container; move up a level if this is the case\n      let dest = node;\n      if (node.parentElement && \n          node.parentElement.parentElement &&\n          node.parentElement.parentElement.parentElement === container) {\n         dest = node.parentElement;\n      }\n      if (animate) {\n        scroller.to(dest);\n      } else {\n        scroller.to(dest, 0);\n      }\n    }, 200);\n\n    return { pos, prevPos };\n  } else {\n    return null;\n  }\n}\n\nfunction navigate(view: EditorView, predicate: Predicate, animate = true): Navigation | null {\n  const result = findChildren(view.state.doc, predicate);\n  if (result.length) {\n    // pos points immediately before the node so add 1 to it\n    const pos = result[0].pos + 1;\n    return navigateToPos(view, pos, animate);\n  } else {\n    return null;\n  }\n}\n","/*\n * xref.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, MarkType } from 'prosemirror-model';\n\nimport { findChildrenByMark } from 'prosemirror-utils';\n\nimport { pandocAutoIdentifier } from './pandoc_id';\nimport { rmdChunkEngineAndLabel } from './rmd';\nimport { kTexFormat } from './raw';\n\nexport interface XRefServer {\n  indexForFile: (file: string) => Promise<XRefs>;\n  xrefForId: (file: string, id: string) => Promise<XRefs>;\n}\n\nexport interface XRefs {\n  baseDir: string;\n  refs: XRef[];\n}\n\nexport interface XRef {\n  file: string;\n  type: string;\n  id: string;\n  suffix: string;\n  title?: string;\n}\n\nexport function xrefKey(xref: XRef) {\n  // headings don't include their type in the key\n  const key = /^h\\d$/.test(xref.type)\n    ? xref.id\n    : // no colon if there is no type\n    xref.type.length > 0\n    ? `${xref.type}:${xref.id}`\n    : xref.id;\n\n  // return key with suffix\n  return key + xref.suffix;\n}\n\nexport function xrefPosition(doc: ProsemirrorNode, xref: string): number {\n  // -1 if not found\n  let xrefPos = -1;\n\n  // get type and id\n  const xrefInfo = xrefTypeAndId(xref);\n  if (xrefInfo) {\n    const { type, id } = xrefInfo;\n    const locator = xrefPositionLocators[type];\n    if (locator) {\n      // if this locator finds by mark then look at doc for marks\n      if (locator.markType) {\n        const schema = doc.type.schema;\n        const markType = schema.marks[locator.markType];\n        const markedNodes = findChildrenByMark(doc, markType, true);\n        markedNodes.forEach(markedNode => {\n          // bail if we already found it\n          if (xrefPos !== -1) {\n            return false;\n          }\n          // see if we can locate the xref\n          if (locator.hasXRef(markedNode.node, id, markType)) {\n            xrefPos = markedNode.pos;\n          }\n        });\n      } \n      if (xrefPos === -1 && locator.nodeTypes) {\n        // otherwise recursively examine nodes to find the xref\n        doc.descendants((node, pos) => {\n          // bail if we already found it\n          if (xrefPos !== -1) {\n            return false;\n          }\n          // see if we can locate the xref\n          if (locator.nodeTypes!.includes(node.type.name) && locator.hasXRef(node, id)) {\n            xrefPos = pos;\n            return false;\n          }\n        });\n      }\n    }\n  }\n\n  // return the position\n  return xrefPos;\n}\n\nfunction xrefTypeAndId(xref: string) {\n  const colonPos = xref.indexOf(':');\n  if (colonPos !== -1) {\n    return {\n      type: xref.substring(0, colonPos),\n      id: xref.substring(colonPos + 1),\n    };\n  } else {\n    return null;\n  }\n}\n\ninterface XRefPositionLocator {\n  markType?: string;\n  nodeTypes?: string[];\n  hasXRef: (node: ProsemirrorNode, id: string, markType?: MarkType) => boolean;\n}\n\nconst xrefPositionLocators: { [key: string]: XRefPositionLocator } = {\n  h1: headingLocator(),\n  h2: headingLocator(),\n  h3: headingLocator(),\n  h4: headingLocator(),\n  h5: headingLocator(),\n  h6: headingLocator(),\n  fig: {\n    nodeTypes: ['rmd_chunk'],\n    hasXRef: (node: ProsemirrorNode, id: string) => rmdChunkHasXRef(node, 'r', id, /^\\{.*[ ,].*fig\\.cap\\s*=.*\\}\\s*\\n/m),\n  },\n  tab: {\n    nodeTypes: ['rmd_chunk', 'table_container'],\n    hasXRef: (node: ProsemirrorNode, id: string) => {\n      if (node.type.name === 'rmd_chunk') {\n        return rmdChunkHasXRef(node, 'r', id, /kable\\s*\\([\\s\\S]*caption/);\n      } else if (node.type.name === 'table_container') {\n        const caption = node.child(1);\n        const match = caption.textContent.match(/^\\s*\\(#tab\\:([a-zA-Z0-9\\/-]+)\\)\\s*(.*)$/);\n        return !!match && match[1].localeCompare(id, undefined, { sensitivity: 'accent' }) === 0;\n      } else {\n        return false;\n      }\n    },\n  },\n  eq: {\n    nodeTypes: ['raw_block'],\n    markType: 'math',\n    hasXRef: (node: ProsemirrorNode, id: string, markType?: MarkType) => {\n      // if it's not a mark then ensure it is tex format before proceeding\n      if (!markType && (node.attrs.format !== kTexFormat)) {\n        return false;\n      }\n      const match = node.textContent.match(/^.*\\(\\\\#eq:([a-zA-Z0-9\\/-]+)\\).*$/m);\n      return !!match && match[1].localeCompare(id, undefined, { sensitivity: 'accent' }) === 0;\n    },\n  },\n  thm: thereomLocator('theorem'),\n  lem: thereomLocator('lemma'),\n  cor: thereomLocator('corollary'),\n  prp: thereomLocator('proposition'),\n  cnj: thereomLocator('conjecture'),\n  def: thereomLocator('definition'),\n  exr: thereomLocator('exercise'),\n};\n\nfunction rmdChunkHasXRef(node: ProsemirrorNode, engine: string, label: string, pattern?: RegExp) {\n  const chunk = rmdChunkEngineAndLabel(node.textContent);\n  const match = node.textContent.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+([a-zA-Z0-9/-]+)/);\n  if (chunk) {\n    return (\n      chunk.engine.localeCompare(engine, undefined, { sensitivity: 'accent' }) === 0 &&\n      chunk.label === label &&\n      (!pattern || !!node.textContent.match(pattern))\n    );\n  } else {\n    return false;\n  }\n}\n\nfunction headingLocator() {\n  return {\n    nodeTypes: ['heading'],\n    hasXRef: (node: ProsemirrorNode, id: string) => {\n      // note we use default pandoc auto id semantics here no matter what the documnet\n      // happens to use b/c our xref indexing code also does this (so only ids generated\n      // using the 'standard' rules will be in the index)\n      return node.attrs.id === id || pandocAutoIdentifier(node.textContent, false) === id;\n    },\n  };\n}\n\nfunction thereomLocator(engine: string) {\n  return {\n    nodeTypes: ['rmd_chunk'],\n    hasXRef: (node: ProsemirrorNode, id: string) => {\n      // look for conventional engine/label\n      if (rmdChunkHasXRef(node, engine, id)) {\n        return true;\n      } else {\n        // look for explicit label= syntax\n        const match = node.textContent.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+label\\s*=\\s*['\"]([^\"']+)['\"].*\\}/);\n        return !!match && match[1].localeCompare(engine, undefined, { sensitivity: 'accent' }) === 0 && match[2] === id;\n      }\n    },\n  };\n}\n","/*\n * pandoc_id.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// emulate pandoc behavior (https://pandoc.org/MANUAL.html#headings-and-sections)\nexport function pandocAutoIdentifier(text: string, asciify: boolean) {\n  if (asciify) {\n    text = pandocAsciify(text);\n  }\n\n  return (\n    text\n      // Remove all non-alphanumeric characters, except underscores, hyphens, and periods.\n      .replace(/[!\"#$%&')*+,\\/:;<=>?@\\[\\\\\\]^`{|}~]/g, '') // filterPunct\n\n      // Replace all spaces with hyphens\n      .replace(/\\s/g, '-')\n\n      // Convert all alphabetic characters to lowercase\n      .toLowerCase()\n\n      // Remove everything up to the first letter\n      .replace(/^[^A-Za-z]+/, '')\n  );\n}\n\n// emulate github behavior (note that unemoji should be done prior to calling this)\n// https://pandoc.org/MANUAL.html#extension-gfm_auto_identifiers\n// https://github.com/jgm/pandoc/blob/83880b0dbc318703babfbb6905b1046fa48f1216/src/Text/Pandoc/Shared.hs#L539\nexport function gfmAutoIdentifier(text: string, asciify: boolean) {\n  if (asciify) {\n    text = pandocAsciify(text);\n  }\n\n  return text\n    .replace(/[!\"#$%&')*+,\\.\\/:;<=>?@\\[\\\\\\]^`{|}~]/g, '') // filterPunct (all but underscore and hyphen)\n    .replace(/\\s/g, '-') // spaceToDash\n    .toLowerCase(); // toLower\n}\n\n// https://github.com/jgm/pandoc/blob/a5fa55969f1b4afc0ca3e38be50b69c65d43a460/src/Text/Pandoc/Asciify.hs\nexport function pandocAsciify(text: string) {\n  const chars: number[] = [];\n  const len = text.length;\n  let newch;\n  for (let i = 0; i < len; i++) {\n    newch = '';\n    const ch = text.charCodeAt(i);\n    switch (ch) {\n      case 192:\n      case 193:\n      case 194:\n      case 195:\n      case 196:\n      case 197:\n      case 256:\n      case 258:\n      case 260:\n      case 461:\n      case 512:\n      case 514:\n      case 550:\n      case 7680:\n      case 7840:\n      case 7842:\n        newch = 'A';\n        break;\n\n      case 7682:\n      case 7684:\n      case 7686:\n        newch = 'B';\n        break;\n\n      case 199:\n      case 262:\n      case 264:\n      case 266:\n      case 268:\n        newch = 'C';\n        break;\n\n      case 270:\n      case 7690:\n      case 7692:\n      case 7694:\n      case 7696:\n      case 7698:\n        newch = 'D';\n        break;\n\n      case 200:\n      case 201:\n      case 203:\n      case 274:\n      case 276:\n      case 278:\n      case 280:\n      case 282:\n      case 516:\n      case 518:\n      case 552:\n      case 7704:\n      case 7706:\n      case 7864:\n      case 7866:\n      case 7868:\n        newch = 'E';\n        break;\n\n      case 7710:\n        newch = 'F';\n        break;\n\n      case 284:\n      case 286:\n      case 288:\n      case 290:\n      case 486:\n      case 500:\n      case 7712:\n        newch = 'G';\n        break;\n\n      case 292:\n      case 542:\n      case 7714:\n      case 7716:\n      case 7718:\n      case 7720:\n      case 7722:\n        newch = 'H';\n        break;\n\n      case 204:\n      case 205:\n      case 206:\n      case 207:\n      case 296:\n      case 298:\n      case 300:\n      case 302:\n      case 304:\n      case 463:\n      case 520:\n      case 522:\n      case 7724:\n      case 7880:\n      case 7882:\n        newch = 'I';\n        break;\n\n      case 308:\n        newch = 'J';\n        break;\n\n      case 310:\n      case 488:\n      case 7728:\n      case 7730:\n      case 7732:\n      case 8490:\n        newch = 'K';\n        break;\n\n      case 313:\n      case 315:\n      case 317:\n      case 7734:\n      case 7738:\n      case 7740:\n        newch = 'L';\n        break;\n\n      case 7742:\n      case 7744:\n      case 7746:\n        newch = 'M';\n        break;\n\n      case 209:\n      case 323:\n      case 325:\n      case 327:\n      case 504:\n      case 7748:\n      case 7750:\n      case 7752:\n      case 7754:\n        newch = 'N';\n        break;\n\n      case 210:\n      case 211:\n      case 212:\n      case 213:\n      case 214:\n      case 332:\n      case 334:\n      case 336:\n      case 416:\n      case 465:\n      case 490:\n      case 524:\n      case 526:\n      case 558:\n      case 7884:\n      case 7886:\n        newch = 'O';\n        break;\n\n      case 7764:\n      case 7766:\n        newch = 'P';\n        break;\n\n      case 340:\n      case 342:\n      case 344:\n      case 528:\n      case 530:\n      case 7768:\n      case 7770:\n      case 7774:\n        newch = 'R';\n        break;\n\n      case 346:\n      case 348:\n      case 350:\n      case 352:\n      case 536:\n      case 7776:\n      case 7778:\n        newch = 'S';\n        break;\n\n      case 354:\n      case 356:\n      case 538:\n      case 7786:\n      case 7788:\n      case 7790:\n      case 7792:\n        newch = 'T';\n        break;\n\n      case 217:\n      case 218:\n      case 219:\n      case 220:\n      case 360:\n      case 362:\n      case 364:\n      case 366:\n      case 368:\n      case 370:\n      case 431:\n      case 467:\n      case 532:\n      case 534:\n      case 7794:\n      case 7796:\n      case 7798:\n      case 7908:\n      case 7910:\n        newch = 'U';\n        break;\n\n      case 7804:\n      case 7806:\n        newch = 'V';\n        break;\n\n      case 372:\n      case 7808:\n      case 7810:\n      case 7812:\n      case 7814:\n      case 7816:\n        newch = 'W';\n        break;\n\n      case 7818:\n      case 7820:\n        newch = 'X';\n        break;\n\n      case 221:\n      case 374:\n      case 376:\n      case 562:\n      case 7822:\n      case 7922:\n      case 7924:\n      case 7926:\n      case 7928:\n        newch = 'Y';\n        break;\n\n      case 377:\n      case 379:\n      case 381:\n      case 7824:\n      case 7826:\n      case 7828:\n        newch = 'Z';\n        break;\n\n      case 224:\n      case 225:\n      case 226:\n      case 227:\n      case 228:\n      case 229:\n      case 257:\n      case 259:\n      case 261:\n      case 462:\n      case 513:\n      case 515:\n      case 551:\n      case 553:\n      case 7681:\n      case 7841:\n      case 7843:\n        newch = 'a';\n        break;\n\n      case 7683:\n      case 7685:\n      case 7687:\n        newch = 'b';\n        break;\n\n      case 231:\n      case 263:\n      case 265:\n      case 267:\n      case 269:\n        newch = 'c';\n        break;\n\n      case 271:\n      case 7691:\n      case 7693:\n      case 7695:\n      case 7697:\n      case 7699:\n        newch = 'd';\n        break;\n\n      case 232:\n      case 233:\n      case 234:\n      case 235:\n      case 275:\n      case 277:\n      case 279:\n      case 281:\n      case 283:\n      case 517:\n      case 519:\n      case 7705:\n      case 7707:\n      case 7865:\n      case 7867:\n      case 7869:\n        newch = 'e';\n        break;\n\n      case 7711:\n        newch = 'f';\n        break;\n\n      case 285:\n      case 287:\n      case 289:\n      case 291:\n      case 487:\n      case 501:\n      case 7713:\n        newch = 'g';\n        break;\n\n      case 293:\n      case 543:\n      case 7715:\n      case 7717:\n      case 7719:\n      case 7721:\n      case 7723:\n      case 7830:\n        newch = 'h';\n        break;\n\n      case 236:\n      case 237:\n      case 238:\n      case 239:\n      case 297:\n      case 299:\n      case 301:\n      case 303:\n      case 305:\n      case 464:\n      case 521:\n      case 523:\n      case 7725:\n      case 7881:\n      case 7883:\n        newch = 'i';\n        break;\n\n      case 309:\n      case 496:\n        newch = 'j';\n        break;\n\n      case 311:\n      case 489:\n      case 7729:\n      case 7731:\n      case 7733:\n        newch = 'k';\n        break;\n\n      case 314:\n      case 316:\n      case 318:\n      case 7735:\n      case 7739:\n      case 7741:\n        newch = 'l';\n        break;\n\n      case 7743:\n      case 7745:\n      case 7747:\n        newch = 'm';\n        break;\n\n      case 241:\n      case 324:\n      case 326:\n      case 328:\n      case 505:\n      case 7749:\n      case 7751:\n      case 7753:\n      case 7755:\n        newch = 'n';\n        break;\n\n      case 242:\n      case 243:\n      case 244:\n      case 245:\n      case 246:\n      case 333:\n      case 335:\n      case 337:\n      case 417:\n      case 432:\n      case 466:\n      case 491:\n      case 525:\n      case 527:\n      case 559:\n      case 7885:\n      case 7887:\n        newch = 'o';\n        break;\n\n      case 7765:\n      case 7767:\n        newch = 'p';\n        break;\n\n      case 341:\n      case 343:\n      case 345:\n      case 529:\n      case 531:\n      case 7769:\n      case 7771:\n      case 7775:\n        newch = 'r';\n        break;\n\n      case 347:\n      case 349:\n      case 351:\n      case 353:\n      case 537:\n      case 7777:\n      case 7779:\n        newch = 's';\n        break;\n\n      case 355:\n      case 357:\n      case 539:\n      case 7787:\n      case 7789:\n      case 7791:\n      case 7793:\n      case 7831:\n        newch = 't';\n        break;\n\n      case 249:\n      case 250:\n      case 251:\n      case 252:\n      case 361:\n      case 363:\n      case 365:\n      case 367:\n      case 369:\n      case 371:\n      case 468:\n      case 533:\n      case 535:\n      case 7795:\n      case 7797:\n      case 7799:\n      case 7909:\n      case 7911:\n        newch = 'u';\n        break;\n\n      case 7805:\n      case 7807:\n        newch = 'v';\n        break;\n\n      case 373:\n      case 7809:\n      case 7811:\n      case 7813:\n      case 7815:\n      case 7817:\n      case 7832:\n        newch = 'w';\n        break;\n\n      case 7819:\n      case 7821:\n        newch = 'x';\n        break;\n\n      case 253:\n      case 255:\n      case 375:\n      case 563:\n      case 7833:\n      case 7923:\n      case 7925:\n      case 7927:\n      case 7929:\n        newch = 'y';\n        break;\n\n      case 378:\n      case 380:\n      case 382:\n      case 7825:\n      case 7827:\n      case 7829:\n        newch = 'z';\n        break;\n\n      case 894:\n        newch = ';';\n        break;\n\n      case 8175:\n        newch = '`';\n        break;\n\n      case 8800:\n        newch = '=';\n        break;\n\n      case 8814:\n        newch = '<';\n        break;\n\n      case 8815:\n        newch = '>';\n        break;\n    }\n    if (newch) {\n      chars.push(newch.charCodeAt(0));\n    } else {\n      chars.push(ch);\n    }\n  }\n\n  // return string\n  return String.fromCharCode(...chars);\n}\n","/*\n * raw.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nimport { EditorUI } from './ui';\nimport { setBlockType } from 'prosemirror-commands';\n\nexport const kTexFormat = 'tex';\nexport const kHTMLFormat = 'html';\nexport const kHTML4Format = 'html4';\nexport const kHTML5Format = 'html5';\n\nexport function isRawHTMLFormat(format: string) {\n  return [kHTMLFormat, kHTML4Format, kHTML5Format].includes(format);\n}\n\nexport function editRawBlockCommand(ui: EditorUI, outputFormats: string[]) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    const schema = state.schema;\n\n    // enable if we are either inside a raw block or we can insert a raw block\n    const rawBlock = findParentNodeOfType(schema.nodes.raw_block)(state.selection);\n\n    if (!rawBlock && !setBlockType(schema.nodes.raw_block, { format: 'html' })(state)) {\n      return false;\n    }\n\n    async function asyncEditRawBlock() {\n      if (dispatch) {\n        // get existing attributes (if any)\n        const raw = {\n          format: '',\n          content: '',\n        };\n        if (rawBlock) {\n          raw.format = rawBlock.node.attrs.format;\n        }\n\n        // show dialog\n        const result = await ui.dialogs.editRawBlock(raw, outputFormats);\n        if (result) {\n          const tr = state.tr;\n\n          // remove means convert the block to text\n          if (rawBlock) {\n            const range = { from: rawBlock.pos, to: rawBlock.pos + rawBlock.node.nodeSize };\n            if (result.action === 'remove') {\n              tr.setBlockType(range.from, range.to, schema.nodes.paragraph);\n            } else if (result.action === 'edit') {\n              tr.setNodeMarkup(range.from, rawBlock.node.type, { format: result.raw.format });\n              setTextSelection(tr.selection.from - 1, -1)(tr);\n            }\n          } else {\n            insertRawNode(tr, result.raw.format);\n          }\n\n          dispatch(tr);\n        }\n      }\n\n      if (view) {\n        view.focus();\n      }\n    }\n    asyncEditRawBlock();\n\n    return true;\n  };\n}\n\n// function to create a raw node\nfunction createRawNode(schema: Schema, format: string) {\n  return schema.nodes.raw_block.create({ format })!;\n}\n\n// function to create and insert a raw node, then set selection inside of it\nfunction insertRawNode(tr: Transaction, format: string) {\n  const schema = tr.doc.type.schema;\n  const prevSel = tr.selection;\n  tr.replaceSelectionWith(createRawNode(schema, format), false);\n  setTextSelection(tr.mapping.map(prevSel.from), -1)(tr);\n}\n","/*\n * image.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { kPixelUnit, kPercentUnit } from './css';\n\nconst kDpi = 96;\n\n// https://github.com/jgm/pandoc/blob/master/src/Text/Pandoc/ImageSize.hs\nexport const kValidUnits = [kPixelUnit, 'in', 'cm', 'mm', kPercentUnit];\n\nexport enum ImageType {\n  Image,\n  Figure,\n}\n\nexport interface ImageDimensions {\n  naturalWidth: number | null;\n  naturalHeight: number | null;\n  containerWidth: number;\n}\n\nexport function isValidImageSizeUnit(unit: string) {\n  return kValidUnits.includes(unit);\n}\n\nexport function imageSizePropWithUnit(prop: string | null) {\n  if (prop) {\n    const match = prop.match(/(^\\d*\\.?\\d*)(.*)$/);\n    if (match) {\n      return {\n        size: parseFloat(match[1]),\n        unit: match[2],\n      };\n    } else {\n      return null;\n    }\n  } else {\n    return null;\n  }\n}\n\nexport function isNaturalAspectRatio(width: number, height: number, dims: ImageDimensions, defaultValue: boolean) {\n  if (dims.naturalWidth && dims.naturalHeight) {\n    const diff = Math.abs(width / height - dims.naturalWidth / dims.naturalHeight);\n    return diff <= 0.01 * (width / height);\n  } else {\n    // no naturalWidth or naturalHeight, return default\n    return defaultValue;\n  }\n}\n\nexport function unitToPixels(value: number, unit: string, containerWidth: number) {\n  let pixels;\n  switch (unit) {\n    case 'in':\n      pixels = value * kDpi;\n      break;\n    case 'mm':\n      pixels = value * (kDpi / 25.4);\n      break;\n    case 'cm':\n      pixels = value * (kDpi / 2.54);\n      break;\n    case kPercentUnit:\n      pixels = (value / 100) * ensureContainerWidth(containerWidth);\n      break;\n    case kPixelUnit:\n    default:\n      pixels = value;\n      break;\n  }\n  return Math.round(pixels);\n}\n\nexport function pixelsToUnit(pixels: number, unit: string, containerWidth: number) {\n  switch (unit) {\n    case 'in':\n      return pixels / kDpi;\n    case 'mm':\n      return (pixels / kDpi) * 25.4;\n    case 'cm':\n      return (pixels / kDpi) * 2.54;\n    case kPercentUnit:\n      return (pixels / ensureContainerWidth(containerWidth)) * 100;\n    case kPixelUnit:\n    default:\n      return pixels;\n  }\n}\n\nexport function roundUnit(value: number, unit: string) {\n  switch (unit) {\n    case 'in':\n      return value.toFixed(2);\n    case 'cm':\n      return value.toFixed(1);\n    default:\n      return Math.round(value).toString();\n  }\n}\n\n// sometime when we are called before the DOM renders the containerWidth\n// is 0, in this case provide a default of 1000\nexport function ensureContainerWidth(containerWidth: number) {\n  return containerWidth || 1000;\n}\n","/*\n * extension.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\n\nexport enum FixupContext {\n  Load,\n  Save,\n  Resize,\n}\n\nexport type FixupFn = (tr: Transaction, fixupContext: FixupContext) => Transaction;\n","/*\n * css.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { kWidthAttrib, kHeightAttrib, kStyleAttrib } from './pandoc_attr';\n\nexport const kPercentUnit = '%';\nexport const kPixelUnit = 'px';\nexport function removeStyleAttrib(style: string, attrib: string, handler?: (attrib: string, value: string) => void) {\n  const pattern = '(' + attrib + ')\\\\:\\\\s*([^;]+);?';\n  const regex = new RegExp(pattern, 'g');\n  return style.replace(regex, (_match, p1, p2) => {\n    if (handler) {\n      handler(p1, p2);\n    }\n    return '';\n  });\n}\n\nexport function extractSizeStyles(keyvalues: Array<[string, string]> | undefined) {\n  if (!keyvalues) {\n    return keyvalues;\n  }\n\n  let newKeyvalues = keyvalues;\n\n  const getValue = (key: string) => {\n    const pair = newKeyvalues.find(keyvalue => keyvalue[0] === key);\n    return pair ? pair[1] : null;\n  };\n\n  const setValue = (key: string, value: string | null) => {\n    newKeyvalues = newKeyvalues.filter(keyvalue => keyvalue[0] !== key);\n    if (value) {\n      newKeyvalues.push([key, value]);\n    }\n  };\n\n  let width = getValue(kWidthAttrib);\n  let height = getValue(kHeightAttrib);\n  let style = getValue(kStyleAttrib);\n\n  if (style) {\n    style = removeStyleAttrib(style, kWidthAttrib, (_attrib, value) => {\n      if (!width) {\n        width = value;\n      }\n    });\n    style = removeStyleAttrib(style, kHeightAttrib, (_attrib, value) => {\n      if (!height) {\n        height = value;\n      }\n    });\n\n    // remove leading ; from style\n    style = style.replace(/^\\s*;+\\s*/, '').trimLeft();\n  }\n\n  setValue(kWidthAttrib, width);\n  setValue(kHeightAttrib, height);\n  setValue(kStyleAttrib, style);\n\n  return newKeyvalues;\n}\n\nexport function applyStyles(el: HTMLElement, classes?: string[], style?: { [key: string]: string }) {\n  if (classes) {\n    if (classes) {\n      classes.forEach(clz => el.classList.add(clz));\n    }\n  }\n  if (style) {\n    Object.keys(style).forEach(name => {\n      el.style.setProperty(name, style[name]);\n    });\n  }\n}\n\nexport function replaceClassWithStyle(el: HTMLElement, className: string, style: { [key: string]: string }) {\n  if (el.classList.contains(className)) {\n    el.classList.remove(className);\n    if (el.classList.length === 0) {\n      el.removeAttribute('class');\n    }\n\n    Object.keys(style).forEach(name => {\n      el.style.setProperty(name, style[name]);\n    });\n  }\n  const children: any = el.children;\n  for (const child of children) {\n    replaceClassWithStyle(child, className, style);\n  }\n}\n","/*\n * diff.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { diff_match_patch, DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT } from 'diff-match-patch';\n\nexport enum EditorChangeType {\n  Insert = 1,\n  Equal = 0,\n  Delete = -1,\n}\n\nexport interface EditorChange {\n  type: EditorChangeType;\n  value: string;\n}\n\nexport function diffChars(from: string, to: string, timeout: number): EditorChange[] {\n  const dmp = new diff_match_patch();\n  dmp.Diff_Timeout = timeout;\n  const diff = dmp.diff_main(from, to);\n  dmp.diff_cleanupSemantic(diff);\n  return diff.map(d => {\n    let type: EditorChangeType;\n    switch (d[0]) {\n      case DIFF_INSERT:\n        type = EditorChangeType.Insert;\n        break;\n      case DIFF_EQUAL:\n        type = EditorChangeType.Equal;\n        break;\n      case DIFF_DELETE:\n        type = EditorChangeType.Delete;\n        break;\n      default:\n        throw new Error('Unexpected diff type: ' + d[0]);\n    }\n    return {\n      type,\n      value: d[1],\n    };\n  });\n}\n","/*\n * input_rule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, MarkType, NodeType, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { InputRule, wrappingInputRule } from 'prosemirror-inputrules';\n\nimport { PandocMark, markIsActive } from './mark';\n\nexport function markInputRule(\n  regexp: RegExp,\n  markType: MarkType,\n  filter: MarkInputRuleFilter,\n  getAttrs?: ((match: string[]) => object) | object,\n) {\n  return new InputRule(regexp, (state: EditorState, match: string[], start: number, end: number) => {\n    if (!filter(state, start, end)) {\n      return null;\n    }\n\n    const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n    const tr = state.tr;\n    if (match[1]) {\n      const textStart = start + match[0].indexOf(match[1]);\n      const textEnd = textStart + match[1].length;\n      if (textEnd < end) {\n        tr.delete(textEnd, end);\n      }\n      if (textStart > start) {\n        tr.delete(start, textStart);\n      }\n      end = start + match[1].length;\n    }\n    const mark = markType.create(attrs);\n    tr.addMark(start, end, mark);\n    tr.removeStoredMark(mark); // Do not continue with mark.\n    return tr;\n  });\n}\n\nexport function delimiterMarkInputRule(\n  delim: string,\n  markType: MarkType,\n  filter: MarkInputRuleFilter,\n  prefixMask?: string,\n  noEnclosingWhitespace?: boolean,\n) {\n  // create distinct patterns depending on whether we allow enclosing whitespace\n  const contentPattern = noEnclosingWhitespace\n    ? `[^\\\\s${delim}][^${delim}]+[^\\\\s${delim}]|[^\\\\s${delim}]{1,2}`\n    : `[^${delim}]+`;\n\n  // if there is no prefix mask then this is simple regex we can pass to markInputRule\n  if (!prefixMask) {\n    const regexp = `(?:${delim})(${contentPattern})(?:${delim})$`;\n    return markInputRule(new RegExp(regexp), markType, filter);\n\n    // otherwise we need custom logic to get mark placement/eliding right\n  } else {\n    // build regex\n    const regexp = `(^|[^${prefixMask}])(?:${delim})(${contentPattern})(?:${delim})$`;\n\n    // return rule\n    return new InputRule(new RegExp(regexp), (state: EditorState, match: string[], start: number, end: number) => {\n      if (!filter(state, start, end)) {\n        return null;\n      }\n\n      // init transaction\n      const tr = state.tr;\n\n      // compute offset for mask (should be zero if this was the beginning of a line,\n      // in all other cases it would be the length of the any mask found).\n      const maskOffset = match[1].length;\n\n      // position of text to be formatted\n      const textStart = start + match[0].indexOf(match[2]);\n      const textEnd = textStart + match[2].length;\n\n      // remove trailing markdown\n      tr.delete(textEnd, end);\n\n      // update start/end to reflect the leading mask which we want to leave alone\n      start = start + maskOffset;\n      end = start + match[2].length;\n\n      // remove leading markdown\n      tr.delete(start, textStart);\n\n      // add mark\n      const mark = markType.create();\n      tr.addMark(start, end, mark);\n\n      // remove stored mark so typing continues w/o the mark\n      tr.removeStoredMark(mark);\n\n      // return transaction\n      return tr;\n    });\n  }\n}\n\nexport type MarkInputRuleFilter = (context: EditorState | Transaction, from?: number, to?: number) => boolean;\n\nexport function markInputRuleFilter(schema: Schema, marks: readonly PandocMark[]): MarkInputRuleFilter {\n  const maskedMarkTypes = marksWithNoInputRules(schema, marks);\n\n  return (context: EditorState | Transaction, from?: number, to?: number) => {\n    if (from !== undefined && to !== undefined && from !== to) {\n      const marksInRange: MarkType[] = [];\n      context.doc.nodesBetween(from, to, node => {\n        node.marks.forEach(mark => marksInRange.push(mark.type));\n      });\n      return !marksInRange.some(markType => maskedMarkTypes.includes(markType));\n    }\n    if (from === undefined) {\n      for (const markType of maskedMarkTypes) {\n        if (markIsActive(context, markType)) {\n          return false;\n        }\n      }\n    }\n    return true;\n  };\n}\n\nexport function conditionalWrappingInputRule(\n  regexp: RegExp,\n  nodeType: NodeType,\n  predicate: (state: EditorState) => boolean,\n  getAttrs?: { [key: string]: any } | ((p: string[]) => { [key: string]: any } | null | undefined),\n  joinPredicate?: (p1: string[], p2: ProsemirrorNode) => boolean,\n): InputRule {\n  const wrappingRule: any = wrappingInputRule(regexp, nodeType, getAttrs, joinPredicate);\n  return new InputRule(regexp, (state: EditorState, match: string[], start: number, end: number) => {\n    if (!predicate(state)) {\n      return null;\n    }\n    return wrappingRule.handler(state, match, start, end);\n  });\n}\n\nfunction marksWithNoInputRules(schema: Schema, marks: readonly PandocMark[]): MarkType[] {\n  const disabledMarks: MarkType[] = [];\n  marks.forEach((mark: PandocMark) => {\n    if (mark.noInputRules) {\n      disabledMarks.push(schema.marks[mark.name]);\n    }\n  });\n  return disabledMarks;\n}\n","/*\n * wrap.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\n\nimport { split } from 'sentence-splitter';\n\nimport { trTransform } from './transaction';\nimport { findChildrenByType, findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nexport function wrapSentences(tr: Transaction) {\n  trTransform(tr, wrapSentencesTransform);\n}\n\nfunction wrapSentencesTransform(tr: Transform) {\n  // find all paragraphs in doc\n  const schema = tr.doc.type.schema;\n  const paragraphs = findChildrenByType(tr.doc, schema.nodes.paragraph);\n\n  // insert linebreaks in paragraphs (go backwards to preserve positions)\n  paragraphs.reverse().forEach(paragraph => {\n    // don't break sentences inside tight list items\n    const $pos = tr.doc.resolve(paragraph.pos);\n    const parent = $pos.node($pos.depth);\n    if (parent.type === schema.nodes.list_item && $pos.node($pos.depth - 1).attrs.tight) {\n      return;\n    }\n\n    // don't break sentences inside tables\n    if (schema.nodes.table && findParentNodeOfTypeClosestToPos($pos, schema.nodes.table)) {\n      return;\n    }\n\n    // don't break bookdown text references\n    const textContent = paragraph.node.textContent;\n    if (/^\\(ref\\:[^\\s]+\\)\\s+[^\\s]/.test(textContent)) {\n      return;\n    }\n\n    // break sentences in text\n    const parts = split(textContent);\n    parts\n      .reverse()\n      .filter(part => part.type === 'Sentence')\n      .forEach(sentence => {\n        // don't break sentence if at least one mark is active\n        if (tr.doc.resolve(paragraph.pos + sentence.range[1] + 1).marks().length === 0) {\n          const hardBreak = schema.text('\\n');\n          const hardBreakPos = paragraph.pos + sentence.range[1] + 2;\n          tr.insert(hardBreakPos, hardBreak);\n        }\n      });\n  });\n}\n","/*\n * yaml_metadata-title.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\n\nimport { transactionsAreTypingChange, transactionsHaveChange } from '../../api/transaction';\nimport {\n  isYamlMetadataNode,\n  yamlMetadataNodes,\n  kYamlMetadataTitleRegex,\n  titleFromYamlMetadataNode,\n} from '../../api/yaml';\n\nconst plugin = new PluginKey<string>('yaml-metadata-title');\n\nexport function yamlMetadataTitlePlugin() {\n  return new Plugin<string>({\n    key: plugin,\n    state: {\n      init(_config, state: EditorState) {\n        return titleFromState(state);\n      },\n\n      apply(tr: Transaction, title: string, oldState: EditorState, newState: EditorState) {\n        const transactions = [tr];\n\n        // doc didn't change, return existing title\n        if (!tr.docChanged) {\n          return title;\n\n          // non-typing change, do a full rescan\n        } else if (!transactionsAreTypingChange(transactions)) {\n          return titleFromState(newState);\n\n          // change that affects a yaml metadata block, do a full rescan\n        } else if (transactionsHaveChange(transactions, oldState, newState, isYamlMetadataNode)) {\n          return titleFromState(newState);\n        }\n\n        // otherwise return the existing title\n        else {\n          return title;\n        }\n      },\n    },\n  });\n}\n\nexport function getTitle(state: EditorState) {\n  return plugin.getState(state);\n}\n\nexport function setTitle(state: EditorState, title: string) {\n  // alias schema\n  const schema = state.schema;\n\n  // no-op if yaml_metadata isn't available\n  if (!schema.nodes.yaml_metadata) {\n    return;\n  }\n\n  // create transaction\n  const tr = state.tr;\n\n  // escape quotes in title then build the title line\n  const escapedTitle = title.replace(/\"/g, `\\\\\"`);\n  const titleLine = `\\ntitle: \"${escapedTitle}\"\\n`;\n\n  // attempt to update existing title\n  const yamlNodes = yamlMetadataNodes(tr.doc);\n  let foundTitle = false;\n  for (const yaml of yamlNodes) {\n    const titleMatch = yaml.node.textContent.match(kYamlMetadataTitleRegex);\n    if (titleMatch) {\n      const updatedMetadata = yaml.node.textContent.replace(kYamlMetadataTitleRegex, titleLine);\n      const updatedNode = schema.nodes.yaml_metadata.createAndFill({}, schema.text(updatedMetadata));\n      tr.replaceRangeWith(yaml.pos, yaml.pos + yaml.node.nodeSize, updatedNode);\n      foundTitle = true;\n      break;\n    }\n  }\n\n  // if we didn't find a title then inject one at the top\n  if (!foundTitle) {\n    const yamlText = schema.text(`---${titleLine}---`);\n    const yamlNode = schema.nodes.yaml_metadata.create({}, yamlText);\n    tr.insert(1, yamlNode);\n  }\n\n  // return transaction\n  return tr;\n}\n\nfunction titleFromState(state: EditorState) {\n  const yamlNodes = yamlMetadataNodes(state.doc);\n  for (const yaml of yamlNodes) {\n    const title = titleFromYamlMetadataNode(yaml.node);\n    if (title) {\n      return title;\n    }\n  }\n  return '';\n}\n","/*\n * oultine.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { NodeWithPos } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { transactionsHaveChange, kSetMarkdownTransaction } from '../api/transaction';\nimport { findTopLevelBodyNodes } from '../api/node';\nimport { uuidv4 } from '../api/util';\nimport {\n  EditorOutlineItem,\n  EditorOutlineItemType,\n  EditorOutline,\n  isOutlineNode,\n  getEditingOutlineLocation,\n  getDocumentOutline,\n} from '../api/outline';\nimport { navigateToPos } from '../api/navigation';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { rmdChunkEngineAndLabel } from '../api/rmd';\n\nconst kOutlineIdsTransaction = 'OutlineIds';\n\nconst plugin = new PluginKey<EditorOutline>('outline');\n\nconst extension: Extension = {\n  appendTransaction: (schema: Schema) => {\n    return [\n      {\n        name: 'outline',\n        filter: hasOutlineIdsTransaction,\n        nodeFilter: isOutlineNode,\n        append: (tr: Transaction) => {\n          const usedIds = new Set<string>();\n          const needsOutlineId = (node: ProsemirrorNode) => {\n            if (isOutlineNode(node)) {\n              if (node.attrs.navigation_id === null) {\n                return true;\n              } else if (usedIds.has(node.attrs.navigation_id)) {\n                return true;\n              } else {\n                usedIds.add(node.attrs.navigation_id);\n                return false;\n              }\n            } else {\n              return false;\n            }\n          };\n          const needsOutlineIdNodes = findTopLevelBodyNodes(tr.doc, needsOutlineId);\n          needsOutlineIdNodes.forEach(outlineId => {\n            tr.setNodeMarkup(outlineId.pos, outlineId.node.type, {\n              ...outlineId.node.attrs,\n              navigation_id: uuidv4(),\n            });\n            tr.setMeta(kOutlineIdsTransaction, true);\n          });\n        },\n      },\n    ];\n  },\n\n  commands: () => {\n    return [\n      new ProsemirrorCommand(EditorCommandId.GoToNextSection, ['Mod-PageDown'], goToSectionCommand('next')),\n      new ProsemirrorCommand(EditorCommandId.GoToPreviousSection, ['Mod-PageUp'], goToSectionCommand('previous')),\n    ];\n  },\n\n  plugins: (schema: Schema) => {\n    return [\n      new Plugin<EditorOutline>({\n        key: plugin,\n\n        // track editor outline as state changes\n        state: {\n          init: (_config, state: EditorState) => {\n            return editorOutline(state);\n          },\n          apply: (tr: Transaction, value: EditorOutline, oldState: EditorState, newState: EditorState) => {\n            if (transactionsAffectOutline([tr], oldState, newState)) {\n              return editorOutline(newState);\n            } else {\n              return value; // don't need to map b/c there are no positions in the data structure\n            }\n          },\n        },\n      }),\n    ];\n  },\n};\n\nexport function goToSectionCommand(dir: 'next' | 'previous') {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    if (dispatch && view) {\n      let outline = getDocumentOutline(state);\n      if (dir === 'previous') {\n        outline = outline.reverse();\n      }\n      const target = outline.find(nodeWithPos => {\n        if (dir === 'next') {\n          return nodeWithPos.pos > state.selection.head;\n        } else {\n          return nodeWithPos.pos < state.selection.head - 1;\n        }\n      });\n      if (target) {\n        navigateToPos(view, target.pos, false);\n      }\n    }\n    return true;\n  };\n}\n\nfunction editorOutline(state: EditorState): EditorOutline {\n  // get all of the headings (bail if there are none)\n  const doc = state.doc;\n  const outlineNodes = findTopLevelBodyNodes(doc, isOutlineNode);\n  if (!outlineNodes.length) {\n    return [];\n  }\n\n  // create mapping of node type names to their current sequence\n  const sequence = new Map<string, number>();\n\n  // function to create an outline item from a node\n  const editorOutlineItem = (nodeWithPos: NodeWithPos, defaultLevel: number) => {\n    const typename = nodeWithPos.node.type.name;\n\n    // build sequence (ordinal of entry within node type)\n    let sequenceLast = sequence.get(typename);\n    if (sequenceLast === undefined) {\n      sequenceLast = 0;\n    }\n    const sequenceNext = sequenceLast + 1;\n    sequence.set(typename, sequenceNext);\n\n    const item = {\n      navigation_id: nodeWithPos.node.attrs.navigation_id,\n      type: nodeWithPos.node.type.name as EditorOutlineItemType,\n      level: nodeWithPos.node.attrs.level || defaultLevel,\n      title: nodeWithPos.node.type.spec.code ? nodeWithPos.node.type.name : nodeWithPos.node.textContent,\n      sequence: sequenceNext,\n      children: [],\n    };\n    \n    // if this is an R Markdown chunk, extract the title from the chunk\n    if (nodeWithPos.node.type.name === 'rmd_chunk') {\n      const chunk = rmdChunkEngineAndLabel(nodeWithPos.node.textContent);\n      if (chunk) {\n        item.title = chunk.label;\n      }\n    }\n    return item; \n  };\n\n  // extract the outline\n  const rootOutlineItem: EditorOutlineItem = {\n    navigation_id: '',\n    type: '' as EditorOutlineItemType,\n    level: 0,\n    sequence: 0,\n    title: '',\n    children: [],\n  };\n  const containers: EditorOutlineItem[] = [];\n  containers.push(rootOutlineItem);\n  const top = () => containers[containers.length - 1];\n  outlineNodes.forEach(nodeWithPos => {\n    // get outline item from document node\n    const outlineItem = editorOutlineItem(nodeWithPos, top().level + 1);\n\n    // pop containers until we reach <= our level\n    while (outlineItem.level <= top().level) {\n      containers.pop();\n    }\n\n    // add the outline node\n    top().children.push(outlineItem);\n\n    // make it the the active container if it's a heading\n    if (outlineItem.type === 'heading') {\n      containers.push(outlineItem);\n    }\n  });\n\n  // return children of root\n  return rootOutlineItem.children;\n}\n\nfunction hasOutlineIdsTransaction(transactions: Transaction[]) {\n  return transactions.some(tr => tr.getMeta(kOutlineIdsTransaction));\n}\n\nfunction transactionsAffectOutline(transactions: Transaction[], oldState: EditorState, newState: EditorState) {\n  return (\n    transactions.some(tr => tr.getMeta(kSetMarkdownTransaction)) ||\n    hasOutlineIdsTransaction(transactions) ||\n    transactionsHaveChange(transactions, oldState, newState, isOutlineNode)\n  );\n}\n\nexport function getOutline(state: EditorState): EditorOutline {\n  return plugin.getState(state)!;\n}\n\nexport default extension;\n","/*\n * find.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Extension } from '../api/extension';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { mergedTextNodes } from '../api/text';\nimport { kAddToHistoryTransaction } from '../api/transaction';\nimport { editingRootNode } from '../api/node';\nimport zenscroll from 'zenscroll';\n\nconst key = new PluginKey<DecorationSet>('find-plugin');\n\nclass FindPlugin extends Plugin<DecorationSet> {\n  private term: string = '';\n  private options: FindOptions = {};\n  private updating: boolean = false;\n\n  // The HTML element containing the last known selected search result\n  private resultElement: HTMLElement|null = null;\n\n  // A DOM mutation observer that watches for search results to be rendered\n  private resultObserver: MutationObserver|null = null;\n\n  // The ID for a timer that ensures the resultObserver completes quickly\n  private resultObserverTimer: number = 0;\n\n  constructor() {\n    super({\n      key,\n      state: {\n        init: (_config: { [key: string]: any }, instance: EditorState) => {\n          return DecorationSet.empty;\n        },\n        apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n          if (this.updating) {\n            return this.resultDecorations(tr);\n          } else {\n            return DecorationSet.empty;\n          }\n        },\n      },\n      view: () => ({\n        update: (view: EditorView, prevState: EditorState) => {\n          // Clear any previous search result observer\n          this.clearResultObserver();\n\n          // If there is a search result selected, navigate to it\n          if (this.isResultSelected(view.state)) {\n            this.scrollToSelectedResult(view, null);\n          }\n        },\n      }),\n      props: {\n        decorations: (state: EditorState) => {\n          return key.getState(state);\n        },\n      },\n    });\n  }\n\n  public find(term: string, options: FindOptions) {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      if (dispatch) {\n        this.term = !options.regex ? term.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') : term;\n        this.options = options;\n        this.updateResults(state, dispatch);\n      }\n      return true;\n    };\n  }\n\n  public matchCount(state: EditorState) {\n    return key.getState(state)!.find().length;\n  }\n\n  public selectFirst() {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      const decorations: Decoration[] = key.getState(state)!.find(0);\n      if (decorations.length === 0) {\n        return false;\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n        this.selectResult(tr, decorations[0]);\n        this.withResultUpdates(() => {\n          dispatch(tr);\n        });\n      }\n\n      return true;\n    };\n  }\n\n  public selectCurrent() {\n    return this.selectNext(false);\n  }\n\n  public selectNext(afterSelection = true) {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n      const searchFrom = afterSelection\n        ? this.matchesTerm(selectedText)\n          ? state.selection.to + 1\n          : state.selection.to\n        : state.selection.from;\n\n      const decorationSet = key.getState(state)!;\n      let decorations: Decoration[] = decorationSet.find(searchFrom);\n      if (decorations.length === 0) {\n        // check for wrapping\n        if (this.options.wrap) {\n          const searchTo = this.matchesTerm(selectedText) ? state.selection.from - 1 : state.selection.from;\n          decorations = decorationSet.find(0, searchTo);\n          if (decorations.length === 0) {\n            return false;\n          }\n          // no wrapping\n        } else {\n          return false;\n        }\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n        this.selectResult(tr, decorations[0]);\n        this.withResultUpdates(() => {\n          dispatch(tr);\n        });\n      }\n      return true;\n    };\n  }\n\n  public selectPrevious() {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      // sort out where we are searching up to\n      const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n      const searchTo = this.matchesTerm(selectedText) ? state.selection.from - 1 : state.selection.from;\n\n      // get all decorations up to the current selection\n      const decorationSet = key.getState(state)!;\n      let decorations: Decoration[] = decorationSet.find(0, searchTo);\n      if (decorations.length === 0) {\n        // handle wrapping\n        if (this.options.wrap) {\n          const searchFrom = this.matchesTerm(selectedText) ? state.selection.to + 1 : state.selection.to;\n          decorations = decorationSet.find(searchFrom);\n          if (decorations.length === 0) {\n            return false;\n          }\n          // no wrapping\n        } else {\n          return false;\n        }\n      }\n\n      // find the one closest to the beginning of the current selection\n      if (dispatch) {\n        // now we need to find the decoration with the largest from value\n        const decoration = decorations.reduce((lastDecoration, nextDecoration) => {\n          if (nextDecoration.from > lastDecoration.from) {\n            return nextDecoration;\n          } else {\n            return lastDecoration;\n          }\n        });\n\n        const tr = state.tr;\n        this.selectResult(tr, decoration);\n        this.withResultUpdates(() => {\n          dispatch(tr);\n        });\n      }\n      return true;\n    };\n  }\n\n  public replace(text: string) {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      if (!this.isResultSelected(state)) {\n        return false;\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n        const selectionMarks = tr.selection.$from.marksAcross(tr.selection.$to);\n        tr.replaceSelectionWith(state.schema.text(text, selectionMarks), false);\n        this.withResultUpdates(() => {\n          dispatch(tr);\n        });\n      }\n\n      return true;\n    };\n  }\n\n  public replaceAll(text: string) {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      \n      let replaced = 0;\n\n      if (!this.hasTerm()) {\n        return replaced;\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n\n        const decorationSet = key.getState(state)!;\n\n        const decorations: Decoration[] = decorationSet.find(0);\n        decorations.forEach(decoration => {\n          const from = tr.mapping.map(decoration.from);\n          const to = tr.mapping.map(decoration.to);\n          tr.insertText(text, from, to);\n          replaced += 1;\n        });\n        this.withResultUpdates(() => {\n          dispatch(tr);\n        });\n      }\n\n      return replaced;\n    };\n  }\n\n  public clear() {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      if (dispatch) {\n        this.term = '';\n        this.options = {};\n        this.updateResults(state, dispatch);\n      }\n      return true;\n    };\n  }\n\n  private updateResults(state: EditorState, dispatch: (tr: Transaction<any>) => void) {\n    this.withResultUpdates(() => {\n      const tr = state.tr;\n      tr.setMeta(kAddToHistoryTransaction, false);\n      dispatch(tr);\n    });\n  }\n\n  private resultDecorations(tr: Transaction): DecorationSet {\n    // bail if no search term\n    if (!this.hasTerm()) {\n      return DecorationSet.empty;\n    }\n\n    // decorations to return\n    const decorations: Decoration[] = [];\n\n    // merge text nodes\n    const textNodes = mergedTextNodes(tr.doc);\n\n    textNodes.forEach(textNode => {\n      const search = this.findRegEx();\n      if (!search) {\n        return;\n      }\n\n      let m;\n      // tslint:disable-next-line no-conditional-assignment\n      while ((m = search.exec(textNode.text))) {\n        if (m[0] === '') {\n          break;\n        }\n        const from = textNode.pos + m.index;\n        const to = textNode.pos + m.index + m[0].length;\n        const classes = ['pm-find-text'];\n        if (from === tr.selection.from && to === tr.selection.to) {\n          classes.push('pm-selected-text');\n        }\n        decorations.push(Decoration.inline(from, to, { class: classes.join(' ') }));\n      }\n    });\n\n    // return as decoration set\n    return decorations.length ? DecorationSet.create(tr.doc, decorations) : DecorationSet.empty;\n  }\n\n  private withResultUpdates(f: () => void) {\n    this.updating = true;\n    f();\n    this.updating = false;\n  }\n\n  private selectResult(tr: Transaction, decoration: Decoration) {\n    const selection = new TextSelection(tr.doc.resolve(decoration.from), tr.doc.resolve(decoration.to));\n    return tr.setSelection(selection).scrollIntoView();\n  }\n\n  private isResultSelected(state: EditorState) {\n    if (this.hasTerm()) {\n      const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n      return this.matchesTerm(selectedText);\n    } else {\n      return false;\n    }\n  }\n\n  /**\n   * Watch for a search result to appear in the DOM. When it does, scroll it\n   * into view.\n   * \n   * @param view The current EditorView \n   */\n  private watchForSelectedResult(view: EditorView) {\n    // Clear any previous result observer\n    this.clearResultObserver();\n\n    // Create a new result observer to watch for results to be rendered\n    this.resultObserver = new MutationObserver((records: MutationRecord[], observer: MutationObserver) => {\n      let resultElement:HTMLElement|null = null;\n\n      // Predicate for testing a node to see if it looks like the active search result\n      const isResultNode = (node: Node): boolean => {\n        if (node.nodeType !== node.ELEMENT_NODE) {\n          return false;\n        }\n        const ele = node as HTMLElement;\n        return ele.classList.contains('pm-find-text') && \n               ele.classList.contains('pm-selected-text');\n      };\n\n      // Examine each mutation record to see if it's the one we're looking for\n      records.forEach((mutation) => {\n        switch(mutation.type) {\n          case 'childList':\n            // Case 1: a new search result node was added to the DOM\n            mutation.addedNodes.forEach((node) => {\n              if (isResultNode(node)) {\n                resultElement = node as HTMLElement;\n              }\n            });\n            break;\n          case 'attributes':\n            // Case 2: an existing node gained a \"class\" attribute and is now an\n            // active search result\n            if (isResultNode(mutation.target)) {\n              resultElement = mutation.target as HTMLElement;\n            }\n            break;\n        }\n      });\n\n      // If we found a result element, scroll it into view and turn off the DOM\n      // observer. (If we didn't find one, it may be an irrelevant DOM mutation,\n      // so ignore it.)\n      if (resultElement) {\n        this.scrollToSelectedResult(view, resultElement);\n        this.clearResultObserver();\n      }\n    });\n\n    const editingRoot = editingRootNode(view.state.selection);\n    if (editingRoot) {\n      const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n\n      // Begin observing the editing surface for DOM mutations\n      this.resultObserver.observe(container, {\n        subtree: true,\n        childList: true,\n        attributeFilter: ['class']  // Only interested in changes to the \"class\" attribute\n      });\n\n      // The search results should appear quickly (we're really just waiting for\n      // a render loop). If the observer runs for longer than 1s, just cancel\n      // it, as it consumes resources and anything observed is likely to be\n      // spurious.\n      this.resultObserverTimer = window.setTimeout(() => {\n        this.clearResultObserver();\n      }, 1000);\n    }\n  }\n\n  /**\n   * Cleans all state related to the search result DOM observer\n   */\n  private clearResultObserver() {\n    // Disconnect the result observer if running\n    if (this.resultObserver !== null) {\n      this.resultObserver.disconnect();\n      this.resultObserver = null;\n    }\n\n    // Remove the result observer timer if running\n    if (this.resultObserverTimer !== 0) {\n      window.clearTimeout(this.resultObserverTimer);\n      this.resultObserverTimer = 0;\n    }\n  }\n\n  /**\n   * Scrolls the selected search result into view.\n   * \n   * @param view The EditorView on which to act\n   * @param resultElement The HTML element containing the search result, if known\n   */\n  private scrollToSelectedResult(view: EditorView, resultElement: HTMLElement|null) {\n    const editingRoot = editingRootNode(view.state.selection);\n    if (editingRoot) {\n      const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n\n      if (resultElement === null) {\n        // Attempt to find a result element to scroll to if we weren't given one\n        resultElement = container.querySelector(\".pm-find-text.pm-selected-text\");\n      }\n\n      if (resultElement === null || resultElement === this.resultElement) {\n        // If we didn't find a result element, or if we found a stale one\n        // (hasn't changed), defer scrolling until it has been rendered. This is\n        // most common when the search result is inside an Ace editor chunk,\n        // which puts the result in the DOM on a deferred render loop.\n        this.watchForSelectedResult(view);\n        return;\n      } \n\n      this.resultElement = resultElement;\n\n      // Starting offset for scroll position \n      let offset = 100;\n\n      // Zenscroll can only scroll to a direct child element of the scroll\n      // container, but the element containing the search result may be deeply\n      // nested in the container. Walk up the DOM tree, summing the offsets,\n      // until we get to an element that's actually a child of the scroll\n      // container. \n      let scrollElement = resultElement;\n      while (scrollElement.offsetParent?.parentElement !== container) {\n        offset += scrollElement.offsetTop;\n        const nextParent = scrollElement.offsetParent;\n        if (nextParent === null) {\n          break;\n        } \n        scrollElement = nextParent as HTMLElement;\n      }\n\n      // Perform the scroll to the element's container plus its offset inside\n      // the container.\n      const scroller = zenscroll.createScroller(container);\n      scroller.center(scrollElement, 350, offset);\n    }\n  }\n\n  private hasTerm() {\n    return this.term.length > 0;\n  }\n\n  private matchesTerm(text: string) {\n    if (this.hasTerm()) {\n      const regex = this.findRegEx();\n      if (regex) {\n        return regex.test(text);\n      } else {\n        return false;\n      }\n    } else {\n      return false;\n    }\n  }\n\n  private findRegEx() {\n    try {\n      return new RegExp(this.term, !this.options.caseSensitive ? 'gui' : 'gu');\n    } catch {\n      return null;\n    }\n  }\n}\n\nconst extension: Extension = {\n  plugins: () => {\n    return [new FindPlugin()];\n  },\n};\n\nexport interface FindOptions {\n  regex?: boolean;\n  caseSensitive?: boolean;\n  wrap?: boolean;\n}\n\nexport function find(view: EditorView, term: string, options: FindOptions): boolean {\n  return findPlugin(view).find(term, options)(view.state, view.dispatch);\n}\n\nexport function matchCount(view: EditorView): number {\n  return findPlugin(view).matchCount(view.state);\n}\n\nexport function selectFirst(view: EditorView): boolean {\n  return findPlugin(view).selectFirst()(view.state, view.dispatch);\n}\n\nexport function selectCurrent(view: EditorView): boolean {\n  return findPlugin(view).selectCurrent()(view.state, view.dispatch);\n}\n\nexport function selectNext(view: EditorView): boolean {\n  return findPlugin(view).selectNext()(view.state, view.dispatch);\n}\n\nexport function selectPrevious(view: EditorView): boolean {\n  return findPlugin(view).selectPrevious()(view.state, view.dispatch);\n}\n\nexport function replace(view: EditorView, text: string): boolean {\n  return findPlugin(view).replace(text)(view.state, view.dispatch);\n}\n\nexport function replaceAll(view: EditorView, text: string) {\n  return findPlugin(view).replaceAll(text)(view.state, view.dispatch);\n}\n\nexport function clear(view: EditorView): boolean {\n  return findPlugin(view).clear()(view.state, view.dispatch);\n}\n\nexport function findPluginState(state: EditorState): DecorationSet | null | undefined {\n  return key.getState(state);\n}\n\nfunction findPlugin(view: EditorView): FindPlugin {\n  return key.get(view.state) as FindPlugin;\n}\n\nexport default extension;\n","/*\n * omni_insert.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { DOMOutputSpecArray, Mark, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { PandocOutput } from '../../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { selectionAllowsCompletions } from '../../api/completion';\nimport { OmniInserter } from '../../api/omni_insert';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\nimport { EditorUI } from '../../api/ui';\n\nimport { omniInsertCompletionHandler } from './omni_insert-completion';\nimport { Extension } from '../../api/extension';\nimport { markIsActive } from '../../api/mark';\n\nexport function markOmniInsert() {\n  return {\n    marks: [\n      {\n        name: 'omni_insert',\n        spec: {\n          inclusive: true,\n          noInputRules: true,\n          parseDOM: [{ tag: \"span[class*='omni_insert']\" }],\n          toDOM(): DOMOutputSpecArray {\n            return ['span', { class: 'omni_insert' }];\n          },\n        },\n        pandoc: {\n          readers: [],\n          writer: {\n            priority: 30,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              output.writeInlines(parent);\n            },\n          },\n        },\n      },\n    ],\n  };\n}\n\nexport function omniInsertExtension(\n  omniInserters: OmniInserter[],\n  inputRuleFilter: MarkInputRuleFilter,\n  ui: EditorUI,\n): Extension {\n  return {\n    commands: () => [new OmniInsertCommand(inputRuleFilter)],\n    completionHandlers: () => [omniInsertCompletionHandler(omniInserters, ui)],\n  };\n}\n\nclass OmniInsertCommand extends ProsemirrorCommand {\n  constructor(markFilter: MarkInputRuleFilter) {\n    super(\n      EditorCommandId.OmniInsert,\n      ['Mod-/'],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        // check whether selection allows completions\n        if (!selectionAllowsCompletions(state.selection)) {\n          return false;\n        }\n\n        // if the marks is already active then bail\n        if (markIsActive(state, state.schema.marks.omni_insert)) {\n          return false;\n        }\n\n        // check the mark filter\n        if (!markFilter(state)) {\n          return false;\n        }\n\n        if (dispatch) {\n          const mark = state.schema.marks.omni_insert.create();\n          const node = state.schema.text('/', [mark]);\n          const tr = state.tr;\n          tr.replaceSelectionWith(node, false);\n          dispatch(tr);\n        }\n\n        return true;\n      },\n    );\n  }\n}\n","/*\n * completion.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { EditorView, DecorationSet } from 'prosemirror-view';\n\nimport { canInsertNode } from './node';\nimport { EditorUI } from './ui';\nimport { kInsertCompletionTransaction } from './transaction';\n\nexport const kCompletionDefaultItemHeight = 22;\nexport const kCompletionDefaultMaxVisible = 10;\nexport const kCompletionDefaultWidth = 180;\n\nexport interface CompletionContext {\n  isPaste: boolean;\n}\n\nexport interface CompletionsStream<T = any> {\n  items: T[];\n  stream: () => T[] | null;\n}\n\nexport type Completions<T = any> = T[] | CompletionsStream<T>;\n\nexport interface CompletionResult<T = any> {\n  pos: number;\n  offset?: number;\n  token: string;\n  completions: (state: EditorState, context: CompletionContext) => Promise<Completions>;\n  decorations?: DecorationSet;\n}\n\nexport interface CompletionHeaderProps {\n  ui: EditorUI;\n  message?: string;\n}\n\nexport interface CompletionHandler<T = any> {\n  // unique id\n  id: string;\n\n  // An optional scope for this completion handler. Completions\n  // triggered by a transaction will filter completion handlers\n  // that share a scope with the completion handler that originated\n  // a transaction.\n  scope?: string;\n\n  // filter for determing whether we can call this handler from a given context (default is to\n  // never offer completions if a mark with noInputRules is active). set to null to\n  // allow completion anywhere\n  enabled?: ((context: EditorState | Transaction) => boolean) | null;\n\n  // return a set of completions for the given context. text is the text before\n  // before the cursor in the current node (but no more than 500 characters)\n  completions(text: string, context: EditorState | Transaction): CompletionResult | null;\n\n  // filter a previously returned set of completions\n  filter?: (completions: T[], state: EditorState, token: string, prevToken?: string) => T[] | null;\n\n  // provide a completion replacement as a string or node (can be passed null if the popup was dismissed)\n  replacement?(schema: Schema, completion: T | null): string | ProsemirrorNode | null;\n\n  // lower level replacement handler (can be passed null if the popup was dismissed)\n  replace?(view: EditorView, pos: number, completion: T | null): Promise<any>;\n\n  // completion view\n  view: {\n    // optional header component (will go inside a <th>)\n    header?: () =>\n      | {\n          component: React.FC<CompletionHeaderProps> | React.ComponentClass<CompletionHeaderProps>;\n          height: number;\n          message?: string;\n        }\n      | undefined;\n\n    // react compontent type for viewing the item\n    component: React.FC<T> | React.ComponentClass<T>;\n\n    key: (completion: T) => any;\n\n    // width of completion item (defaults to 180).\n    width?: number;\n\n    // height of completion item (defaults to 22px)\n    height?: number;\n\n    // use horizontal orientation (defaults to false)\n    // (optionally provide a set of item widths)\n    horizontal?: boolean;\n    horizontalItemWidths?: number[];\n\n    // maximum number of visible items (defaults to 10). note that\n    // this only applies to completion poupups w/ vertical orientation\n    // (scrolling is not supported for horizontal orientation)\n    maxVisible?: number;\n\n    // hide 'no results' (default false)\n    hideNoResults?: boolean;\n  };\n}\n\nexport function selectionAllowsCompletions(selection: Selection) {\n  const schema = selection.$head.parent.type.schema;\n\n  // non empty selections don't have completions\n  if (!selection.empty) {\n    return false;\n  }\n\n  // must be able to insert text\n  if (!canInsertNode(selection, schema.nodes.text)) {\n    return false;\n  }\n\n  // must not be in a code mark\n  if (schema.marks.code && !!schema.marks.code.isInSet(selection.$from.marks())) {\n    return false;\n  }\n\n  // must not be in a code node\n  if (selection.$head.parent.type.spec.code) {\n    return false;\n  }\n\n  return true;\n}\n\n// Determine whether two completionHandlers share the same scope. By default\n// completion handlers will share scope only if they share an id, but handlers\n// can provide a scope if they'd like to coordinate.\nexport function completionsShareScope(handler: CompletionHandler, prevHandler?: CompletionHandler) {\n  // There is no previous handler, not shared\n  if (!prevHandler) {\n    return false;\n  }\n\n  // Previous handler with the same scope as the current handler\n  if (prevHandler.scope && prevHandler.scope === handler.scope) {\n    return true;\n  } else {\n    // Previous handler has the same id as the current handler\n    return prevHandler.id === handler.id;\n  }\n}\n\nexport function performCompletionReplacement(tr: Transaction, pos: number, replacement: ProsemirrorNode | string) {\n  // set selection to area we will be replacing\n  tr.setSelection(new TextSelection(tr.doc.resolve(pos), tr.selection.$head));\n\n  // ensure we have a node\n  if (replacement instanceof ProsemirrorNode) {\n    // combine it's marks w/ whatever is active at the selection\n    const marks = tr.selection.$head.marks();\n\n    // set selection and replace it\n    tr.replaceSelectionWith(replacement, false);\n\n    // propapate marks\n    marks.forEach(mark => tr.addMark(pos, tr.selection.to, mark));\n  } else {\n    tr.insertText(replacement);\n  }\n\n  // mark the transaction as an completion insertion\n  tr.setMeta(kInsertCompletionTransaction, true);\n}\n","/*\n * omni_insert.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Selection, Transaction } from 'prosemirror-state';\nimport { EditorView, DecorationSet } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport React from 'react';\nimport { firstBy } from 'thenby';\n\nimport { OmniInserter, omniInsertGroupCompare, omniInsertPriorityCompare } from '../../api/omni_insert';\nimport { CompletionHandler, CompletionResult } from '../../api/completion';\n\nimport { EditorUI } from '../../api/ui';\nimport { placeholderDecoration, emptyNodePlaceholderPlugin } from '../../api/placeholder';\nimport { kAddToHistoryTransaction } from '../../api/transaction';\n\nimport './omni_insert-completion.css';\n\nexport function omniInsertCompletionHandler(\n  omniInserters: OmniInserter[],\n  ui: EditorUI,\n): CompletionHandler<OmniInserter> {\n  return {\n    id: 'E305158D-20D6-474D-84E6-06607CA58578',\n\n    completions: omniInsertCompletions(omniInserters, ui),\n\n    filter: (completions: OmniInserter[], state: EditorState, token: string) => {\n      // match contents of name or keywords (and verify the command is enabled)\n      return completions\n        .filter(inserter => {\n          return (\n            token.length === 0 ||\n            inserter.name.toLowerCase().indexOf(token) !== -1 ||\n            inserter.keywords?.some(keyword => keyword.indexOf(token) !== -1)\n          );\n        })\n        .filter(inserter => {\n          return inserter.command(state);\n        })\n        .sort(\n          firstBy(omniInsertGroupCompare)\n            .thenBy(omniInsertPriorityCompare, { direction: 'desc' })\n            .thenBy('name'),\n        );\n    },\n\n    replace(view: EditorView, pos: number, completion: OmniInserter | null) {\n      // helper to remove command text\n      const removeCommandText = () => {\n        const tr = view.state.tr;\n        tr.deleteRange(pos, view.state.selection.head);\n        tr.setMeta(kAddToHistoryTransaction, false);\n        view.dispatch(tr);\n      };\n\n      // execute command if provided\n      if (completion) {\n        // remove existing text\n        removeCommandText();\n\n        // execute the command\n        completion.command(view.state, view.dispatch, view);\n\n        // perform any requested selection offset\n        if (completion.selectionOffset) {\n          const tr = view.state.tr;\n          setTextSelection(tr.selection.from + completion.selectionOffset)(tr);\n          tr.setMeta(kAddToHistoryTransaction, false);\n          view.dispatch(tr);\n        }\n\n        // if this is a dismiss of an omni_insert mark then the command\n        // isn't part of 'natural' typing into the document, so remove it\n      } else if (isOmniInsertCommandActive(view.state.selection)) {\n        removeCommandText();\n      }\n      return Promise.resolve();\n    },\n\n    view: {\n      component: OmniInserterView,\n      key: command => command.id,\n      width: 320,\n      height: 46,\n      maxVisible: 5,\n    },\n  };\n}\n\nconst kOmniInsertRegex = /\\/([\\w]*)$/;\n\nfunction omniInsertCompletions(omniInserters: OmniInserter[], ui: EditorUI) {\n  return (text: string, context: EditorState | Transaction): CompletionResult<OmniInserter> | null => {\n    const match = text.match(kOmniInsertRegex);\n    if (match) {\n      // we need to either be at the beginning of our parent, OR the omni_insert mark needs\n      // to be active (that indicates that we entered omni insert mode via a user command)\n      if (match.index !== 0 && !isOmniInsertCommandActive(context.selection)) {\n        return null;\n      }\n\n      // capture query (note that no query returns all).\n      const query = match[1].toLowerCase();\n\n      // include a decoration if the query is empty\n      const decorations =\n        query.length === 0\n          ? DecorationSet.create(context.doc, [\n              placeholderDecoration(context.selection.head, ui.context.translateText(' type to search...')),\n            ])\n          : undefined;\n\n      // return the completion result\n      return {\n        // match at the /\n        pos: context.selection.head - match[0].length,\n\n        // unique identifier for this request\n        token: query,\n\n        // return all omniInserters (will refine via filter)\n        completions: (state: EditorState) => {\n          return Promise.resolve(omniInserters);\n        },\n\n        // search placehodler decorator if there is no query\n        decorations,\n      };\n    } else {\n      return null;\n    }\n  };\n}\n\nconst OmniInserterView: React.FC<OmniInserter> = inserter => {\n  return (\n    <table className={'pm-omni-insert-completion'}>\n      <tbody>\n        <tr>\n          <td className={'pm-omni-insert-icon'}>\n            <img className={'pm-block-border-color'} src={inserter.image()} alt=\"\" />\n          </td>\n          <td>\n            <div className={'pm-omni-insert-name pm-completion-list-item-text'}>{inserter.name}</div>\n            <div className={'pm-omni-insert-description pm-completion-list-item-text'}>{inserter.description}</div>\n          </td>\n        </tr>\n      </tbody>\n    </table>\n  );\n};\n\nfunction isOmniInsertCommandActive(selection: Selection) {\n  const schema = selection.$head.parent.type.schema;\n  return schema.marks.omni_insert.isInSet(selection.$head.marks());\n}\n","/*\n * omni_insert.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CommandFn } from './command';\n\n// descriptive info for omni insert\nexport interface OmniInsert {\n  name: string;\n  keywords?: string[];\n  description: string;\n  group: OmniInsertGroup;\n  priority?: number;\n  selectionOffset?: number;\n  image: () => string;\n}\n\n// descriptive info + ability to identify/execute\nexport interface OmniInserter extends OmniInsert {\n  id: string;\n  command: CommandFn;\n}\n\nexport enum OmniInsertGroup {\n  Headings = 'Headings',\n  Chunks = 'Chunks',\n  Lists = 'Lists',\n  Math = 'Math',\n  References = 'References',\n  Content = 'Content',\n  Blocks = 'Blocks',\n}\n\nconst omniInsertGroupOrder = new Map<string, number>(Object.keys(OmniInsertGroup).map((key, index) => [key, index]));\n\nexport function omniInsertGroupCompare(a: OmniInsert, b: OmniInsert) {\n  return omniInsertGroupOrder.get(a.group)! - omniInsertGroupOrder.get(b.group)!;\n}\n\nexport function omniInsertPriorityCompare(a: OmniInsert, b: OmniInsert) {\n  return (a.priority || 0) - (b.priority || 0);\n}\n","/*\n * placeholder.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { EditorState, Transaction, Plugin, PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { findParentNode } from 'prosemirror-utils';\n\nimport { EditorUI } from './ui';\n\nexport function emptyNodePlaceholderPlugin(nodeType: NodeType, placeholder: (node: ProsemirrorNode) => string) {\n  const pluginKey = new PluginKey(nodeType.name + '-empty-placeholder');\n\n  return new Plugin<DecorationSet>({\n    key: pluginKey,\n    state: {\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return DecorationSet.empty;\n      },\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        // check for empty parent of our type\n        const emptyNode = findParentNode(node => node.type === nodeType && node.childCount === 0)(tr.selection);\n        if (emptyNode) {\n          const decoration = placeholderDecoration(emptyNode.pos + 1, placeholder(emptyNode.node));\n          return DecorationSet.create(tr.doc, [decoration]);\n        } else {\n          return DecorationSet.empty;\n        }\n      },\n    },\n    props: {\n      decorations(state: EditorState) {\n        return pluginKey.getState(state);\n      },\n    },\n  });\n}\n\nexport function placeholderDecoration(pos: number, text: string) {\n  return Decoration.widget(pos, (_view: EditorView, _getPos: () => number) => {\n    const placeholder = window.document.createElement('span');\n    placeholder.classList.add('pm-placeholder-text-color');\n    placeholder.innerText = text;\n    return placeholder;\n  });\n}\n\nexport function iconAndTextPlaceholderDecoration(pos: number, icon: string, text: string) {\n  return Decoration.widget(pos, (_view: EditorView, _getPos: () => number) => {\n    const container = window.document.createElement('span');\n\n    const iconImg = window.document.createElement('img');\n    iconImg.classList.add('pm-placeholder-icon');\n    iconImg.setAttribute('src', icon);\n\n    const message = window.document.createElement('span');\n    message.classList.add('pm-placeholder-text-color');\n    message.classList.add('pm-placeholder-text');\n    message.innerText = text;\n\n    container.appendChild(iconImg);\n    container.appendChild(message);\n    return container;\n  });\n}\n\nexport function searchPlaceholderDecoration(pos: number, ui: EditorUI, text?: string) {\n  return iconAndTextPlaceholderDecoration(pos, ui.images.search!, text || '');\n}\n","/*\n * completion.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// TODO: it may be that we need to not do full re-requests from the filter\n// when we have streamed results (as they can cause reset of the allCompletions)\n\nimport { Plugin, PluginKey, Transaction, Selection, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n  CompletionHandler,\n  selectionAllowsCompletions,\n  kCompletionDefaultMaxVisible,\n  completionsShareScope,\n  performCompletionReplacement,\n  CompletionResult,\n  Completions,\n  CompletionsStream,\n} from '../../api/completion';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent } from '../../api/event-types';\n\nimport { createCompletionPopup, renderCompletionPopup, destroyCompletionPopup } from './completion-popup';\nimport { EditorUI } from '../../api/ui';\nimport { PromiseQueue } from '../../api/promise';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\nimport { kInsertCompletionTransaction, kPasteTransaction } from '../../api/transaction';\n\ninterface CompletionState {\n  handler?: CompletionHandler;\n  result?: CompletionResult;\n  prevToken?: string;\n  isPaste?: boolean;\n}\n\nexport function completionExtension(\n  handlers: readonly CompletionHandler[],\n  inputRuleFilter: MarkInputRuleFilter,\n  ui: EditorUI,\n  events: EditorEvents,\n) {\n  return {\n    plugins: () => [new CompletionPlugin(handlers, inputRuleFilter, ui, events)],\n  };\n}\n\nconst key = new PluginKey<CompletionState>('completion');\n\nclass CompletionPlugin extends Plugin<CompletionState> {\n  // editor ui\n  private readonly ui: EditorUI;\n\n  // editor view\n  private view: EditorView | null = null;\n\n  // popup elemeent\n  private completionPopup: HTMLElement | null = null;\n\n  // currently selected index and last set of completions are held as transient\n  // state because they can't be derived from the document state (selectedIndex\n  // is derived from out of band user keyboard gestures and completions may\n  // have required fulfilling an external promise). also use a version counter\n  // used to invalidate async completion requests that are fulfilled after\n  // an update has occurred\n  private version = 0;\n  private allCompletions: any[] = [];\n  private completions: any[] = [];\n  private horizontal = false;\n  private selectedIndex = 0;\n\n  // serialize async completion requests\n  private completionQueue = new PromiseQueue();\n\n  // events we need to unsubscribe from\n  private readonly scrollUnsubscribe: VoidFunction;\n\n  constructor(\n    handlers: readonly CompletionHandler[],\n    inputRuleFilter: MarkInputRuleFilter,\n    ui: EditorUI,\n    events: EditorEvents,\n  ) {\n    super({\n      key,\n      state: {\n        init: () => ({}),\n        apply: (tr: Transaction, prevState: CompletionState) => {\n          // if we don't have a view then bail\n          if (!this.view) {\n            return {};\n          }\n\n          // selection only changes dismiss any active completion\n          if (!tr.docChanged && !tr.storedMarksSet && tr.selectionSet) {\n            return {};\n          }\n\n          // check whether completions are valid here\n          if (!selectionAllowsCompletions(tr.selection)) {\n            return {};\n          }\n\n          // calcluate text before cursor\n          const textBefore = completionTextBeforeCursor(tr.selection);\n\n          // if there is no text then don't handle it\n          if (textBefore.length === 0) {\n            return {};\n          }\n\n          const isPaste = tr.getMeta(kPasteTransaction) === true;\n\n          // check for a handler that can provide completions at the current selection\n          for (const handler of handlers) {\n            // first check if the handler is enabled (null means use inputRuleFilter)\n            if (handler.enabled === null || (handler.enabled ? handler.enabled(tr) : inputRuleFilter(tr))) {\n              const result = handler.completions(textBefore, tr);\n              if (result) {\n                // check if the previous state had a completion from the same handler\n                let prevToken: string | undefined;\n\n                // If this completion shares scope with the previous completion\n                // and this is a completion transaction, skip\n                if (tr.getMeta(kInsertCompletionTransaction) && completionsShareScope(handler, prevState.handler)) {\n                  continue;\n                }\n\n                if (handler.id === prevState.handler?.id) {\n                  // pass the prevToken on if the completion was for the same position\n                  if (result.pos === prevState.result?.pos) {\n                    prevToken = prevState.result.token;\n                  }\n                }\n\n                // return state\n                return { handler, result, prevToken, isPaste };\n              }\n            }\n          }\n\n          // no handler found\n          return {};\n        },\n      },\n\n      view: () => ({\n        update: (view: EditorView) => {\n          // increment version\n          this.version++;\n\n          // set view\n          this.view = view;\n\n          // update completions\n          this.updateCompletions(view, true);\n        },\n\n        destroy: () => {\n          // unsubscribe from events\n          this.scrollUnsubscribe();\n          window.document.removeEventListener('focusin', this.clearCompletions);\n\n          // tear down the popup\n          this.clearCompletions();\n        },\n      }),\n\n      props: {\n        decorations: (state: EditorState) => {\n          const pluginState = key.getState(state);\n          return pluginState?.result?.decorations;\n        },\n\n        handleDOMEvents: {\n          keydown: (view: EditorView, event: Event) => {\n            const kbEvent = event as KeyboardEvent;\n\n            let handled = false;\n\n            // determine meaning of keys based on orientation\n            const forwardKey = this.horizontal ? 'ArrowRight' : 'ArrowDown';\n            const backwardKey = this.horizontal ? 'ArrowLeft' : 'ArrowUp';\n\n            if (this.completionsActive()) {\n              switch (kbEvent.key) {\n                case 'Escape':\n                  this.dismissCompletions();\n                  handled = true;\n                  break;\n                case 'Enter':\n                case 'Tab':\n                  this.insertCompletion(view, this.selectedIndex);\n                  handled = true;\n                  break;\n                case backwardKey:\n                  this.selectedIndex = Math.max(this.selectedIndex - 1, 0);\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n                case forwardKey:\n                  this.selectedIndex = Math.min(this.selectedIndex + 1, this.completions.length - 1);\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n                case 'PageUp':\n                  this.selectedIndex = Math.max(this.selectedIndex - this.completionPageSize(), 0);\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n                case 'PageDown':\n                  this.selectedIndex = Math.min(\n                    this.selectedIndex + this.completionPageSize(),\n                    this.completions.length - 1,\n                  );\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n                case 'End':\n                  this.selectedIndex = this.completions.length - 1;\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n                case 'Home':\n                  this.selectedIndex = 0;\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n              }\n            }\n\n            // supress event if we handled it\n            if (handled) {\n              event.preventDefault();\n              event.stopPropagation();\n            }\n\n            // return status\n            return handled;\n          },\n        },\n      },\n    });\n\n    // capture reference to ui\n    this.ui = ui;\n\n    // hide completions when we scroll or the focus changes\n    this.clearCompletions = this.clearCompletions.bind(this);\n    this.scrollUnsubscribe = events.subscribe(ScrollEvent, this.clearCompletions);\n    window.document.addEventListener('focusin', this.clearCompletions);\n  }\n\n  private updateCompletions(view: EditorView, resetSelection: boolean) {\n    const state = key.getState(view.state);\n\n    if (state?.handler && state?.result) {\n      // track the request version to invalidate the result if an\n      // update happens after it goes into flight\n      const requestVersion = this.version;\n\n      // make an async request for the completions, update allCompletions,\n      // and then apply any filter we have (allows the completer to just return\n      // everything from the aysnc query and fall back to the filter for refinement)\n      const requestAllCompletions = async () => {\n        // fetch completions\n        const completions = await state.result!.completions(view.state, { isPaste: state.isPaste === true });\n\n        // if we don't have a handler or result then return\n        if (!state.handler || !state.result) {\n          return;\n        }\n\n        // function to update completions\n        const updateCompletions = (updatedCompletions: any[]) => {\n          // save completions\n          this.setAllCompletions(updatedCompletions, !!state.handler?.view.horizontal, resetSelection);\n\n          // display if the request still maps to the current state\n          if (state.handler && state.result && this.version === requestVersion) {\n            // if there is a filter then call it and update displayed completions\n            const displayedCompletions = state.handler.filter\n              ? state.handler.filter(this.allCompletions, view.state, state.result.token)\n              : null;\n            if (displayedCompletions) {\n              this.setDisplayedCompletions(displayedCompletions, !!state.handler.view.horizontal, resetSelection);\n            }\n\n            this.renderCompletions(view);\n          }\n        };\n\n        // if we got an array, just set it. if we got a stream then poll it for it's update\n        if (Array.isArray(completions)) {\n          updateCompletions(completions);\n        } else {\n          const completionStream = completions as CompletionsStream;\n          updateCompletions(completionStream.items);\n          const pollingInterval = setInterval(() => {\n            // if the document has been updated then invalidate\n            if (this.version !== requestVersion) {\n              clearInterval(pollingInterval);\n            } else {\n              // otherwise check the stream\n              const result = completionStream.stream();\n              if (result) {\n                clearInterval(pollingInterval);\n                updateCompletions(result);\n              }\n            }\n          }, 300);\n        }\n      };\n\n      // first see if we can do this exclusively via filter\n      if (state.prevToken && state.handler.filter) {\n        this.completionQueue.enqueue(async () => {\n          // display if the request still maps to the current state\n          if (state.handler && state.result && this.version === requestVersion) {\n            const filteredCompletions = state.handler.filter!(\n              this.allCompletions,\n              view.state,\n              state.result.token,\n              state.prevToken,\n            );\n\n            // got a hit from the filter!\n            if (filteredCompletions) {\n              this.setDisplayedCompletions(filteredCompletions, !!state.handler.view.horizontal, resetSelection);\n              this.renderCompletions(view);\n\n              // couldn't use the filter, do a full request for all completions (so long as we aren't\n              // already waiting on a strea,)\n            } else {\n              await requestAllCompletions();\n            }\n          }\n        });\n      } else {\n        // no prevToken or no filter for this handler, request everything\n        this.completionQueue.enqueue(requestAllCompletions);\n      }\n    } else {\n      // no handler/result for this document state\n      this.clearCompletions();\n    }\n  }\n\n  private renderCompletions(view: EditorView) {\n    const state = key.getState(view.state);\n\n    if (state && state.handler && (this.completions.length > 0 || !state.handler.view.hideNoResults)) {\n      const props = {\n        handler: state.handler!,\n        pos: state.result!.pos + (state.result!.offset || 0),\n        completions: this.completions,\n        selectedIndex: this.selectedIndex,\n        noResults: this.ui.context.translateText('No Results'),\n        onClick: (index: number) => {\n          this.insertCompletion(view, index);\n        },\n        onHover: (index: number) => {\n          this.selectedIndex = index;\n          this.renderCompletions(view);\n        },\n        ui: this.ui,\n      };\n\n      // create the completion popup if we need to\n      if (this.completionPopup === null) {\n        this.completionPopup = createCompletionPopup();\n        window.document.body.appendChild(this.completionPopup);\n      }\n\n      // render\n      renderCompletionPopup(view, props, this.completionPopup);\n    } else {\n      // hide\n      this.hideCompletionPopup();\n    }\n  }\n\n  private async insertCompletion(view: EditorView, index: number) {\n    // default index if not specified\n    index = index || this.selectedIndex;\n\n    const state = key.getState(view.state);\n    if (state && state.handler) {\n      // perform replacement\n      const result = state.result!;\n\n      // check low level handler first\n      if (state.handler.replace) {\n        // execute replace\n        await state.handler.replace(view, result.pos, this.completions[index]);\n\n        // use higher level handler\n      } else if (state.handler.replacement) {\n        // get replacement from handler\n        const replacement = state.handler.replacement(view.state.schema, this.completions[index]);\n        if (replacement) {\n          const tr = view.state.tr;\n          performCompletionReplacement(tr, result.pos, replacement);\n          view.dispatch(tr);\n        }\n      }\n      // set focus\n      view.focus();\n    }\n    this.clearCompletions();\n  }\n\n  // explicit user dismiss of completion (e.g. Esc key)\n  private async dismissCompletions() {\n    // call lower-level replace on any active handler (w/ null). this gives\n    // them a chance to dismiss any artifacts that were explicitly inserted\n    // to trigger the handler (e.g. a cmd+/ for omni-insert)\n    if (this.view) {\n      const state = key.getState(this.view.state);\n      if (state?.result && state.handler) {\n        if (state.handler.replace) {\n          await state.handler.replace(this.view, state.result.pos, null);\n        } else if (state.handler.replacement) {\n          state.handler.replacement(this.view.state.schema, null);\n        }\n      }\n    }\n\n    this.clearCompletions();\n  }\n\n  private clearCompletions() {\n    this.setAllCompletions([], false, true);\n    this.hideCompletionPopup();\n  }\n\n  private hideCompletionPopup() {\n    if (this.completionPopup) {\n      destroyCompletionPopup(this.completionPopup);\n      this.completionPopup = null;\n    }\n  }\n\n  private completionsActive() {\n    return !!this.completionPopup;\n  }\n\n  private setAllCompletions(completions: any[], horizontal: boolean, resetSelection: boolean) {\n    this.allCompletions = completions;\n    this.setDisplayedCompletions(completions, horizontal, resetSelection);\n  }\n\n  private setDisplayedCompletions(completions: any[], horizontal: boolean, resetSelection: boolean) {\n    this.completions = completions;\n    this.horizontal = !!horizontal;\n\n    // reset selection if requested or if the current index exceeds the # of completions\n    if (resetSelection || this.selectedIndex > this.completions.length - 1) {\n      this.selectedIndex = 0;\n    }\n  }\n\n  private completionPageSize() {\n    if (this.view) {\n      const state = key.getState(this.view.state);\n      return state?.handler?.view.maxVisible || kCompletionDefaultMaxVisible;\n    } else {\n      return kCompletionDefaultMaxVisible;\n    }\n  }\n}\n\n// extract the text before the cursor, dealing with block separators and\n// non-text leaf chracters (this is based on code in prosemirror-inputrules)\nfunction completionTextBeforeCursor(selection: Selection, maxLength = 500) {\n  const { $head } = selection;\n  return $head.parent.textBetween(\n    Math.max(0, $head.parentOffset - maxLength), // start\n    $head.parentOffset, // end\n    undefined, // block separator\n    '\\ufffc', // leaf char\n  );\n}\n","/*\n * completion-popup.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport React, { useEffect } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport zenscroll from 'zenscroll';\n\nimport { applyStyles } from '../../api/css';\nimport {\n  CompletionHandler,\n  kCompletionDefaultItemHeight,\n  kCompletionDefaultMaxVisible,\n  kCompletionDefaultWidth,\n} from '../../api/completion';\nimport { Popup } from '../../api/widgets/popup';\n\nimport './completion-popup.css';\nimport { EditorUI } from '../../api/ui';\n\nconst kNoResultsHeight = 22;\n\nexport interface CompletionListProps {\n  handler: CompletionHandler;\n  pos: number;\n  completions: any[];\n  selectedIndex: number;\n  noResults: string;\n  onHover: (index: number) => void;\n  onClick: (index: number) => void;\n  ui: EditorUI;\n}\n\nexport function createCompletionPopup(): HTMLElement {\n  const popup = window.document.createElement('div');\n  popup.style.position = 'absolute';\n  popup.style.zIndex = '900';\n  return popup;\n}\n\nexport function renderCompletionPopup(view: EditorView, props: CompletionListProps, popup: HTMLElement) {\n  // position popup\n  const size = completionPopupSize(props);\n  const positionStyles = completionPopupPositionStyles(view, props.pos, size.width, size.height);\n  applyStyles(popup, [], positionStyles);\n\n  // render popup\n  ReactDOM.render(<CompletionPopup {...props} />, popup);\n}\n\nexport function destroyCompletionPopup(popup: HTMLElement) {\n  ReactDOM.unmountComponentAtNode(popup);\n  popup.remove();\n}\n\nconst CompletionPopup: React.FC<CompletionListProps> = props => {\n  // main completion popup + class + dark mode if appropriate\n  const classes = ['pm-completion-popup'].concat(props.ui.prefs.darkMode() ? ['pm-dark-mode'] : []);\n  return (\n    <Popup classes={classes}>\n      <CompletionList {...props} />\n    </Popup>\n  );\n};\n\nconst CompletionList: React.FC<CompletionListProps> = props => {\n  const size = completionPopupSize(props);\n  const itemHeight = props.handler.view.height || kCompletionDefaultItemHeight;\n\n  // keep selected index in view\n  const containerRef = React.useRef<HTMLDivElement>(null);\n  useEffect(() => {\n    const containerEl = containerRef.current;\n    if (containerEl) {\n      const rows = containerEl.getElementsByClassName('pm-completion-list-item-row');\n      const scrollToRow = rows.item(props.selectedIndex);\n      if (scrollToRow) {\n        const scroller = zenscroll.createScroller(containerEl);\n        scroller.intoView(scrollToRow as HTMLElement);\n      }\n    }\n  }, [props.selectedIndex]);\n\n  // item event handler\n  const itemEventHandler = (index: number, handler: (index: number) => void) => {\n    return (event: React.MouseEvent) => {\n      event.preventDefault();\n      event.stopPropagation();\n      handler(index);\n    };\n  };\n\n  // completion source based on orientation\n  const completions = props.handler.view.horizontal ? horizontalCompletions : verticalCompletions;\n\n  const classes = ['pm-completion-list'].concat(props.handler.view.horizontal ? ['pm-completion-list-horizontal'] : []);\n\n  return (\n    <div\n      ref={containerRef}\n      className={classes.join(' ')}\n      style={{ width: size.width + 'px', height: size.height + 'px' }}\n    >\n      <table>\n        {completionsHeader(props.handler, props.completions.length, props)}\n        <tbody>\n          {completions(props, itemHeight, itemEventHandler)}\n          {props.completions.length === 0 ? completionsNoResults(props) : null}\n        </tbody>\n      </table>\n    </div>\n  );\n};\n\nfunction completionsHeader(handler: CompletionHandler, completionCount: number, props: CompletionListProps) {\n  if (handler.view.header) {\n    const completionHeader = handler.view.header ? handler.view.header() : undefined;\n    const headerProps = { message: completionHeader?.message, ...props };\n\n    if (completionHeader) {\n      const header = React.createElement(completionHeader.component, headerProps);\n      return (\n        <thead>\n          <tr>\n            <th\n              style={{ lineHeight: completionHeader.height + 'px' }}\n              colSpan={props.handler.view.horizontal ? completionCount : undefined}\n            >\n              {header}\n            </th>\n          </tr>\n        </thead>\n      );\n    } else {\n      return null;\n    }\n  } else {\n    return null;\n  }\n}\n\ntype ItemEventHandler = (index: number, handler: (index: number) => void) => (event: React.MouseEvent) => void;\n\nfunction verticalCompletions(props: CompletionListProps, itemHeight: number, itemEventHandler: ItemEventHandler) {\n  return props.completions.map((completion, index) => {\n    const { key, cell } = completionItemCell(props, completion, index);\n    return (\n      <tr\n        key={key}\n        style={{ lineHeight: itemHeight + 'px' }}\n        className={'pm-completion-list-item-row'}\n        onClick={itemEventHandler(index, props.onClick)}\n        onMouseMove={itemEventHandler(index, props.onHover)}\n      >\n        {cell}\n      </tr>\n    );\n  });\n}\n\nfunction horizontalCompletions(props: CompletionListProps, itemHeight: number, itemEventHandler: ItemEventHandler) {\n  const cellWidths = horizontalCellWidths(props);\n  return (\n    <tr style={{ lineHeight: itemHeight + 'px' }}>\n      {props.completions.map((completion, index) => {\n        const { cell } = completionItemCell(props, completion, index, cellWidths[index], itemEventHandler);\n        return cell;\n      })}\n    </tr>\n  );\n}\n\nfunction completionItemCell(\n  props: CompletionListProps,\n  completion: any,\n  index: number,\n  width?: number,\n  itemEventHandler?: ItemEventHandler,\n) {\n  // need to provide key for both wrapper and item\n  // https://stackoverflow.com/questions/28329382/understanding-unique-keys-for-array-children-in-react-js#answer-28329550\n  const key = props.handler.view.key(completion);\n  const item = React.createElement(props.handler.view.component, { ...completion, key });\n  const className = 'pm-completion-list-item' + (index === props.selectedIndex ? ' pm-selected-list-item' : '');\n  const cell = (\n    <td\n      key={key}\n      style={width ? { width: width + 'px' } : undefined}\n      className={className}\n      onClick={itemEventHandler ? itemEventHandler(index, props.onClick) : undefined}\n      onMouseMove={itemEventHandler ? itemEventHandler(index, props.onHover) : undefined}\n    >\n      {item}\n    </td>\n  );\n  return { key, cell };\n}\n\nfunction completionsNoResults(props: CompletionListProps) {\n  return (\n    <tr\n      className={'pm-completion-no-results pm-placeholder-text-color'}\n      style={{ lineHeight: kNoResultsHeight + 'px' }}\n    >\n      <td>{props.noResults}</td>\n    </tr>\n  );\n}\n\nfunction completionPopupSize(props: CompletionListProps) {\n  // kicker for list margins/border/etc\n  const kCompletionsChrome = 8;\n\n  // get view props (apply defaults)\n  let { height: itemHeight = kCompletionDefaultItemHeight } = props.handler.view;\n  const { maxVisible = kCompletionDefaultMaxVisible, width = kCompletionDefaultWidth } = props.handler.view;\n\n  // add 2px for the border to item heights\n  const kBorderPad = 2;\n  itemHeight += kBorderPad;\n\n  // compute header height\n  let headerHeight = 0;\n  if (props.handler.view.header) {\n    const completionHeader = props.handler.view.header();\n    if (completionHeader) {\n      headerHeight = completionHeader.height + kBorderPad;\n    }\n  }\n\n  // complete based on horizontal vs. vertical\n  if (props.handler.view.horizontal) {\n    // horizontal mode can provide explicit item widths\n    const kTablePadding = 8;\n    const kCellPadding = 8;\n    const kCellBorders = 2;\n    const totalWidth =\n      horizontalCellWidths(props).reduce((total, current) => {\n        return total + (current + kCellPadding + kCellBorders);\n      }, 0) + kTablePadding;\n\n    return {\n      width: totalWidth,\n      height: headerHeight + itemHeight + kCompletionsChrome,\n    };\n  } else {\n    // compute height (subject it to a minimum require to display 'no results')\n    const height =\n      headerHeight +\n      kCompletionsChrome +\n      Math.max(itemHeight * Math.min(maxVisible, props.completions.length), kNoResultsHeight);\n\n    // return\n    return { width, height };\n  }\n}\n\nfunction horizontalCellWidths(props: CompletionListProps) {\n  const { width = kCompletionDefaultWidth } = props.handler.view;\n  return props.completions.map((_completion, index) => {\n    if (props.handler.view.horizontalItemWidths) {\n      return props.handler.view.horizontalItemWidths[index] || width;\n    } else {\n      return width;\n    }\n  });\n}\n\nfunction completionPopupPositionStyles(view: EditorView, pos: number, width: number, height: number) {\n  // some constants\n  const kMinimumPaddingToEdge = 5;\n  const kCompletionsVerticalPadding = 5;\n\n  // default position\n  const selectionCoords = view.coordsAtPos(pos);\n\n  let top = selectionCoords.bottom + kCompletionsVerticalPadding;\n  let left = selectionCoords.left;\n\n  // see if we need to be above\n  if (top + height + kMinimumPaddingToEdge >= window.innerHeight) {\n    top = selectionCoords.top - height - kCompletionsVerticalPadding;\n  }\n\n  // see if we need to be to the left (use cursor as pos in this case)\n  if (left + width + kMinimumPaddingToEdge >= window.innerWidth) {\n    const cursorCoords = view.coordsAtPos(view.state.selection.head);\n    left = cursorCoords.right - width;\n  }\n\n  return {\n    left: left + 'px',\n    top: top + 'px',\n  };\n}\n","/*\n * popup.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nexport type PopupProps = WidgetProps;\n\nexport const Popup: React.FC<PopupProps> = props => {\n  const className = ['pm-popup', 'pm-text-color', 'pm-proportional-font', 'pm-pane-border-color', 'pm-background-color']\n    .concat(props.classes || [])\n    .join(' ');\n\n  const style: React.CSSProperties = {\n    ...props.style,\n    position: 'absolute',\n    zIndex: 10,\n  };\n\n  return (\n    <div className={className} style={style} contentEditable={false} suppressContentEditableWarning={true}>\n      {props.children}\n    </div>\n  );\n};\n","/*\n * promise.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\ninterface PendingPromise<T> {\n  promise: () => Promise<T>;\n  resolve: (result: T) => void;\n  reject: (reason: any) => void;\n}\n\nexport class PromiseQueue<T = unknown> {\n  private queue = new Array<PendingPromise<T>>();\n  private running = false;\n\n  public enqueue(promise: () => Promise<T>) {\n    return new Promise<T>((resolve, reject) => {\n      this.queue.push({\n        promise,\n        resolve,\n        reject,\n      });\n      this.dequeue();\n    });\n  }\n\n  private dequeue() {\n    if (this.running) {\n      return false;\n    }\n    const item = this.queue.shift();\n    if (!item) {\n      return false;\n    }\n    try {\n      this.running = true;\n      item\n        .promise()\n        .then(value => {\n          this.running = false;\n          item.resolve(value);\n          this.dequeue();\n        })\n        .catch(err => {\n          this.running = false;\n          item.reject(err);\n          this.dequeue();\n        });\n    } catch (err) {\n      this.running = false;\n      item.reject(err);\n      this.dequeue();\n    }\n    return true;\n  }\n}\n","/*\n * spelling-doc.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView, DecorationSet, Decoration } from 'prosemirror-view';\nimport { TextSelection, Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocMark } from '../../api/mark';\nimport {\n  EditorWordRange,\n  EditorSpellingDoc,\n  EditorWordSource,\n  EditorAnchor,\n  EditorRect,\n  EditorUISpelling,\n} from '../../api/spelling';\nimport { scrollIntoView } from '../../api/scroll';\n\nimport { excludedMarks, getWords, spellcheckerWord } from './spelling';\n\n// get the document interface required by interactive spellchecking\n\nexport function getSpellingDoc(\n  view: EditorView,\n  marks: readonly PandocMark[],\n  spelling: EditorUISpelling,\n): EditorSpellingDoc {\n  // alias schema\n  const schema = view.state.schema;\n\n  // intialize marks we don't want to check\n  const excluded = excludedMarks(schema, marks);\n\n  // check begin\n  spellingDocPlugin(view.state).onCheckBegin();\n\n  return {\n    getWords: (start: number, end: number): EditorWordSource => {\n      return getWords(view.state, start, end, spelling, excluded);\n    },\n\n    createAnchor: (pos: number): EditorAnchor => {\n      return spellingDocPlugin(view.state).createAnchor(pos);\n    },\n\n    shouldCheck: (_wordRange: EditorWordRange): boolean => {\n      return true;\n    },\n\n    setSelection: (wordRange: EditorWordRange) => {\n      const tr = view.state.tr;\n      tr.setSelection(TextSelection.create(tr.doc, wordRange.start, wordRange.end));\n      view.dispatch(tr);\n    },\n\n    getText: (wordRange: EditorWordRange): string => {\n      const word = view.state.doc.textBetween(wordRange.start, wordRange.end);\n      return spellcheckerWord(word);\n    },\n\n    replaceSelection: (text: string) => {\n      const tr = view.state.tr;\n      const selectionMarks = tr.selection.$from.marks();\n      tr.replaceSelectionWith(view.state.schema.text(text, selectionMarks), false);\n      view.dispatch(tr);\n    },\n\n    getCursorPosition: (): number => {\n      return view.state.selection.to;\n    },\n\n    getSelectionStart: (): number => {\n      return view.state.selection.from;\n    },\n\n    getSelectionEnd: (): number => {\n      return view.state.selection.to;\n    },\n\n    getCursorBounds: (): EditorRect => {\n      const fromCoords = view.coordsAtPos(view.state.selection.from);\n      const toCoords = view.coordsAtPos(view.state.selection.to);\n\n      return {\n        x: Math.min(fromCoords.left, toCoords.left),\n        y: fromCoords.top,\n        width: Math.abs(fromCoords.left - toCoords.left),\n        height: toCoords.bottom - fromCoords.top,\n      };\n    },\n\n    moveCursorNearTop: () => {\n      scrollIntoView(view, view.state.selection.from, false, undefined, 100);\n    },\n\n    dispose: () => {\n      spellingDocPlugin(view.state).onCheckEnd(view);\n    },\n  };\n}\n\n// companion plugin for SpellingDoc provided above (shows 'fake' selection during\n// interactive spell check dialog and maintains anchor position(s) across\n// transactions that occur while the dialog/doc is active)\n\nconst spellingDocKey = new PluginKey<DecorationSet>('spelling-doc-plugin');\n\nfunction spellingDocPlugin(state: EditorState) {\n  return spellingDocKey.get(state) as SpellingDocPlugin;\n}\n\nexport class SpellingDocPlugin extends Plugin<DecorationSet> {\n  private checking = false;\n  private anchors: SpellingAnchor[] = [];\n\n  constructor() {\n    super({\n      key: spellingDocKey,\n      state: {\n        init: () => {\n          return DecorationSet.empty;\n        },\n        apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n          if (this.checking) {\n            // map anchors\n            this.anchors.forEach(anchor => {\n              anchor.setPosition(tr.mapping.map(anchor.getPosition()));\n            });\n\n            // show selection\n            if (!tr.selection.empty) {\n              return DecorationSet.create(tr.doc, [\n                Decoration.inline(tr.selection.from, tr.selection.to, { class: 'pm-selected-text' }),\n              ]);\n            }\n          }\n\n          return DecorationSet.empty;\n        },\n      },\n      props: {\n        decorations: (state: EditorState) => {\n          return spellingDocKey.getState(state);\n        },\n      },\n    });\n  }\n\n  public createAnchor(pos: number) {\n    const anchor = new SpellingAnchor(pos);\n    this.anchors.push(anchor);\n    return anchor;\n  }\n\n  public onCheckBegin() {\n    this.checking = true;\n  }\n\n  public onCheckEnd(view: EditorView) {\n    this.checking = false;\n    this.anchors = [];\n\n    if (!view.state.selection.empty) {\n      const tr = view.state.tr;\n      setTextSelection(tr.selection.to)(tr);\n      view.dispatch(tr);\n    }\n  }\n}\n\nclass SpellingAnchor implements EditorAnchor {\n  private pos = 0;\n  constructor(pos: number) {\n    this.pos = pos;\n  }\n  public getPosition() {\n    return this.pos;\n  }\n  public setPosition(pos: number) {\n    this.pos = pos;\n  }\n}\n\nconst extension = () => {\n  return {\n    plugins: () => {\n      return [new SpellingDocPlugin()];\n    },\n  };\n};\n\nexport default extension;\n","/*\n * spelling.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { MarkType, Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\n\nimport { EditorWordSource, EditorWordRange, EditorUISpelling, kCharClassNonWord } from '../../api/spelling';\nimport { PandocMark, getMarkRange } from '../../api/mark';\n\nexport const beginDocPos = () => 1;\nexport const endDocPos = (doc: ProsemirrorNode) => doc.nodeSize - 2;\n\nexport function getWords(\n  state: EditorState,\n  start: number,\n  end: number,\n  spelling: EditorUISpelling,\n  excluded: MarkType[],\n): EditorWordSource {\n  // provide defaults\n  if (start === -1) {\n    start = beginDocPos();\n  }\n  if (end === -1) {\n    end = endDocPos(state.doc);\n  }\n\n  // enlarge range to begin/end\n  const beginPos = findBeginWord(state, start, spelling.classifyCharacter);\n  const endPos = findEndWord(state, end, spelling.classifyCharacter);\n\n  const words: EditorWordRange[] = [];\n  let currentPos = beginPos;\n  while (currentPos <= endPos) {\n    // advance until we find a word\n    currentPos = advanceToWord(state, currentPos, spelling.classifyCharacter);\n    if (currentPos >= endPos) {\n      break;\n    }\n\n    // find end of word\n    const endWordPos = findEndWord(state, currentPos, spelling.classifyCharacter);\n    if (endWordPos === currentPos) {\n      break;\n    }\n\n    // add word if it doesn't have an excluded type\n    if (!excludeWord(state.doc, currentPos, endWordPos, excluded)) {\n      const wordText = state.doc.textBetween(currentPos, endWordPos);\n      words.push(\n        ...spelling.breakWords(wordText).map(wordRange => {\n          return {\n            start: currentPos + wordRange.start,\n            end: currentPos + wordRange.end,\n          };\n        }),\n      );\n    }\n\n    // next word\n    currentPos = endWordPos;\n  }\n\n  // return iterator over word range\n  return {\n    hasNext: () => {\n      return words.length > 0;\n    },\n    next: () => {\n      if (words.length > 0) {\n        return words.shift()!;\n      } else {\n        return null;\n      }\n    },\n  };\n}\n\nfunction excludeWord(doc: ProsemirrorNode, from: number, to: number, excluded: MarkType[]) {\n  // does it have one of our excluded mark types?\n  if (excluded.some(markType => doc.rangeHasMark(from, to, markType))) {\n    return true;\n  }\n\n  // it is in a link mark where the link text is a url?\n  const schema = doc.type.schema;\n  if (schema.marks.link && doc.rangeHasMark(from, to, schema.marks.link)) {\n    const range = getMarkRange(doc.resolve(from), schema.marks.link);\n    if (range && /^[a-z]+:\\/\\/.*$/.test(doc.textBetween(range.from, range.to))) {\n      return true;\n    }\n  }\n\n  // don't exclude\n  return false;\n}\n\nexport function advanceToWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n  while (pos < endDocPos(state.doc)) {\n    const nextChar = charAt(state.doc, pos);\n    if (classifier(nextChar) !== kCharClassNonWord) {\n      break;\n    } else {\n      pos++;\n    }\n  }\n  return pos;\n}\n\nexport function findBeginWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n  // scan backwards until a non-word character is encountered\n  while (pos >= beginDocPos()) {\n    const prevChar = charAt(state.doc, pos - 1);\n    if (classifier(prevChar) === kCharClassNonWord) {\n      break;\n    } else {\n      pos--;\n    }\n  }\n  // return the position\n  return pos;\n}\n\nexport function findEndWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n  // scan forwards until a non-word character is encountered\n  while (pos < endDocPos(state.doc)) {\n    const nextChar = charAt(state.doc, pos);\n    if (classifier(nextChar) === kCharClassNonWord) {\n      break;\n    } else {\n      pos++;\n    }\n  }\n\n  // return the position\n  return pos;\n}\n\n// get the chracter code at the specified position, returning character code 32 (a space)\n// for begin/end of document, block boundaries, and non-text leaf nodes\nexport function charAt(doc: ProsemirrorNode, pos: number) {\n  if (pos < beginDocPos() || pos >= endDocPos(doc)) {\n    return 32; // space for doc boundary\n  } else {\n    return (doc.textBetween(pos, pos + 1, ' ', ' ') || ' ').charCodeAt(0);\n  }\n}\n\nexport function excludedMarks(schema: Schema, marks: readonly PandocMark[]): MarkType[] {\n  return marks.filter(mark => mark.noSpelling).map(mark => schema.marks[mark.name]);\n}\n\nexport function spellcheckerWord(word: string) {\n  return word.replace(/’/g, \"'\");\n}\n","/*\n * spelling.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kCharClassWord = 0;\nexport const kCharClassBoundary = 1;\nexport const kCharClassNonWord = 2;\n\nexport interface EditorUISpelling {\n  // realtime interface\n  realtimeEnabled: () => boolean;\n  checkWord: (word: string) => boolean;\n  suggestionList: (word: string) => string[];\n\n  // dictionary\n  isWordIgnored: (word: string) => boolean;\n  ignoreWord: (word: string) => void;\n  unignoreWord: (word: string) => void;\n  addToDictionary: (word: string) => void;\n\n  // word breaking\n  breakWords: (text: string) => EditorWordRange[];\n  classifyCharacter: (ch: number) => number;\n}\n\nexport interface EditorAnchor {\n  getPosition: () => number;\n}\n\nexport interface EditorRect {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\nexport interface EditorWordRange {\n  start: number;\n  end: number;\n}\n\nexport interface EditorWordSource {\n  hasNext: () => boolean;\n  next: () => EditorWordRange | null;\n}\n\nexport interface EditorSpellingDoc {\n  getWords: (start: number, end: number) => EditorWordSource;\n\n  createAnchor: (pos: number) => EditorAnchor;\n\n  shouldCheck: (wordRange: EditorWordRange) => boolean;\n  setSelection: (wordRange: EditorWordRange) => void;\n  getText: (wordRange: EditorWordRange) => string;\n\n  getCursorPosition: () => number;\n  replaceSelection: (text: string) => void;\n  getSelectionStart: () => number;\n  getSelectionEnd: () => number;\n\n  getCursorBounds: () => EditorRect;\n  moveCursorNearTop: () => void;\n\n  dispose: () => void;\n}\n","/*\n * spelling-realtime.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, MarkType } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, EditorView, Decoration, DecorationAttrs } from 'prosemirror-view';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\nimport { ChangeSet } from 'prosemirror-changeset';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { FocusEvent } from '../../api/event-types';\nimport { PandocMark } from '../../api/mark';\nimport { EditorUISpelling, kCharClassWord } from '../../api/spelling';\nimport { EditorEvents } from '../../api/events';\nimport { kAddToHistoryTransaction } from '../../api/transaction';\nimport { EditorUI, EditorMenuItem } from '../../api/ui';\n\nimport { excludedMarks, getWords, spellcheckerWord, findBeginWord, findEndWord, charAt } from './spelling';\n\nconst kUpdateSpellingTransaction = 'updateSpelling';\nconst kInvalidateSpellingWordTransaction = 'invalidateSpellingWord';\nconst kSpellingErrorClass = 'pm-spelling-error';\n\nconst realtimeSpellingKey = new PluginKey<DecorationSet>('spelling-realtime-plugin');\n\nexport function realtimeSpellingPlugin(\n  schema: Schema,\n  marks: readonly PandocMark[],\n  ui: EditorUI,\n  events: EditorEvents,\n) {\n  return new RealtimeSpellingPlugin(excludedMarks(schema, marks), ui, events);\n}\n\nexport function invalidateAllWords(view: EditorView) {\n  updateSpelling(view);\n}\n\nexport function invalidateWord(view: EditorView, word: string) {\n  const tr = view.state.tr;\n  tr.setMeta(kInvalidateSpellingWordTransaction, word);\n  tr.setMeta(kAddToHistoryTransaction, false);\n  view.dispatch(tr);\n}\n\nclass RealtimeSpellingPlugin extends Plugin<DecorationSet> {\n  // track whether we've ever had the focus (don't do any spelling operaitons until then)\n  private hasBeenFocused = true;\n\n  private view: EditorView | null = null;\n  private readonly ui: EditorUI;\n\n  constructor(excluded: MarkType[], ui: EditorUI, events: EditorEvents) {\n    super({\n      key: realtimeSpellingKey,\n      view: (view: EditorView) => {\n        this.view = view;\n        return {};\n      },\n      state: {\n        init: (_config, state: EditorState) => {\n          return DecorationSet.empty;\n        },\n        apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n          // if we somehow manage to get focus w/o our FocusEvent (below) being called then also\n          // flip the hasBeenFocused bit here\n          if (this.view?.hasFocus()) {\n            this.hasBeenFocused = true;\n          }\n\n          // don't continue if either realtime spelling is disabled or we have never been focused\n          if (!this.ui.spelling.realtimeEnabled() || !this.hasBeenFocused) {\n            return DecorationSet.empty;\n          }\n\n          if (tr.getMeta(kUpdateSpellingTransaction)) {\n            // explicit update request invalidates any existing decorations (this can happen when\n            // we get focus for the very firs time or when the main or secondary dictionaries change)\n            return DecorationSet.create(newState.doc, spellingDecorations(newState, ui.spelling, excluded));\n          } else if (tr.getMeta(kInvalidateSpellingWordTransaction)) {\n            // for word invalidations we search through the decorations and remove words that match\n            const word = tr.getMeta(kInvalidateSpellingWordTransaction) as string;\n\n            // find decorations that have this word and remove them\n            const wordDecos = old.find(undefined, undefined, spec => spec.word === word);\n\n            // return decorators w/ those words removed\n            return old.remove(wordDecos);\n          } else if (tr.docChanged) {\n            // perform an incremental update of spelling decorations (invalidate and re-scan\n            // for decorations in changed ranges)\n\n            // start w/ previous state\n            let decos = old;\n\n            // create change set from transaction\n            let changeSet = ChangeSet.create(oldState.doc);\n            changeSet = changeSet.addSteps(newState.doc, tr.mapping.maps);\n\n            // collect ranges that had mark changes\n            const markRanges: Array<{ from: number; to: number }> = [];\n            for (const step of tr.steps) {\n              if (step instanceof AddMarkStep || step instanceof RemoveMarkStep) {\n                const markStep = step as any;\n                markRanges.push({ from: markStep.from, to: markStep.to });\n              }\n            }\n\n            // remove ranges = mark ranges + deleted ranges\n            const removeRanges = markRanges.concat(\n              changeSet.changes.map(change => ({ from: change.fromA, to: change.toA })),\n            );\n\n            // remove decorations from deleted ranges (expanding ranges to word boundaries)\n            for (const range of removeRanges) {\n              const fromPos = findBeginWord(oldState, range.from, ui.spelling.classifyCharacter);\n              const toPos = findEndWord(oldState, range.to, ui.spelling.classifyCharacter);\n              decos = decos.remove(decos.find(fromPos, toPos));\n            }\n\n            // map decoration positions to new document\n            decos = decos.map(tr.mapping, tr.doc);\n\n            // add ranges = mark ranges + inserted ranges\n            const addRanges = markRanges.concat(\n              changeSet.changes.map(change => ({ from: change.fromB, to: change.toB })),\n            );\n\n            // scan inserted ranges for spelling decorations (don't need to find word boundaries\n            // b/c spellingDecorations already does that)\n            for (const range of addRanges) {\n              decos = decos.add(\n                tr.doc,\n                spellingDecorations(newState, ui.spelling, excluded, true, range.from, range.to),\n              );\n            }\n\n            // return decorators\n            return decos;\n          } else if (tr.selectionSet) {\n            // if we had previously suppressed a decoration due to typing at the cursor, restore it\n            // whenever the selection changes w/o the doc changing\n\n            // start with previous state\n            let decos = old;\n\n            // find any special 'at cursor' errors\n            const cursorDecos = decos.find(undefined, undefined, spec => !!spec.cursor);\n            if (cursorDecos.length) {\n              // there will only be one cursor, capture it's position then remove it\n              const word = cursorDecos[0].spec.word as string;\n              const { from, to } = cursorDecos[0];\n              decos = decos.remove(cursorDecos);\n\n              // add it back in as a real spelling error\n              decos = decos.add(tr.doc, [Decoration.inline(from, to, { class: kSpellingErrorClass }, { word })]);\n            }\n\n            // return decorators\n            return decos;\n          } else {\n            // no content or selection change, return old w/o mapping\n            return old;\n          }\n        },\n      },\n      props: {\n        decorations: (state: EditorState) => {\n          return realtimeSpellingKey.getState(state);\n        },\n        handleDOMEvents: {\n          contextmenu: spellingSuggestionContextMenuHandler(ui),\n        },\n      },\n    });\n\n    // save reference to ui\n    this.ui = ui;\n\n    // trigger update on first focus\n    const focusUnsubscribe = events.subscribe(FocusEvent, () => {\n      if (this.view) {\n        focusUnsubscribe();\n        this.hasBeenFocused = true;\n        updateSpelling(this.view);\n      }\n    });\n  }\n}\n\nfunction spellingDecorations(\n  state: EditorState,\n  spelling: EditorUISpelling,\n  excluded: MarkType[],\n  excludeCursor = false,\n  from = -1,\n  to = -1,\n): Decoration[] {\n  // break words\n  const words = getWords(state, from, to, spelling, excluded);\n\n  // spell check and return decorations for misspellings\n  const decorations: Decoration[] = [];\n  while (words.hasNext()) {\n    const word = words.next()!;\n    const wordText = state.doc.textBetween(word.start, word.end);\n    const wordCheck = spellcheckerWord(wordText);\n    if (!spelling.checkWord(wordCheck)) {\n      const attrs: DecorationAttrs = {};\n      const spec: { [key: string]: any } = {\n        word: wordCheck,\n      };\n      if (excludeCursor && state.selection.head > word.start && state.selection.head <= word.end) {\n        spec.cursor = true;\n      } else {\n        attrs.class = kSpellingErrorClass;\n      }\n      decorations.push(Decoration.inline(word.start, word.end, attrs, spec));\n    }\n  }\n  return decorations;\n}\n\nfunction spellingSuggestionContextMenuHandler(ui: EditorUI) {\n  return (view: EditorView, event: Event) => {\n    if (!ui.display.showContextMenu) {\n      return false;\n    }\n\n    // helper to create a menu action\n    const menuAction = (text: string, action: VoidFunction) => {\n      return {\n        text,\n        exec: () => {\n          action();\n          view.focus();\n        },\n      };\n    };\n\n    // helper to show a context menu and prevetn further event handling\n    const showContextMenu = (menuItems: EditorMenuItem[]) => {\n      // show the menu\n      const { clientX, clientY } = event as MouseEvent;\n      ui.display.showContextMenu!(menuItems, clientX, clientY);\n\n      // prevent default handling\n      event.stopPropagation();\n      event.preventDefault();\n    };\n\n    if (event.target && event.target instanceof Node) {\n      // alias schema\n      const schema = view.state.schema;\n\n      // find the spelling decoration at this position (if any)\n      const pos = view.posAtDOM(event.target, 0);\n      const deco = realtimeSpellingKey.getState(view.state)!.find(pos, pos);\n      if (deco.length) {\n        // get word\n        const { from, to } = deco[0];\n        const word = spellcheckerWord(view.state.doc.textBetween(from, to));\n\n        // get suggetions\n        const kMaxSuggetions = 5;\n        const suggestions = ui.spelling.suggestionList(word);\n\n        // create menu w/ suggestions\n        const menuItems: EditorMenuItem[] = suggestions.slice(0, kMaxSuggetions).map(suggestion => {\n          return {\n            text: suggestion,\n            exec: () => {\n              const tr = view.state.tr;\n              tr.setSelection(TextSelection.create(tr.doc, from, to));\n              const marks = tr.selection.$from.marks();\n              tr.replaceSelectionWith(schema.text(suggestion, marks), false);\n              setTextSelection(from + suggestion.length)(tr);\n              view.dispatch(tr);\n              view.focus();\n            },\n          };\n        });\n        if (menuItems.length) {\n          menuItems.push({ separator: true });\n        }\n\n        menuItems.push(menuAction(ui.context.translateText('Ignore All'), () => ui.spelling.ignoreWord(word)));\n        menuItems.push({ separator: true });\n        menuItems.push(\n          menuAction(ui.context.translateText('Add to Dictionary'), () => ui.spelling.addToDictionary(word)),\n        );\n\n        // show context menu\n        showContextMenu(menuItems);\n        return true;\n      }\n\n      // find the word at this position and see if it's ignored. if so provide an unignore context menu\n      const classify = ui.spelling.classifyCharacter;\n      const mouseEvent = event as MouseEvent;\n      const clickPos = view.posAtCoords({ left: mouseEvent.clientX, top: mouseEvent.clientY });\n      if (clickPos) {\n        const ch = charAt(view.state.doc, clickPos.pos);\n        if (classify(ch) === kCharClassWord) {\n          const from = findBeginWord(view.state, clickPos.pos, classify);\n          const to = findEndWord(view.state, clickPos.pos, classify);\n          const word = spellcheckerWord(view.state.doc.textBetween(from, to));\n          if (ui.spelling.isWordIgnored(word)) {\n            showContextMenu([\n              menuAction(`${ui.context.translateText('Unignore')} \\'${word}\\'`, () => ui.spelling.unignoreWord(word)),\n            ]);\n            return true;\n          }\n        }\n      }\n    }\n\n    return false;\n  };\n}\n\nfunction updateSpelling(view: EditorView) {\n  const tr = view.state.tr;\n  tr.setMeta(kUpdateSpellingTransaction, true);\n  tr.setMeta(kAddToHistoryTransaction, false);\n  view.dispatch(tr);\n}\n","/*\n * pandoc_converter.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport {\n  PandocServer,\n  PandocTokenReader,\n  PandocNodeWriter,\n  PandocMarkWriter,\n  PandocPreprocessorFn,\n  PandocBlockReaderFn,\n  PandocPostprocessorFn,\n  PandocInlineHTMLReaderFn,\n  PandocWriterOptions,\n  PandocTokensFilterFn,\n} from '../api/pandoc';\n\nimport { haveTableCellsWithInlineRcode } from '../api/rmd';\n\nimport { pandocFormatWith, PandocFormat, kGfmFormat, kCommonmarkFormat } from '../api/pandoc_format';\nimport { PandocCapabilities } from '../api/pandoc_capabilities';\nimport { PandocBlockCapsuleFilter, pandocMarkdownWithBlockCapsules } from '../api/pandoc_capsule';\n\nimport { ExtensionManager } from '../editor/editor-extensions';\n\nimport { pandocToProsemirror } from './pandoc_to_prosemirror';\nimport { pandocFromProsemirror } from './pandoc_from_prosemirror';\n\nexport type PandocLineWrapping = 'none' | 'column' | 'sentence';\n\nexport interface PandocToProsemirrorResult {\n  doc: ProsemirrorNode;\n  line_wrapping: PandocLineWrapping;\n  unrecognized: string[];\n  unparsed_meta: { [key: string]: any };\n}\n\nexport class PandocConverter {\n  private readonly schema: Schema;\n  private readonly preprocessors: readonly PandocPreprocessorFn[];\n  private readonly postprocessors: readonly PandocPostprocessorFn[];\n  private readonly readers: readonly PandocTokenReader[];\n  private readonly tokensFilters: readonly PandocTokensFilterFn[];\n  private readonly blockReaders: readonly PandocBlockReaderFn[];\n  private readonly inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[];\n  private readonly blockCapsuleFilters: readonly PandocBlockCapsuleFilter[];\n  private readonly nodeWriters: readonly PandocNodeWriter[];\n  private readonly markWriters: readonly PandocMarkWriter[];\n  private readonly pandoc: PandocServer;\n  private readonly pandocCapabilities: PandocCapabilities;\n\n  constructor(\n    schema: Schema,\n    extensions: ExtensionManager,\n    pandoc: PandocServer,\n    pandocCapabilities: PandocCapabilities,\n  ) {\n    this.schema = schema;\n\n    this.preprocessors = extensions.pandocPreprocessors();\n    this.postprocessors = extensions.pandocPostprocessors();\n    this.readers = extensions.pandocReaders();\n    this.tokensFilters = extensions.pandocTokensFilters();\n    this.blockReaders = extensions.pandocBlockReaders();\n    this.inlineHTMLReaders = extensions.pandocInlineHTMLReaders();\n    this.blockCapsuleFilters = extensions.pandocBlockCapsuleFilters();\n    this.nodeWriters = extensions.pandocNodeWriters();\n    this.markWriters = extensions.pandocMarkWriters();\n\n    this.pandoc = pandoc;\n    this.pandocCapabilities = pandocCapabilities;\n  }\n\n  public async toProsemirror(markdown: string, format: PandocFormat): Promise<PandocToProsemirrorResult> {\n    // save original markdown (for aligning capsule positions)\n    const original = markdown;\n\n    // adjust format. we always need to *read* raw_html, raw_attribute, and backtick_code_blocks b/c\n    // that's how preprocessors hoist content through pandoc into our prosemirror token parser.\n    // we always need to read with auto_identifiers so we can catch any auto-generated ids\n    // required to fulfill links inside the document (we will strip out heading ids that\n    // aren't explicit or a link target using the heading_ids returned with the ast). we also\n    // disable 'smart' b/c that causes pandoc to insert non-breaking spaces before selected\n    // abbreviations like e.g. rather, we do our own implementation of 'smart' when we read\n    // PandocTokenType.Str from the ast\n\n    // determine type of auto_ids\n    const autoIds = format.extensions.gfm_auto_identifiers ? 'gfm_auto_identifiers' : 'auto_identifiers';\n    const targetFormat = adjustedFormat(\n      format.fullName,\n      ['raw_html', 'raw_attribute', 'backtick_code_blocks', autoIds],\n      ['smart'],\n    );\n\n    // run preprocessors\n    this.preprocessors.forEach(preprocessor => {\n      markdown = preprocessor(markdown);\n    });\n\n    // create source capsules\n    this.blockCapsuleFilters.forEach(filter => {\n      markdown = pandocMarkdownWithBlockCapsules(original, markdown, filter);\n    });\n\n    const ast = await this.pandoc.markdownToAst(markdown, targetFormat, []);\n    const result = pandocToProsemirror(\n      ast,\n      this.schema,\n      format.extensions,\n      this.readers,\n      this.tokensFilters,\n      this.blockReaders,\n      this.inlineHTMLReaders,\n      this.blockCapsuleFilters,\n    );\n\n    // run post-processors\n    this.postprocessors.forEach(postprocessor => {\n      result.doc = postprocessor(result.doc);\n    });\n\n    // return the doc\n    return result;\n  }\n\n  // NOTE: For a plain markdown file, this is the closest we can come to cannonicalizing w/ just pandoc:\n  //\n  //   pandoc MANUAL.md --to markdown-auto_identifiers-smart -o MANUAL.md --self-contained --atx-headers --wrap=none\n  //\n  // For R Mardown files, we would need to pull out the Rmd chunks before sending to pandoc.\n  //\n\n  public async fromProsemirror(\n    doc: ProsemirrorNode,\n    pandocFormat: PandocFormat,\n    options: PandocWriterOptions,\n  ): Promise<string> {\n    // generate pandoc ast\n    const output = pandocFromProsemirror(\n      doc,\n      this.pandocCapabilities.api_version,\n      pandocFormat,\n      this.nodeWriters,\n      this.markWriters,\n    );\n\n    // adjust format. we always need to be able to write raw_attribute b/c that's how preprocessors\n    // hoist content through pandoc into our prosemirror token parser. since we open this door when\n    // reading, users could end up writing raw inlines, and in that case we want them to echo back\n    // to the source document just the way they came in. for writing markdown from pm we don't\n    // ever want to generate auto identifiers so we disable them here. we also disable smart b/c\n    // we do this manually above in pandocFromProsemirror (so we can avoid pandoc's insertion of\n    // nbsp's after abbreviations, which is more approriate for final output than editing)\n    let format = adjustedFormat(\n      pandocFormat.fullName,\n      ['raw_html', 'raw_attribute'], // always enable\n      ['auto_identifiers', 'gfm_auto_identifiers', 'smart'],\n    ); // always disable\n\n    // disable selected format options\n    format = pandocFormatWith(format, disabledFormatOptions(format, doc), '');\n\n    // prepare pandoc options\n    let pandocOptions: string[] = [];\n    if (!options.atxHeaders) {\n      pandocOptions.push('--markdown-headings=setext');\n    }\n    if (options.dpi) {\n      pandocOptions.push('--dpi');\n    }\n    // default to block level references (validate known types)\n    let referenceLocation = 'block';\n    if (options.references?.location) {\n      referenceLocation = ['block', 'section', 'document'].includes(options.references.location)\n        ? options.references.location\n        : 'block';\n    }\n    pandocOptions.push(`--reference-location=${referenceLocation}`);\n\n    // references prefix (if any)\n    if (options.references?.prefix) {\n      pandocOptions.push('--id-prefix', options.references.prefix);\n    }\n\n    // provide wrap options\n    pandocOptions = pandocOptions.concat(wrapOptions(options));\n\n    // render to markdown\n    const markdown = await this.pandoc.astToMarkdown(output.ast, format, pandocOptions);\n\n    // normalize newlines (don't know if pandoc uses \\r\\n on windows)\n    return markdown.replace(/\\r\\n|\\n\\r|\\r/g, '\\n');\n  }\n}\n\n// adjust the specified format\nfunction adjustedFormat(format: string, extensions: string[], disabled: string[]) {\n  let newFormat = pandocFormatWith(\n    format,\n    '',\n    extensions.map(ext => `+${ext}`).join('') + disabled.map(ext => `-${ext}`).join(''),\n  );\n\n  // any extension specified needs to not have a - anywhere in the format\n  extensions.forEach(ext => {\n    newFormat = newFormat.replace('-' + ext, '');\n  });\n\n  return newFormat;\n}\n\nfunction disabledFormatOptions(format: string, doc: ProsemirrorNode) {\n  // (prefer pipe and grid tables). users can still force the availability of these by\n  // adding those format flags but all known markdown variants that support tables also\n  // support pipe tables so this seems unlikely to ever be required.\n  let disabledTableTypes = '-simple_tables-multiline_tables';\n\n  // if there are tables with inline R code then disable grid tables (as the inline\n  // R code will mess up the column boundaries)\n  if (haveTableCellsWithInlineRcode(doc)) {\n    disabledTableTypes += '-grid_tables';\n  }\n\n  // gfm and commonmark variants don't allow simple/multiline/grid tables (just pipe tables)\n  // and it's an error to even include these in the markdown format specifier -- so for\n  // these modes we just nix the disabling\n  if (format.startsWith(kGfmFormat) || format.startsWith(kCommonmarkFormat)) {\n    disabledTableTypes = '';\n  }\n\n  // return\n  return disabledTableTypes;\n}\n\nfunction wrapOptions(options: PandocWriterOptions) {\n  const pandocOptions: string[] = [];\n  if (options.wrap) {\n    if (options.wrap === 'none' || options.wrap === 'sentence') {\n      pandocOptions.push('--wrap=none');\n    } else {\n      const column = parseInt(options.wrap, 10);\n      if (column) {\n        pandocOptions.push('--wrap=auto');\n        pandocOptions.push(`--columns=${column}`);\n      } else {\n        pandocOptions.push('--wrap=none');\n      }\n    }\n  } else {\n    pandocOptions.push('--wrap=none');\n  }\n  return pandocOptions;\n}\n","/*\n * pandoc_capsule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { base64Encode, base64Decode } from './base64';\n\nimport { PandocToken, ProsemirrorWriter, mapTokens, PandocTokenType } from './pandoc';\n\n// constants used for creating/consuming capsules\nconst kFieldDelimiter = '\\n';\nconst kValueDelimiter = ':';\nconst kTypeField = 'type';\nconst kPositionField = 'position';\nconst kPrefixField = 'prefix';\nconst kSourceField = 'source';\nconst kSuffixField = 'suffix';\nconst kBlockCapsuleSentinel = '31B8E172-B470-440E-83D8-E6B185028602'.toLowerCase();\n\n// block capsule\nexport interface PandocBlockCapsule {\n  type: string;\n  position: number;\n  prefix: string;\n  source: string;\n  suffix: string;\n}\n\n// preserve block source code through markdown parsing (e.g. for yaml metadata or rmd chunks).\n// block capsules remove markdown from the document before pandoc parses it (placing it into\n// a base64 encoded 'capsule'), then unwraps the capsule from the AST. All of this is done\n// by the function in this interface.\nexport interface PandocBlockCapsuleFilter {\n  // unique type id for this capsule\n  type: string;\n\n  // regex that matches a prefix (match[1]), the source to preserve (match[2]), and a suffix (match[3])\n  // we need the prefix/suffix for the cases where the preserved source needs to be put back exactly\n  // where it came from (e.g. in a multi-line html comment). we also need it to fixup indentation in\n  // cases where capsules are unwrapped within a code block or raw block. the prefix and suffix\n  // must begin and end (respectively) with newlines, and consist entirely of whitespace (e.g. leading\n  // space for indented block or incidental whitespace after block delimiter)\n  match: RegExp;\n\n  // optional seconary filter expression (applied to a successful match to ensure\n  // that matching wasn't overly greedy)\n  discard?: RegExp;\n\n  // custom function for pulling out the 3 parts from a match (defaults to p1,p2,p3)\n  extract?: (\n    match: string,\n    p1: string,\n    p2: string,\n    p3: string,\n    p4: string,\n  ) => { prefix: string; source: string; suffix: string };\n\n  // provide a (text) envelope around the capsule, e.g.\n  //  - newlines to ensure that yaml is parsed as a standalone paragraph;\n  //  - backticks to ensure an Rmd is structurally parsed by pandoc as a codeblock\n  enclose: (capsuleText: string, capsule: PandocBlockCapsule) => string;\n\n  // examine a piece of text from within the pandoc ast and, if approproate, substitute any\n  // capsules of my type for the original text (otherwise just return the passed string).\n  // this method will generally use encodedBlockCapsuleRegex to create a regex to search\n  // with, then upon finding a capsule, will unpack it with parsePandocBlockCapsule, compare\n  // the type against our own type, and in the case they match do the substitution.\n  handleText: (text: string, tok: PandocToken) => string;\n\n  // do you want to handle this token as a capsule object? if so return the capsule text\n  // (only the filter will know how to extract it from a pandoc token b/c it knows\n  // where it was parsed from and what happened in the 'enclose' method)\n  handleToken: (tok: PandocToken) => string | null;\n\n  // write a capsule as a pandoc node\n  writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => void;\n}\n\n// transform the passed markdown to include base64 encoded block capsules as specified by the\n// provided capsule filter. capsules are used to hoist block types that we don't want pandoc\n// to see (e.g. yaml metadata or Rmd chunks) out of the markdown, only to be re-inserted\n// after pandoc has yielded an ast. block capsules are a single base64 encoded pieced of\n// text that include the original content, the matched prefix and suffix, and a type\n// identifier for orchestrating the unpacking.\nexport function pandocMarkdownWithBlockCapsules(\n  original: string,\n  markdown: string,\n  capsuleFilter: PandocBlockCapsuleFilter,\n) {\n  // default extractor\n  const defaultExtractor = (match: string, p1: string, p2: string, p3: string) => {\n    return {\n      prefix: p1,\n      source: p2,\n      suffix: p3,\n    };\n  };\n\n  // find the original position of all the matches\n  const positions: number[] = [];\n  let match = capsuleFilter.match.exec(original);\n  while (match != null) {\n    positions.push(match.index);\n    match = capsuleFilter.match.exec(original);\n  }\n\n  // reset capsule filter match index\n  capsuleFilter.match.lastIndex = 0;\n\n  // replace all w/ source preservation capsules\n  return markdown.replace(capsuleFilter.match, (match: string, p1: string, p2: string, p3: string, p4: string) => {\n    // read the original position of the match\n    let position = 0;\n    const originalPos = positions.shift();\n    if (originalPos) {\n      position = originalPos;\n    }\n\n    // if the capsuleFilter has a discard expression then check it\n    if (capsuleFilter.discard && !!match.match(capsuleFilter.discard)) {\n      return match;\n    }\n\n    // extract matches\n    const extract = capsuleFilter.extract || defaultExtractor;\n    const { prefix, source, suffix } = extract(match, p1, p2, p3, p4);\n\n    // make the capsule\n    const capsule: PandocBlockCapsule = {\n      [kTypeField]: capsuleFilter.type,\n      [kPositionField]: position,\n      [kPrefixField]: prefix,\n      [kSourceField]: source,\n      [kSuffixField]: suffix,\n    };\n\n    // construct a field\n    const field = (name: string, value: string) => `${name}${kValueDelimiter}${base64Encode(value)}`;\n\n    // construct a record\n    const record =\n      field(kTypeField, capsule.type) +\n      kFieldDelimiter +\n      field(kPositionField, capsule.position.toString()) +\n      kFieldDelimiter +\n      field(kPrefixField, capsule.prefix) +\n      kFieldDelimiter +\n      field(kSourceField, capsule.source) +\n      kFieldDelimiter +\n      field(kSuffixField, capsule.suffix);\n\n    // now base64 encode the entire record (so it can masquerade as a paragraph)\n    const encodedRecord = base64Encode(record);\n\n    // return capsule, which is:\n    //   - a base64 encoded record surrounded with a sentinel value\n    //   - enclosed in a filter specific envelope (used to influence pandoc parsing),\n    //   - surrounded by the original prefix and suffix\n    return (\n      prefix +\n      capsuleFilter.enclose(\n        `${kBlockCapsuleSentinel}${kValueDelimiter}${encodedRecord}${kValueDelimiter}${kBlockCapsuleSentinel}`,\n        capsule,\n      ) +\n      suffix\n    );\n  });\n}\n\n// block capsules can also end up not as block tokens, but rather as text within another\n// token (e.g. within a backtick code block or raw_block). this function takes a set\n// of pandoc tokens and recursively converts block capsules that aren't of type\n// PandocTokenType.Str (which is what we'd see in a paragraph) into their original form\nexport function resolvePandocBlockCapsuleText(\n  tokens: PandocToken[],\n  filters: readonly PandocBlockCapsuleFilter[],\n): PandocToken[] {\n  // process all tokens\n  return mapTokens(tokens, token => {\n    // look for non-string pandoc tokens\n    if (token.t !== PandocTokenType.Str && token.c) {\n      if (typeof token.c === 'string') {\n        token.c = decodeBlockCapsuleText(token.c, token, filters);\n      } else if (Array.isArray(token.c)) {\n        const children = token.c.length;\n        for (let i = 0; i < children; i++) {\n          if (typeof token.c[i] === 'string') {\n            token.c[i] = decodeBlockCapsuleText(token.c[i], token, filters);\n          }\n        }\n      }\n    }\n\n    return token;\n  });\n}\n\n// decode the text capsule by running all of the filters (as there could be nesting)\nexport function decodeBlockCapsuleText(text: string, tok: PandocToken, filters: readonly PandocBlockCapsuleFilter[]) {\n  filters.forEach(filter => {\n    text = filter.handleText(text, tok);\n  });\n  return text;\n}\n\nexport function blockCapsuleTextHandler(type: string, pattern: RegExp, textFilter?: (text: string) => string) {\n  return (text: string, tok: PandocToken): string => {\n    // if this is a code block or raw block then we need to strip the prefix\n    // (b/c it could in a blockquote or indented in a list)\n    const stripPrefix = tok.t === PandocTokenType.CodeBlock || tok.t === PandocTokenType.RawBlock;\n\n    // replace text\n    return text.replace(pattern, match => {\n      const capsuleText = textFilter ? textFilter(match) : match;\n      const capsule = parsePandocBlockCapsule(capsuleText);\n      if (capsule.type === type) {\n        if (stripPrefix) {\n          return blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n        } else {\n          return capsule.source;\n        }\n      } else {\n        return match;\n      }\n    });\n  };\n}\n\n// token handler that looks for a paragraph token consisting entirely of a block capsule of our type.\n// if we find that then return the block capsule text\nexport function blockCapsuleParagraphTokenHandler(type: string) {\n  const tokenRegex = encodedBlockCapsuleRegex('^', '$');\n  return (tok: PandocToken) => {\n    if (tok.t === PandocTokenType.Para) {\n      if (tok.c.length === 1 && tok.c[0].t === PandocTokenType.Str) {\n        const text = tok.c[0].c as string;\n        const match = text.match(tokenRegex);\n        if (match) {\n          const capsuleRecord = parsePandocBlockCapsule(match[0]);\n          if (capsuleRecord.type === type) {\n            return match[0];\n          }\n        }\n      }\n    }\n    return null;\n  };\n}\n\n// create a regex that can be used to match a block capsule\nexport function encodedBlockCapsuleRegex(prefix?: string, suffix?: string, flags?: string) {\n  return new RegExp(\n    (prefix || '') +\n      kBlockCapsuleSentinel +\n      kValueDelimiter +\n      '((?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?)' +\n      kValueDelimiter +\n      kBlockCapsuleSentinel +\n      (suffix || ''),\n    flags,\n  );\n}\n\n// remove encoding envelope then parse the remaining text into a block capsule\nexport function parsePandocBlockCapsule(text: string): PandocBlockCapsule {\n  const envelopeLen = kBlockCapsuleSentinel.length + kFieldDelimiter.length;\n  const record = text.substring(envelopeLen, text.length - envelopeLen);\n  const decodedRecord = base64Decode(record);\n  const fields = decodedRecord.split(kFieldDelimiter);\n  const fieldValue = (i: number) => base64Decode(fields[i].split(kValueDelimiter)[1]);\n  return {\n    [kTypeField]: fieldValue(0),\n    [kPositionField]: parseInt(fieldValue(1), 10),\n    [kPrefixField]: fieldValue(2),\n    [kSourceField]: fieldValue(3),\n    [kSuffixField]: fieldValue(4),\n  };\n}\n\n// provide a version of the block capsule source with the prefix removed\n// from all but the very first line. this allows us to restore the text\n// to the level of indentation implied by the markdown (as opposed to the\n// level found literally in the source file)\nexport function blockCapsuleSourceWithoutPrefix(source: string, prefix: string) {\n  // prefix represents the indentation level of the block's source code, strip that\n  // same prefix from all the lines of code save for the first one\n  const prefixStripRegEx = new RegExp('^' + prefix);\n  const lines = source.split('\\n').map((line, index) => {\n    return index > 0 ? line.replace(prefixStripRegEx, '') : line;\n  });\n  return lines.join('\\n');\n}\n","/*\n * base_64.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// btoa and atob don't handle unicode strings, see\n// https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa#Unicode_strings\n\n// these functions implement the suggested workaround ()\n\nexport function base64Encode(text: string) {\n  const binary = toBinary(text);\n  return window.btoa(binary);\n}\n\nexport function base64Decode(encoded: string) {\n  const decoded = atob(encoded);\n  return fromBinary(decoded);\n}\n\n// convert a Unicode string to a string in which each 16-bit unit occupies only one byte\nfunction toBinary(text: string) {\n  const codeUnits = new Uint16Array(text.length);\n  for (let i = 0; i < codeUnits.length; i++) {\n    codeUnits[i] = text.charCodeAt(i);\n  }\n  const charCodes = Array.from(new Uint8Array(codeUnits.buffer)).map(code => String.fromCharCode(code));\n  return charCodes.join('');\n}\n\n// reverse the conversion\nfunction fromBinary(binary: string) {\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < bytes.length; i++) {\n    bytes[i] = binary.charCodeAt(i);\n  }\n  const charCodes = Array.from(new Uint16Array(bytes.buffer)).map(code => String.fromCharCode(code));\n  return charCodes.join('');\n}\n","/*\n * pandoc_to_prosemirror.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Node as ProsemirrorNode, NodeType, Schema } from 'prosemirror-model';\n\nimport {\n  PandocTokenReader,\n  PandocToken,\n  PandocAst,\n  ProsemirrorWriter,\n  PandocBlockReaderFn,\n  PandocInlineHTMLReaderFn,\n  PandocTokensFilterFn,\n  PandocTokenType,\n  mapTokens,\n  stringifyTokens,\n  PandocExtensions,\n  forEachToken,\n} from '../api/pandoc';\nimport {\n  pandocAttrReadAST,\n  kCodeBlockAttr,\n  kCodeBlockText,\n  kPandocAttrClasses,\n  kPandocAttrKeyvalue,\n} from '../api/pandoc_attr';\nimport {\n  PandocBlockCapsuleFilter,\n  parsePandocBlockCapsule,\n  resolvePandocBlockCapsuleText,\n  decodeBlockCapsuleText,\n} from '../api/pandoc_capsule';\n\nimport { PandocToProsemirrorResult, PandocLineWrapping } from './pandoc_converter';\nimport { kLinkTarget, kLinkTargetUrl, kLinkChildren, kLinkAttr, kLinkTargetTitle } from '../api/link';\nimport { kHeadingAttr, kHeadingLevel, kHeadingChildren } from '../api/heading';\nimport { pandocAutoIdentifier, gfmAutoIdentifier } from '../api/pandoc_id';\nimport { equalsIgnoreCase } from '../api/text';\nimport { hasShortcutHeadingLinks } from '../api/pandoc_format';\n\nexport function pandocToProsemirror(\n  ast: PandocAst,\n  schema: Schema,\n  extensions: PandocExtensions,\n  readers: readonly PandocTokenReader[],\n  tokensFilters: readonly PandocTokensFilterFn[],\n  blockReaders: readonly PandocBlockReaderFn[],\n  inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[],\n  blockCapsuleFilters: readonly PandocBlockCapsuleFilter[],\n): PandocToProsemirrorResult {\n  const parser = new Parser(\n    schema,\n    extensions,\n    readers,\n    tokensFilters,\n    blockReaders,\n    inlineHTMLReaders,\n    blockCapsuleFilters,\n  );\n  return parser.parse(ast);\n}\n\nclass Parser {\n  private readonly schema: Schema;\n  private readonly extensions: PandocExtensions;\n  private readonly tokensFilters: readonly PandocTokensFilterFn[];\n  private readonly inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[];\n  private readonly blockCapsuleFilters: readonly PandocBlockCapsuleFilter[];\n  private readonly handlers: { [token: string]: ParserTokenHandlerCandidate[] };\n\n  constructor(\n    schema: Schema,\n    extensions: PandocExtensions,\n    readers: readonly PandocTokenReader[],\n    tokensFilters: readonly PandocTokensFilterFn[],\n    blockReaders: readonly PandocBlockReaderFn[],\n    inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[],\n    blockCapsuleFilters: readonly PandocBlockCapsuleFilter[],\n  ) {\n    this.schema = schema;\n    this.extensions = extensions;\n    this.tokensFilters = tokensFilters;\n    this.inlineHTMLReaders = inlineHTMLReaders;\n    // apply block capsule filters in reverse order\n    this.blockCapsuleFilters = blockCapsuleFilters.slice().reverse();\n    this.handlers = this.createHandlers(readers, blockReaders);\n  }\n\n  public parse(ast: PandocAst) {\n    // create state\n    const state: ParserState = new ParserState(this.schema);\n    // create writer (compose state w/ writeTokens function)\n    const parser = this;\n    const writer: ProsemirrorWriter = {\n      openNode: state.openNode.bind(state),\n      closeNode: state.closeNode.bind(state),\n      openNoteNode: state.openNoteNode.bind(state),\n      addNode: state.addNode.bind(state),\n      openMark: state.openMark.bind(state),\n      closeMark: state.closeMark.bind(state),\n      writeText: state.writeText.bind(state),\n      hasInlineHTMLWriter(html: string) {\n        return parser.hasInlineHTMLWriter(html);\n      },\n      writeInlineHTML(html: string) {\n        return parser.writeInlineHTML(this, html);\n      },\n      writeTokens(tokens: PandocToken[]) {\n        parser.writeTokens(this, tokens);\n      },\n      logUnrecognized: state.logUnrecognized.bind(state),\n      isNodeOpen: state.isNodeOpen.bind(state),\n    };\n\n    // process raw text capsules\n    let targetAst = {\n      ...ast,\n      blocks: resolvePandocBlockCapsuleText(ast.blocks, this.blockCapsuleFilters),\n    };\n\n    // detect line wrapping\n    const lineWrapping = detectLineWrapping(targetAst);\n\n    // resolve heading ids\n    targetAst = resolveHeadingIds(targetAst, this.extensions);\n\n    // write all tokens\n    writer.writeTokens(targetAst.blocks);\n\n    // return\n    return {\n      doc: state.doc(),\n      line_wrapping: lineWrapping,\n      unrecognized: state.unrecognized(),\n      unparsed_meta: ast.meta,\n    };\n  }\n\n  private writeTokens(writer: ProsemirrorWriter, tokens: PandocToken[]) {\n    // pass through tokens filters\n    let targetTokens = tokens;\n    this.tokensFilters.forEach(filter => {\n      targetTokens = filter(targetTokens, writer);\n    });\n\n    // process tokens\n    targetTokens.forEach(tok => this.writeToken(writer, tok));\n  }\n\n  private writeToken(writer: ProsemirrorWriter, tok: PandocToken) {\n    // process block-level capsules\n    for (const filter of this.blockCapsuleFilters) {\n      const capsuleText = filter.handleToken?.(tok);\n      if (capsuleText) {\n        const blockCapsule = parsePandocBlockCapsule(capsuleText);\n        // run all of the text filters in case there was nesting\n        blockCapsule.source = decodeBlockCapsuleText(blockCapsule.source, tok, this.blockCapsuleFilters);\n        filter.writeNode(this.schema, writer, blockCapsule);\n        return;\n      }\n    }\n\n    // look for a handler.match function that wants to handle this token\n    const handlers = this.handlers[tok.t] || [];\n    for (const handler of handlers) {\n      // It's not enough for a pandoc reader's preferred token to match the\n      // current token; it's possible based on the `match` method for the\n      // reader to decline to handle it.\n      if (handler.match && handler.match(tok)) {\n        handler.handler(writer, tok);\n        return;\n      }\n    }\n\n    // if we didn't find one, look for the default handler\n    for (const handler of handlers) {\n      if (!handler.match) {\n        handler.handler(writer, tok);\n        return;\n      }\n    }\n\n    // log unrecognized token\n    writer.logUnrecognized(tok.t);\n  }\n\n  private hasInlineHTMLWriter(html: string) {\n    for (const reader of this.inlineHTMLReaders) {\n      if (reader(this.schema, html)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private writeInlineHTML(writer: ProsemirrorWriter, html: string) {\n    for (const reader of this.inlineHTMLReaders) {\n      if (reader(this.schema, html, writer)) {\n        return;\n      }\n    }\n  }\n\n  // create parser token handler functions based on the passed readers\n  private createHandlers(readers: readonly PandocTokenReader[], blockReaders: readonly PandocBlockReaderFn[]) {\n    const handlers: { [token: string]: ParserTokenHandlerCandidate[] } = {};\n\n    for (const reader of readers) {\n      // resolve children (provide default impl)\n      const getChildren = reader.getChildren || ((tok: PandocToken) => tok.c);\n\n      // resolve getAttrs (provide default imple)\n      const getAttrs = reader.getAttrs ? reader.getAttrs : (tok: PandocToken) => ({});\n\n      let handler: ParserTokenHandler;\n\n      // see if there is a low-level handler\n      if (reader.handler) {\n        handler = reader.handler(this.schema);\n      }\n\n      // text\n      else if (reader.text) {\n        handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n          if (reader.getText) {\n            const text = reader.getText(tok);\n            writer.writeText(text);\n          }\n        };\n\n        // marks\n      } else if (reader.mark) {\n        handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n          const markType = this.schema.marks[reader.mark as string];\n          const mark = markType.create(getAttrs(tok));\n          writer.openMark(mark);\n          if (reader.getText) {\n            writer.writeText(reader.getText(tok));\n          } else {\n            writer.writeTokens(getChildren(tok));\n          }\n          writer.closeMark(mark);\n        };\n\n        // blocks\n      } else if (reader.block) {\n        const nodeType = this.schema.nodes[reader.block];\n        handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n          // give the block readers first crack (e.g. handle a paragraph node with\n          // a single image as a figure node)\n          for (const blockReader of blockReaders) {\n            if (blockReader(this.schema, tok, writer)) {\n              return;\n            }\n          }\n\n          writer.openNode(nodeType, getAttrs(tok));\n          if (reader.getText) {\n            writer.writeText(reader.getText(tok));\n          } else {\n            writer.writeTokens(getChildren(tok));\n          }\n          writer.closeNode();\n        };\n\n        // nodes\n      } else if (reader.node) {\n        const nodeType = this.schema.nodes[reader.node];\n        handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n          if (reader.getChildren) {\n            writer.openNode(nodeType, getAttrs(tok));\n            writer.writeTokens(getChildren(tok));\n            writer.closeNode();\n          } else {\n            let content: ProsemirrorNode[] = [];\n            if (reader.getText) {\n              content = [this.schema.text(reader.getText(tok))];\n            }\n            writer.addNode(nodeType, getAttrs(tok), content);\n          }\n        };\n\n        // code blocks\n      } else if (reader.code_block) {\n        handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n          // type/attr/text\n          const nodeType = this.schema.nodes.code_block;\n          const attr: {} = pandocAttrReadAST(tok, kCodeBlockAttr);\n          const text = tok.c[kCodeBlockText] as string;\n\n          // write node\n          writer.openNode(nodeType, attr);\n          writer.writeText(text);\n          writer.closeNode();\n        };\n      } else {\n        throw new Error('pandoc reader was malformed or unrecognized');\n      }\n\n      // Ensure an array exists\n      handlers[reader.token] = handlers[reader.token] || [];\n\n      handlers[reader.token].push({\n        match: reader.match,\n        handler,\n      });\n    }\n    return handlers;\n  }\n}\n\nclass ParserState {\n  private readonly schema: Schema;\n  private readonly stack: ParserStackElement[];\n  private readonly notes: ProsemirrorNode[];\n  private marks: Mark[];\n  private footnoteNumber: number;\n  private unrecognizedTokens: string[];\n\n  constructor(schema: Schema) {\n    this.schema = schema;\n    this.stack = [{ type: this.schema.nodes.body, attrs: {}, content: [] }];\n    this.notes = [];\n    this.marks = Mark.none;\n    this.footnoteNumber = 1;\n    this.unrecognizedTokens = [];\n  }\n\n  public doc(): ProsemirrorNode {\n    const content: ProsemirrorNode[] = [];\n    content.push(this.top().type.createAndFill(null, this.top().content) as ProsemirrorNode);\n    content.push(this.schema.nodes.notes.createAndFill(null, this.notes) as ProsemirrorNode);\n    return this.schema.topNodeType.createAndFill({}, content) as ProsemirrorNode;\n  }\n\n  public unrecognized(): string[] {\n    return this.unrecognizedTokens;\n  }\n\n  public writeText(text: string) {\n    if (!text) {\n      return;\n    }\n    const nodes: ProsemirrorNode[] = this.top().content;\n    const last: ProsemirrorNode = nodes[nodes.length - 1];\n    const node: ProsemirrorNode = this.schema.text(text, this.marks);\n    const merged: ProsemirrorNode | undefined = this.maybeMerge(last, node);\n    if (last && merged) {\n      nodes[nodes.length - 1] = merged;\n    } else {\n      nodes.push(node);\n    }\n  }\n\n  public addNode(type: NodeType, attrs: {}, content: ProsemirrorNode[]) {\n    const node: ProsemirrorNode | null | undefined = type.createAndFill(attrs, content, this.marks);\n    if (!node) {\n      return null;\n    }\n    if (this.stack.length) {\n      if (type === this.schema.nodes.note) {\n        this.notes.push(node);\n      } else {\n        this.top().content.push(node);\n      }\n    }\n    return node;\n  }\n\n  public openNode(type: NodeType, attrs: {}) {\n    this.stack.push({ type, attrs, content: [] });\n  }\n\n  public closeNode(): ProsemirrorNode {\n    // get node info\n    const info: ParserStackElement = this.stack.pop() as ParserStackElement;\n\n    // clear marks if the node type isn't inline\n    if (!info.type.isInline) {\n      if (this.marks.length) {\n        this.marks = Mark.none;\n      }\n    }\n\n    return this.addNode(info.type, info.attrs, info.content) as ProsemirrorNode;\n  }\n\n  public openMark(mark: Mark) {\n    this.marks = mark.addToSet(this.marks);\n  }\n\n  public closeMark(mark: Mark) {\n    this.marks = mark.removeFromSet(this.marks);\n  }\n\n  public openNoteNode(ref: string) {\n    this.openNode(this.schema.nodes.note, { ref, number: this.footnoteNumber++ });\n  }\n\n  public logUnrecognized(type: string) {\n    if (!this.unrecognizedTokens.includes(type)) {\n      this.unrecognizedTokens.push(type);\n    }\n  }\n\n  public isNodeOpen(type: NodeType) {\n    return this.stack.some(value => value.type === type);\n  }\n\n  private top(): ParserStackElement {\n    return this.stack[this.stack.length - 1];\n  }\n\n  private maybeMerge(a: ProsemirrorNode, b: ProsemirrorNode): ProsemirrorNode | undefined {\n    if (a && a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n      return this.schema.text(((a.text as string) + b.text) as string, a.marks);\n    } else {\n      return undefined;\n    }\n  }\n}\n\n// determine what sort of line wrapping is used within the file\nfunction detectLineWrapping(ast: PandocAst): PandocLineWrapping {\n  // look for soft breaks and classify them as column or sentence breaks\n  let columnBreaks = 0;\n  let sentenceBreaks = 0;\n  let prevTok: PandocToken = { t: PandocTokenType.Null };\n  forEachToken(ast.blocks, tok => {\n    if (tok.t === PandocTokenType.SoftBreak) {\n      if (\n        prevTok.t === PandocTokenType.Str &&\n        typeof prevTok.c === 'string' &&\n        ['.', '?', '!'].includes(prevTok.c.charAt(prevTok.c.length - 1))\n      ) {\n        sentenceBreaks++;\n      } else {\n        columnBreaks++;\n      }\n    }\n    prevTok = tok;\n  });\n\n  // need to have > 5 line breaks or more line breaks than blocks to trigger detection\n  // (prevents 'over-detection' if there are stray few soft breaks)\n  const lineBreaks = columnBreaks + sentenceBreaks;\n  if (lineBreaks > 5 || lineBreaks > ast.blocks.length) {\n    if (sentenceBreaks > columnBreaks) {\n      return 'sentence';\n    } else {\n      return 'column';\n    }\n  } else {\n    return 'none';\n  }\n}\n\n// determine which heading ids are valid based on explicit headings contained in the\n// document and any headings targeted by links. remove any heading ids not so identified\nfunction resolveHeadingIds(ast: PandocAst, extensions: PandocExtensions) {\n  // determine function we will use to create auto-identifiers\n  const autoIdentifier = extensions.gfm_auto_identifiers ? gfmAutoIdentifier : pandocAutoIdentifier;\n\n  // start with ids we know are valid (i.e. ones the user added to the doc)\n  const headingIds = new Set<string>((ast.heading_ids || []).map(id => id.toLocaleLowerCase()));\n\n  // find ids referenced in links\n  let astBlocks = mapTokens(ast.blocks, tok => {\n    if (tok.t === PandocTokenType.Link) {\n      const target = tok.c[kLinkTarget];\n      const href = target[kLinkTargetUrl] as string;\n      if (href.startsWith('#')) {\n        // if we have support for implicit header references and shortcut reference links,\n        // also check to see whether the link text resolves to the target (in that case\n        // we don't need the explicit id). note that if that heading has an explicit\n        // id defined then we also leave it alone.\n        const text = stringifyTokens(tok.c[kLinkChildren], extensions.gfm_auto_identifiers);\n        if (\n          hasShortcutHeadingLinks(extensions) &&\n          equalsIgnoreCase('#' + autoIdentifier(text, extensions.ascii_identifiers), href) &&\n          !headingIds.has(href.toLocaleLowerCase())\n        ) {\n          // return a version of the link w/o the target\n          return {\n            t: PandocTokenType.Link,\n            c: [tok.c[kLinkAttr], tok.c[kLinkChildren], ['#', tok.c[kLinkTarget][kLinkTargetTitle]]],\n          };\n\n          // otherwise note that it's a valid id\n        } else {\n          headingIds.add(href.toLocaleLowerCase());\n        }\n      }\n    }\n    // default to return token unmodified\n    return tok;\n  });\n\n  // remove any heading ids not created by the user or required by a link\n  astBlocks = mapTokens(ast.blocks, tok => {\n    if (tok.t === PandocTokenType.Header) {\n      const attr = pandocAttrReadAST(tok, kHeadingAttr);\n      if (attr.id && !headingIds.has('#' + attr.id.toLocaleLowerCase())) {\n        return {\n          t: PandocTokenType.Header,\n          c: [\n            tok.c[kHeadingLevel],\n            ['', tok.c[kHeadingAttr][kPandocAttrClasses], tok.c[kHeadingAttr][kPandocAttrKeyvalue]],\n            tok.c[kHeadingChildren],\n          ],\n        };\n      }\n    }\n    // default to just reflecting back the token\n    return tok;\n  });\n\n  // return the ast\n  return {\n    ...ast,\n    blocks: astBlocks,\n    heading_ids: undefined,\n  };\n}\n\ninterface ParserStackElement {\n  type: NodeType;\n  attrs: {};\n  content: ProsemirrorNode[];\n}\n\ntype ParserTokenHandler = (writer: ProsemirrorWriter, tok: PandocToken) => void;\n\ninterface ParserTokenHandlerCandidate {\n  match?: (tok: PandocToken) => boolean;\n  handler: ParserTokenHandler;\n}\n","/*\n * pandoc_from_prosemirror.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Fragment, MarkType, Mark } from 'prosemirror-model';\n\nimport {\n  PandocAst,\n  PandocToken,\n  PandocOutput,\n  PandocNodeWriterFn,\n  PandocNodeWriter,\n  PandocMarkWriter,\n  PandocApiVersion,\n  PandocTokenType,\n  PandocOutputOption,\n  PandocExtensions,\n  marksByPriority,\n} from '../api/pandoc';\n\nimport { PandocFormat, kGfmFormat } from '../api/pandoc_format';\nimport { PandocAttr } from '../api/pandoc_attr';\nimport { fragmentText } from '../api/fragment';\nimport { fancyQuotesToSimple } from '../api/quote';\n\nexport function pandocFromProsemirror(\n  doc: ProsemirrorNode,\n  apiVersion: PandocApiVersion,\n  format: PandocFormat,\n  nodeWriters: readonly PandocNodeWriter[],\n  markWriters: readonly PandocMarkWriter[],\n) {\n  const bodyNode = doc.child(0);\n  const notesNode = doc.child(1);\n  const writer = new PandocWriter(apiVersion, format, nodeWriters, markWriters, notesNode);\n  writer.writeNodes(bodyNode);\n  return writer.output();\n}\n\nclass PandocWriter implements PandocOutput {\n  private readonly ast: PandocAst;\n  private readonly format: PandocFormat;\n  private readonly nodeWriters: { [key: string]: PandocNodeWriterFn };\n  private readonly markWriters: { [key: string]: PandocMarkWriter };\n  private readonly notes: { [key: string]: ProsemirrorNode };\n  private readonly containers: any[][];\n  private readonly activeMarks: MarkType[];\n  private options: { [key: string]: boolean };\n\n  public readonly extensions: PandocExtensions;\n\n  private readonly escapeCharacters: string[] = [];\n  private readonly manualEscapeCharacters: Map<string, string> = new Map<string, string>();\n  private readonly preventEscapeCharacters: string[] = [];\n\n  constructor(\n    apiVersion: PandocApiVersion,\n    format: PandocFormat,\n    nodeWriters: readonly PandocNodeWriter[],\n    markWriters: readonly PandocMarkWriter[],\n    notes: ProsemirrorNode,\n  ) {\n    // save format and extensions\n    this.format = format;\n    this.extensions = format.extensions;\n    // compute escape characters based on format\n    this.initEscapeCharacters();\n    // create maps of node and mark writers\n    this.nodeWriters = {};\n    nodeWriters.forEach((writer: PandocNodeWriter) => {\n      this.nodeWriters[writer.name] = writer.write;\n    });\n    this.markWriters = {};\n    markWriters.forEach((writer: PandocMarkWriter) => {\n      this.markWriters[writer.name] = writer;\n    });\n    // create map of notes\n    this.notes = {};\n    notes.forEach((note: ProsemirrorNode) => {\n      this.notes[note.attrs.ref] = note;\n    });\n\n    this.ast = {\n      blocks: [],\n      'pandoc-api-version': apiVersion,\n      meta: {},\n    };\n    this.containers = [this.ast.blocks];\n    this.activeMarks = [];\n    this.options = {\n      writeSpaces: true,\n    };\n  }\n\n  public output() {\n    return {\n      ast: this.ast,\n    };\n  }\n\n  public write(value: any) {\n    const container = this.containers[this.containers.length - 1];\n    container.push(value);\n  }\n\n  public writeToken(type: PandocTokenType, content?: (() => void) | any) {\n    const token: PandocToken = {\n      t: type,\n    };\n    if (content !== undefined) {\n      if (typeof content === 'function') {\n        token.c = [];\n        this.fill(token.c, content);\n      } else {\n        token.c = content;\n      }\n    }\n    this.write(token);\n  }\n\n  public writeMark(type: PandocTokenType, parent: Fragment, expelEnclosingWhitespace = true) {\n    // expel enclosing whitepsace if requested and if the fragment isn't 100% spaces\n    if (expelEnclosingWhitespace) {\n      // build output spec\n      const output = {\n        spaceBefore: false,\n        nodes: new Array<ProsemirrorNode>(),\n        spaceAfter: false,\n      };\n\n      // if we see leading or trailing spaces we need to output them as tokens\n      // and substitute text nodes\n      parent.forEach((node: ProsemirrorNode, offset: number, index: number) => {\n        // check for leading/trailing space in first/last nodes\n        if (node.isText) {\n          let outputText = node.textContent;\n\n          // checking for leading space in first node\n          if (output.nodes.length === 0 && node.textContent.match(/^\\s+/)) {\n            output.spaceBefore = true;\n            outputText = outputText.trimLeft();\n          }\n\n          // check for trailing space in last node\n          if (index === parent.childCount - 1 && node.textContent.match(/\\s+$/)) {\n            output.spaceAfter = true;\n            outputText = outputText.trimRight();\n          }\n\n          // check for an entirely blank node\n          if (outputText.match(/^\\s*$/)) {\n            outputText = '';\n          }\n\n          // skip the node if it has nothing in it\n          if (outputText.length > 0) {\n            // if we modified the node's text then create a new node\n            if (outputText !== node.textContent) {\n              output.nodes.push(node.type.schema.text(outputText, node.marks));\n            } else {\n              output.nodes.push(node);\n            }\n          }\n        } else {\n          output.nodes.push(node);\n        }\n      });\n\n      // output space tokens before/after mark as necessary\n      if (output.nodes.length > 0) {\n        if (output.spaceBefore) {\n          this.writeToken(PandocTokenType.Space);\n        }\n        this.writeToken(type, () => {\n          this.writeInlines(Fragment.from(output.nodes));\n        });\n        if (output.spaceAfter) {\n          this.writeToken(PandocTokenType.Space);\n        }\n      }\n\n      // normal codepath (not expelling existing whitespace)\n    } else {\n      this.writeToken(type, () => {\n        this.writeInlines(parent);\n      });\n    }\n  }\n\n  public writeArray(content: () => void) {\n    const arr: any[] = [];\n    this.fill(arr, content);\n    this.write(arr);\n  }\n\n  public writeAttr(id?: string, classes?: string[], keyvalue?: Array<[string, string]>) {\n    this.write([id || '', classes || [], keyvalue || []]);\n  }\n\n  public writeText(text: string | null) {\n    // determine which characters we shouldn't escape\n    const preventEscapeCharacters = this.preventEscapeCharacters;\n\n    if (text) {\n      let textRun = '';\n      const flushTextRun = () => {\n        if (textRun) {\n          // if this is a line block, convert leading nbsp to regular space,\n          if (!this.options.writeSpaces) {\n            textRun = textRun.replace(/(^|\\n)+(\\u00A0+)/g, (_match, p1, p2) => {\n              return p1 + Array(p2.length + 1).join(' ');\n            });\n          }\n\n          // reverse smart punctuation. pandoc does this autmoatically for markdown\n          // writing w/ +smart, however this also results in nbsp's being inserted\n          // after selected abbreviations like e.g. and Mr., and we don't want that\n          // to happen for editing (b/c the nbsp's weren't put there by the user\n          // and are not obviously visible)\n          if (this.extensions.smart) {\n            textRun = textRun\n              .replace(/—/g, '---')\n              .replace(/–/g, '--')\n              .replace(/…/g, '...');\n          }\n\n          // we explicitly don't want fancy quotes in the editor\n          textRun = fancyQuotesToSimple(textRun);\n\n          this.writeToken(PandocTokenType.Str, textRun);\n          textRun = '';\n        }\n      };\n      for (let i = 0; i < text.length; i++) {\n        const ch = text.charAt(i);\n        if (this.options.writeSpaces && ch === ' ') {\n          flushTextRun();\n          this.writeToken(PandocTokenType.Space);\n        } else if (preventEscapeCharacters.includes(ch)) {\n          flushTextRun();\n          this.writeRawMarkdown(ch);\n        } else if (this.manualEscapeCharacters.has(ch)) {\n          flushTextRun();\n          this.writeRawMarkdown(this.manualEscapeCharacters.get(ch)!);\n        } else {\n          textRun += ch;\n        }\n      }\n      flushTextRun();\n    }\n  }\n\n  public writeLink(href: string, title: string, attr: PandocAttr | null, content: VoidFunction) {\n    this.writeToken(PandocTokenType.Link, () => {\n      // write attr if provided\n      if (attr) {\n        this.writeAttr(attr.id, attr.classes, attr.keyvalue);\n      } else {\n        this.writeAttr();\n      }\n      // write content\n      this.writeArray(() => {\n        content();\n      });\n\n      // write href\n      this.write([href || '', title || '']);\n    });\n  }\n\n  public writeNote(note: ProsemirrorNode) {\n    // get corresponding note body\n    const noteBody = this.notes[note.attrs.ref];\n\n    // don't write empty footnotes (otherwise in block or section mode they gobble up the section below them)\n    if (noteBody.textContent.trim().length > 0) {\n      this.writeToken(PandocTokenType.Note, () => {\n        this.writeNodes(noteBody);\n      });\n    }\n  }\n\n  public writeNode(node: ProsemirrorNode) {\n    this.nodeWriters[node.type.name](this, node);\n  }\n\n  public writeNodes(parent: ProsemirrorNode) {\n    parent.forEach(this.writeNode.bind(this));\n  }\n\n  public writeInlines(fragment: Fragment) {\n    // get the marks from a node that are not already on the stack of active marks\n    const nodeMarks = (node: ProsemirrorNode) => {\n      // get marks ordered by writer priority\n      let marks = marksByPriority(node.marks, this.markWriters);\n\n      // remove active marks\n      for (const activeMark of this.activeMarks) {\n        marks = activeMark.removeFromSet(marks);\n      }\n\n      // return marks\n      return marks;\n    };\n\n    // helpers to iterate through the nodes (sans any marks already on the stack)\n    let currentChild = 0;\n    const nextNode = () => {\n      const childIndex = currentChild;\n      currentChild++;\n      return {\n        node: fragment.child(childIndex),\n        marks: nodeMarks(fragment.child(childIndex)),\n      };\n    };\n    const putBackNode = () => {\n      currentChild--;\n    };\n\n    // iterate through the nodes\n    while (currentChild < fragment.childCount) {\n      // get the next node\n      let next = nextNode();\n\n      // if there are active marks then collect them up and call the mark handler\n      // with all nodes that it contains, otherwise just process it as a plain\n      // unmarked node\n      if (next.marks.length > 0) {\n        // get the mark and start building a list of marked nodes\n        const mark = next.marks[0];\n        const markedNodes: ProsemirrorNode[] = [next.node];\n\n        // inner iteration to find nodes that have this mark\n        while (currentChild < fragment.childCount) {\n          next = nextNode();\n          if (mark.type.isInSet(next.marks)) {\n            markedNodes.push(next.node);\n          } else {\n            // no mark found, \"put back\" the node\n            putBackNode();\n            break;\n          }\n        }\n\n        // call the mark writer after noting that this mark is active (which\n        // will cause subsequent recursive invocations of this function to\n        // not re-process this mark)\n        this.activeMarks.push(mark.type);\n        this.markWriters[mark.type.name].write(this, mark, Fragment.from(markedNodes));\n        this.activeMarks.pop();\n      } else {\n        // ordinary unmarked node, call the node writer\n        this.nodeWriters[next.node.type.name](this, next.node);\n      }\n    }\n  }\n\n  public writeRawMarkdown(markdown: Fragment | string, escapeSymbols?: boolean) {\n    // collect markdown text if necessary\n    let md = markdown instanceof Fragment ? fragmentText(markdown) : markdown;\n\n    // escape symbols if requested\n    if (escapeSymbols) {\n      const escaped: string[] = [];\n      for (let i = 0; i < md.length; i++) {\n        const ch = md.charAt(i);\n        if (this.escapeCharacters.includes(ch)) {\n          escaped.push('\\\\' + ch);\n        } else {\n          escaped.push(ch);\n        }\n      }\n      md = escaped.join('');\n    }\n\n    this.writeToken(PandocTokenType.RawInline, () => {\n      this.write('markdown');\n      this.write(md);\n    });\n  }\n\n  public withOption(option: PandocOutputOption, value: boolean, f: () => void) {\n    const previousValue = this.options[option];\n    this.options[option] = value;\n    f();\n    this.options[option] = previousValue;\n  }\n\n  private fill(container: any[], content: () => void) {\n    this.containers.push(container);\n    content();\n    this.containers.pop();\n  }\n\n  private initEscapeCharacters() {\n    // gfm disallows [] escaping so that MediaWiki style page links (e.g. [[MyPage]]) work as expected\n    // tex_math_single_backslash does not allow escaping of [] or () (as that conflicts with the math syntax)\n    if (this.format.mode === kGfmFormat || this.format.extensions.tex_math_single_backslash) {\n      this.preventEscapeCharacters.push('[', ']');\n    }\n\n    // tex_math_single_backslash does not allow escaping of [] or () (as that conflicts with the math syntax)\n    if (this.format.extensions.tex_math_single_backslash) {\n      this.preventEscapeCharacters.push('(', ')');\n    }\n\n    // filter standard escape characters w/ preventEscapeCharacters\n    const allEscapeCharacters = ['\\\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!'];\n    if (this.format.extensions.angle_brackets_escapable) {\n      allEscapeCharacters.push('<');\n    }\n    this.escapeCharacters.push(...allEscapeCharacters.filter(ch => !this.preventEscapeCharacters.includes(ch)));\n\n    // Manual escape characters are ones we can't rely on pandoc to automatically escape (b/c\n    // they represent valid syntax for a markdown extension, e.g. '@' for citations).\n    // For '@', since we already do special writing for spans we know are citation ids, we can\n    // globally prescribe escaping behavior and never stomp over a citation. We also check\n    // that '@' can be escaped in the current markdown format, and if not use an html escape.\n    const atEscape = this.extensions.all_symbols_escapable ? '\\\\@' : '&#x0040;';\n    this.manualEscapeCharacters.set('@', atEscape);\n  }\n}\n","/*\n * fragment.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment } from 'prosemirror-model';\n\nexport function fragmentText(fragment: Fragment, unemoji = false) {\n  let text = '';\n  fragment.forEach(node => {\n    const emjojiMark = node.marks.find(mark => mark.type === node.type.schema.marks.emoji);\n    if (unemoji && emjojiMark) {\n      return (text = text + (emjojiMark.attrs.emojihint || node.textContent));\n    } else {\n      return (text = text + node.textContent);\n    }\n  });\n  return text;\n}\n","/*\n * editor-extensions.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Schema } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { ProsemirrorCommand } from '../api/command';\nimport { PandocMark } from '../api/mark';\nimport { PandocNode, CodeViewOptions } from '../api/node';\nimport { Extension, ExtensionFn, ExtensionContext } from '../api/extension';\nimport { BaseKeyBinding } from '../api/basekeys';\nimport { OmniInserter } from '../api/omni_insert';\nimport { AppendTransactionHandler, AppendMarkTransactionHandler } from '../api/transaction';\nimport { FixupFn } from '../api/fixup';\nimport {\n  PandocTokenReader,\n  PandocMarkWriter,\n  PandocNodeWriter,\n  PandocPreprocessorFn,\n  PandocPostprocessorFn,\n  PandocBlockReaderFn,\n  PandocInlineHTMLReaderFn,\n  PandocTokensFilterFn,\n} from '../api/pandoc';\nimport { PandocBlockCapsuleFilter } from '../api/pandoc_capsule';\nimport { markInputRuleFilter } from '../api/input_rule';\nimport { CompletionHandler } from '../api/completion';\n\n// required extensions (base non-customiziable pandoc nodes/marks + core behaviors)\nimport nodeText from '../nodes/text';\nimport nodeParagraph from '../nodes/paragraph';\nimport nodeHeading from '../nodes/heading';\nimport nodeBlockquote from '../nodes/blockquote';\nimport nodeCodeBlock from '../nodes/code_block';\nimport nodeLists from '../nodes/list/list';\nimport nodeImage from '../nodes/image/image';\nimport nodeFigure from '../nodes/image/figure';\nimport nodeHr from '../nodes/hr';\nimport nodeHardBreak from '../nodes/hard_break';\nimport nodeNull from '../nodes/null';\nimport markEm from '../marks/em';\nimport markStrong from '../marks/strong';\nimport markCode from '../marks/code';\nimport markLink from '../marks/link/link';\nimport behaviorHistory from '../behaviors/history';\nimport behaviorSelectAll from '../behaviors/select_all';\nimport behaviorCursor from '../behaviors/cursor';\nimport behaviorFind from '../behaviors/find';\nimport behaviorSpellingInteractive from '../behaviors/spelling/spelling-interactive';\nimport behaviorClearFormatting from '../behaviors/clear_formatting';\n\n// behaviors\nimport behaviorSmarty from '../behaviors/smarty';\nimport behaviorAttrDuplicateId from '../behaviors/attr_duplicate_id';\nimport behaviorTrailingP from '../behaviors/trailing_p';\nimport behaviorEmptyMark from '../behaviors/empty_mark';\nimport behaviorEscapeMark from '../behaviors/escape_mark';\nimport behaviorOutline from '../behaviors/outline';\nimport beahviorCodeBlockInput from '../behaviors/code_block_input';\nimport behaviorPasteText from '../behaviors/paste_text';\nimport behaviorBottomPadding from '../behaviors/bottom_padding';\nimport behaviorInsertSymbol from '../behaviors/insert_symbol/insert_symbol-plugin-symbol';\nimport behaviorInsertSymbolEmoji from '../behaviors/insert_symbol/insert_symbol-plugin-emoji';\nimport beahviorInsertSpecialCharacters from '../behaviors/insert_symbol/insert_special_characters';\nimport behaviorNbsp from '../behaviors/nbsp';\nimport behaviorRemoveSection from '../behaviors/remove_section';\n\n// marks\nimport markStrikeout from '../marks/strikeout';\nimport markSuperscript from '../marks/superscript';\nimport markSubscript from '../marks/subscript';\nimport markSmallcaps from '../marks/smallcaps';\nimport markUnderline from '../marks/underline';\nimport markRawInline from '../marks/raw_inline/raw_inline';\nimport markRawTex from '../marks/raw_inline/raw_tex';\nimport markRawHTML from '../marks/raw_inline/raw_html';\nimport markMath from '../marks/math/math';\nimport markCite from '../marks/cite/cite';\nimport markSpan from '../marks/span';\nimport markXRef from '../marks/xref/xref';\nimport markHTMLComment from '../marks/raw_inline/raw_html_comment';\nimport markShortcode from '../marks/shortcode';\nimport markEmoji from '../marks/emoji/emoji';\nimport { markOmniInsert } from '../behaviors/omni_insert/omni_insert';\n\n// nodes\nimport nodeFootnote from '../nodes/footnote/footnote';\nimport nodeRawBlock from '../nodes/raw_block';\nimport nodeYamlMetadata from '../nodes/yaml_metadata/yaml_metadata';\nimport nodeRmdCodeChunk from '../nodes/rmd_chunk/rmd_chunk';\nimport nodeDiv from '../nodes/div';\nimport nodeLineBlock from '../nodes/line_block';\nimport nodeTable from '../nodes/table/table';\nimport nodeDefinitionList from '../nodes/definition_list/definition_list';\nimport nodeShortcodeBlock from '../nodes/shortcode_block';\nimport nodeHtmlPreserve from '../nodes/html_preserve';\n\n// extension/plugin factories\nimport { acePlugins } from '../optional/ace/ace';\nimport { attrEditExtension } from '../behaviors/attr_edit/attr_edit';\nimport { codeViewClipboardPlugin } from '../api/code';\n\nexport function initExtensions(context: ExtensionContext, extensions?: readonly Extension[]): ExtensionManager {\n  // create extension manager\n  const manager = new ExtensionManager(context);\n\n  // required extensions\n  manager.register([\n    nodeText,\n    nodeParagraph,\n    nodeHeading,\n    nodeBlockquote,\n    nodeLists,\n    nodeCodeBlock,\n    nodeImage,\n    nodeFigure,\n    nodeHr,\n    nodeHardBreak,\n    nodeNull,\n    markEm,\n    markStrong,\n    markCode,\n    markLink,\n    behaviorHistory,\n    behaviorSelectAll,\n    behaviorCursor,\n    behaviorFind,\n    behaviorSpellingInteractive,\n    behaviorClearFormatting,\n  ]);\n\n  // optional extensions\n  manager.register([\n    // behaviors\n    behaviorSmarty,\n    behaviorAttrDuplicateId,\n    behaviorTrailingP,\n    behaviorEmptyMark,\n    behaviorEscapeMark,\n    behaviorOutline,\n    beahviorCodeBlockInput,\n    behaviorPasteText,\n    behaviorBottomPadding,\n    behaviorInsertSymbol,\n    behaviorInsertSymbolEmoji,\n    beahviorInsertSpecialCharacters,\n    behaviorNbsp,\n    behaviorRemoveSection,\n\n    // nodes\n    nodeDiv,\n    nodeFootnote,\n    nodeYamlMetadata,\n    nodeRmdCodeChunk,\n    nodeTable,\n    nodeDefinitionList,\n    nodeLineBlock,\n    nodeRawBlock,\n    nodeShortcodeBlock,\n    nodeHtmlPreserve,\n\n    // marks\n    markUnderline,\n    markStrikeout,\n    markSuperscript,\n    markSubscript,\n    markSmallcaps,\n    markHTMLComment,\n    markRawTex,\n    markRawHTML,\n    markRawInline,\n    markMath,\n    markCite,\n    markSpan,\n    markXRef,\n    markShortcode,\n    markEmoji,\n    markOmniInsert,\n  ]);\n\n  // register external extensions\n  if (extensions) {\n    manager.register(extensions);\n  }\n\n  // additional extensions dervied from other extensions (e.g. extensions that have registered attr editors)\n  // note that all of these take a callback to access the manager -- this is so that if an extension earlier\n  // in the chain registers something the later extensions are able to see it\n  manager.register([\n    // bindings to 'Edit Attribute' command and UI adornment\n    attrEditExtension(context.pandocExtensions, context.ui, manager.attrEditors()),\n  ]);\n\n  // additional plugins derived from extensions\n  const codeViews = manager.codeViews();\n  const plugins: Plugin[] = [];\n  if (context.options.codeEditor === 'ace') {\n    plugins.push(...acePlugins(codeViews, context));\n  }\n  plugins.push(codeViewClipboardPlugin(codeViews));\n\n  // register plugins\n  manager.registerPlugins(plugins);\n\n  // return manager\n  return manager;\n}\n\nexport class ExtensionManager {\n  private context: ExtensionContext;\n  private extensions: Extension[];\n\n  public constructor(context: ExtensionContext) {\n    this.context = context;\n    this.extensions = [];\n  }\n\n  public register(extensions: ReadonlyArray<Extension | ExtensionFn>, priority = false): void {\n    extensions.forEach(extension => {\n      if (typeof extension === 'function') {\n        const ext = extension(this.context);\n        if (ext) {\n          if (priority) {\n            this.extensions.unshift(ext);\n          } else {\n            this.extensions.push(ext);\n          }\n        }\n      } else {\n        if (priority) {\n          this.extensions.unshift(extension);\n        } else {\n          this.extensions.push(extension);\n        }\n      }\n    });\n  }\n\n  public registerPlugins(plugins: Plugin[], priority = false) {\n    this.register([{ plugins: () => plugins }], priority);\n  }\n\n  public pandocMarks(): readonly PandocMark[] {\n    return this.collect(extension => extension.marks);\n  }\n\n  public pandocNodes(): readonly PandocNode[] {\n    return this.collect(extension => extension.nodes);\n  }\n\n  public pandocPreprocessors(): readonly PandocPreprocessorFn[] {\n    return this.collectFrom({\n      node: node => [node.pandoc.preprocessor],\n    });\n  }\n\n  public pandocPostprocessors(): readonly PandocPostprocessorFn[] {\n    return this.pandocReaders().flatMap(reader => (reader.postprocessor ? [reader.postprocessor] : []));\n  }\n\n  public pandocTokensFilters(): readonly PandocTokensFilterFn[] {\n    return this.collectFrom({\n      node: node => [node.pandoc.tokensFilter],\n    });\n  }\n\n  public pandocBlockReaders(): readonly PandocBlockReaderFn[] {\n    return this.collectFrom({\n      node: node => [node.pandoc.blockReader],\n    });\n  }\n\n  public pandocInlineHTMLReaders(): readonly PandocInlineHTMLReaderFn[] {\n    return this.collectFrom({\n      mark: mark => [mark.pandoc.inlineHTMLReader],\n      node: node => [node.pandoc.inlineHTMLReader],\n    });\n  }\n\n  public pandocBlockCapsuleFilters(): readonly PandocBlockCapsuleFilter[] {\n    return this.collectFrom({\n      node: node => [node.pandoc.blockCapsuleFilter],\n    });\n  }\n\n  public pandocReaders(): readonly PandocTokenReader[] {\n    return this.collectFrom({\n      mark: mark => mark.pandoc.readers,\n      node: node => node.pandoc.readers ?? [],\n    });\n  }\n\n  public pandocMarkWriters(): readonly PandocMarkWriter[] {\n    return this.collectFrom({\n      mark: mark => [{ name: mark.name, ...mark.pandoc.writer }],\n    });\n  }\n\n  public pandocNodeWriters(): readonly PandocNodeWriter[] {\n    return this.collectFrom({\n      node: node => {\n        return node.pandoc.writer ? [{ name: node.name, write: node.pandoc.writer! }] : [];\n      },\n    });\n  }\n\n  public commands(schema: Schema): readonly ProsemirrorCommand[] {\n    return this.collect<ProsemirrorCommand>(extension => extension.commands?.(schema));\n  }\n\n  public omniInserters(schema: Schema): OmniInserter[] {\n    const omniInserters: OmniInserter[] = [];\n    const commands = this.commands(schema);\n    commands.forEach(command => {\n      if (command.omniInsert) {\n        omniInserters.push({\n          ...command.omniInsert,\n          id: command.id,\n          command: command.execute,\n        });\n      }\n    });\n    return omniInserters;\n  }\n\n  public codeViews() {\n    const views: { [key: string]: CodeViewOptions } = {};\n    this.pandocNodes().forEach((node: PandocNode) => {\n      if (node.code_view) {\n        views[node.name] = node.code_view;\n      }\n    });\n    return views;\n  }\n\n  public attrEditors() {\n    return this.collectFrom({\n      node: node => [node.attr_edit?.()],\n    });\n  }\n\n  public baseKeys(schema: Schema): readonly BaseKeyBinding[] {\n    return this.collect(extension => extension.baseKeys?.(schema));\n  }\n\n  public appendTransactions(schema: Schema): readonly AppendTransactionHandler[] {\n    return this.collect(extension => extension.appendTransaction?.(schema));\n  }\n\n  public appendMarkTransactions(schema: Schema): readonly AppendMarkTransactionHandler[] {\n    return this.collect(extension => extension.appendMarkTransaction?.(schema));\n  }\n\n  public plugins(schema: Schema): readonly Plugin[] {\n    return this.collect(extension => extension.plugins?.(schema));\n  }\n\n  public fixups(schema: Schema, view: EditorView): readonly FixupFn[] {\n    return this.collect(extension => extension.fixups?.(schema, view));\n  }\n\n  public completionHandlers(): readonly CompletionHandler[] {\n    return this.collect(extension => extension.completionHandlers?.());\n  }\n\n  // NOTE: return value not readonly b/c it will be fed directly to a\n  // Prosemirror interface that doesn't take readonly\n  public inputRules(schema: Schema): InputRule[] {\n    const markFilter = markInputRuleFilter(schema, this.pandocMarks());\n    return this.collect<InputRule>(extension => extension.inputRules?.(schema, markFilter));\n  }\n\n  private collect<T>(collector: (extension: Extension) => readonly T[] | undefined) {\n    return this.collectFrom({\n      extension: extension => collector(extension) ?? [],\n    });\n  }\n\n  /**\n   * Visits extensions in order of registration, providing optional callbacks\n   * for extension, mark, and node. The return value of callbacks should be\n   * arrays of (T | undefined | null); these will all be concatenated together,\n   * with the undefined and nulls filtered out.\n   *\n   * @param visitor Object containing callback methods for the different\n   * extension parts.\n   */\n  private collectFrom<T>(visitor: {\n    extension?: (extension: Extension) => ReadonlyArray<T | undefined | null>;\n    mark?: (mark: PandocMark) => ReadonlyArray<T | undefined | null>;\n    node?: (node: PandocNode) => ReadonlyArray<T | undefined | null>;\n  }): T[] {\n    const results: Array<T | undefined | null> = [];\n\n    this.extensions.forEach(extension => {\n      if (visitor.extension) {\n        results.push(...visitor.extension(extension));\n      }\n      if (visitor.mark && extension.marks) {\n        results.push(...extension.marks.flatMap(visitor.mark));\n      }\n      if (visitor.node && extension.nodes) {\n        results.push(...extension.nodes.flatMap(visitor.node));\n      }\n    });\n\n    return results.filter(value => typeof value !== 'undefined' && value !== null) as T[];\n  }\n}\n","/*\n * text.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { PandocOutput, PandocToken, PandocTokenType, ProsemirrorWriter } from '../api/pandoc';\nimport { ExtensionContext } from '../api/extension';\nimport { kQuoteType, QuoteType, kQuoteChildren, fancyQuotesToSimple } from '../api/quote';\n\nconst extension = (context: ExtensionContext) => {\n  const readText = (text: string) => {\n    // we explicitly don't want fancy quotes in the editor\n    text = fancyQuotesToSimple(text);\n\n    if (context.pandocExtensions.smart) {\n      return text\n        .replace(/---/g, '—')\n        .replace(/--/g, '–')\n        .replace(/\\.\\.\\./g, '…');\n    } else {\n      return text;\n    }\n  };\n\n  return {\n    nodes: [\n      {\n        name: 'text',\n        spec: {\n          group: 'inline',\n          toDOM(node: ProsemirrorNode): any {\n            return node.text;\n          },\n        },\n        pandoc: {\n          readers: [\n            { token: PandocTokenType.Str, text: true, getText: (t: PandocToken) => readText(t.c) },\n            { token: PandocTokenType.Space, text: true, getText: () => ' ' },\n            { token: PandocTokenType.SoftBreak, text: true, getText: () => ' ' },\n            {\n              token: PandocTokenType.Quoted,\n              handler: () => (writer: ProsemirrorWriter, tok: PandocToken) => {\n                const type = tok.c[kQuoteType].t;\n                const quote = type === QuoteType.SingleQuote ? \"'\" : '\"';\n                writer.writeTokens([{ t: 'Str', c: quote }, ...tok.c[kQuoteChildren], { t: 'Str', c: quote }]);\n              },\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            const text = node.textContent;\n            output.writeText(text);\n          },\n        },\n      },\n    ],\n  };\n};\n\nexport default extension;\n","/*\n * paragraph.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { BlockCommand, EditorCommandId, ProsemirrorCommand } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { insertParagraph } from '../api/paragraph';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nconst extension: Extension = {\n  nodes: [\n    {\n      name: 'paragraph',\n      spec: {\n        content: 'inline*',\n        group: 'block list_item_block',\n        parseDOM: [{ tag: 'p' }],\n        toDOM() {\n          return ['p', 0];\n        },\n      },\n      pandoc: {\n        readers: [\n          { token: PandocTokenType.Para, block: 'paragraph' },\n          { token: PandocTokenType.Plain, block: 'paragraph' },\n        ],\n        writer: (output: PandocOutput, node: ProsemirrorNode) => {\n          output.writeToken(PandocTokenType.Para, () => {\n            output.writeInlines(node.content);\n          });\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [\n      new BlockCommand(EditorCommandId.Paragraph, ['Mod-Alt-0'], schema.nodes.paragraph, schema.nodes.paragraph),\n      new InsertParagraphCommand(),\n    ];\n  },\n};\n\nclass InsertParagraphCommand extends ProsemirrorCommand {\n  constructor() {\n    super(EditorCommandId.ParagraphInsert, [], insertParagraph);\n  }\n}\n\nexport default extension;\n","/*\n * paragraph.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { canInsertNode } from './node';\n\nexport function insertParagraph(state: EditorState, dispatch?: (tr: Transaction) => void) {\n  const schema = state.schema;\n\n  if (!canInsertNode(state, schema.nodes.paragraph)) {\n    return false;\n  }\n\n  if (dispatch) {\n    const tr = state.tr;\n    tr.replaceSelectionWith(schema.nodes.paragraph.create());\n    setTextSelection(state.selection.from + 1, 1)(tr);\n    dispatch(tr);\n  }\n\n  return true;\n}\n","/*\n * heading.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { textblockTypeInputRule, InputRule } from 'prosemirror-inputrules';\nimport { Node as ProsemirrorNode, Schema, NodeType, Fragment } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\nimport { findParentNode, findParentNodeOfType } from 'prosemirror-utils';\n\nimport { PandocOutput, PandocToken, PandocTokenType } from '../api/pandoc';\nimport { EditorCommandId, toggleBlockType, ProsemirrorCommand } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport {\n  pandocAttrSpec,\n  pandocAttrParseDom,\n  pandocAttrToDomAttr,\n  pandocAttrReadAST,\n  pandocAttrParseText,\n} from '../api/pandoc_attr';\nimport { uuidv4 } from '../api/util';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsert, OmniInsertGroup } from '../api/omni_insert';\nimport { emptyNodePlaceholderPlugin } from '../api/placeholder';\nimport { kHeadingLevel, kHeadingAttr, kHeadingChildren } from '../api/heading';\n\nconst kHeadingLevels = [1, 2, 3, 4, 5, 6];\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, format, ui } = context;\n\n  const headingAttr = pandocExtensions.header_attributes || pandocExtensions.mmd_header_identifiers;\n\n  return {\n    nodes: [\n      {\n        name: 'heading',\n        spec: {\n          attrs: {\n            level: { default: 1 },\n            link: { default: null },\n            navigation_id: { default: null },\n            ...(headingAttr ? pandocAttrSpec : {}),\n          },\n          content: 'inline*',\n          group: 'block',\n          defining: true,\n          parseDOM: [\n            { tag: 'h1', getAttrs: headingAttrs(1, headingAttr) },\n            { tag: 'h2', getAttrs: headingAttrs(2, headingAttr) },\n            { tag: 'h3', getAttrs: headingAttrs(3, headingAttr) },\n            { tag: 'h4', getAttrs: headingAttrs(4, headingAttr) },\n            { tag: 'h5', getAttrs: headingAttrs(5, headingAttr) },\n            { tag: 'h6', getAttrs: headingAttrs(6, headingAttr) },\n          ],\n          toDOM(node) {\n            const attr = headingAttr ? pandocAttrToDomAttr(node.attrs) : {};\n            attr.class = (attr.class || '').concat(' pm-heading');\n            return [\n              'h' + node.attrs.level,\n              {\n                'data-link': node.attrs.link,\n                ...attr,\n              },\n\n              0,\n            ];\n          },\n        },\n\n        attr_edit: () => {\n          if (headingAttr) {\n            return {\n              type: (schema: Schema) => schema.nodes.heading,\n              offset: {\n                top: 5,\n                right: 10,\n              },\n            };\n          } else {\n            return null;\n          }\n        },\n\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Header,\n              block: 'heading',\n              getAttrs: (tok: PandocToken) => ({\n                level: tok.c[kHeadingLevel],\n                navigation_id: uuidv4(),\n                ...(headingAttr ? pandocAttrReadAST(tok, kHeadingAttr) : {}),\n              }),\n              getChildren: (tok: PandocToken) => tok.c[kHeadingChildren],\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Header, () => {\n              output.write(node.attrs.level);\n              if (headingAttr) {\n                output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n              } else {\n                output.writeAttr();\n              }\n              output.writeArray(() => {\n                if (node.attrs.level === 1 && format.rmdExtensions.bookdownPart) {\n                  writeBookdownH1(output, node);\n                } else {\n                  output.writeInlines(node.content);\n                }\n              });\n            });\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [\n        new HeadingCommand(schema, EditorCommandId.Heading1, 1, heading1OmniInsert(ui)),\n        new HeadingCommand(schema, EditorCommandId.Heading2, 2, heading2OmniInsert(ui)),\n        new HeadingCommand(schema, EditorCommandId.Heading3, 3, heading3OmniInsert(ui)),\n        new HeadingCommand(schema, EditorCommandId.Heading4, 4, heading4OmniInsert(ui)),\n        new HeadingCommand(schema, EditorCommandId.Heading5, 5),\n        new HeadingCommand(schema, EditorCommandId.Heading6, 6),\n      ];\n    },\n\n    inputRules: (schema: Schema) => {\n      const rules = [\n        textblockTypeInputRule(\n          new RegExp('^(#{1,' + kHeadingLevels.length + '})\\\\s$'),\n          schema.nodes.heading,\n          match => ({\n            level: match[1].length,\n            navigation_id: uuidv4(),\n          }),\n        ),\n      ];\n\n      if (headingAttr) {\n        rules.push(headingAttributeInputRule(schema));\n      }\n\n      return rules;\n    },\n\n    plugins: (schema: Schema) => {\n      return [emptyHeadingPlaceholderPlugin(schema.nodes.heading, ui)];\n    },\n  };\n};\n\nfunction headingAttributeInputRule(schema: Schema) {\n  return new InputRule(/ {([^}]+)}$/, (state: EditorState, match: string[], start: number, end: number) => {\n    // only fire in headings\n    const heading = findParentNodeOfType(schema.nodes.heading)(state.selection);\n    if (heading) {\n      // try to parse the attributes\n      const attrs = pandocAttrParseText(match[1]);\n      if (attrs) {\n        const tr = state.tr;\n        tr.setNodeMarkup(heading.pos, undefined, {\n          ...heading.node.attrs,\n          ...attrs,\n        });\n        tr.deleteRange(start + 1, end);\n        return tr;\n      } else {\n        return null;\n      }\n    } else {\n      return null;\n    }\n  });\n}\n\nclass HeadingCommand extends ProsemirrorCommand {\n  public readonly nodeType: NodeType;\n  public readonly level: number;\n\n  constructor(schema: Schema, id: EditorCommandId, level: number, omniInsert?: OmniInsert) {\n    super(id, ['Mod-Alt-' + level], headingCommandFn(schema, level), omniInsert);\n    this.nodeType = schema.nodes.heading;\n    this.level = level;\n  }\n\n  public isActive(state: EditorState) {\n    const predicate = (n: ProsemirrorNode) => n.type === this.nodeType && n.attrs.level === this.level;\n    const node = findParentNode(predicate)(state.selection);\n    return !!node;\n  }\n}\n\nfunction heading1OmniInsert(ui: EditorUI) {\n  return headingOmniInsert(ui, 1, ui.context.translateText('Top level heading'), [\n    ui.images.omni_insert?.heading1!,\n    ui.images.omni_insert?.heading1_dark!,\n  ]);\n}\n\nfunction heading2OmniInsert(ui: EditorUI) {\n  return headingOmniInsert(ui, 2, ui.context.translateText('Section heading'), [\n    ui.images.omni_insert?.heading2!,\n    ui.images.omni_insert?.heading2_dark!,\n  ]);\n}\n\nfunction heading3OmniInsert(ui: EditorUI) {\n  return headingOmniInsert(ui, 3, ui.context.translateText('Sub-section heading'), [\n    ui.images.omni_insert?.heading3!,\n    ui.images.omni_insert?.heading3_dark!,\n  ]);\n}\n\nfunction heading4OmniInsert(ui: EditorUI) {\n  return headingOmniInsert(ui, 4, ui.context.translateText('Smaller heading'), [\n    ui.images.omni_insert?.heading4!,\n    ui.images.omni_insert?.heading4_dark!,\n  ]);\n}\n\nfunction headingOmniInsert(ui: EditorUI, level: number, description: string, images: [string, string]): OmniInsert {\n  return {\n    name: headingName(ui, level),\n    description,\n    group: OmniInsertGroup.Headings,\n    image: () => (ui.prefs.darkMode() ? images[1] : images[0]),\n  };\n}\n\nfunction headingName(ui: EditorUI, level: number) {\n  const kHeadingPrefix = ui.context.translateText('Heading');\n  return `${kHeadingPrefix} ${level}`;\n}\n\nfunction headingCommandFn(schema: Schema, level: number) {\n  return toggleBlockType(schema.nodes.heading, schema.nodes.paragraph, { level });\n}\n\n// function for getting attrs\nfunction headingAttrs(level: number, pandocAttrSupported: boolean) {\n  return (dom: Node | string) => {\n    const el = dom as Element;\n    return {\n      level,\n      'data-link': el.getAttribute('data-link'),\n      ...(pandocAttrSupported ? pandocAttrParseDom(el, {}) : {}),\n    };\n  };\n}\n\nfunction emptyHeadingPlaceholderPlugin(nodeType: NodeType, ui: EditorUI) {\n  return emptyNodePlaceholderPlugin(nodeType, node => headingName(ui, node.attrs.level));\n}\n\n// write a bookdown (PART) H1 w/o spurious \\\nfunction writeBookdownH1(output: PandocOutput, node: ProsemirrorNode) {\n  // see if this is a (PART\\*). note we also match and replay any text\n  // before the first ( in case the cursor sentinel ended up there\n  const partMatch = node.textContent.match(/^([^()]*)\\(PART\\\\\\*\\)/);\n  if (partMatch) {\n    const schema = node.type.schema;\n    output.writeInlines(Fragment.from(schema.text(partMatch[1] + '(PART*)')));\n    output.writeInlines(node.content.cut(partMatch[0].length));\n  } else {\n    output.writeInlines(node.content);\n  }\n}\n\nexport default extension;\n","/*\n * blockquote.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { wrappingInputRule } from 'prosemirror-inputrules';\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { WrapCommand, EditorCommandId } from '../api/command';\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nconst extension = (context: ExtensionContext) => {\n  const { ui } = context;\n\n  return {\n    nodes: [\n      {\n        name: 'blockquote',\n        spec: {\n          content: 'block+',\n          group: 'block',\n          defining: true,\n          parseDOM: [{ tag: 'blockquote' }],\n          toDOM(): DOMOutputSpec {\n            return ['blockquote', { class: 'pm-blockquote pm-block-border-color' }, 0];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.BlockQuote,\n              block: 'blockquote',\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.BlockQuote, () => {\n              output.writeNodes(node);\n            });\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [new WrapCommand(EditorCommandId.Blockquote, [], schema.nodes.blockquote, {}, blockquoteOmniInsert(ui))];\n    },\n\n    inputRules: (schema: Schema) => {\n      return [wrappingInputRule(/^\\s*>\\s$/, schema.nodes.blockquote)];\n    },\n  };\n};\n\nfunction blockquoteOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Blockquote'),\n    description: ui.context.translateText('Section quoted from another source'),\n    group: OmniInsertGroup.Blocks,\n    priority: 8,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.blockquote_dark! : ui.images.omni_insert?.blockquote!),\n  };\n}\n\nexport default extension;\n","/*\n * code_block.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { newlineInCode, exitCode } from 'prosemirror-commands';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { BlockCommand, EditorCommandId, ProsemirrorCommand, toggleBlockType } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { BaseKey } from '../api/basekeys';\nimport { codeNodeSpec } from '../api/code';\nimport { PandocOutput, PandocTokenType, PandocExtensions } from '../api/pandoc';\nimport { pandocAttrSpec, pandocAttrParseDom, pandocAttrToDomAttr } from '../api/pandoc_attr';\nimport { PandocCapabilities } from '../api/pandoc_capabilities';\nimport { EditorUI } from '../api/ui';\nimport { CodeBlockProps } from '../api/ui-dialogs';\nimport { hasFencedCodeBlocks } from '../api/pandoc_format';\nimport { precedingListItemInsertPos, precedingListItemInsert } from '../api/list';\nimport { EditorOptions } from '../api/options';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, pandocCapabilities, ui, options } = context;\n\n  const hasAttr = hasFencedCodeBlocks(pandocExtensions);\n\n  return {\n    nodes: [\n      {\n        name: 'code_block',\n\n        spec: {\n          ...codeNodeSpec(),\n          attrs: { ...(hasAttr ? pandocAttrSpec : {}) },\n          parseDOM: [\n            {\n              tag: 'pre',\n              preserveWhitespace: 'full',\n              getAttrs: (node: Node | string) => {\n                if (hasAttr) {\n                  const el = node as Element;\n                  return pandocAttrParseDom(el, {});\n                } else {\n                  return {};\n                }\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            const fontClass = 'pm-fixedwidth-font';\n            const attrs = hasAttr\n              ? pandocAttrToDomAttr({\n                  ...node.attrs,\n                  classes: [...node.attrs.classes, fontClass],\n                })\n              : {\n                  class: fontClass,\n                };\n            return ['pre', attrs, ['code', 0]];\n          },\n        },\n\n        code_view: {\n          lang: (node: ProsemirrorNode) => {\n            return codeBlockLang(node, options);\n          },\n          attrEditFn: codeBlockFormatCommandFn(pandocExtensions, ui, pandocCapabilities.highlight_languages),\n        },\n\n        attr_edit: codeBlockAttrEdit(pandocExtensions, pandocCapabilities, ui),\n\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.CodeBlock,\n              code_block: true,\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.CodeBlock, () => {\n              if (hasAttr) {\n                const id = pandocExtensions.fenced_code_attributes ? node.attrs.id : '';\n                const keyvalue = pandocExtensions.fenced_code_attributes ? node.attrs.keyvalue : [];\n                output.writeAttr(id, node.attrs.classes, keyvalue);\n              } else {\n                output.writeAttr();\n              }\n              output.write(node.textContent);\n            });\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      const commands: ProsemirrorCommand[] = [\n        new BlockCommand(EditorCommandId.CodeBlock, [], schema.nodes.code_block, schema.nodes.paragraph, {}),\n      ];\n      if (hasAttr) {\n        commands.push(new CodeBlockFormatCommand(pandocExtensions, ui, pandocCapabilities.highlight_languages));\n      }\n      return commands;\n    },\n\n    baseKeys: () => {\n      return [\n        { key: BaseKey.Enter, command: newlineInCode },\n        { key: BaseKey.ModEnter, command: exitCode },\n        { key: BaseKey.ShiftEnter, command: exitCode },\n      ];\n    },\n  };\n};\n\nclass CodeBlockFormatCommand extends ProsemirrorCommand {\n  constructor(pandocExtensions: PandocExtensions, ui: EditorUI, languages: string[]) {\n    super(\n      EditorCommandId.CodeBlockFormat,\n      ['Shift-Mod-\\\\'],\n      codeBlockFormatCommandFn(pandocExtensions, ui, languages),\n      {\n        name: ui.context.translateText('Code Block...'),\n        description: ui.context.translateText('Source code display'),\n        group: OmniInsertGroup.Blocks,\n        priority: 7,\n        image: () =>\n          ui.prefs.darkMode() ? ui.images.omni_insert?.code_block_dark! : ui.images.omni_insert?.code_block!,\n      },\n    );\n  }\n}\n\nfunction codeBlockFormatCommandFn(pandocExtensions: PandocExtensions, ui: EditorUI, languages: string[]) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    // enable if we are either inside a code block or we can toggle to a code block\n    const schema = state.schema;\n    const codeBlock = findParentNodeOfType(schema.nodes.code_block)(state.selection);\n    if (\n      !codeBlock &&\n      !toggleBlockType(schema.nodes.code_block, schema.nodes.paragraph)(state) &&\n      !precedingListItemInsertPos(state.doc, state.selection)\n    ) {\n      return false;\n    }\n\n    async function asyncEditCodeBlock() {\n      if (dispatch) {\n        // get props to edit\n        const codeBlockProps = codeBlock\n          ? { ...(codeBlock.node.attrs as CodeBlockProps), lang: '' }\n          : defaultCodeBlockProps();\n\n        // set lang if the first class is from available languages\n        // (alternatively if we don't support attributes then it's\n        // automatically considered the language)\n        if (codeBlockProps.classes && codeBlockProps.classes.length) {\n          const potentialLang = codeBlockProps.classes[0];\n          if (!pandocExtensions.fenced_code_attributes || languages.includes(potentialLang)) {\n            codeBlockProps.lang = potentialLang;\n            codeBlockProps.classes = codeBlockProps.classes.slice(1);\n          }\n        }\n\n        // show dialog\n        const result = await ui.dialogs.editCodeBlock(\n          codeBlockProps,\n          pandocExtensions.fenced_code_attributes,\n          languages,\n        );\n        if (result) {\n          // extract lang\n          const applyProps = propsWithLangClass(result);\n\n          // edit or toggle as appropriate\n          if (codeBlock) {\n            const tr = state.tr;\n            tr.setNodeMarkup(codeBlock.pos, schema.nodes.code_block, applyProps);\n            dispatch(tr);\n          } else {\n            const prevListItemPos = precedingListItemInsertPos(state.doc, state.selection);\n            if (prevListItemPos) {\n              const tr = state.tr;\n              const block = schema.nodes.code_block.create(applyProps);\n              precedingListItemInsert(tr, prevListItemPos, block);\n              dispatch(tr);\n            } else {\n              toggleBlockType(schema.nodes.code_block, schema.nodes.paragraph, applyProps)(state, dispatch, view);\n            }\n          }\n        }\n      }\n\n      if (view) {\n        view.focus();\n      }\n    }\n\n    asyncEditCodeBlock();\n\n    return true;\n  };\n}\n\nfunction defaultCodeBlockProps() {\n  return { id: '', classes: [], keyvalue: [], lang: '' };\n}\n\nfunction propsWithLangClass(props: CodeBlockProps) {\n  const newProps = { ...props };\n  if (newProps.classes && newProps.lang) {\n    newProps.classes.unshift(props.lang);\n  }\n  return newProps;\n}\n\n// determine the code block language. if it's an Rmd example (i.e. with `r ''`) and\n// we have rmdExampleHighlight enabled then use the Rmd chunk language for highlighting\nfunction codeBlockLang(node: ProsemirrorNode, options: EditorOptions) {\n  if (node.attrs.classes && node.attrs.classes.length) {\n    const lang = node.attrs.classes[0];\n    if (options.rmdExampleHighlight && lang === 'md') {\n      const match = node.textContent.match(/^```+\\s*\\{([a-zA-Z0-9_]+)( *[ ,].*)?\\}`r ''`/);\n      if (match) {\n        return match[1];\n      }\n    }\n    return lang;\n  } else {\n    return null;\n  }\n}\n\nfunction codeBlockAttrEdit(pandocExtensions: PandocExtensions, pandocCapabilities: PandocCapabilities, ui: EditorUI) {\n  return () => {\n    if (hasFencedCodeBlocks(pandocExtensions)) {\n      return {\n        type: (schema: Schema) => schema.nodes.code_block,\n        tags: (node: ProsemirrorNode) => {\n          const tags: string[] = [];\n          if (node.attrs.id) {\n            tags.push(`#${node.attrs.id}`);\n          }\n          if (node.attrs.classes && node.attrs.classes.length) {\n            const lang = node.attrs.classes[0];\n            if (pandocCapabilities.highlight_languages.includes(lang) || lang === 'tex') {\n              tags.push(lang);\n            } else {\n              tags.push(`.${lang}`);\n            }\n          }\n          return tags;\n        },\n        offset: {\n          top: 3,\n          right: 0,\n        },\n        editFn: () => codeBlockFormatCommandFn(pandocExtensions, ui, pandocCapabilities.highlight_languages),\n      };\n    } else {\n      return null;\n    }\n  };\n}\n\nexport default extension;\n","/*\n * list.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { liftListItem, sinkListItem, splitListItem } from 'prosemirror-schema-list';\nimport { Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { BaseKey } from '../../api/basekeys';\nimport { EditorUI, kListSpacingTight } from '../../api/ui';\nimport { ListCapabilities } from '../../api/list';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocTokenType } from '../../api/pandoc';\nimport { kPlatformMac } from '../../api/platform';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { conditionalWrappingInputRule } from '../../api/input_rule';\n\nimport { ListCommand, TightListCommand, EditListPropertiesCommand, editListPropertiesCommandFn } from './list-commands';\n\nimport {\n  CheckedListItemNodeView,\n  checkedListItemInputRule,\n  checkedListInputRule,\n  CheckedListItemCommand,\n  CheckedListItemToggleCommand,\n} from './list-checked';\n\nimport { writePandocBulletList, writePandocOrderedList, readPandocList } from './list-pandoc';\n\nimport './list-styles.css';\n\nexport enum ListNumberStyle {\n  DefaultStyle = 'DefaultStyle',\n  Decimal = 'Decimal',\n  LowerRoman = 'LowerRoman',\n  UpperRoman = 'UpperRoman',\n  LowerAlpha = 'LowerAlpha',\n  UpperAlpha = 'UpperAlpha',\n  Example = 'Example',\n}\n\n// NOTE: HTML output doesn't currently respect this and it's difficult to\n// do with CSS (especially for nested lists). So we allow the user to edit\n// it but it isn't reflected in the editor.\nexport enum ListNumberDelim {\n  DefaultDelim = 'DefaultDelim',\n  Period = 'Period',\n  OneParen = 'OneParen',\n  TwoParens = 'TwoParens',\n}\n\nconst plugin = new PluginKey('list');\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, ui } = context;\n\n  // determine list capabilities based on active format options\n  const capabilities: ListCapabilities = {\n    tasks: pandocExtensions.task_lists,\n    fancy: pandocExtensions.fancy_lists,\n    /*\n     Always disable example lists b/c they don't round trip through the AST:\n      - (@good) referenced elsewhere via (@good) just becomes a generic example (@) with \n        a literal numeric reference.\n      - The writer doesn't preserve the (@) or the (@good) when writing\n    */\n    // example: pandocExtensions.fancy_lists && pandocExtensions.example_lists,\n    example: false,\n    order: pandocExtensions.startnum,\n  };\n\n  return {\n    nodes: [\n      {\n        name: 'list_item',\n        spec: {\n          content: 'list_item_block block*',\n          attrs: {\n            checked: { default: null },\n          },\n          defining: true,\n          parseDOM: [\n            {\n              tag: 'li',\n              getAttrs: (dom: Node | string) => {\n                const el = dom as Element;\n                const attrs: any = {};\n                if (capabilities.tasks && el.hasAttribute('data-checked')) {\n                  attrs.checked = el.getAttribute('data-checked') === 'true';\n                }\n                return attrs;\n              },\n            },\n          ],\n          toDOM(node) {\n            const attrs: any = {\n              class: 'pm-list-item',\n            };\n            if (capabilities.tasks && node.attrs.checked !== null) {\n              attrs['data-checked'] = node.attrs.checked ? 'true' : 'false';\n            }\n            return ['li', attrs, 0];\n          },\n        },\n        pandoc: {},\n      },\n      {\n        name: 'bullet_list',\n        spec: {\n          content: 'list_item+',\n          group: 'block',\n          attrs: {\n            tight: { default: false },\n          },\n          parseDOM: [\n            {\n              tag: 'ul',\n              getAttrs: (dom: Node | string) => {\n                const el = dom as Element;\n                const attrs: any = {};\n                if (el.hasAttribute('data-tight')) {\n                  attrs.tight = true;\n                }\n                return attrs;\n              },\n            },\n          ],\n          toDOM(node) {\n            const attrs: { [key: string]: string } = {};\n            attrs.class = 'pm-list pm-bullet-list';\n            if (node.attrs.tight) {\n              attrs['data-tight'] = 'true';\n            }\n            return ['ul', attrs, 0];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.BulletList,\n              handler: (schema: Schema) => readPandocList(schema.nodes.bullet_list, capabilities),\n            },\n          ],\n          writer: writePandocBulletList(capabilities),\n        },\n\n        attr_edit: listAttrEdit('bullet_list', capabilities, ui),\n      },\n      {\n        name: 'ordered_list',\n        spec: {\n          content: 'list_item+',\n          group: 'block',\n          attrs: {\n            tight: { default: false },\n            order: { default: 1 },\n            number_style: { default: ListNumberStyle.DefaultStyle },\n            number_delim: { default: ListNumberDelim.DefaultDelim },\n          },\n          parseDOM: [\n            {\n              tag: 'ol',\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n\n                const attrs: any = {};\n                attrs.tight = el.hasAttribute('data-tight');\n\n                if (capabilities.order) {\n                  const order: string | null = el.getAttribute('start');\n                  if (!order) {\n                    attrs.order = 1;\n                  } else {\n                    attrs.order = parseInt(order, 10) || 1;\n                  }\n                }\n\n                if (capabilities.fancy) {\n                  if (capabilities.example && el.getAttribute('data-example')) {\n                    attrs.number_style = ListNumberStyle.Example;\n                  } else {\n                    attrs.number_style = typeToNumberStyle(el.getAttribute('type'));\n                  }\n                  const numberDelim = el.getAttribute('data-number-delim');\n                  if (numberDelim) {\n                    attrs.number_delim = numberDelim;\n                  }\n                }\n\n                return attrs;\n              },\n            },\n          ],\n          toDOM(node) {\n            const attrs: { [key: string]: string } = {};\n            attrs.class = 'pm-list pm-ordered-list';\n            if (node.attrs.tight) {\n              attrs['data-tight'] = 'true';\n            }\n            if (capabilities.order && node.attrs.order !== 1) {\n              attrs.start = node.attrs.order;\n            }\n            if (capabilities.fancy) {\n              const type = numberStyleToType(node.attrs.number_style);\n              if (type) {\n                attrs.type = type;\n              }\n              if (capabilities.example) {\n                if (node.attrs.number_style === ListNumberStyle.Example) {\n                  attrs['data-example'] = '1';\n                }\n              }\n              attrs['data-number-delim'] = node.attrs.number_delim;\n            }\n            return ['ol', attrs, 0];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.OrderedList,\n              handler: (schema: Schema) => readPandocList(schema.nodes.ordered_list, capabilities),\n            },\n          ],\n          writer: writePandocOrderedList(capabilities),\n        },\n\n        attr_edit: listAttrEdit('ordered_list', capabilities, ui),\n      },\n    ],\n\n    plugins: (schema: Schema) => {\n      const plugins: Plugin[] = [];\n      if (capabilities.tasks) {\n        plugins.push(\n          new Plugin({\n            key: plugin,\n            props: {\n              nodeViews: {\n                list_item(node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) {\n                  return new CheckedListItemNodeView(node, view, getPos as () => number);\n                },\n              },\n            },\n          }),\n        );\n      }\n      return plugins;\n    },\n\n    commands: (schema: Schema) => {\n      const commands = [\n        new ListCommand(\n          EditorCommandId.BulletList,\n          kPlatformMac ? ['Shift-Mod-8'] : [],\n          schema.nodes.bullet_list,\n          schema.nodes.list_item,\n          bulletListOmniInsert(ui),\n          ui.prefs,\n        ),\n        new ListCommand(\n          EditorCommandId.OrderedList,\n          kPlatformMac ? ['Shift-Mod-7'] : [],\n          schema.nodes.ordered_list,\n          schema.nodes.list_item,\n          orderedListOmniInsert(ui),\n          ui.prefs,\n        ),\n        new ProsemirrorCommand(EditorCommandId.ListItemSink, ['Tab'], sinkListItem(schema.nodes.list_item)),\n        new ProsemirrorCommand(EditorCommandId.ListItemLift, ['Shift-Tab'], liftListItem(schema.nodes.list_item)),\n        new ProsemirrorCommand(EditorCommandId.ListItemSplit, ['Enter'], splitListItem(schema.nodes.list_item)),\n        new TightListCommand(),\n      ];\n      if (capabilities.fancy) {\n        commands.push(new EditListPropertiesCommand(ui, capabilities));\n      }\n      if (capabilities.tasks) {\n        commands.push(\n          new CheckedListItemCommand(schema.nodes.list_item),\n          new CheckedListItemToggleCommand(schema.nodes.list_item),\n        );\n      }\n      return commands;\n    },\n\n    baseKeys: (schema: Schema) => {\n      return [\n        { key: BaseKey.Enter, command: splitListItem(schema.nodes.list_item) },\n        { key: BaseKey.Tab, command: sinkListItem(schema.nodes.list_item) },\n        { key: BaseKey.ShiftTab, command: liftListItem(schema.nodes.list_item) },\n      ];\n    },\n\n    inputRules: (schema: Schema) => {\n      // reflect tight pref\n      const tightFn = () => {\n        return {\n          tight: ui.prefs.listSpacing() === kListSpacingTight,\n        };\n      };\n\n      const isNotInHeading = (state: EditorState) => {\n        return !findParentNodeOfType(schema.nodes.heading)(state.selection);\n      };\n\n      const rules = [\n        conditionalWrappingInputRule(/^\\s*([-+*])\\s$/, schema.nodes.bullet_list, isNotInHeading, tightFn),\n        conditionalWrappingInputRule(\n          /^(\\d+)\\.\\s$/,\n          schema.nodes.ordered_list,\n          isNotInHeading,\n          match => ({ order: +match[1], tight: tightFn() }),\n          (match, node) => node.childCount + node.attrs.order === +match[1],\n        ),\n      ];\n      if (capabilities.tasks) {\n        rules.push(checkedListItemInputRule(), checkedListInputRule(schema));\n      }\n      return rules;\n    },\n  };\n};\n\nfunction listAttrEdit(type: string, capabilities: ListCapabilities, ui: EditorUI) {\n  return () => {\n    return {\n      type: (schema: Schema) => schema.nodes[type],\n      editFn: () => editListPropertiesCommandFn(ui, capabilities),\n      offset: {\n        top: 5,\n        right: 5,\n      },\n    };\n  };\n}\n\nfunction numberStyleToType(style: ListNumberStyle): string | null {\n  switch (style) {\n    case ListNumberStyle.DefaultStyle:\n    case ListNumberStyle.Decimal:\n    case ListNumberStyle.Example:\n      return 'l';\n    case ListNumberStyle.LowerAlpha:\n      return 'a';\n    case ListNumberStyle.UpperAlpha:\n      return 'A';\n    case ListNumberStyle.LowerRoman:\n      return 'i';\n    case ListNumberStyle.UpperRoman:\n      return 'I';\n    default:\n      return null;\n  }\n}\n\nfunction typeToNumberStyle(type: string | null): ListNumberStyle {\n  switch (type) {\n    case 'l':\n      return ListNumberStyle.Decimal;\n    case 'a':\n      return ListNumberStyle.LowerAlpha;\n    case 'A':\n      return ListNumberStyle.UpperAlpha;\n    case 'i':\n      return ListNumberStyle.LowerRoman;\n    case 'I':\n      return ListNumberStyle.UpperRoman;\n    default:\n      return ListNumberStyle.Decimal;\n  }\n}\n\nfunction bulletListOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Bullet List'),\n    description: ui.context.translateText('List using bullets for items'),\n    group: OmniInsertGroup.Lists,\n    priority: 5,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.bullet_list_dark! : ui.images.omni_insert?.bullet_list!),\n  };\n}\n\nfunction orderedListOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Numbered List'),\n    description: ui.context.translateText('List using numbers for items'),\n    group: OmniInsertGroup.Lists,\n    priority: 4,\n    image: () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.ordered_list_dark! : ui.images.omni_insert?.ordered_list!,\n  };\n}\n\nexport default extension;\n","/*\n * list-commands.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeType, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { autoJoin } from 'prosemirror-commands';\nimport { NodeWithPos, findParentNode } from 'prosemirror-utils';\n\nimport { NodeCommand, toggleList, ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { EditorUI, EditorUIPrefs } from '../../api/ui';\nimport { ListProps } from '../../api/ui-dialogs';\nimport { ListType, ListCapabilities, isList } from '../../api/list';\nimport { OmniInsert } from '../../api/omni_insert';\n\nexport class ListCommand extends NodeCommand {\n  constructor(\n    id: EditorCommandId,\n    keymap: string[],\n    listType: NodeType,\n    listItemType: NodeType,\n    omniInsert: OmniInsert,\n    prefs: EditorUIPrefs,\n  ) {\n    super(id, keymap, listType, {}, autoJoin(toggleList(listType, listItemType, prefs), [listType.name]), omniInsert);\n  }\n}\n\nexport class TightListCommand extends ProsemirrorCommand {\n  constructor() {\n    super(\n      EditorCommandId.TightList,\n      ['Mod-Alt-9'],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        const parentList = findParentNode(isList)(state.selection);\n        if (!parentList) {\n          return false;\n        }\n\n        if (dispatch) {\n          const tr = state.tr;\n          const node = parentList.node;\n          tr.setNodeMarkup(parentList.pos, node.type, {\n            ...node.attrs,\n            tight: !node.attrs.tight,\n          });\n          dispatch(tr);\n        }\n\n        return true;\n      },\n    );\n  }\n\n  public isActive(state: EditorState): boolean {\n    if (this.isEnabled(state)) {\n      const itemNode = findParentNode(isList)(state.selection) as NodeWithPos;\n      return itemNode.node.attrs.tight;\n    } else {\n      return false;\n    }\n  }\n}\n\nexport function editListPropertiesCommandFn(ui: EditorUI, capabilities: ListCapabilities) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    // see if a parent node is a list\n    let node: ProsemirrorNode | null = null;\n    let pos: number = 0;\n    const nodeWithPos = findParentNode(isList)(state.selection);\n    if (nodeWithPos) {\n      node = nodeWithPos.node;\n      pos = nodeWithPos.pos;\n    }\n\n    // return false (disabled) for no targets\n    if (!node) {\n      return false;\n    }\n\n    // execute command when requested\n    async function asyncEditList() {\n      if (dispatch) {\n        await editList(node as ProsemirrorNode, pos, state, dispatch, ui, capabilities);\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncEditList();\n\n    return true;\n  };\n}\n\nexport class EditListPropertiesCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI, capabilities: ListCapabilities) {\n    super(EditorCommandId.EditListProperties, [], editListPropertiesCommandFn(ui, capabilities));\n  }\n}\n\nasync function editList(\n  node: ProsemirrorNode,\n  pos: number,\n  state: EditorState,\n  dispatch: (tr: Transaction<any>) => void,\n  ui: EditorUI,\n  capabilities: ListCapabilities,\n): Promise<void> {\n  // get list properties\n  const schema = node.type.schema;\n  const attrs = node.attrs;\n  const props = {\n    ...attrs,\n    type: node.type === schema.nodes.ordered_list ? ListType.Ordered : ListType.Bullet,\n  } as ListProps;\n\n  // edit list\n  const result = await ui.dialogs.editList(props, capabilities);\n\n  // apply result\n  if (result) {\n    const tr = state.tr;\n    const listType = result.type === ListType.Ordered ? schema.nodes.ordered_list : schema.nodes.bullet_list;\n    tr.setNodeMarkup(pos, listType, {\n      ...attrs,\n      ...result,\n    });\n    dispatch(tr);\n  }\n}\n","/*\n * list-checked.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, NodeType } from 'prosemirror-model';\nimport { NodeView, EditorView } from 'prosemirror-view';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNodeOfType, NodeWithPos, setTextSelection } from 'prosemirror-utils';\nimport { InputRule, wrappingInputRule } from 'prosemirror-inputrules';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocToken, mapTokens } from '../../api/pandoc';\n\n// custom NodeView that accomodates display / interaction with item check boxes\nexport class CheckedListItemNodeView implements NodeView {\n  public readonly dom: HTMLElement;\n  public readonly contentDOM: HTMLElement;\n\n  private readonly node: ProsemirrorNode;\n  private readonly view: EditorView;\n  private readonly getPos: () => number;\n\n  constructor(node: ProsemirrorNode, view: EditorView, getPos: () => number) {\n    this.node = node;\n    this.view = view;\n    this.getPos = getPos;\n\n    // create root li element\n    this.dom = window.document.createElement('li');\n    if (node.attrs.tight) {\n      this.dom.setAttribute('data-tight', 'true');\n    }\n\n    const container = window.document.createElement('div');\n    container.classList.add('list-item-container');\n    this.dom.appendChild(container);\n\n    // add checkbox for checked items\n    if (node.attrs.checked !== null) {\n      this.dom.setAttribute('data-checked', node.attrs.checked ? 'true' : 'false');\n\n      // checkbox for editing checked state\n      const input = window.document.createElement('input');\n      input.classList.add('list-item-checkbox');\n      input.setAttribute('type', 'checkbox');\n      input.checked = node.attrs.checked;\n      input.contentEditable = 'false';\n      input.disabled = !(view as any).editable;\n      input.addEventListener('mousedown', (ev: Event) => {\n        ev.preventDefault(); // don't steal focus\n      });\n      input.addEventListener('change', (ev: Event) => {\n        const tr = view.state.tr;\n        tr.setNodeMarkup(getPos(), node.type, {\n          ...node.attrs,\n          checked: (ev.target as HTMLInputElement).checked,\n        });\n        setTextSelection(getPos() + 1)(tr);\n        view.dispatch(tr);\n      });\n      container.appendChild(input);\n    }\n\n    // content div\n    const content = window.document.createElement('div');\n    content.classList.add('list-item-content');\n    this.contentDOM = content;\n    container.appendChild(content);\n  }\n}\n\n// command to toggle checked list items\nexport function checkedListItemCommandFn(itemType: NodeType) {\n  return (state: EditorState, dispatch?: ((tr: Transaction) => void) | undefined) => {\n    const itemNode = findParentNodeOfType(itemType)(state.selection);\n    if (!itemNode) {\n      return false;\n    }\n\n    if (dispatch) {\n      const tr = state.tr;\n      if (itemNode.node.attrs.checked !== null) {\n        setItemChecked(tr, itemNode, null);\n      } else {\n        setItemChecked(tr, itemNode, false);\n      }\n\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nexport function checkedListItemToggleCommandFn(itemType: NodeType) {\n  return (state: EditorState, dispatch?: ((tr: Transaction) => void) | undefined) => {\n    const itemNode = findParentNodeOfType(itemType)(state.selection);\n    if (!itemNode || itemNode.node.attrs.checked === null) {\n      return false;\n    }\n\n    if (dispatch) {\n      const tr = state.tr;\n      setItemChecked(tr, itemNode, !itemNode.node.attrs.checked);\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nexport class CheckedListItemCommand extends ProsemirrorCommand {\n  constructor(itemType: NodeType) {\n    super(EditorCommandId.ListItemCheck, [], checkedListItemCommandFn(itemType));\n  }\n\n  public isActive(state: EditorState): boolean {\n    if (this.isEnabled(state)) {\n      const itemNode = findParentNodeOfType(state.schema.nodes.list_item)(state.selection) as NodeWithPos;\n      return itemNode.node.attrs.checked !== null;\n    } else {\n      return false;\n    }\n  }\n}\n\nexport class CheckedListItemToggleCommand extends ProsemirrorCommand {\n  private itemType: NodeType;\n\n  constructor(itemType: NodeType) {\n    super(EditorCommandId.ListItemCheckToggle, [], checkedListItemToggleCommandFn(itemType));\n    this.itemType = itemType;\n  }\n\n  public isActive(state: EditorState): boolean {\n    const itemNode = findParentNodeOfType(this.itemType)(state.selection);\n    return itemNode && itemNode.node.attrs.checked;\n  }\n}\n\n// allow users to type [x] or [ ] to define a checked list item\nexport function checkedListItemInputRule() {\n  return new InputRule(/\\[([ x])\\]\\s$/, (state: EditorState, match: string[], start: number, end: number) => {\n    const schema = state.schema;\n\n    const itemNode = findParentNodeOfType(schema.nodes.list_item)(state.selection);\n    if (itemNode) {\n      // create transaction\n      const tr = state.tr;\n\n      // set checked\n      setItemChecked(tr, itemNode, match[1]);\n\n      // delete entered text\n      tr.delete(start, end);\n\n      // return transaction\n      return tr;\n    } else {\n      return null;\n    }\n  });\n}\n\n// allow users to begin a new checked list by typing [x] or [ ] at the beginning of a line\nexport function checkedListInputRule(schema: Schema) {\n  // regex to match checked list at the beginning of a line\n  const regex = /^\\s*\\[([ x])\\]\\s$/;\n\n  // we are going to steal the handler from the base bullet list wrapping input rule\n  const baseInputRule: any = wrappingInputRule(regex, schema.nodes.bullet_list);\n\n  return new InputRule(regex, (state: EditorState, match: string[], start: number, end: number) => {\n    // call the base handler to create the bullet list\n    const tr = baseInputRule.handler(state, match, start, end);\n    if (tr) {\n      // set the checkbox\n      const itemNode = findParentNodeOfType(schema.nodes.list_item)(tr.selection);\n      if (itemNode) {\n        setItemChecked(tr, itemNode, match[1]);\n      }\n\n      return tr;\n    } else {\n      return null;\n    }\n  });\n}\n\nfunction setItemChecked(tr: Transaction, itemNode: NodeWithPos, check: null | boolean | string) {\n  tr.setNodeMarkup(itemNode.pos, itemNode.node.type, {\n    ...itemNode.node.attrs,\n    checked: check === null ? null : typeof check === 'string' ? check === 'x' : check,\n  });\n}\n// prepend a check mark to the provided fragment\nexport function fragmentWithCheck(schema: Schema, fragment: Fragment, checked: boolean) {\n  // create a raw markdown node with [x] or [ ]\n  const mark = schema.marks.raw_inline.create({ format: 'markdown' });\n  const check = schema.text((checked ? '[x]' : '[ ]') + ' ', [mark]);\n  return Fragment.from(check).append(fragment);\n}\n\nconst kCheckedChar = '☒';\nconst kUncheckedChar = '☐';\n\nexport function tokensWithChecked(tokens: PandocToken[]): { checked: null | boolean; tokens: PandocToken[] } {\n  // will set this flag based on inspecting the first Str token\n  let checked: null | boolean | undefined;\n  let lastWasChecked = false;\n\n  // map tokens\n  const mappedTokens = mapTokens(tokens, tok => {\n    // if the last token was checked then strip the next space\n    if (tok.t === 'Space' && lastWasChecked) {\n      lastWasChecked = false;\n      return {\n        t: 'Str',\n        c: '',\n      };\n    }\n\n    // derive 'checked' from first chraracter of first Str token encountered\n    // if we find checked or unchecked then set the flag and strip off\n    // the first 2 chraracters (the check and the space after it)\n    else if (tok.t === 'Str' && checked === undefined) {\n      let text = tok.c as string;\n      if (text.charAt(0) === kCheckedChar) {\n        checked = true;\n        lastWasChecked = true;\n        text = text.slice(1);\n      } else if (text.charAt(0) === kUncheckedChar) {\n        checked = false;\n        lastWasChecked = true;\n        text = text.slice(1);\n      } else {\n        checked = null;\n      }\n      return {\n        t: 'Str',\n        c: text,\n      };\n    } else {\n      return tok;\n    }\n  });\n\n  // return\n  return {\n    checked: checked !== undefined ? checked : null,\n    tokens: mappedTokens,\n  };\n}\n","/*\n * list-pandoc.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType, Fragment } from 'prosemirror-model';\n\nimport { PandocOutput, PandocToken, ProsemirrorWriter, PandocTokenType } from '../../api/pandoc';\n\nimport { fragmentWithCheck, tokensWithChecked } from './list-checked';\nimport { ListNumberDelim, ListNumberStyle } from './list';\nimport { ListCapabilities } from '../../api/list';\n\nconst LIST_ATTRIBS = 0;\nconst LIST_CHILDREN = 1;\n\nconst LIST_ATTRIB_ORDER = 0;\nconst LIST_ATTRIB_NUMBER_STYLE = 1;\nconst LIST_ATTRIB_NUMBER_DELIM = 2;\n\n// Note that we are planning on eliminating the markdownOutputFilter after this commit\n// as there will be no more uses of it and it plays poorly w/ e.g. pandoc table output\n// which needs to reliably know the number of characters wide each column will be).\n// (previous uses of markdownOutputFilter were converted to use output.writeRawMarkdown).\n// So, if we are attempting to re-enable example lists b/c there is now round tripping\n// of example lists through the pandoc AST we need an alternative way to fixup\n// example list output (likely a more robust pandoc AST).\nconst kListItemExampleSentinel = '20543127-1873-4833-AC49-5B352CFA2AF5';\nconst kListItemExampleRegex = new RegExp(`\\\\(\\\\d+\\\\) ${kListItemExampleSentinel}`, 'g');\n\nexport function readPandocList(nodeType: NodeType, capabilities: ListCapabilities) {\n  // alias schema\n  const schema = nodeType.schema;\n\n  // default extraction functions\n  let getChildren = (tok: PandocToken) => tok.c;\n  let getAttrs = (tok: PandocToken): { [key: string]: any } => ({});\n\n  // function to read the number style (convert example to default if we\n  // don't support example lists)\n  const readNumberStyle = (attribs: any) => {\n    if (capabilities.fancy) {\n      const style = attribs[LIST_ATTRIB_NUMBER_STYLE].t;\n      if (style === ListNumberStyle.Example && !capabilities.example) {\n        return ListNumberStyle.DefaultStyle;\n      } else {\n        return style;\n      }\n    } else {\n      return ListNumberStyle.DefaultStyle;\n    }\n  };\n\n  // specialize for ordered_list\n  if (nodeType === schema.nodes.ordered_list) {\n    getAttrs = (tok: PandocToken) => {\n      const attribs = tok.c[LIST_ATTRIBS];\n      return {\n        order: capabilities.order ? attribs[LIST_ATTRIB_ORDER] : 1,\n        number_style: readNumberStyle(attribs),\n        number_delim: capabilities.fancy ? attribs[LIST_ATTRIB_NUMBER_DELIM].t : ListNumberDelim.DefaultDelim,\n      };\n    };\n    getChildren = (tok: PandocToken) => tok.c[LIST_CHILDREN];\n  }\n\n  const listItemNodeType = schema.nodes.list_item;\n  return (writer: ProsemirrorWriter, tok: PandocToken) => {\n    const children = getChildren(tok);\n    const attrs = getAttrs(tok);\n    attrs.tight = children.length && children[0].length && children[0][0].t === 'Plain';\n    writer.openNode(nodeType, attrs);\n    children.forEach((child: PandocToken[]) => {\n      // setup tokens/attribs for output\n      let tokens = child;\n      const childAttrs: { checked: null | boolean } = { checked: null };\n\n      // special task list processing if the current format supports task lists\n      if (capabilities.tasks) {\n        // look for checkbox in first character of child tokens\n        // if we see it, remove it and set childAttrs.checked as appropriate\n        const childWithChecked = tokensWithChecked(child);\n        childAttrs.checked = childWithChecked.checked;\n        tokens = childWithChecked.tokens;\n      }\n\n      // process children\n      writer.openNode(listItemNodeType, childAttrs);\n      writer.writeTokens(tokens);\n      writer.closeNode();\n    });\n    writer.closeNode();\n  };\n}\n\nexport function writePandocOrderedList(capabilities: ListCapabilities) {\n  return (output: PandocOutput, node: ProsemirrorNode) => {\n    // alias some list options\n    const options = listNodeOptions(node, capabilities);\n\n    // force delim to two parens for example styles. we do this\n    // to simplify the search/replace of example list sentinels\n    // during conversion post-processing\n    const delim = options.example ? ListNumberDelim.TwoParens : node.attrs.number_delim;\n\n    output.writeToken(PandocTokenType.OrderedList, () => {\n      output.writeArray(() => {\n        output.write(capabilities.order ? node.attrs.order : 1);\n        output.writeToken(capabilities.fancy ? node.attrs.number_style : ListNumberStyle.DefaultStyle);\n        output.writeToken(capabilities.fancy ? delim : ListNumberDelim.DefaultDelim);\n      });\n      output.writeArray(() => {\n        node.forEach(item => writePandocListItem(output, options, item));\n      });\n    });\n  };\n}\n\nexport function writePandocBulletList(capabilities: ListCapabilities) {\n  return (output: PandocOutput, node: ProsemirrorNode) => {\n    output.writeToken(PandocTokenType.BulletList, () => {\n      node.forEach(item => writePandocListItem(output, listNodeOptions(node, capabilities), item));\n    });\n  };\n}\n\nexport function exampleListPandocMarkdownOutputFilter(markdown: string) {\n  return markdown.replace(kListItemExampleRegex, '(@) ');\n}\n\ninterface ListNodeOptions {\n  tight: boolean;\n  example: boolean;\n}\n\nfunction listNodeOptions(node: ProsemirrorNode, capabilities: ListCapabilities): ListNodeOptions {\n  const options = {\n    tight: node.attrs.tight,\n    example: capabilities.example ? node.attrs.number_style === ListNumberStyle.Example : false,\n  };\n\n  // if it's tight see if we need to override b/c of multiple blocks\n  node.forEach(item => {\n    if (options.tight && item.childCount > 1) {\n      options.tight = false;\n    }\n  });\n\n  return options;\n}\n\nfunction writePandocListItem(output: PandocOutput, options: ListNodeOptions, node: ProsemirrorNode) {\n  const checked = node.attrs.checked;\n\n  output.writeArray(() => {\n    node.forEach((itemNode: ProsemirrorNode, _offset, index) => {\n      if (itemNode.type === node.type.schema.nodes.paragraph) {\n        const paraItemBlockType = options.tight ? PandocTokenType.Plain : PandocTokenType.Para;\n        output.writeToken(paraItemBlockType, () => {\n          // for first item block, prepend check mark if we have one\n          if (checked !== null && index === 0) {\n            writeListItemInlines(\n              output,\n              options.example,\n              fragmentWithCheck(node.type.schema, itemNode.content, checked),\n              index,\n            );\n          } else {\n            writeListItemInlines(output, options.example, itemNode.content, index);\n          }\n        });\n      } else {\n        output.writeNode(itemNode);\n      }\n    });\n  });\n}\n\nfunction writeListItemInlines(output: PandocOutput, example: boolean, fragment: Fragment, index: number) {\n  if (index === 0 && example) {\n    output.writeToken(PandocTokenType.Str, kListItemExampleSentinel);\n  }\n  output.writeInlines(fragment);\n}\n","/*\n * image.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { EditorState, NodeSelection, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { canInsertNode } from '../../api/node';\nimport { selectionIsImageNode, selectionIsEmptyParagraph } from '../../api/selection';\nimport {\n  pandocAttrSpec,\n  pandocAttrParseDom,\n  pandocAttrToDomAttr,\n  pandocAttrReadAST,\n  pandocAttrAvailable,\n} from '../../api/pandoc_attr';\nimport {\n  PandocOutput,\n  PandocTokenType,\n  ProsemirrorWriter,\n  PandocToken,\n  stringifyTokens,\n  imageAttributesAvailable,\n} from '../../api/pandoc';\nimport { EditorUI } from '../../api/ui';\nimport { ImageDimensions } from '../../api/image';\nimport { asHTMLTag } from '../../api/html';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { imageDialog } from './image-dialog';\nimport { imageDimensionsFromImg, imageContainerWidth, inlineHTMLIsImage } from './image-util';\nimport { imageTextSelectionPlugin } from './image-textsel';\nimport { posHasProhibitedFigureParent } from './figure';\nimport { imageEventsPlugin } from './image-events';\nimport { imageNodeViewPlugins } from './image-view';\n\nconst TARGET_URL = 0;\nconst TARGET_TITLE = 1;\n\nconst IMAGE_ATTR = 0;\nconst IMAGE_ALT = 1;\nconst IMAGE_TARGET = 2;\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, ui, events } = context;\n\n  const imageAttr = imageAttributesAvailable(pandocExtensions);\n\n  return {\n    nodes: [\n      {\n        name: 'image',\n        spec: {\n          inline: true,\n          attrs: imageNodeAttrsSpec(false, imageAttr),\n          group: 'inline',\n          draggable: true,\n          parseDOM: [\n            {\n              tag: 'img[src]',\n              getAttrs(dom: Node | string) {\n                return imageAttrsFromDOM(dom as Element, imageAttr);\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return imageDOMOutputSpec(node, imageAttr);\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Image,\n              handler: pandocImageHandler(false, imageAttr),\n            },\n          ],\n          inlineHTMLReader: pandocExtensions.raw_html ? imageInlineHTMLReader : undefined,\n          writer: imagePandocOutputWriter(false, ui),\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.image,\n          noDecorator: true,\n          editFn: () => imageCommand(ui, imageAttr),\n        }),\n      },\n    ],\n\n    commands: (_schema: Schema) => {\n      return [\n        new ProsemirrorCommand(\n          EditorCommandId.Image,\n          ['Shift-Mod-i'],\n          imageCommand(ui, imageAttr),\n          imageOmniInsert(ui),\n        ),\n      ];\n    },\n\n    plugins: (schema: Schema) => {\n      return [\n        imageTextSelectionPlugin(),\n        imageEventsPlugin(ui),\n        ...imageNodeViewPlugins('image', ui, events, pandocExtensions),\n      ];\n    },\n  };\n};\n\nexport function pandocImageHandler(figure: boolean, imageAttributes: boolean) {\n  return (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => {\n    // get attributes\n    const target = tok.c[IMAGE_TARGET];\n    const attrs = {\n      src: decodeURI(target[TARGET_URL]),\n      title: readPandocTitle(target[TARGET_TITLE]),\n      alt: '',\n      ...(imageAttributes ? pandocAttrReadAST(tok, IMAGE_ATTR) : {}),\n    };\n\n    // add alt as plain text if it's not a figure\n    if (!figure) {\n      attrs.alt = stringifyTokens(tok.c[IMAGE_ALT]);\n    }\n\n    // read image and (if appropriate) children\n    writer.openNode(figure ? schema.nodes.figure : schema.nodes.image, attrs);\n    if (figure) {\n      writer.writeTokens(tok.c[IMAGE_ALT]);\n    }\n    writer.closeNode();\n  };\n}\n\nexport function imagePandocOutputWriter(figure: boolean, ui: EditorUI) {\n  return (output: PandocOutput, node: ProsemirrorNode) => {\n    // default writer for markdown images\n    let writer = () => {\n      output.writeToken(PandocTokenType.Image, () => {\n        if (output.extensions.link_attributes) {\n          output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n        } else {\n          output.writeAttr();\n        }\n        output.writeArray(() => {\n          if (figure) {\n            output.writeInlines(node.content);\n          } else {\n            output.writeText(node.attrs.alt);\n          }\n        });\n        output.write([encodeURI(node.attrs.src), node.attrs.title || '']);\n      });\n    };\n\n    // see if we need to write raw html\n    const requireHTML =\n      pandocAttrAvailable(node.attrs) && // attribs need to be written\n      !output.extensions.link_attributes && // markdown attribs not supported\n      output.extensions.raw_html; // raw html is supported\n\n    // if we do, then substitute a raw html writer\n    if (node.attrs.raw || requireHTML) {\n      writer = () => {\n        const imgAttr = imageDOMAttributes(node, true, false);\n        const html = asHTMLTag('img', imgAttr, true, true);\n        output.writeRawMarkdown(html);\n      };\n    }\n\n    // write (wrap in paragraph and possibly link for  figures)\n    if (figure) {\n      let writeFigure = writer;\n      if (node.attrs.linkTo) {\n        writeFigure = () => {\n          output.writeLink(node.attrs.linkTo, '', null, writer);\n        };\n      }\n      output.writeToken(PandocTokenType.Para, writeFigure);\n    } else {\n      writer();\n    }\n  };\n}\n\n// parse inline html with <img> as image node\nfunction imageInlineHTMLReader(schema: Schema, html: string, writer?: ProsemirrorWriter) {\n  const isImage = inlineHTMLIsImage(html);\n  if (!isImage) {\n    return false;\n  }\n\n  if (writer) {\n    const attrs = imageAttrsFromHTML(html);\n    if (attrs) {\n      attrs.raw = true;\n      writer.addNode(schema.nodes.image, attrs, []);\n    } else {\n      return false;\n    }\n  }\n\n  return isImage;\n}\n\nexport function imageDOMOutputSpec(node: ProsemirrorNode, imageAttributes: boolean): DOMOutputSpec {\n  return ['img', imageDOMAttributes(node, imageAttributes)];\n}\n\nexport function imageDOMAttributes(\n  node: ProsemirrorNode,\n  imageAttributes: boolean,\n  marker = true,\n): { [key: string]: string } {\n  const attr: { [key: string]: string } = {\n    src: node.attrs.src,\n  };\n  const title = node.attrs.title;\n  if (title) {\n    attr.title = title;\n  }\n  const alt = node.attrs.alt || node.textContent;\n  if (alt) {\n    attr.alt = alt;\n  }\n\n  return {\n    ...attr,\n    ...(imageAttributes ? pandocAttrToDomAttr(node.attrs, marker) : {}),\n  };\n}\n\nexport function imageNodeAttrsSpec(linkTo: boolean, imageAttributes: boolean) {\n  return {\n    src: {},\n    title: { default: null },\n    alt: { default: null },\n    raw: { default: false },\n    ...(linkTo ? { linkTo: { default: null } } : {}),\n    ...(imageAttributes ? pandocAttrSpec : {}),\n  };\n}\n\nexport function imageAttrsFromDOM(el: Element, imageAttributes: boolean, forceAttrs = false) {\n  const attrs: { [key: string]: string | null } = {\n    src: el.getAttribute('src') || null,\n    title: el.getAttribute('title') || null,\n    alt: el.getAttribute('alt') || null,\n  };\n  return {\n    ...attrs,\n    ...(imageAttributes ? pandocAttrParseDom(el, attrs, forceAttrs) : {}),\n  };\n}\n\nexport function imageAttrsFromHTML(html: string) {\n  const parser = new window.DOMParser();\n  const doc = parser.parseFromString(html, 'text/html');\n  if (doc.body && doc.body.firstChild instanceof HTMLImageElement) {\n    return imageAttrsFromDOM(doc.body.firstChild, true, true);\n  } else {\n    return null;\n  }\n}\n\nexport function imageCommand(editorUI: EditorUI, imageAttributes: boolean) {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const schema = state.schema;\n\n    if (!canInsertNode(state, schema.nodes.image) && !canInsertNode(state, schema.nodes.figure)) {\n      return false;\n    }\n\n    if (dispatch && view) {\n      // see if we are editing an existing node\n      let node: ProsemirrorNode | null = null;\n      let nodeType = schema.nodes.image;\n      let img: HTMLImageElement | null = null;\n      let imgDimensions: ImageDimensions | null = null;\n      if (selectionIsImageNode(schema, state.selection)) {\n        node = (state.selection as NodeSelection).node;\n        nodeType = node.type;\n        if (nodeType === schema.nodes.figure) {\n          const figure = view.nodeDOM(state.selection.from) as HTMLElement;\n          img = figure.firstChild!.firstChild as HTMLImageElement;\n        } else {\n          const span = view.nodeDOM(state.selection.from) as HTMLElement;\n          img = span.firstChild! as HTMLImageElement;\n        }\n        if (img) {\n          const containerWidth = imageContainerWidth(state.selection.from, view);\n          imgDimensions = imageDimensionsFromImg(img, containerWidth);\n        }\n      }\n\n      // see if we are in an empty paragraph (in that case insert a figure)\n      if (\n        selectionIsEmptyParagraph(schema, state.selection) &&\n        !posHasProhibitedFigureParent(schema, state.selection.$head)\n      ) {\n        nodeType = schema.nodes.figure;\n      }\n\n      // show dialog\n      imageDialog(node, imgDimensions, nodeType, view, editorUI, imageAttributes);\n    }\n\n    return true;\n  };\n}\n\nfunction imageOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Image...'),\n    description: ui.context.translateText('Figure or inline image'),\n    group: OmniInsertGroup.Content,\n    priority: 10,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.image_dark! : ui.images.omni_insert?.image!),\n  };\n}\n\nfunction readPandocTitle(title: string | null) {\n  if (title) {\n    return title.replace(/^(fig:)/, '');\n  } else {\n    return title;\n  }\n}\n\nexport default extension;\n","/*\n * image-dialog.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType, Fragment, Mark } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { insertAndSelectNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { ImageProps } from '../../api/ui-dialogs';\nimport { extractSizeStyles, kPercentUnit, kPixelUnit } from '../../api/css';\nimport { ImageType, ImageDimensions, isNaturalAspectRatio } from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib } from '../../api/pandoc_attr';\n\nimport { imagePropsWithSizes, hasPercentWidth } from './image-util';\n\nexport async function imageDialog(\n  node: ProsemirrorNode | null,\n  dims: ImageDimensions | null,\n  nodeType: NodeType,\n  view: EditorView,\n  editorUI: EditorUI,\n  imageAttributes: boolean,\n) {\n  // alias schema\n  const schema = view.state.schema;\n\n  // if we are being called with an existing node then read it's attributes\n  let content = Fragment.empty;\n  let image: ImageProps = { src: null };\n  let linkMark: Mark | undefined;\n  let marks: Mark[] = [];\n  if (node && dims && node.type === nodeType) {\n    // base attributess\n    image = {\n      ...(node.attrs as ImageProps),\n      alt: nodeType === schema.nodes.figure ? node.textContent : node.attrs.alt,\n    };\n\n    // move width and height out of style and into keyvalue if necessary\n    image = {\n      ...image,\n      keyvalue: extractSizeStyles(image.keyvalue),\n    };\n\n    // move width, height, and units out of keyvalue into explicit\n    // top level image properties if necessary\n    image = imagePropsWithSizes(image, dims);\n\n    // record marks / linkTo\n    if (nodeType === schema.nodes.image) {\n      marks = node.marks;\n      linkMark = node.marks.find(mark => mark.type === schema.marks.link);\n      if (linkMark) {\n        image.linkTo = linkMark.attrs.href;\n      }\n    }\n\n    // content (will be caption for figures)\n    content = node.content;\n  } else {\n    // create a new image\n    image = nodeType.create(image).attrs as ImageProps;\n  }\n\n  // determine the type\n  const type = nodeType === view.state.schema.nodes.image ? ImageType.Image : ImageType.Figure;\n\n  // edit the image\n  const result = await editorUI.dialogs.editImage(image, dims, imageAttributes);\n  if (result) {\n    // figures treat 'alt' as their content (the caption), but since captions support\n    // inline formatting (and the dialog doesn't) we only want to update the\n    // content if the alt/caption actually changed (as it will blow away formatting)\n    if (type === ImageType.Figure && image.alt !== result.alt) {\n      if (result.alt) {\n        content = Fragment.from(view.state.schema.text(result.alt));\n      } else {\n        content = Fragment.empty;\n      }\n    }\n\n    // if we have width and height move them into keyvalue\n    let keyvalue = result.keyvalue;\n    if (result.units) {\n      // no units for px\n      const units = result.units && result.units === kPixelUnit ? '' : result.units;\n      // width\n      if (result.width) {\n        let width = result.width;\n        if (hasPercentWidth(units)) {\n          width = Math.min(width, 100);\n        }\n        keyvalue = keyvalue || [];\n        keyvalue.push([kWidthAttrib, width + units]);\n      }\n      // only record height if it's not % units and it's not at it's natural height\n      if (result.height && units !== kPercentUnit && !isNaturalHeight(result.width, result.height, dims)) {\n        keyvalue = keyvalue || [];\n        keyvalue.push([kHeightAttrib, result.height + units]);\n      }\n    }\n\n    // merge updated keyvalue\n    const imageProps = { ...result, keyvalue };\n\n    // update or create link mark as necessary\n    if (nodeType === schema.nodes.image) {\n      if (linkMark) {\n        marks = linkMark.removeFromSet(marks);\n        if (imageProps.linkTo) {\n          linkMark = linkMark.type.create({ ...linkMark.attrs, href: imageProps.linkTo });\n        }\n      } else if (imageProps.linkTo) {\n        linkMark = schema.marks.link.create({ href: imageProps.linkTo });\n      }\n      if (imageProps.linkTo && linkMark) {\n        marks = linkMark.addToSet(marks);\n      }\n    }\n\n    // create the image\n    const newImage = nodeType.createAndFill(imageProps, content, marks);\n\n    // insert and select\n    if (newImage) {\n      insertAndSelectNode(view, newImage);\n    }\n  }\n\n  if (view) {\n    view.focus();\n  }\n}\n\n// wrapper for isNaturalHeight that handles potentially undefined params\nfunction isNaturalHeight(width: number | undefined, height: number | undefined, dims: ImageDimensions | null) {\n  if (width && height && dims) {\n    return isNaturalAspectRatio(width, height, dims, false);\n  } else {\n    return false;\n  }\n}\n","/*\n * image-util.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeClosestToPos } from 'prosemirror-utils';\n\nimport { ImageProps } from '../../api/ui-dialogs';\nimport {\n  imageSizePropWithUnit,\n  isValidImageSizeUnit,\n  ensureContainerWidth,\n  isNaturalAspectRatio,\n  ImageDimensions,\n} from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib, attrPartitionKeyvalue } from '../../api/pandoc_attr';\nimport { kPercentUnit, kPixelUnit } from '../../api/css';\nimport { elementInnerDimensions } from '../../api/dom';\n\nexport function imagePropsWithSizes(image: ImageProps, dims: ImageDimensions) {\n  // pull width, height, and units out of keyvalue if necessary\n  // (enables front-ends to provide dedicated UI for width/height)\n  // note that if the value doesn't use a unit supported by the\n  // UI it's kept within the original keyvalue prop\n  if (image.keyvalue) {\n    let width: number | undefined;\n    let height: number | undefined;\n    let units: string | undefined;\n    let lockRatio = true;\n    const partitionedKeyvalue = attrPartitionKeyvalue([kWidthAttrib, kHeightAttrib], image.keyvalue);\n    for (const kv of partitionedKeyvalue.partitioned) {\n      const [key, value] = kv;\n      let partitioned = false;\n      const sizeWithUnit = imageSizePropWithUnit(value);\n      if (sizeWithUnit) {\n        sizeWithUnit.unit = sizeWithUnit.unit || kPixelUnit;\n        if (isValidImageSizeUnit(sizeWithUnit.unit)) {\n          if (key === kWidthAttrib) {\n            width = sizeWithUnit.size;\n            units = sizeWithUnit.unit;\n          } else if (key === kHeightAttrib) {\n            height = sizeWithUnit.size;\n            units = units || sizeWithUnit.unit;\n          }\n          partitioned = true;\n        }\n      }\n      if (!partitioned) {\n        partitionedKeyvalue.base.push(kv);\n      }\n    }\n    if (width && height) {\n      lockRatio = isNaturalAspectRatio(width, height, dims, lockRatio);\n    }\n    return {\n      ...image,\n      width,\n      height,\n      units,\n      lockRatio,\n      keyvalue: partitionedKeyvalue.base,\n    };\n  } else {\n    return image;\n  }\n}\n\nexport function imageDimensionsFromImg(img: HTMLImageElement, containerWidth: number) {\n  return {\n    naturalWidth: img.naturalWidth || null,\n    naturalHeight: img.naturalHeight || null,\n    containerWidth: ensureContainerWidth(containerWidth),\n  };\n}\n\nexport function hasPercentWidth(size: string | null) {\n  return !!size && size.endsWith(kPercentUnit);\n}\n\nexport function imageContainerWidth(pos: number, view: EditorView) {\n  let containerWidth = (view.dom as HTMLElement).offsetWidth;\n  if (containerWidth > 0) {\n    if (pos) {\n      const imagePos = view.state.doc.resolve(pos);\n      const resizeContainer = findParentNodeClosestToPos(imagePos, nd => nd.isBlock);\n      if (resizeContainer) {\n        const resizeEl = view.domAtPos(resizeContainer.pos + 1);\n        containerWidth = elementInnerDimensions(resizeEl.node as HTMLElement).width;\n      }\n    }\n  }\n\n  return containerWidth;\n}\n\nexport function inlineHTMLIsImage(html: string) {\n  return html\n    .trimLeft()\n    .toLowerCase()\n    .startsWith('<img');\n}\n","/*\n * image-textsel.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection, Plugin, PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { nodeDecoration } from '../../api/decoration';\n\nconst pluginKey = new PluginKey('image-text-selection');\n\nexport function imageTextSelectionPlugin() {\n  return new Plugin<DecorationSet>({\n    key: pluginKey,\n    state: {\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return DecorationSet.empty;\n      },\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        // no decorations for empty or node selection\n        if (tr.selection.empty || tr.selection instanceof NodeSelection) {\n          return DecorationSet.empty;\n        }\n\n        const schema = newState.schema;\n        const decorations: Decoration[] = [];\n        tr.doc.nodesBetween(tr.selection.from, tr.selection.to, (node, pos) => {\n          if ([schema.nodes.image, schema.nodes.figure].includes(node.type)) {\n            decorations.push(nodeDecoration({ node, pos }, { class: 'pm-image-text-selection' }));\n          }\n        });\n\n        return DecorationSet.create(tr.doc, decorations);\n      },\n    },\n    props: {\n      decorations(state: EditorState) {\n        return pluginKey.getState(state);\n      },\n    },\n  });\n}\n","/*\n * figure.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, ResolvedPos } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\n\nimport { findChildrenByType, findParentNodeClosestToPos } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { FixupContext } from '../../api/fixup';\nimport { isSingleLineHTML } from '../../api/html';\nimport { getMarkAttrs } from '../../api/mark';\nimport {\n  PandocToken,\n  PandocTokenType,\n  ProsemirrorWriter,\n  kRawBlockContent,\n  kRawBlockFormat,\n  imageAttributesAvailable,\n} from '../../api/pandoc';\nimport { trTransform } from '../../api/transaction';\n\nimport {\n  imageAttrsFromDOM,\n  imageNodeAttrsSpec,\n  imageDOMOutputSpec,\n  imagePandocOutputWriter,\n  pandocImageHandler,\n  imageAttrsFromHTML,\n  imageCommand,\n} from './image';\nimport { inlineHTMLIsImage } from './image-util';\nimport { imageNodeViewPlugins } from './image-view';\nimport { figureKeys } from './figure-keys';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, ui, events } = context;\n\n  const imageAttr = imageAttributesAvailable(pandocExtensions);\n\n  return {\n    nodes: [\n      {\n        name: 'figure',\n        spec: {\n          attrs: imageNodeAttrsSpec(true, imageAttr),\n          content: 'inline*',\n          group: 'block',\n          draggable: true,\n          selectable: true,\n          defining: true,\n          parseDOM: [\n            {\n              tag: 'figure',\n              contentElement: 'figcaption',\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                const img = el.querySelector('img');\n                if (img && img.parentNode === dom) {\n                  return imageAttrsFromDOM(img, imageAttr);\n                } else {\n                  return {\n                    src: null,\n                    title: null,\n                  };\n                }\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return ['figure', imageDOMOutputSpec(node, imageAttr), ['figcaption', { class: 'pm-figcaption' }, 0]];\n          },\n        },\n        pandoc: {\n          writer: imagePandocOutputWriter(true, ui),\n\n          // intercept  paragraphs with a single image and process them as figures\n          blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n            // helper to process html image\n            const handleHTMLImage = (html: string) => {\n              const attrs = imageAttrsFromHTML(html);\n              if (attrs) {\n                attrs.raw = true;\n                writer.addNode(schema.nodes.figure, attrs, []);\n                return true;\n              } else {\n                return false;\n              }\n            };\n\n            // unroll figure from paragraph with single image\n            if (isParaWrappingFigure(tok) && !writerHasProhibitedFigureParent(schema, writer)) {\n              const handler = pandocImageHandler(true, imageAttr)(schema);\n              handler(writer, tok.c[0]);\n              return true;\n              // unroll figure from html RawBlock with single <img> tag\n            } else if (isHTMLImageBlock(tok)) {\n              return handleHTMLImage(tok.c[kRawBlockContent]);\n            } else {\n              return false;\n            }\n          },\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.figure,\n          editFn: () => imageCommand(ui, imageAttr),\n        }),\n      },\n    ],\n\n    fixups: (_schema: Schema) => {\n      return [\n        (tr: Transaction, fixupContext: FixupContext) => {\n          if (fixupContext === FixupContext.Load) {\n            return convertImagesToFigure(tr);\n          } else {\n            return tr;\n          }\n        },\n      ];\n    },\n\n    appendTransaction: (schema: Schema) => {\n      return [\n        {\n          name: 'figure-convert',\n          nodeFilter: node => node.type === schema.nodes.image,\n          append: convertImagesToFigure,\n        },\n      ];\n    },\n\n    baseKeys: figureKeys,\n\n    plugins: (schema: Schema) => {\n      return [...imageNodeViewPlugins('figure', ui, events, pandocExtensions)];\n    },\n  };\n};\n\nexport function posHasProhibitedFigureParent(schema: Schema, $pos: ResolvedPos) {\n  return prohibitedFigureParents(schema).some(type => {\n    return !!findParentNodeClosestToPos($pos, node => node.type === type);\n  });\n}\n\nexport function writerHasProhibitedFigureParent(schema: Schema, writer: ProsemirrorWriter) {\n  return prohibitedFigureParents(schema).some(writer.isNodeOpen);\n}\n\nfunction prohibitedFigureParents(schema: Schema) {\n  return [schema.nodes.table_cell, schema.nodes.list_item, schema.nodes.definition_list];\n}\n\nfunction convertImagesToFigure(tr: Transaction) {\n  return trTransform(tr, imagesToFiguresTransform);\n}\n\nfunction imagesToFiguresTransform(tr: Transform) {\n  const schema = tr.doc.type.schema;\n  const images = findChildrenByType(tr.doc, schema.nodes.image);\n  images.forEach(image => {\n    // position reflecting steps already taken in this handler\n    const mappedImagePos = tr.mapping.mapResult(image.pos);\n\n    // process image so long as it wasn't deleted by a previous step\n    if (!mappedImagePos.deleted) {\n      // resolve image pos\n      const imagePos = tr.doc.resolve(mappedImagePos.pos);\n\n      // if it's an image in a standalone paragraph, convert it to a figure\n      if (\n        imagePos.parent.type === schema.nodes.paragraph &&\n        imagePos.parent.childCount === 1 &&\n        !posHasProhibitedFigureParent(schema, imagePos)\n      ) {\n        // figure attributes\n        const attrs = image.node.attrs;\n\n        // extract linkTo from link mark (if any)\n        if (schema.marks.link.isInSet(image.node.marks)) {\n          const linkAttrs = getMarkAttrs(\n            tr.doc,\n            { from: mappedImagePos.pos, to: mappedImagePos.pos + image.node.nodeSize },\n            schema.marks.link,\n          );\n          if (linkAttrs && linkAttrs.href) {\n            attrs.linkTo = linkAttrs.href;\n          }\n        }\n\n        // figure content\n        const content = attrs.alt ? Fragment.from(schema.text(attrs.alt)) : Fragment.empty;\n\n        // replace image with figure\n        const figure = schema.nodes.figure.createAndFill(attrs, content);\n        if (figure) {\n          tr.replaceRangeWith(mappedImagePos.pos, mappedImagePos.pos + image.node.nodeSize, figure);\n        }\n      }\n    }\n  });\n}\n\nfunction isParaWrappingFigure(tok: PandocToken) {\n  return isSingleChildParagraph(tok) && tok.c[0].t === PandocTokenType.Image;\n}\n\nfunction isHTMLImageBlock(tok: PandocToken) {\n  if (tok.t === PandocTokenType.RawBlock) {\n    const format = tok.c[kRawBlockFormat];\n    const text = tok.c[kRawBlockContent] as string;\n    return format === 'html' && isSingleLineHTML(text) && inlineHTMLIsImage(text);\n  } else {\n    return false;\n  }\n}\n\nfunction isSingleChildParagraph(tok: PandocToken) {\n  return tok.t === PandocTokenType.Para && tok.c && tok.c.length === 1;\n}\n\nexport default extension;\n","/*\n * decoration.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { DecorationAttrs, Decoration } from 'prosemirror-view';\n\nexport function nodeDecoration(nodeWithPos: NodeWithPos, attrs: DecorationAttrs) {\n  return Decoration.node(nodeWithPos.pos, nodeWithPos.pos + nodeWithPos.node.nodeSize, attrs);\n}\n","/*\n * image-view.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { NodeView, EditorView } from 'prosemirror-view';\nimport { NodeSelection, PluginKey, Plugin } from 'prosemirror-state';\n\nimport { EditorUI } from '../../api/ui';\nimport { ImageType } from '../../api/image';\nimport { PandocExtensions, imageAttributesAvailable } from '../../api/pandoc';\nimport { isElementVisible } from '../../api/dom';\nimport { EditorEvents } from '../../api/events';\nimport { ResizeEvent } from '../../api/event-types';\n\nimport { imageDialog } from './image-dialog';\nimport {\n  attachResizeUI,\n  initResizeContainer,\n  ResizeUI,\n  isResizeUICompatible,\n  updateImageViewSize,\n} from './image-resize';\nimport { imageDimensionsFromImg, imageContainerWidth } from './image-util';\n\nimport './image-styles.css';\n\nexport function imageNodeViewPlugins(\n  type: string,\n  ui: EditorUI,\n  events: EditorEvents,\n  pandocExtensions: PandocExtensions,\n): Plugin[] {\n  return [\n    new Plugin({\n      key: new PluginKey(`${type}-node-view`),\n      props: {\n        nodeViews: {\n          [type]: (node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) => {\n            return new ImageNodeView(node, view, getPos as () => number, ui, events, pandocExtensions);\n          },\n        },\n      },\n    }),\n  ];\n}\n\nclass ImageNodeView implements NodeView {\n  // ProseMirror context\n  private readonly type: ImageType;\n  private node: ProsemirrorNode;\n  private readonly view: EditorView;\n  private readonly getPos: () => number;\n  private readonly editorUI: EditorUI;\n  private readonly imageAttributes: boolean;\n  private readonly implicitFigures: boolean;\n\n  // DOM elements\n  public readonly dom: HTMLElement;\n  private readonly img: HTMLImageElement;\n  public readonly contentDOM: HTMLElement | null;\n  private readonly figcaption: HTMLElement | null;\n\n  // transient state\n  private imgBroken: boolean;\n\n  // things to clean up\n  private resizeUI: ResizeUI | null;\n  private sizeOnVisibleTimer?: number;\n  private unregisterOnResize: VoidFunction;\n  private unregisterWatchImg: VoidFunction | null = null;\n\n  constructor(\n    node: ProsemirrorNode,\n    view: EditorView,\n    getPos: () => number,\n    editorUI: EditorUI,\n    editorEvents: EditorEvents,\n    pandocExtensions: PandocExtensions,\n  ) {\n    // determine type\n    const schema = node.type.schema;\n    this.type = node.type === schema.nodes.image ? ImageType.Image : ImageType.Figure;\n\n    // save references\n    this.node = node;\n    this.view = view;\n    this.getPos = getPos;\n    this.imageAttributes = imageAttributesAvailable(pandocExtensions);\n    this.implicitFigures = pandocExtensions.implicit_figures;\n    this.editorUI = editorUI;\n    this.resizeUI = null;\n    this.imgBroken = false;\n\n    // set node selection on click\n    const selectOnClick = () => {\n      const tr = view.state.tr;\n      tr.setSelection(NodeSelection.create(view.state.doc, getPos()));\n      view.dispatch(tr);\n    };\n\n    // show image dialog on double-click\n    const editOnDblClick = () => {\n      selectOnClick();\n      imageDialog(\n        this.node,\n        imageDimensionsFromImg(this.img, this.containerWidth()),\n        this.node.type,\n        this.view,\n        editorUI,\n        this.imageAttributes,\n      );\n    };\n\n    // stop propagation from child elmeents that need to handle click\n    // (e.g. figcaption element)\n    const noPropagateClick = (ev: MouseEvent) => {\n      ev.stopPropagation();\n    };\n\n    // create the image (used by both image and figure node types)\n    this.img = document.createElement('img');\n    this.img.classList.add('pm-img');\n    this.img.onload = () => {\n      this.imgBroken = false;\n    };\n    this.img.onerror = () => {\n      this.imgBroken = true;\n    };\n    this.img.onclick = selectOnClick;\n    this.img.ondblclick = editOnDblClick;\n\n    // wrap in figure if appropriate\n    if (this.type === ImageType.Figure) {\n      // create figure wrapper\n      this.dom = document.createElement('figure');\n      this.dom.classList.add('pm-figure');\n\n      // create container\n      const container = document.createElement('div');\n      container.contentEditable = 'false';\n      this.dom.append(container);\n\n      // initialize the image\n      container.append(this.img);\n      this.updateImg();\n\n      // create the caption and make it our contentDOM\n      this.figcaption = document.createElement('figcaption');\n      this.figcaption.classList.add('pm-figcaption');\n      this.figcaption.classList.add('pm-node-caption');\n      this.figcaption.onclick = noPropagateClick;\n      this.figcaption.ondblclick = noPropagateClick;\n      this.contentDOM = this.figcaption;\n      this.dom.append(this.figcaption);\n\n      // manage visibility\n      this.manageFigcaption();\n\n      // standard inline image\n    } else {\n      this.dom = document.createElement('span');\n\n      this.dom.append(this.img);\n      this.updateImg();\n\n      this.contentDOM = null;\n      this.figcaption = null;\n    }\n\n    // prevent drag/drop if the event doesn't target the image\n    this.dom.ondragstart = (event: DragEvent) => {\n      if (event.target !== this.img) {\n        event.preventDefault();\n        event.stopPropagation();\n      }\n    };\n\n    // init resize if we support imageAttributes\n    if (this.imageAttributes) {\n      initResizeContainer(this.dom);\n    }\n\n    // update image size when the image first becomes visible\n    this.updateSizeOnVisible();\n\n    // update image size whenever the container is resized\n    this.unregisterOnResize = editorEvents.subscribe(ResizeEvent, () => {\n      this.updateImageSize();\n    });\n  }\n\n  public destroy() {\n    if (this.unregisterWatchImg) {\n      this.unregisterWatchImg();\n    }\n    this.unregisterOnResize();\n    this.clearSizeOnVisibleTimer();\n    this.detachResizeUI();\n  }\n\n  public selectNode() {\n    // mirror default implementation\n    this.dom.classList.add('ProseMirror-selectednode');\n    if (this.contentDOM || !this.node.type.spec.draggable) {\n      this.dom.draggable = true;\n    }\n\n    // manage figcaption\n    this.manageFigcaption();\n\n    // attach resize UI\n    this.attachResizeUI();\n  }\n\n  public deselectNode() {\n    // mirror default implementation\n    this.dom.classList.remove('ProseMirror-selectednode');\n    if (this.contentDOM || !this.node.type.spec.draggable) {\n      this.dom.draggable = false;\n    }\n\n    // remove resize UI\n    this.detachResizeUI();\n  }\n\n  // update image with latest node/attributes\n  public update(node: ProsemirrorNode) {\n    // boilerplate type check\n    if (node.type !== this.node.type) {\n      return false;\n    }\n\n    // set new node and update the image\n    this.node = node;\n    this.updateImg();\n\n    // if we already have resize UI then either update it\n    // or detach it (if e.g. the units are no longer compatible)\n    if (this.resizeUI) {\n      if (isResizeUICompatible(this.img!)) {\n        this.resizeUI.update();\n      } else {\n        this.resizeUI.detach();\n        this.resizeUI = null;\n      }\n      // attach if the node is selected\n    } else if (this.isNodeSelected()) {\n      this.attachResizeUI();\n    }\n    return true;\n  }\n\n  // ignore mutations outside of the content dom so sizing actions don't cause PM re-render\n  public ignoreMutation(mutation: MutationRecord | { type: 'selection'; target: Element }) {\n    return !this.contentDOM || !this.contentDOM.contains(mutation.target);\n  }\n\n  // map node to img tag\n  private updateImg() {\n    // unsubscribe from any existing resource watcher\n    if (this.unregisterWatchImg) {\n      this.unregisterWatchImg();\n    }\n\n    // map to path reachable within current editing frame\n    const src = this.node.attrs.src;\n    this.img.src = this.editorUI.context.mapResourceToURL(src);\n\n    // if this is a local resource then watch it and update when it changes\n    if (!src.match(/^\\w+:\\/\\//)) {\n      this.unregisterWatchImg = this.editorUI.context.watchResource(src, () => {\n        this.img.src = this.editorUI.context.mapResourceToURL(src);\n      });\n    }\n\n    // title/tooltip\n    this.img.title = '';\n    if (this.node.attrs.title) {\n      this.img.title = this.node.attrs.title;\n    }\n\n    // ensure alt attribute so that we get default browser broken image treatment\n    this.img.alt = this.node.textContent || this.node.attrs.src;\n\n    // manage caption visibility\n    this.manageFigcaption();\n\n    // update size\n    this.updateImageSize();\n  }\n\n  private updateImageSize() {\n    const containerWidth = this.img.isConnected ? this.containerWidth() : 0;\n    updateImageViewSize(this.node, this.img, this.isFigure() ? this.dom : null, containerWidth);\n  }\n\n  private updateSizeOnVisible() {\n    const updateSizeOnVisible = () => {\n      if (isElementVisible(this.img)) {\n        this.updateImageSize();\n        this.clearSizeOnVisibleTimer();\n      }\n    };\n    this.sizeOnVisibleTimer = window.setInterval(updateSizeOnVisible, 200);\n  }\n\n  private clearSizeOnVisibleTimer() {\n    if (this.sizeOnVisibleTimer) {\n      clearInterval(this.sizeOnVisibleTimer);\n      this.sizeOnVisibleTimer = undefined;\n    }\n  }\n\n  // attach resize UI if appropriate\n  private attachResizeUI() {\n    if (this.imageAttributes && !this.imgBroken && isResizeUICompatible(this.img!)) {\n      const imageNode = () => ({ pos: this.getPos(), node: this.node });\n      const imgContainerWidth = () => this.containerWidth();\n      this.resizeUI = attachResizeUI(imageNode, this.dom, this.img!, imgContainerWidth, this.view, this.editorUI);\n    }\n  }\n\n  private detachResizeUI() {\n    if (this.resizeUI) {\n      this.resizeUI.detach();\n      this.resizeUI = null;\n    }\n  }\n\n  private isNodeSelected() {\n    return this.dom.classList.contains('ProseMirror-selectednode');\n  }\n\n  private isFigure() {\n    return this.type === ImageType.Figure;\n  }\n\n  private containerWidth() {\n    return imageContainerWidth(this.getPos(), this.view);\n  }\n\n  private manageFigcaption() {\n    // hide the figcaption if appropriate\n    const noImplicitFigures = !this.implicitFigures;\n    const emptyFigcaption = this.figcaption && this.node.textContent.length === 0;\n    const selection = this.view.state.selection;\n    const selectionInFigcaption = selection.empty && selection.$head.node() === this.node;\n    const hide = noImplicitFigures || (emptyFigcaption && !selectionInFigcaption);\n\n    // hide or show if we have a figcaption\n    if (this.figcaption) {\n      if (noImplicitFigures) {\n        this.figcaption.style.display = 'none';\n        this.figcaption.contentEditable = 'false';\n      } else {\n        this.figcaption.contentEditable = hide ? 'false' : 'true';\n        this.figcaption.style.height = hide ? '0' : '';\n        this.figcaption.style.minHeight = hide ? '0' : '';\n        this.figcaption.style.margin = hide ? '0' : '';\n      }\n    }\n  }\n}\n","/*\n * image-resize.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { NodeSelection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport {\n  createPopup,\n  createHorizontalPanel,\n  addHorizontalPanelCell,\n  createInputLabel,\n  createImageButton,\n  createCheckboxInput,\n  createSelectInput,\n  createTextInput,\n} from '../../api/widgets/widgets';\nimport { EditorUI } from '../../api/ui';\nimport { editingRootScrollContainerElement } from '../../api/node';\nimport { extractSizeStyles, kPercentUnit, kPixelUnit, removeStyleAttrib } from '../../api/css';\nimport {\n  imageSizePropWithUnit,\n  isNaturalAspectRatio,\n  unitToPixels,\n  pixelsToUnit,\n  roundUnit,\n  kValidUnits,\n  isValidImageSizeUnit,\n} from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib, kStyleAttrib, kAlignAttrib } from '../../api/pandoc_attr';\nimport { EditorUIImages } from '../../api/ui-images';\n\nimport { imageDialog } from './image-dialog';\nimport { hasPercentWidth, imageDimensionsFromImg } from './image-util';\n\nconst kDataWidth = 'data-width';\nconst kDataHeight = 'data-height';\n\nconst kDefaultContainerDisplay = 'inline-block';\n\nexport function initResizeContainer(container: HTMLElement) {\n  // add standard parent class\n  container.classList.add('pm-image-resize-container', 'pm-selected-node-outline-color');\n\n  // so that we are the offsetParent for the resize handles and shelf\n  container.style.position = 'relative';\n\n  // so that the container matches the size of the contained image\n  container.style.display = kDefaultContainerDisplay;\n\n  // so that the handles and shelf can be visible outside the boundaries of the image\n  container.style.overflow = 'visible';\n\n  // return for convenience\n  return container;\n}\n\nexport function isResizeUICompatible(img: HTMLImageElement) {\n  // incompatible if it has a width, but not a data-width\n  const incompatibleWidth = img.style.width && !img.hasAttribute(kDataWidth);\n\n  // incompatible if it has a height, but not a data-height\n  const incompatibleHeight = img.style.height && img.style.height !== 'auto' && !img.hasAttribute(kDataHeight);\n\n  return !incompatibleWidth && !incompatibleHeight;\n}\n\nexport interface ResizeUI {\n  update: () => void;\n  detach: () => void;\n}\n\nexport function attachResizeUI(\n  imageNode: () => NodeWithPos,\n  container: HTMLElement,\n  img: HTMLImageElement,\n  imgContainerWidth: () => number,\n  view: EditorView,\n  ui: EditorUI,\n): ResizeUI {\n  // indicate that resize ui is active\n  container.classList.add('pm-image-resize-active');\n\n  // sync current state of shelf to node\n  const updateImageNodeFromShelf = () => {\n    updateImageNodeSize(\n      view,\n      imageNode(),\n      img,\n      imgContainerWidth,\n      shelf.props.width(),\n      shelf.props.height(),\n      shelf.props.units(),\n    );\n  };\n\n  // shelf init\n  const onInitShelf = () => {\n    // sync props\n    shelf.sync();\n\n    // default for lockRatio based on naturalWidth/naturalHeight\n    const dims = imageDimensionsFromImg(img, imgContainerWidth());\n    shelf.props.setLockRatio(isNaturalAspectRatio(shelf.props.width(), shelf.props.height(), dims, true));\n  };\n\n  // handle width changed from shelf\n  const onWidthChanged = () => {\n    const width = shelf.props.width();\n    const height = shelf.props.lockRatio() ? (img.offsetHeight / img.offsetWidth) * width : shelf.props.height();\n    shelf.props.setHeight(height);\n    updateImageNodeFromShelf();\n  };\n\n  // handle height changed from shelf\n  const onHeightChanged = () => {\n    const height = shelf.props.height();\n    const width = shelf.props.lockRatio() ? (img.offsetWidth / img.offsetHeight) * height : shelf.props.width();\n    shelf.props.setWidth(width);\n    updateImageNodeFromShelf();\n  };\n\n  // do necessary unit conversion when the units change\n  const onUnitsChanged = () => {\n    const prevUnits = shelfSizeFromImage(img).unit;\n    const containerWidth = imgContainerWidth();\n\n    const width = shelf.props.width();\n    const widthPixels = unitToPixels(width, prevUnits, containerWidth);\n    let widthInUnits = pixelsToUnit(widthPixels, shelf.props.units(), containerWidth);\n    if (hasPercentWidth(shelf.props.units()) && widthInUnits > 100) {\n      widthInUnits = 100;\n    }\n    shelf.props.setWidth(widthInUnits);\n\n    const height = shelf.props.height();\n    const heightPixels = unitToPixels(height, prevUnits, containerWidth);\n    shelf.props.setHeight(pixelsToUnit(heightPixels, shelf.props.units(), containerWidth));\n\n    updateImageNodeFromShelf();\n  };\n\n  // handle editImage request from shelf\n  const onEditImage = () => {\n    const nodeWithPos = imageNode();\n    imageDialog(\n      nodeWithPos.node,\n      imageDimensionsFromImg(img, imgContainerWidth()),\n      nodeWithPos.node.type,\n      view,\n      ui,\n      true,\n    );\n  };\n\n  // create resize shelf\n  const shelf = resizeShelf(\n    view,\n    container,\n    img,\n    onInitShelf,\n    onWidthChanged,\n    onHeightChanged,\n    onUnitsChanged,\n    onEditImage,\n    ui.images,\n    ui.context.translateText,\n  );\n\n  // create resize handle and add it to the container\n  const handle = resizeHandle(\n    img,\n    imgContainerWidth,\n    shelf.props.lockRatio,\n    shelf.props.units,\n    shelf.sync,\n    updateImageNodeFromShelf,\n  );\n  container.append(handle);\n\n  // return functions that can be used to update and detach the ui\n  return {\n    update: () => {\n      shelf.sync();\n    },\n    detach: () => {\n      container.classList.remove('pm-image-resize-active');\n      handle.remove();\n      shelf.remove();\n    },\n  };\n}\n\nfunction resizeShelf(\n  view: EditorView,\n  container: HTMLElement,\n  img: HTMLImageElement,\n  onInit: () => void,\n  onWidthChanged: () => void,\n  onHeightChanged: () => void,\n  onUnitsChanged: () => void,\n  onEditImage: () => void,\n  uiImages: EditorUIImages,\n  translateText: (text: string) => string,\n) {\n  // create resize shelf\n  const shelf = createPopup(view, []);\n\n  // add the shelf to the editor container (so we don't mutate the editor dom)\n  const editorContainer = view.dom.parentNode as HTMLElement;\n  editorContainer.appendChild(shelf);\n\n  // update shelf absolute position to make sure it's visible\n  const updatePosition = () => {\n    const kShelfRequiredSize = 333;\n    const editorBox = editorContainer.getBoundingClientRect();\n    const imageBox = container.getBoundingClientRect();\n    shelf.style.top = imageBox.top - editorBox.top + imageBox.height + 6 + 'px';\n    const positionLeft = imageBox.left + kShelfRequiredSize < editorBox.right;\n    if (positionLeft) {\n      shelf.style.right = '';\n      shelf.style.left = imageBox.left - editorBox.left + 'px';\n    } else {\n      shelf.style.left = '';\n      shelf.style.right = editorBox.right - imageBox.right + 'px';\n    }\n  };\n\n  // detect when the editing root note scrolls and update the position\n  const editingScrollContainerEl = editingRootScrollContainerElement(view);\n  if (editingScrollContainerEl) {\n    editingScrollContainerEl.addEventListener('scroll', updatePosition);\n  }\n\n  // update position every 50ms (cleanup drag/drop copy/paste mispositioning)\n  const positionTimer = setInterval(updatePosition, 50);\n\n  // main panel that holds the controls\n  const panel = createHorizontalPanel();\n  shelf.append(panel);\n  const addToPanel = (widget: HTMLElement, paddingRight: number) => {\n    addHorizontalPanelCell(panel, widget);\n    if (paddingRight) {\n      const paddingSpan = window.document.createElement('span');\n      paddingSpan.style.width = paddingRight + kPixelUnit;\n      addHorizontalPanelCell(panel, paddingSpan);\n    }\n  };\n\n  // width\n  const inputClasses = ['pm-text-color', 'pm-background-color'];\n  const wLabel = createInputLabel('w:');\n  addToPanel(wLabel, 4);\n  const wInput = createTextInput(4, inputClasses);\n  wInput.onchange = onWidthChanged;\n  addToPanel(wInput, 8);\n\n  // height\n  const kHeightWidth = '38px';\n  const hLabel = createInputLabel('h:');\n  addToPanel(hLabel, 4);\n  const hInput = createTextInput(4, inputClasses, { width: kHeightWidth });\n  hInput.onchange = onHeightChanged;\n  addToPanel(hInput, 0);\n  const hAutoLabel = createInputLabel('(auto)', ['pm-light-text-color'], { width: kHeightWidth });\n  addToPanel(hAutoLabel, 10);\n\n  // units\n  const unitsSelect = createSelectInput(kValidUnits, inputClasses);\n  unitsSelect.onchange = () => {\n    // drive focus to width and back to prevent wierd selection change\n    // detection condition that causes PM to re-render the node the\n    // next time we resize it\n    wInput.focus();\n    unitsSelect.focus();\n\n    // manage UI\n    manageUnitsUI();\n\n    // notify client\n    onUnitsChanged();\n  };\n  addToPanel(unitsSelect, 12);\n\n  // lock ratio\n  const checkboxWrapper = window.document.createElement('div');\n  const lockCheckbox = createCheckboxInput();\n  lockCheckbox.checked = true;\n  checkboxWrapper.append(lockCheckbox);\n  addToPanel(checkboxWrapper, 4);\n  const lockLabel = createInputLabel(translateText('Lock ratio'));\n  addToPanel(lockLabel, 20);\n\n  // edit button\n  const editImage = createImageButton(\n    uiImages.properties!,\n    ['pm-image-button-edit-properties'],\n    translateText('Edit Attributes'),\n  );\n  editImage.onclick = onEditImage;\n  addHorizontalPanelCell(panel, editImage);\n\n  // run onInit (wait for image to load if necessary)\n  if (img.complete) {\n    setTimeout(onInit, 0);\n  } else {\n    img.onload = onInit;\n  }\n\n  // function used to manage units ui (percent vs. non-percent)\n  const manageUnitsUI = () => {\n    const percentSizing = unitsSelect.value === kPercentUnit;\n\n    if (percentSizing) {\n      lockCheckbox.checked = true;\n      lockCheckbox.disabled = true;\n    } else {\n      lockCheckbox.disabled = false;\n    }\n\n    hInput.style.display = percentSizing ? 'none' : '';\n    hAutoLabel.style.display = percentSizing ? '' : 'none';\n  };\n  manageUnitsUI();\n\n  // helper function to get a dimension (returns null if input not currently valid)\n  const getDim = (input: HTMLInputElement) => {\n    const value = parseFloat(input.value);\n    if (isNaN(value)) {\n      return null;\n    }\n    if (value > 0) {\n      return value;\n    } else {\n      return null;\n    }\n  };\n\n  const setWidth = (width: number) => {\n    wInput.value = roundUnit(width, unitsSelect.value);\n  };\n  const setHeight = (height: number) => {\n    hInput.value = roundUnit(height, unitsSelect.value);\n  };\n\n  return {\n    // shelf element\n    el: shelf,\n\n    // sync the shelf props to the current size/units of the image\n    // we don't sync to the node b/c we want to benefit from automatic\n    // unit handling in the conversion to the DOM\n    sync: () => {\n      const size = shelfSizeFromImage(img);\n      unitsSelect.value = size.unit;\n      setWidth(size.width);\n      setHeight(size.height);\n\n      // manage units ui\n      manageUnitsUI();\n\n      // ensure we are positioned correctly (not offscreen, wide enough, etc.)\n      updatePosition();\n    },\n\n    position: () => {\n      updatePosition();\n    },\n\n    remove: () => {\n      if (editingScrollContainerEl) {\n        editingScrollContainerEl.removeEventListener('scroll', updatePosition);\n      }\n      clearInterval(positionTimer);\n      shelf.remove();\n    },\n\n    props: {\n      width: () => getDim(wInput) || shelfSizeFromImage(img).width,\n      setWidth,\n      height: () => getDim(hInput) || shelfSizeFromImage(img).height,\n      setHeight,\n      units: () => unitsSelect.value,\n      setUnits: (units: string) => (unitsSelect.value = units),\n      lockRatio: () => lockCheckbox.checked,\n      setLockRatio: (lock: boolean) => {\n        if (!lockCheckbox.disabled) {\n          lockCheckbox.checked = lock;\n        }\n      },\n    },\n  };\n}\n\nfunction resizeHandle(\n  img: HTMLImageElement,\n  imgContainerWidth: () => number,\n  lockRatio: () => boolean,\n  units: () => string,\n  onSizing: () => void,\n  onSizingComplete: () => void,\n) {\n  const handle = document.createElement('span');\n  handle.contentEditable = 'false';\n  handle.classList.add('pm-image-resize-handle', 'pm-background-color', 'pm-selected-node-border-color');\n  handle.style.position = 'absolute';\n  handle.style.bottom = '-6px';\n  handle.style.right = '-6px';\n  handle.style.cursor = 'nwse-resize';\n\n  const havePointerEvents = !!document.body.setPointerCapture;\n\n  const onPointerDown = (ev: MouseEvent) => {\n    ev.preventDefault();\n\n    const startWidth = img.offsetWidth;\n    const startHeight = img.offsetHeight;\n\n    const startX = ev.pageX;\n    const startY = ev.pageY;\n\n    const containerWidth = imgContainerWidth();\n\n    const onPointerMove = (e: MouseEvent) => {\n      // detect pointer movement\n      const movedX = e.pageX - startX;\n      const movedY = e.pageY - startY;\n\n      let width;\n      let height;\n      if (lockRatio()) {\n        if (movedX >= movedY) {\n          width = startWidth + movedX;\n          height = startHeight + movedX * (startHeight / startWidth);\n        } else {\n          height = startHeight + movedY;\n          width = startWidth + movedY * (startWidth / startHeight);\n        }\n      } else {\n        width = startWidth + movedX;\n        height = startHeight + movedY;\n      }\n\n      // determine the new width in units. If it's percent and > 100 then clip\n      const widthInUnits = pixelsToUnit(width, units(), containerWidth);\n      if (hasPercentWidth(units()) && widthInUnits > 100) {\n        width = containerWidth;\n        height = width * (startHeight / startWidth);\n      }\n\n      img.style.width = width + kPixelUnit;\n      img.setAttribute(kDataWidth, pixelsToUnit(width, units(), containerWidth) + units());\n      img.style.height = height + kPixelUnit;\n      img.setAttribute(kDataHeight, pixelsToUnit(height, units(), containerWidth) + units());\n\n      onSizing();\n    };\n\n    const onPointerUp = (e: MouseEvent) => {\n      e.preventDefault();\n\n      // stop listening to events\n      if (havePointerEvents) {\n        handle.releasePointerCapture((e as PointerEvent).pointerId);\n        handle.removeEventListener('pointermove', onPointerMove);\n        handle.removeEventListener('pointerup', onPointerUp);\n      } else {\n        document.removeEventListener('mousemove', onPointerMove);\n        document.removeEventListener('mouseup', onPointerUp);\n      }\n\n      // update image size\n      onSizingComplete();\n    };\n\n    if (havePointerEvents) {\n      handle.setPointerCapture((ev as PointerEvent).pointerId);\n      handle.addEventListener('pointermove', onPointerMove);\n      handle.addEventListener('pointerup', onPointerUp);\n    } else {\n      document.addEventListener('mousemove', onPointerMove);\n      document.addEventListener('mouseup', onPointerUp);\n    }\n  };\n\n  if (havePointerEvents) {\n    handle.addEventListener('pointerdown', onPointerDown);\n  } else {\n    handle.addEventListener('mousedown', onPointerDown);\n  }\n\n  return handle;\n}\n\n// derive the shelf size attributes from the image. takes advantage of any data-width\n// or data-height attributes, then falls back to actual offsetWidth/offsetHeight\n// as necessary\nfunction shelfSizeFromImage(img: HTMLImageElement) {\n  // get attributes\n  const width = img.getAttribute(kDataWidth);\n  const height = img.getAttribute(kDataHeight);\n\n  // if there is no width and no height, then use naturalWidth/naturalHeight\n  if (!width && !height) {\n    return {\n      width: img.naturalWidth || img.offsetWidth,\n      height: img.naturalHeight || img.offsetHeight,\n      unit: kPixelUnit,\n    };\n\n    // read units\n  } else {\n    let widthWithUnit = imageSizePropWithUnit(width);\n    let heightWithUnit = imageSizePropWithUnit(height);\n\n    if (!widthWithUnit) {\n      widthWithUnit = {\n        size: heightWithUnit!.size * (img.offsetWidth / img.offsetHeight),\n        unit: heightWithUnit!.unit,\n      };\n    }\n\n    if (!heightWithUnit) {\n      heightWithUnit = {\n        size: widthWithUnit.size * (img.offsetHeight / img.offsetWidth),\n        unit: widthWithUnit.unit,\n      };\n    }\n\n    return {\n      width: widthWithUnit.size,\n      height: heightWithUnit.size,\n      unit: widthWithUnit.unit,\n    };\n  }\n}\n\nfunction updateImageNodeSize(\n  view: EditorView,\n  image: NodeWithPos,\n  img: HTMLImageElement,\n  imgContainerWidth: () => number,\n  width: number,\n  height: number,\n  unit: string,\n) {\n  // don't write pixels explicitly\n  unit = unit === kPixelUnit ? '' : unit;\n\n  // edit width & height in keyvalue\n  let keyvalue = extractSizeStyles(image.node.attrs.keyvalue as Array<[string, string]>)!;\n  keyvalue = keyvalue.filter(value => ![kWidthAttrib, kHeightAttrib].includes(value[0]));\n  keyvalue.push([kWidthAttrib, width + unit]);\n  const dims = imageDimensionsFromImg(img, imgContainerWidth());\n  if (!hasPercentWidth(width + unit) && !isNaturalAspectRatio(width, height, dims, false)) {\n    keyvalue.push([kHeightAttrib, height + unit]);\n  }\n\n  // create transaction\n  const tr = view.state.tr;\n\n  // set new attributes\n  tr.setNodeMarkup(image.pos, image.node.type, { ...image.node.attrs, keyvalue });\n\n  // restore node selection if our tr.setNodeMarkup blew away the selection\n  const prevState = view.state;\n  if (prevState.selection instanceof NodeSelection && prevState.selection.from === image.pos) {\n    tr.setSelection(NodeSelection.create(tr.doc, image.pos));\n  }\n\n  // dispatch transaction\n  view.dispatch(tr);\n}\n\n// update the DOM representation of the image. extracts size-oriented attributes from the node and\n// applies them to the img element (alignment oriented attributes are applied to the figure elmenet)\nexport function updateImageViewSize(\n  node: ProsemirrorNode,\n  img: HTMLImageElement,\n  figure: HTMLElement | null,\n  containerWidth: number,\n) {\n  // reset attributes (they'll be set to new values below)\n  img.removeAttribute(kStyleAttrib);\n  img.removeAttribute(kDataWidth);\n  img.removeAttribute(kDataHeight);\n\n  // reset figure styles (only reset styles that we explicitly set below, b/c some\n  // styles may have been set by e.g. the attachResizeUI function)\n  if (figure) {\n    figure.style.cssFloat = '';\n    figure.style.verticalAlign = '';\n    figure.style.margin = '';\n    figure.style.marginTop = '';\n    figure.style.marginBottom = '';\n    figure.style.marginRight = '';\n    figure.style.marginLeft = '';\n    figure.style.padding = '';\n    figure.style.paddingTop = '';\n    figure.style.paddingBottom = '';\n    figure.style.paddingRight = '';\n    figure.style.paddingLeft = '';\n    figure.style.display = kDefaultContainerDisplay;\n  }\n\n  // apply keyvalue attribute to image\n  if (node.attrs.keyvalue) {\n    // factor width & height out of style\n    const keyvalue = extractSizeStyles(node.attrs.keyvalue);\n\n    // inspect all keys and process width, height, and style\n    (keyvalue as Array<[string, string]>).forEach(attr => {\n      // alias key and value\n      const key = attr[0];\n      let value = attr[1];\n\n      // set align oriented styles on figure parent\n      if (key === kStyleAttrib) {\n        if (figure) {\n          const liftStyle = (attrib: string, val: string) => figure.style.setProperty(attrib, val);\n          value = removeStyleAttrib(value, 'float', liftStyle);\n          value = removeStyleAttrib(value, 'vertical-align', liftStyle);\n          value = removeStyleAttrib(value, 'padding(?:[\\\\w\\\\-])*', liftStyle);\n          removeStyleAttrib(value, 'display', liftStyle); // leave display for lifting by image\n        }\n\n        // apply selected other styles to the image view (we don't just forward the entire\n        // style attribute b/c that would interfere with setting of style props in the\n        // width and height cases below). here we should whitelist in all styles we think\n        // users might want to see in the editor\n        const liftImgStyle = (attrib: string, val: string) => img.style.setProperty(attrib, val);\n        value = removeStyleAttrib(value, 'border(?:[\\\\w\\\\-])*', liftImgStyle);\n        value = removeStyleAttrib(value, 'margin(?:[\\\\w\\\\-])*', liftImgStyle);\n        value = removeStyleAttrib(value, 'display', liftImgStyle);\n      } else if (key === kWidthAttrib) {\n        // see if this is a unit we can edit\n        const widthProp = imageSizePropWithUnit(value);\n        if (widthProp) {\n          widthProp.unit = widthProp.unit || kPixelUnit;\n          if (isValidImageSizeUnit(widthProp.unit)) {\n            img.setAttribute(kDataWidth, widthProp.size + widthProp.unit);\n            img.style.width = unitToPixels(widthProp.size, widthProp.unit, containerWidth) + kPixelUnit;\n          }\n        }\n\n        // if not, just pass it straight through (editing UI will be disabled)\n        if (!img.hasAttribute(kDataWidth)) {\n          img.style.width = value;\n        }\n      } else if (key === kHeightAttrib) {\n        // see if this is a unit we can edit\n        const heightProp = imageSizePropWithUnit(value);\n        if (heightProp) {\n          heightProp.unit = heightProp.unit || kPixelUnit;\n          if (isValidImageSizeUnit(heightProp.unit)) {\n            img.setAttribute(kDataHeight, heightProp.size + heightProp.unit);\n            img.style.height = unitToPixels(heightProp.size, heightProp.unit, containerWidth) + kPixelUnit;\n          }\n        }\n\n        // if not, just pass it straight through (editing UI will be disabled)\n        if (!img.hasAttribute(kDataHeight)) {\n          img.style.height = value;\n        }\n\n        // use of legacy 'align' attribute is common for some pandoc users\n        // so we convert it to the requisite CSS and apply it to the figure container\n      } else if (figure && key === kAlignAttrib) {\n        switch (value) {\n          case 'left':\n          case 'right':\n            figure.style.cssFloat = value;\n            break;\n          case 'top':\n          case 'bottom':\n          case 'middle':\n            figure.style.verticalAlign = value;\n            break;\n        }\n      }\n    });\n\n    // if width is a percentage, then displayed height needs to be 'auto'\n    if (hasPercentWidth(img.getAttribute(kDataWidth))) {\n      img.style.height = 'auto';\n    }\n  }\n}\n","/*\n * widgets.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { applyStyles } from '../css';\n\nimport './widgets.css';\n\nexport function createHorizontalPanel() {\n  const div = window.document.createElement('div');\n  div.classList.add('pm-horizontal-panel');\n  return div;\n}\n\nexport function addHorizontalPanelCell(panel: HTMLDivElement, el: HTMLElement) {\n  el.classList.add('pm-horizontal-panel-cell');\n  panel.append(el);\n}\n\nexport function createPopup(\n  view: EditorView,\n  classes: string[],\n  onDestroyed?: () => void,\n  style?: { [key: string]: string },\n) {\n  // create popup\n  const popup = window.document.createElement('span');\n  popup.contentEditable = 'false';\n  popup.classList.add(\n    'pm-popup',\n    'pm-text-color',\n    'pm-proportional-font',\n    'pm-pane-border-color',\n    'pm-background-color',\n  );\n  popup.style.position = 'absolute';\n  popup.style.zIndex = '10';\n  applyStyles(popup, classes, style);\n\n  // create mutation observer that watches for destruction\n  if (onDestroyed) {\n    const observer = new MutationObserver(mutationsList => {\n      mutationsList.forEach(mutation => {\n        mutation.removedNodes.forEach(node => {\n          if (node === popup) {\n            observer.disconnect();\n            onDestroyed();\n          }\n        });\n      });\n    });\n    observer.observe(view.dom, { attributes: false, childList: true, subtree: true });\n  }\n\n  return popup;\n}\n\nexport function createImageButton(image: string, classes: string[], title: string, style?: { [key: string]: string }) {\n  const button = window.document.createElement('button');\n  button.classList.add('pm-image-button');\n  button.title = title;\n  applyStyles(button, classes, style);\n  const imageEl = window.document.createElement('img') as HTMLImageElement;\n  imageEl.src = image;\n  button.append(imageEl);\n  return button;\n}\n\nexport function createInputLabel(text: string, classes?: string[], style?: { [key: string]: string }) {\n  const label = window.document.createElement('label');\n  label.innerText = text;\n  label.classList.add('pm-input-label');\n  applyStyles(label, classes, style);\n  return label;\n}\n\nexport function createSelectInput(options: string[], classes?: string[], style?: { [key: string]: string }) {\n  const select = window.document.createElement('select');\n  appendOptions(select, options);\n  select.classList.add('pm-input-select');\n  select.classList.add('pm-pane-border-color');\n  applyStyles(select, classes, style);\n  return select;\n}\n\nfunction appendOptions(container: HTMLElement, options: string[]) {\n  options.forEach(option => {\n    const optionEl = window.document.createElement('option');\n    optionEl.value = option;\n    optionEl.textContent = option;\n    container.append(optionEl);\n  });\n}\n\nexport function createCheckboxInput(classes?: string[], style?: { [key: string]: string }) {\n  const input = window.document.createElement('input');\n  input.classList.add('pm-input-checkbox');\n  input.type = 'checkbox';\n  applyStyles(input, classes, style);\n  return input;\n}\n\nexport function createTextInput(widthChars: number, classes?: string[], style?: { [key: string]: string }) {\n  const input = document.createElement('input');\n  input.type = 'text';\n  input.classList.add('pm-input-text');\n  input.classList.add('pm-pane-border-color');\n  applyStyles(input, classes, style);\n  input.style.width = widthChars + 'ch';\n  return input;\n}\n","/*\n * figure-keys.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorState, Transaction, NodeSelection, Selection, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n  findParentNodeOfTypeClosestToPos,\n  findSelectedNodeOfType,\n  setTextSelection,\n  ContentNodeWithPos,\n  findParentNodeOfType,\n  findParentNodeClosestToPos,\n} from 'prosemirror-utils';\n\nimport { BaseKey, verticalArrowCanAdvanceWithinTextBlock } from '../../api/basekeys';\nimport { exitNode } from '../../api/command';\n\nexport function figureKeys(schema: Schema) {\n  return [\n    { key: BaseKey.Enter, command: exitNode(schema.nodes.figure, -1, false) },\n    { key: BaseKey.Backspace, command: backspaceHandler() },\n    { key: BaseKey.ArrowLeft, command: arrowHandler('left') },\n    { key: BaseKey.ArrowRight, command: arrowHandler('right') },\n    { key: BaseKey.ArrowUp, command: arrowHandler('up') },\n    { key: BaseKey.ArrowDown, command: arrowHandler('down') },\n  ];\n}\n\nfunction backspaceHandler() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // must be an empty selection\n    const selection = state.selection;\n    if (!selection.empty) {\n      return false;\n    }\n\n    // must be a selection at the beginning of it's parent\n    const schema = state.schema;\n    const { $head } = state.selection;\n    const { parentOffset } = $head;\n    if (parentOffset !== 0) {\n      return false;\n    }\n\n    // two scenarios: backspace within empty caption or backspace right after figure\n    const isWithinEmptyCaption = $head.parent.type === schema.nodes.figure && $head.parent.childCount === 0;\n    if (isWithinEmptyCaption) {\n      if (dispatch) {\n        // set a node selection for the figure\n        const tr = state.tr;\n        tr.setSelection(NodeSelection.create(tr.doc, $head.pos - 1));\n        dispatch(tr);\n      }\n      return true;\n    } else {\n      // check if the previous node is a figure\n      const parent = $head.node($head.depth - 1);\n      const parentIndex = $head.index($head.depth - 1);\n      if (parentIndex > 0) {\n        const previousNode = parent.child(parentIndex - 1);\n        if (previousNode.type === schema.nodes.figure) {\n          if (dispatch) {\n            const tr = state.tr;\n\n            // if the current node is and empty textblock then remove it\n            if ($head.node().childCount === 0) {\n              const parentTextBlock = findParentNodeClosestToPos($head, node => node.isTextblock);\n              if (parentTextBlock) {\n                tr.deleteRange(parentTextBlock.pos, parentTextBlock.pos + parentTextBlock.node.nodeSize);\n              }\n            }\n\n            const nodePos = $head.pos - previousNode.nodeSize - 1;\n            const figureSelection = NodeSelection.create(tr.doc, nodePos);\n            tr.setSelection(figureSelection);\n            dispatch(tr);\n          }\n          return true;\n        }\n      }\n    }\n\n    return false;\n  };\n}\n\nfunction arrowHandler(dir: 'up' | 'down' | 'left' | 'right') {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    // select figure\n    const selectFigure = (figure: ContentNodeWithPos) => {\n      if (dispatch) {\n        const tr = state.tr;\n        const figureSelection = NodeSelection.create(state.doc, figure.pos);\n        tr.setSelection(figureSelection).scrollIntoView();\n        dispatch(tr);\n      }\n    };\n\n    // select figure caption\n    const selectFigureCaption = (figure: ContentNodeWithPos, atEnd = false) => {\n      if (dispatch) {\n        const tr = state.tr;\n        setTextSelection(figure.pos + (atEnd ? figure.node.textContent.length + 1 : 0), 1)(tr);\n        dispatch(tr);\n      }\n    };\n\n    // alias schema and selection\n    const { schema, selection } = state;\n\n    // down/right arrow for node selection w/ caption drives cursor into caption\n    if (\n      (dir === 'down' || dir === 'right') &&\n      selection instanceof NodeSelection &&\n      selection.node.type === schema.nodes.figure\n    ) {\n      const figure = findSelectedNodeOfType(schema.nodes.figure)(selection);\n      if (figure && figure.node.childCount > 0) {\n        selectFigureCaption(figure);\n        return true;\n      }\n    }\n\n    // up/left arrow for selection in caption takes us back to the node selection\n    if (\n      (dir === 'up' || dir === 'left') &&\n      selection instanceof TextSelection &&\n      !!findParentNodeOfType(schema.nodes.figure)(selection)\n    ) {\n      if (dir === 'up' || (dir === 'left' && selection.$head.parentOffset === 0)) {\n        const figure = findParentNodeOfType(schema.nodes.figure)(selection);\n        if (figure) {\n          selectFigure(figure);\n          return true;\n        }\n      }\n\n      // normal node traversal\n    } else if (selection.empty && view && view.endOfTextblock(dir)) {\n      // compute side offset\n      const side = dir === 'left' || dir === 'up' ? -1 : 1;\n\n      // get selection head\n      const { $head } = selection;\n\n      // see if this would traverse our type\n      const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n      if (nextPos.$head) {\n        const figure = findParentNodeOfTypeClosestToPos(nextPos.$head, schema.nodes.figure);\n        if (figure) {\n          // check for e.g. math where you can advance across embedded newlines\n          if ((dir === 'up' || dir === 'down') && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n            return false;\n          }\n          // arrowing back into a figure with a caption selects the caption\n          if (side === -1 && figure.node.childCount > 0) {\n            selectFigureCaption(figure, dir === 'left');\n            // otherwise select the figure\n          } else {\n            selectFigure(figure);\n          }\n          return true;\n        }\n      }\n    }\n\n    // not handled\n    return false;\n  };\n}\n","/*\n * image-events.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorUI } from '../../api/ui';\n\nconst kTextUriList = 'text/uri-list';\nconst kApplicationQtImage = 'application/x-qt-image';\n\nconst pluginKey = new PluginKey('image-events');\n\nexport function imageEventsPlugin(ui: EditorUI) {\n  return new Plugin({\n    key: pluginKey,\n    props: {\n      handleDOMEvents: {\n        drop: imageDrop(ui),\n      },\n      handlePaste: imagePaste(ui),\n    },\n  });\n}\n\nfunction imagePaste(ui: EditorUI) {\n  return (view: EditorView, event: Event) => {\n    const clipboardEvent = event as ClipboardEvent;\n\n    if (clipboardEvent.clipboardData) {\n      // detect file pastes where there is no payload, in that case check to see\n      // if there is clipboard data we can get from our context (e.g. from Qt)\n      if (clipboardEvent.clipboardData.types.includes(kTextUriList)) {\n        const uriList = clipboardEvent.clipboardData.getData(kTextUriList);\n        if (uriList.length === 0) {\n          ui.context.clipboardUris().then(uris => {\n            if (uris) {\n              handleImageUris(view, view.state.selection.from, event, uris, ui);\n            }\n          });\n          event.preventDefault();\n          return true;\n        }\n        // raw image paste (e.g. from an office doc)\n      } else if (clipboardEvent.clipboardData.types.includes('application/x-qt-image')) {\n        ui.context.clipboardImage().then(image => {\n          if (image) {\n            handleImageUris(view, view.state.selection.from, event, [image], ui);\n          }\n          event.preventDefault();\n          return true;\n        });\n      }\n    }\n\n    return false;\n  };\n}\n\nfunction imageDrop(ui: EditorUI) {\n  return (view: EditorView, event: Event) => {\n    // alias to drag event so typescript knows about event.dataTransfer\n    const dragEvent = event as DragEvent;\n\n    // ensure we have data transfer\n    if (!dragEvent.dataTransfer) {\n      return false;\n    }\n\n    // ensure the drop coordinates map to an editor position\n    const coordinates = view.posAtCoords({\n      left: dragEvent.clientX,\n      top: dragEvent.clientY,\n    });\n    if (!coordinates) {\n      return false;\n    }\n\n    // array of uris\n    let uris: string[] | null = null;\n\n    // see if this is a drag of uris\n    const uriList = dragEvent.dataTransfer.getData(kTextUriList);\n    if (uriList) {\n      uris = uriList.split('\\r?\\n');\n    } else {\n      // see if the ui context has some dropped uris\n      uris = ui.context.droppedUris();\n    }\n\n    // process uris if we have them\n    if (uris && handleImageUris(view, coordinates.pos, event, uris, ui)) {\n      event.preventDefault();\n      return true;\n    } else {\n      return false;\n    }\n  };\n}\n\nfunction handleImageUris(view: EditorView, pos: number, event: Event, uris: string[], ui: EditorUI): boolean {\n  // filter out images\n  const imageUris = uris.filter(uri => {\n    // get extension and check it it's an image\n    // https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types#Common_image_file_types\n    const kImageExtensions = [\n      'apng',\n      'bmp',\n      'gif',\n      'ico',\n      'cur',\n      'jpg',\n      'jpeg',\n      'jfif',\n      'pjpeg',\n      'pjp',\n      'png',\n      'svg',\n      'tif',\n      'tiff',\n      'webp',\n    ];\n    const extension = uri\n      .split(/\\./)\n      .pop()!\n      .toLowerCase();\n    return kImageExtensions.includes(extension);\n  });\n\n  // exit if we have no image uris\n  if (imageUris.length === 0) {\n    return false;\n  }\n\n  // resolve image uris then insert them. note that this is done\n  // async so we return true indicating we've handled the drop and\n  // then we actually do the insertion once it returns\n  ui.context.resolveImageUris(imageUris).then(images => {\n    const tr = view.state.tr;\n    images.forEach(image => {\n      const node = view.state.schema.nodes.image.create({ src: image });\n      tr.insert(pos, node);\n    });\n    view.dispatch(tr);\n  });\n\n  // indicate that we will handle the event\n  return true;\n}\n","/*\n * hr.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { findParentNodeOfType } from 'prosemirror-utils';\nimport { EditorState } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, insertNode, EditorCommandId } from '../api/command';\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nimport './hr-styles.css';\n\nconst extension = (context: ExtensionContext) => {\n  const { ui } = context;\n\n  return {\n    nodes: [\n      {\n        name: 'horizontal_rule',\n        spec: {\n          group: 'block',\n          parseDOM: [{ tag: 'hr' }],\n          toDOM(): DOMOutputSpec {\n            return ['div', ['hr', { class: 'pm-border-background-color' }]];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.HorizontalRule,\n              node: 'horizontal_rule',\n            },\n          ],\n          writer: (output: PandocOutput) => {\n            output.writeToken(PandocTokenType.HorizontalRule);\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [\n        new ProsemirrorCommand(\n          EditorCommandId.HorizontalRule,\n          [],\n          insertNode(schema.nodes.horizontal_rule),\n          hrOmniInsert(ui),\n        ),\n      ];\n    },\n\n    inputRules: (_schema: Schema) => {\n      return [\n        new InputRule(/^\\*{3}$/, (state: EditorState, match: string[], start: number, end: number) => {\n          const schema = state.schema;\n          const paraNode = findParentNodeOfType(schema.nodes.paragraph)(state.selection);\n          if (paraNode && state.selection.$anchor.depth === 2) {\n            // only in top-level paragraphs\n            return state.tr.replaceRangeWith(start, end, schema.nodes.horizontal_rule.create());\n          } else {\n            return null;\n          }\n        }),\n      ];\n    },\n  };\n};\n\nfunction hrOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Horizontal Rule'),\n    description: ui.context.translateText('Line that spans across the page'),\n    group: OmniInsertGroup.Content,\n    priority: 1,\n    image: () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.horizontal_rule_dark! : ui.images.omni_insert?.horizontal_rule!,\n  };\n}\n\nexport default extension;\n","/*\n * hard_break.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { Extension } from '../api/extension';\nimport { BaseKey } from '../api/basekeys';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nconst extension: Extension = {\n  nodes: [\n    {\n      name: 'hard_break',\n      spec: {\n        inline: true,\n        group: 'inline',\n        selectable: false,\n        parseDOM: [{ tag: 'br' }],\n        toDOM() {\n          return ['br'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.LineBreak,\n            node: 'hard_break',\n          },\n        ],\n        writer: (output: PandocOutput) => {\n          output.writeToken(PandocTokenType.LineBreak);\n        },\n      },\n    },\n  ],\n\n  baseKeys: (_schema: Schema) => {\n    return [\n      { key: BaseKey.ModEnter, command: hardBreakCommandFn() },\n      { key: BaseKey.ShiftEnter, command: hardBreakCommandFn() },\n    ];\n  },\n};\n\nfunction hardBreakCommandFn() {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const br = state.schema.nodes.hard_break;\n    if (dispatch) {\n      dispatch(state.tr.replaceSelectionWith(br.create()).scrollIntoView());\n    }\n    return true;\n  };\n}\n\nexport default extension;\n","/*\n * null.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './null-styles.css';\n\nconst extension: Extension = {\n  nodes: [\n    {\n      name: 'null',\n      spec: {\n        group: 'block',\n        atom: true,\n        selectable: false,\n        parseDOM: [{ tag: \"div[class*='null-block']\" }],\n        toDOM() {\n          return ['div', { class: 'null-block' }];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Null,\n            node: 'null',\n          },\n        ],\n        writer: (output: PandocOutput) => {\n          output.writeToken(PandocTokenType.Null);\n        },\n      },\n    },\n  ],\n};\n\nexport default extension;\n","/*\n * em.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'em',\n      spec: {\n        group: 'formatting',\n        parseDOM: [\n          { tag: 'i' },\n          { tag: 'em' },\n          { style: 'font-weight', getAttrs: (value: string | Node) => (value as string) === 'italic' && null },\n        ],\n        toDOM() {\n          return ['em'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Emph,\n            mark: 'em',\n          },\n        ],\n        writer: {\n          priority: 4,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Emph, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Em, ['Mod-i'], schema.marks.em)];\n  },\n\n  inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n    return [\n      delimiterMarkInputRule('\\\\*', schema.marks.em, filter, '\\\\*-`', true),\n      delimiterMarkInputRule('_', schema.marks.em, filter, '\\\\w_`', true),\n    ];\n  },\n};\n\nexport default extension;\n","/*\n * strong.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'strong',\n      spec: {\n        group: 'formatting',\n        parseDOM: [\n          // This works around a Google Docs misbehavior where pasted content will be inexplicably wrapped in `<b>`\n          // tags with a font-weight normal.\n          {\n            tag: 'b',\n            getAttrs: (value: string | Node) => (value as HTMLElement).style.fontWeight !== 'normal' && null,\n          },\n          { tag: 'strong' },\n          {\n            style: 'font-weight',\n            getAttrs: (value: string | Node) => /^(bold(er)?|[5-9]\\d{2,})$/.test(value as string) && null,\n          },\n        ],\n        toDOM() {\n          return ['strong'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Strong,\n            mark: 'strong',\n          },\n        ],\n        writer: {\n          priority: 3,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Strong, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Strong, ['Mod-b'], schema.marks.strong)];\n  },\n\n  inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n    return [\n      delimiterMarkInputRule('\\\\*\\\\*', schema.marks.strong, filter, '`', true),\n      delimiterMarkInputRule('__', schema.marks.strong, filter, '\\\\w`', true),\n    ];\n  },\n};\n\nexport default extension;\n","/*\n * code.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { pandocAttrSpec, pandocAttrParseDom, pandocAttrToDomAttr, pandocAttrReadAST } from '../api/pandoc_attr';\nimport { PandocToken, PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport { kCodeText, kCodeAttr } from '../api/code';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions } = context;\n\n  const codeAttrs = pandocExtensions.inline_code_attributes;\n\n  return {\n    marks: [\n      {\n        name: 'code',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          group: 'formatting',\n          attrs: codeAttrs ? pandocAttrSpec : {},\n          parseDOM: [\n            {\n              tag: 'code',\n              getAttrs(dom: Node | string) {\n                if (codeAttrs) {\n                  return pandocAttrParseDom(dom as Element, {});\n                } else {\n                  return {};\n                }\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            const fontClass = 'pm-code pm-fixedwidth-font pm-chunk-background-color pm-block-border-color';\n            const attrs = codeAttrs\n              ? pandocAttrToDomAttr({\n                  ...mark.attrs,\n                  classes: [...mark.attrs.classes, fontClass],\n                })\n              : {\n                  class: fontClass,\n                };\n            return ['code', attrs];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Code,\n              mark: 'code',\n              getText: (tok: PandocToken) => tok.c[kCodeText],\n              getAttrs: (tok: PandocToken) => {\n                if (codeAttrs) {\n                  return pandocAttrReadAST(tok, kCodeAttr);\n                } else {\n                  return {};\n                }\n              },\n            },\n          ],\n          writer: {\n            // lowest possible mark priority since it doesn't call writeInlines\n            // (so will 'eat' any other marks on the stack)\n            priority: 0,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              // collect code and trim it (pandoc will do this on parse anyway)\n              let code = '';\n              parent.forEach((node: ProsemirrorNode) => (code = code + node.textContent));\n              code = code.trim();\n              if (code.length > 0) {\n                output.writeToken(PandocTokenType.Code, () => {\n                  if (codeAttrs) {\n                    output.writeAttr(mark.attrs.id, mark.attrs.classes, mark.attrs.keyvalue);\n                  } else {\n                    output.writeAttr();\n                  }\n                  output.write(code);\n                });\n              }\n            },\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [new MarkCommand(EditorCommandId.Code, ['Mod-d'], schema.marks.code)];\n    },\n\n    inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n      return [delimiterMarkInputRule('`', schema.marks.code, filter)];\n    },\n  };\n};\n\nexport default extension;\n","/*\n * link.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Schema } from 'prosemirror-model';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocToken, PandocOutput, PandocTokenType } from '../../api/pandoc';\nimport {\n  pandocAttrSpec,\n  pandocAttrParseDom,\n  pandocAttrToDomAttr,\n  pandocAttrReadAST,\n  PandocAttr,\n} from '../../api/pandoc_attr';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { kLinkTarget, kLinkTargetUrl, kLinkTargetTitle, kLinkAttr, kLinkChildren } from '../../api/link';\nimport { hasShortcutHeadingLinks } from '../../api/pandoc_format';\n\nimport { linkCommand, removeLinkCommand, linkOmniInsert } from './link-command';\nimport { linkInputRules, linkPasteHandler } from './link-auto';\nimport { linkHeadingsPostprocessor, syncHeadingLinksAppendTransaction } from './link-headings';\nimport { linkPopupPlugin } from './link-popup';\n\nimport './link-styles.css';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, ui, navigation } = context;\n\n  const capabilities = {\n    headings: hasShortcutHeadingLinks(pandocExtensions),\n    attributes: pandocExtensions.link_attributes,\n    text: true,\n  };\n  const linkAttr = pandocExtensions.link_attributes;\n  const autoLink = pandocExtensions.autolink_bare_uris;\n  const headingLink = hasShortcutHeadingLinks(pandocExtensions);\n  const citations = pandocExtensions.citations;\n\n  const excludes = citations ? { excludes: 'cite_id' } : {};\n\n  return {\n    marks: [\n      {\n        name: 'link',\n        spec: {\n          attrs: {\n            href: {},\n            heading: { default: null },\n            title: { default: null },\n            ...(linkAttr ? pandocAttrSpec : {}),\n          },\n          inclusive: false,\n          ...excludes,\n          parseDOM: [\n            {\n              tag: 'a[href]',\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                const attrs: { [key: string]: string | null } = {\n                  href: el.getAttribute('href'),\n                  title: el.getAttribute('title'),\n                  heading: el.getAttribute('data-heading'),\n                };\n                return {\n                  ...attrs,\n                  ...(linkAttr ? pandocAttrParseDom(el, attrs) : {}),\n                };\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            const linkClasses = 'pm-link pm-link-text-color';\n\n            let extraAttr: any = {};\n            if (linkAttr) {\n              extraAttr = pandocAttrToDomAttr({\n                ...mark.attrs,\n                classes: [...mark.attrs.classes, linkClasses],\n              });\n            } else {\n              extraAttr = { class: linkClasses };\n            }\n\n            return [\n              'a',\n              {\n                href: mark.attrs.href,\n                title: mark.attrs.title,\n                'data-heading': mark.attrs.heading,\n                ...extraAttr,\n              },\n            ];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Link,\n              mark: 'link',\n              getAttrs: (tok: PandocToken) => {\n                const target = tok.c[kLinkTarget];\n                return {\n                  href: target[kLinkTargetUrl],\n                  title: target[kLinkTargetTitle] || null,\n                  ...(linkAttr ? pandocAttrReadAST(tok, kLinkAttr) : {}),\n                };\n              },\n              getChildren: (tok: PandocToken) => tok.c[kLinkChildren],\n\n              postprocessor: hasShortcutHeadingLinks(pandocExtensions) ? linkHeadingsPostprocessor : undefined,\n            },\n          ],\n\n          writer: {\n            priority: 12,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              if (mark.attrs.heading) {\n                output.writeRawMarkdown('[');\n                output.writeInlines(parent);\n                output.writeRawMarkdown(']');\n              } else {\n                output.writeLink(\n                  mark.attrs.href,\n                  mark.attrs.title,\n                  linkAttr ? (mark.attrs as PandocAttr) : null,\n                  () => {\n                    output.writeInlines(parent);\n                  },\n                );\n              }\n            },\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [\n        new ProsemirrorCommand(\n          EditorCommandId.Link,\n          ['Mod-k'],\n          linkCommand(schema.marks.link, ui.dialogs.editLink, capabilities),\n          linkOmniInsert(ui),\n        ),\n        new ProsemirrorCommand(EditorCommandId.RemoveLink, [], removeLinkCommand(schema.marks.link)),\n      ];\n    },\n\n    inputRules: linkInputRules(autoLink, headingLink),\n\n    appendTransaction: (schema: Schema) =>\n      pandocExtensions.implicit_header_references ? [syncHeadingLinksAppendTransaction()] : [],\n\n    plugins: (schema: Schema) => {\n      const plugins = [\n        linkPopupPlugin(\n          schema,\n          ui,\n          navigation,\n          linkCommand(schema.marks.link, ui.dialogs.editLink, capabilities),\n          removeLinkCommand(schema.marks.link),\n        ),\n      ];\n      if (autoLink) {\n        plugins.push(\n          new Plugin({\n            key: new PluginKey('link-auto'),\n            props: {\n              transformPasted: linkPasteHandler(schema),\n            },\n          }),\n        );\n      }\n      return plugins;\n    },\n  };\n};\n\nexport default extension;\n","/*\n * link-command.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { MarkType } from 'prosemirror-model';\nimport { EditorUI } from '../../api/ui';\nimport { LinkEditorFn, LinkProps } from '../../api/ui-dialogs';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findChildren } from 'prosemirror-utils';\n\nimport { markIsActive, getMarkAttrs, getSelectionMarkRange, getMarkRange } from '../../api/mark';\n\nimport { linkTargets, LinkCapabilities, LinkType } from '../../api/link';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { equalsIgnoreCase } from '../../api/text';\n\nexport function linkCommand(markType: MarkType, onEditLink: LinkEditorFn, capabilities: LinkCapabilities) {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    // if the current node doesn't allow this mark return false\n    if (!state.selection.$from.node().type.allowsMarkType(markType)) {\n      return false;\n    }\n\n    async function asyncEditLink() {\n      if (dispatch) {\n        // collect link targets\n        const targets = await linkTargets(state.doc);\n\n        // get the range of the mark\n        const range = getSelectionMarkRange(state.selection, markType);\n\n        // get link attributes if we have them\n        let link: { [key: string]: any } = {};\n\n        // only get text if this is a text selection\n        if (state.selection instanceof TextSelection) {\n          link.text = state.doc.textBetween(range.from, range.to);\n          capabilities.text = true;\n        } else {\n          capabilities.text = false;\n        }\n\n        // get other attributes\n        if (markIsActive(state, markType)) {\n          link = {\n            ...link,\n            ...getMarkAttrs(state.doc, range, markType),\n          };\n        } else {\n          // if the link text is a URL then make it the default\n          if (link.text && link.text.match(/^https?:\\/\\/.*$/)) {\n            link.href = link.text;\n          }\n        }\n\n        // determine type\n        if (link.heading) {\n          link.type = LinkType.Heading;\n        } else if (link.href && link.href.startsWith('#')) {\n          link.type = LinkType.ID;\n        } else {\n          link.type = LinkType.URL;\n        }\n\n        // show edit ui\n        const result = await onEditLink({ ...link } as LinkProps, targets, capabilities);\n        if (result) {\n          const tr = state.tr;\n          tr.removeMark(range.from, range.to, markType);\n          if (result.action === 'edit') {\n            // create the mark\n            const mark = markType.create(result.link);\n\n            // if the content changed then replace the range, otherwise\n            if (capabilities.text && link.text !== result.link.text) {\n              const node = markType.schema.text(result.link.text, [mark]);\n              // if we are editing an existing link then replace it, otherwise replace the selection\n              if (link.href) {\n                tr.replaceRangeWith(range.from, range.to, node);\n              } else {\n                tr.replaceSelectionWith(node, false);\n              }\n            } else {\n              tr.addMark(range.from, range.to, mark);\n            }\n\n            // if it's a heading link then update heading to indicate it has an associated link\n            if (result.link.type === LinkType.Heading) {\n              const heading = findChildren(\n                tr.doc,\n                node =>\n                  node.type === state.schema.nodes.heading &&\n                  equalsIgnoreCase(node.textContent, result.link.heading || ''),\n              );\n              if (heading.length > 0) {\n                tr.setNodeMarkup(heading[0].pos, state.schema.nodes.heading, {\n                  ...heading[0].node.attrs,\n                  link: result.link.heading,\n                });\n              }\n            }\n          }\n          dispatch(tr);\n        }\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncEditLink();\n\n    return true;\n  };\n}\n\nexport function linkOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Link...'),\n    description: ui.context.translateText('Link to another location'),\n    group: OmniInsertGroup.Content,\n    priority: 8,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.link_dark! : ui.images.omni_insert?.link!),\n  };\n}\n\nexport function removeLinkCommand(markType: MarkType) {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const range = getMarkRange(state.selection.$from, markType);\n    if (!range) {\n      return false;\n    }\n\n    if (dispatch) {\n      const tr = state.tr;\n      tr.removeMark(range.from, range.to, markType);\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n","/*\n * link-auto.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { markInputRule, MarkInputRuleFilter } from '../../api/input_rule';\nimport { markPasteHandler } from '../../api/clipboard';\n\nexport function linkInputRules(autoLink: boolean, headingLink: boolean) {\n  return (schema: Schema, filter: MarkInputRuleFilter) => {\n    const rules = [\n      // <link> style link\n      markInputRule(/(?:(?:^|[^`])<)(https?:\\/\\/[^>]+)(?:>)$/, schema.marks.link, filter, (match: string[]) => ({\n        href: match[1],\n      })),\n      // full markdown link\n      markInputRule(/(?:\\[)([^\\]]+)(?:\\]\\()([^)]+)(?:\\))$/, schema.marks.link, filter, (match: string[]) => ({\n        href: match[2],\n      })),\n    ];\n\n    if (autoLink) {\n      // plain link\n      rules.push(\n        new InputRule(\n          /(^|[^`])(https?:\\/\\/[^\\s]+\\w)[\\.\\?!\\,)]* $/,\n          (state: EditorState, match: string[], start: number, end: number) => {\n            const tr = state.tr;\n            start = start + match[1].length;\n            const linkEnd = start + match[2].length;\n            tr.addMark(start, linkEnd, schema.marks.link.create({ href: match[2] }));\n            tr.removeStoredMark(schema.marks.link);\n            tr.insertText(' ');\n            setTextSelection(end + 1)(tr);\n            return tr;\n          },\n        ),\n      );\n    }\n\n    return rules;\n  };\n}\n\nexport function linkPasteHandler(schema: Schema) {\n  return markPasteHandler(/(?:<)?([a-z]+:\\/\\/[^\\s>]+)(?:>)?/g, schema.marks.link, url => ({ href: url }));\n}\n","/*\n * clipboard.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Slice, Fragment, MarkType, Node as ProsemirrorNode } from 'prosemirror-model';\n\n// add marks to plain text pasted into the editor (e.g. urls become links)\n// https://github.com/ProseMirror/prosemirror/issues/90\nexport function markPasteHandler(regexp: RegExp, type: MarkType, getAttrs: (s: string) => {}) {\n  const handler = (fragment: Fragment) => {\n    regexp.lastIndex = 0;\n\n    const nodes: ProsemirrorNode[] = [];\n\n    fragment.forEach((child: ProsemirrorNode) => {\n      if (child.isText) {\n        const { text } = child;\n        let pos = 0;\n        let match;\n\n        do {\n          match = regexp.exec(text!);\n          if (match) {\n            const start = match.index;\n            const end = start + match[0].length;\n            const matchText = match.length > 1 ? match[1] : match[0];\n            const attrs = getAttrs instanceof Function ? getAttrs(matchText) : getAttrs;\n            if (start > 0) {\n              nodes.push(child.cut(pos, start));\n            }\n            nodes.push(type.schema.text(matchText).mark(type.create(attrs).addToSet(child.marks)));\n            pos = end;\n          }\n        } while (match);\n\n        if (pos < text!.length) {\n          nodes.push(child.cut(pos));\n        }\n      } else {\n        nodes.push(child.copy(handler(child.content)));\n      }\n    });\n\n    regexp.lastIndex = 0;\n\n    return Fragment.fromArray(nodes);\n  };\n\n  return (slice: Slice) => new Slice(handler(slice.content), slice.openStart, slice.openEnd);\n}\n","/*\n * link-headings.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildrenByType, findChildrenByMark } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { Transaction } from 'prosemirror-state';\nimport { equalsIgnoreCase } from '../../api/text';\n\n// detect links to headings within the doc read from pandoc and update the doc\n// to note those headings in the link attributes\nexport function linkHeadingsPostprocessor(doc: ProsemirrorNode) {\n  // alias schema\n  const schema = doc.type.schema;\n\n  // start with a list of all headings\n  const headings = findChildrenByType(doc, schema.nodes.heading);\n\n  // find link marks\n  findChildrenByMark(doc, schema.marks.link).forEach(link => {\n    const markRange = getMarkRange(doc.resolve(link.pos), schema.marks.link);\n    if (markRange) {\n      const attrs = getMarkAttrs(doc, markRange, schema.marks.link);\n      const linkText = doc.textBetween(markRange.from, markRange.to);\n      const matchedHeading = headings.find(heading => {\n        return equalsIgnoreCase(heading.node.textContent, linkText) && !attrs.title && attrs.href === '#';\n      });\n      if (matchedHeading) {\n        // point the link mark at this heading by name\n        doc.nodesBetween(markRange.from, markRange.to, node => {\n          const linkMark = node.marks.find(m => m.type === schema.marks.link);\n          if (linkMark) {\n            linkMark.attrs.heading = matchedHeading.node.textContent;\n          }\n        });\n\n        // update the heading to indicate it has a named link to it\n        matchedHeading.node.attrs.link = linkText;\n      }\n    }\n  });\n\n  // return doc\n  return doc;\n}\n\nexport function syncHeadingLinksAppendTransaction() {\n  return {\n    name: 'sync-heading-links',\n    nodeFilter: (node: ProsemirrorNode) =>\n      node.type === node.type.schema.nodes.heading || node.type.schema.marks.link.isInSet(node.marks),\n    append: (tr: Transaction) => {\n      // alias schema\n      const schema = tr.doc.type.schema;\n\n      // fix links to be in sync with their text\n      const links = findChildrenByMark(tr.doc, schema.marks.link);\n      links.forEach(link => {\n        const linkPos = tr.mapping.map(link.pos);\n        const range = getMarkRange(tr.doc.resolve(linkPos), schema.marks.link);\n        if (range) {\n          const attrs = getMarkAttrs(tr.doc, range, schema.marks.link);\n          const linkText = tr.doc.textBetween(range.from, range.to);\n          if (attrs.heading && !equalsIgnoreCase(attrs.heading, linkText)) {\n            tr.removeMark(range.from, range.to, schema.marks.link);\n            tr.addMark(range.from, range.to, schema.marks.link.create({ ...attrs, heading: linkText }));\n          }\n        }\n      });\n\n      // if a heading has deviated from it's link, then update the link\n      findChildrenByType(tr.doc, schema.nodes.heading).forEach(heading => {\n        const headingPos = tr.mapping.map(heading.pos);\n        const headingText = heading.node.textContent;\n        const headingLink = heading.node.attrs.link;\n\n        if (headingLink && !equalsIgnoreCase(headingLink, headingText) && headingText.length > 0) {\n          // set the heading link text\n          tr.setNodeMarkup(headingPos, schema.nodes.heading, {\n            ...heading.node.attrs,\n            link: headingText,\n          });\n\n          // find links that don't match and update them\n          findChildrenByMark(tr.doc, schema.marks.link).forEach(link => {\n            const linkPos = tr.mapping.map(link.pos);\n            const range = getMarkRange(tr.doc.resolve(linkPos), schema.marks.link);\n            if (range) {\n              const attrs = getMarkAttrs(tr.doc, range, schema.marks.link);\n              if (equalsIgnoreCase(attrs.heading, headingLink)) {\n                tr.insertText(headingText, range.from, range.to);\n                tr.addMark(\n                  range.from,\n                  range.from + headingText.length,\n                  schema.marks.link.create({ ...attrs, heading: headingText }),\n                );\n              }\n            }\n          });\n        }\n      });\n    },\n  };\n}\n","/*\n * LinkPopup.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, EditorView } from 'prosemirror-view';\nimport { Selection, PluginKey } from 'prosemirror-state';\n\nimport * as React from 'react';\n\nimport ClipboardJS from 'clipboard';\n\nimport { EditorUI } from '../../api/ui';\nimport { LinkProps } from '../../api/ui-dialogs';\nimport { CommandFn } from '../../api/command';\n\nimport { selectionIsImageNode } from '../../api/selection';\n\nimport { showTooltip } from '../../api/widgets/tooltip';\n\nimport { WidgetProps } from '../../api/widgets/react';\nimport { LinkButton, ImageButton } from '../../api/widgets/button';\nimport { Popup } from '../../api/widgets/popup';\nimport { EditorNavigation, NavigationType } from '../../api/navigation';\nimport { Schema } from 'prosemirror-model';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\n\nexport function linkPopupPlugin(\n  schema: Schema,\n  ui: EditorUI,\n  nav: EditorNavigation,\n  linkCmd: CommandFn,\n  removeLinkCmd: CommandFn,\n) {\n  const kPopupChromeWidth = 70;\n  const kMaxLinkWidth = 300;\n  const maxWidth = kMaxLinkWidth + kPopupChromeWidth;\n\n  return textPopupDecorationPlugin({\n    key: new PluginKey<DecorationSet>('link-popup'),\n    markType: schema.marks.link,\n    maxWidth,\n    createPopup: (view: EditorView, target: TextPopupTarget<LinkProps>, style: React.CSSProperties) => {\n      return Promise.resolve(\n        <LinkPopup\n          link={target.attrs}\n          maxLinkWidth={kMaxLinkWidth - 10} // prevent off by pixel(s) overflow\n          linkCmd={linkCmd}\n          removeLinkCmd={removeLinkCmd}\n          view={view}\n          ui={ui}\n          nav={nav}\n          style={style}\n        />,\n      );\n    },\n    specKey: (target: TextPopupTarget<LinkProps>) => {\n      const linkText = target.attrs.heading ? target.attrs.heading : target.attrs.href;\n      return `link:${linkText}`;\n    },\n    filter: (selection: Selection) => {\n      return !selectionIsImageNode(schema, selection);\n    },\n    onCmdClick: (target: TextPopupTarget<LinkProps>) => {\n      ui.display.openURL(target.attrs.href);\n    },\n  });\n}\n\ninterface LinkPopupProps extends WidgetProps {\n  link: LinkProps;\n  maxLinkWidth: number;\n  view: EditorView;\n  ui: EditorUI;\n  nav: EditorNavigation;\n  linkCmd: CommandFn;\n  removeLinkCmd: CommandFn;\n}\n\nconst LinkPopup: React.FC<LinkPopupProps> = props => {\n  // link\n  const linkText = props.link.heading ? props.link.heading : props.link.href;\n  const onLinkClicked = () => {\n    props.view.focus();\n    if (props.link.heading) {\n      props.nav.navigate(NavigationType.Heading, props.link.heading);\n    } else if (props.link.href.startsWith('#')) {\n      props.nav.navigate(NavigationType.Href, props.link.href.substr(1));\n    } else {\n      props.ui.display.openURL(props.link.href);\n    }\n  };\n\n  // copy\n  const showCopyButton = !props.link.heading && ClipboardJS.isSupported();\n  let clipboard: ClipboardJS;\n  const setCopyButton = (button: HTMLButtonElement | null) => {\n    if (button) {\n      clipboard = new ClipboardJS(button, {\n        text: () => linkText,\n      });\n      clipboard.on('success', () => {\n        showTooltip(button, props.ui.context.translateText('Copied to Clipboard'), 's');\n      });\n    } else {\n      if (clipboard) {\n        clipboard.destroy();\n      }\n    }\n  };\n\n  // remove\n  const onRemoveClicked = () => {\n    // in rstudio (w/ webkit) removing the link during the click results\n    // in a page-navigation! defer to next event cycle to avoid this\n    setTimeout(() => {\n      props.removeLinkCmd(props.view.state, props.view.dispatch, props.view);\n      props.view.focus();\n    }, 0);\n  };\n\n  // edit\n  const onEditClicked = () => {\n    props.linkCmd(props.view.state, props.view.dispatch, props.view);\n  };\n\n  return (\n    <Popup classes={['pm-popup-link']} style={props.style}>\n      <LinkButton text={linkText} onClick={onLinkClicked} maxWidth={props.maxLinkWidth} />\n      {showCopyButton ? (\n        <ImageButton\n          image={props.ui.images.copy!}\n          classes={['pm-image-button-copy-link']}\n          title={props.ui.context.translateText('Copy Link to Clipboard')}\n          ref={setCopyButton}\n        />\n      ) : null}\n      <ImageButton\n        image={props.ui.images.removelink!}\n        classes={['pm-image-button-remove-link']}\n        title={props.ui.context.translateText('Remove Link')}\n        onClick={onRemoveClicked}\n      />\n      <ImageButton\n        image={props.ui.images.properties!}\n        classes={['pm-image-button-edit-properties']}\n        title={props.ui.context.translateText('Edit Attributes')}\n        onClick={onEditClicked}\n      />\n    </Popup>\n  );\n};\n","/*\n * tooltip.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport tlite from 'tlite';\n\nimport './tooltip.css';\n\nexport function showTooltip(\n  el: Element,\n  text: string,\n  grav: 's' | 'n' | 'e' | 'w' | 'sw' | 'se' | 'nw' | 'ne' = 'n',\n  timeout = 2000,\n) {\n  el.setAttribute('title', '');\n  el.setAttribute('data-tlite', text);\n  tlite.show(el, { grav });\n  setTimeout(() => tlite.hide(el), timeout);\n}\n","/*\n * button.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nexport interface LinkButtonProps extends WidgetProps {\n  text: string;\n  onClick: () => void;\n  title?: string;\n  maxWidth?: number;\n}\n\nexport const LinkButton: React.FC<LinkButtonProps> = props => {\n  const className = ['pm-link', 'pm-link-text-color'].concat(props.classes || []).join(' ');\n\n  const style: React.CSSProperties = {\n    ...props.style,\n    maxWidth: props.maxWidth,\n  };\n\n  const onClick = (e: React.MouseEvent) => {\n    e.preventDefault();\n    props.onClick();\n  };\n\n  const onKeyDown = (e: React.KeyboardEvent) => {\n    if (e.keyCode === 32) {\n      e.preventDefault();\n      props.onClick();\n    }\n  };\n\n  return (\n    <a\n      href={props.text}\n      tabIndex={0}\n      onClick={onClick}\n      onKeyDown={onKeyDown}\n      title={props.title || props.text}\n      className={className}\n      style={style}\n    >\n      {props.text}\n    </a>\n  );\n};\n\nexport interface ImageButtonProps extends WidgetProps {\n  title: string;\n  image: string;\n  tabIndex?: number;\n  onClick?: () => void;\n}\n\nexport const ImageButton = React.forwardRef<HTMLButtonElement, ImageButtonProps>((props: ImageButtonProps, ref) => {\n  const className = ['pm-image-button'].concat(props.classes || []).join(' ');\n  const onClick = (e: React.MouseEvent) => {\n    if (props.onClick) {\n      e.preventDefault();\n      props.onClick();\n    }\n  };\n  return (\n    <button\n      onClick={onClick}\n      title={props.title}\n      className={className}\n      style={props.style}\n      ref={ref}\n      tabIndex={props.tabIndex}\n    >\n      <img src={props.image} alt={props.title} />\n    </button>\n  );\n});\n\nexport interface TextButtonProps extends WidgetProps {\n  title: string;\n  onClick?: () => void;\n  tabIndex?: number;\n  disabled?: boolean;\n}\n\nexport const TextButton = React.forwardRef<HTMLButtonElement, TextButtonProps>((props: TextButtonProps, ref) => {\n  const className = ['pm-text-button', 'pm-input-button'].concat(props.classes || []).join(' ');\n  const onClick = (e: React.MouseEvent) => {\n    if (props.onClick) {\n      e.preventDefault();\n      props.onClick();\n    }\n  };\n  return (\n    <button\n      onClick={onClick}\n      type=\"button\"\n      className={className}\n      style={props.style}\n      ref={ref}\n      tabIndex={props.tabIndex}\n      disabled={props.disabled}\n    >\n      {props.title}\n    </button>\n  );\n});\n\nexport interface OutlineButtonProps extends WidgetProps {\n  title: string;\n  onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n  tabIndex?: number;\n}\n\nexport const OutlineButton = React.forwardRef<HTMLButtonElement, OutlineButtonProps>(\n  (props: OutlineButtonProps, ref) => {\n    const className = ['pm-outline-button', 'pm-input-button', 'pm-input-outline-button']\n      .concat(props.classes || [])\n      .join(' ');\n    return (\n      <button\n        onClick={props.onClick}\n        type=\"button\"\n        className={className}\n        style={props.style}\n        ref={ref}\n        tabIndex={props.tabIndex}\n      >\n        {props.title}\n      </button>\n    );\n  },\n);\n","/*\n * TextPopup.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\nimport { Selection, Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\n\nimport * as React from 'react';\n\nimport { getMarkRange, getMarkAttrs } from './mark';\nimport { kRestoreLocationTransaction, kNavigationTransaction } from './transaction';\n\nimport { reactRenderForEditorView } from './widgets/react';\nimport { textRangePopupDecorationPosition } from './widgets/decoration';\nimport { kPlatformMac } from './platform';\nimport { MarkType } from 'prosemirror-model';\n\nexport interface TextPopupTarget<AttrsType = any> {\n  attrs: AttrsType;\n  text: string;\n}\n\nexport interface TextPopupDecoration<AttrsType = any> {\n  key: PluginKey<DecorationSet>;\n  markType: MarkType;\n  maxWidth: number;\n  createPopup: (\n    view: EditorView,\n    target: TextPopupTarget<AttrsType>,\n    style: React.CSSProperties,\n  ) => Promise<JSX.Element | null>;\n  dismissOnEdit?: boolean;\n  makeLinksAccessible?: boolean;\n  specKey?: (target: TextPopupTarget<AttrsType>) => string;\n  filter?: (selection: Selection) => boolean;\n  onCmdClick?: (target: TextPopupTarget<AttrsType>) => void;\n}\n\nexport function textPopupDecorationPlugin(deco: TextPopupDecoration): Plugin<DecorationSet> {\n  const {\n    key,\n    markType,\n    maxWidth,\n    createPopup,\n    specKey,\n    dismissOnEdit,\n    makeLinksAccessible,\n    filter,\n    onCmdClick,\n  } = deco;\n\n  let editorView: EditorView;\n\n  return new Plugin<DecorationSet>({\n    key,\n    view(view: EditorView) {\n      editorView = view;\n      return {};\n    },\n    state: {\n      init: (_config: { [key: string]: any }) => {\n        return DecorationSet.empty;\n      },\n      apply: (tr: Transaction, old: DecorationSet, _oldState: EditorState, newState: EditorState) => {\n        // if this a restore location or navigation then return empty\n        if (tr.getMeta(kRestoreLocationTransaction) || tr.getMeta(kNavigationTransaction)) {\n          return DecorationSet.empty;\n        }\n\n        // if this is doc update and we have dismiss on edit then return empty\n        if (dismissOnEdit && tr.docChanged) {\n          return DecorationSet.empty;\n        }\n\n        // if the selection is contained within the mark then show the popup\n        const selection = newState.selection;\n\n        // TODO JJA: The mark range is undefined when the the selection is 'after' the mark\n        // e.g.  [@allaire2012|]\n        // which means that the preview doesn't show\n        const range = getMarkRange(selection.$from, markType);\n\n        if (range) {\n          // selection has to be bounded by the range\n          if (selection.from < range.from || selection.to > range.to) {\n            return DecorationSet.empty;\n          }\n\n          // apply the filter\n          if (filter && !filter(selection)) {\n            return DecorationSet.empty;\n          }\n\n          // don't show the link popup if it's positioned at the far left of the mark\n          // (awkward when cursor is just left of an image)\n          if (selection.empty && range.from === selection.from) {\n            return DecorationSet.empty;\n          }\n\n          // mark target\n          const attrs = getMarkAttrs(newState.doc, range, markType);\n          const text = newState.doc.textBetween(range.from, range.to);\n          const target = { attrs, text };\n\n          // compute position (we need this both for setting the styles on the LinkPopup\n          // as well as for setting the Decorator pos)\n          const decorationPosition = textRangePopupDecorationPosition(editorView, range, maxWidth);\n\n          // key if one was provided\n          let decoratorSpec: { [key: string]: any } | undefined;\n          if (specKey) {\n            decoratorSpec = {\n              key: decorationPosition.key + specKey(target),\n              ignoreSelection: true,\n              stopEvent: () => {\n                return true;\n              },\n            };\n          }\n\n          // create decorator\n          const textPopupDecorator = Decoration.widget(\n            decorationPosition.pos,\n\n            (view: EditorView, getPos: () => number) => {\n              // create decorator and render popup into it\n              const decorationEl = window.document.createElement('div');\n              decorationEl.style.visibility = 'hidden';\n\n              // create popup component\n              createPopup(view, target, decorationPosition.style).then(popup => {\n                if (popup) {\n                  reactRenderForEditorView(popup, decorationEl, view);\n\n                  // make sure links responsd to spacebar\n                  if (makeLinksAccessible) {\n                    const links = decorationEl.getElementsByTagName('a');\n                    // tslint:disable-next-line: prefer-for-of\n                    for (let i = 0; i < links.length; i++) {\n                      const link = links[0];\n                      link.onkeydown = (e: KeyboardEvent) => {\n                        if (e.keyCode === 32) {\n                          e.preventDefault();\n                          link.click();\n                        }\n                      };\n                    }\n                  }\n\n                  decorationEl.style.visibility = 'visible';\n                }\n              });\n\n              return decorationEl;\n            },\n\n            decoratorSpec,\n          );\n\n          // return decorations\n          return DecorationSet.create(tr.doc, [textPopupDecorator]);\n        } else {\n          return DecorationSet.empty;\n        }\n      },\n    },\n    props: {\n      decorations: (state: EditorState) => {\n        return key.getState(state);\n      },\n      handleClick: onCmdClick\n        ? (view: EditorView, pos: number, event: MouseEvent) => {\n            const keyPressed = kPlatformMac && event.metaKey;\n            if (keyPressed) {\n              const attrs = getMarkAttrs(view.state.doc, { from: pos, to: pos }, markType);\n              const range = getMarkRange(view.state.doc.resolve(pos));\n              if (attrs && range) {\n                event.stopPropagation();\n                event.preventDefault();\n                const text = view.state.doc.textBetween(range.from, range.to);\n                onCmdClick({ attrs, text });\n                return true;\n              }\n            }\n            return false;\n          }\n        : undefined,\n    },\n  });\n}\n","/*\n * react.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport { EditorView } from 'prosemirror-view';\n\nexport interface WidgetProps {\n  classes?: string[];\n  style?: React.CSSProperties;\n}\n\n// Render a react element into a DOM container that will eventually be added to the EditorView.dom\n// this function is necessary for situations where an element is created and then handed to ProseMirror\n// (unattached to the DOM), and then subsequently destoyed/unmounted by ProseMirror. We use a\n// MutationObserver to watch EditorView.dom for the element's removal then in response call\n// ReactDOM.unmountComponentAtNode\nexport function reactRenderForEditorView(element: React.ReactElement, container: HTMLElement, view: EditorView) {\n  // render the react element into the container\n  const ref = ReactDOM.render(element, container);\n\n  // track view dom mutations to determine when ProseMirror has destroyed the element\n  // (our cue to unmount/cleanup the react component)\n  const observer = new MutationObserver(mutationsList => {\n    mutationsList.forEach(mutation => {\n      mutation.removedNodes.forEach(node => {\n        if (node === container) {\n          observer.disconnect();\n          ReactDOM.unmountComponentAtNode(container);\n        }\n      });\n    });\n  });\n  observer.observe(view.dom, { attributes: false, childList: true, subtree: true });\n\n  // return the ref\n  return ref;\n}\n","/*\n * decoration.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { editingRootNodeClosestToPos } from '../node';\n\nimport { kPixelUnit } from '../css';\n\nexport interface DecorationPosition {\n  pos: number;\n  style: { [key: string]: string };\n  key: string;\n}\n\nexport function textRangePopupDecorationPosition(\n  view: EditorView,\n  range: { from: number; to: number },\n  maxWidth: number,\n): DecorationPosition {\n  // get the (window) DOM coordinates for the start of the range. we use range.from + 1 so\n  // that ranges that are at the beginning of a line don't have their position set\n  // to the previous line\n  const rangeCoords = view.coordsAtPos(range.from + 1);\n\n  // get the node, element, coordinates, and style for the current editing root\n  const rangePos = view.state.doc.resolve(range.from);\n  const editingNode = editingRootNodeClosestToPos(rangePos)!;\n  const editingEl = view.domAtPos(editingNode!.pos + 1).node as HTMLElement;\n  const editingBox = editingEl.getBoundingClientRect();\n  const editingBoxStyle = window.getComputedStyle(editingEl);\n\n  // base popup style\n  const topPadding = parseInt(editingBoxStyle.paddingTop!, 10) || 0;\n  const popupStyle = {\n    top: rangeCoords.bottom - editingBox.top - topPadding + 5 + kPixelUnit,\n  };\n\n  // we need to compute whether the popup will be visible (horizontally), do\n  // this by testing whether we have room for the max link width + controls/padding\n  let style: { [key: string]: string };\n  const positionRight = rangeCoords.left + maxWidth > editingBox.right;\n  if (positionRight) {\n    const rightCoords = view.coordsAtPos(range.to);\n    const rightPos = rangeCoords.top === rightCoords.top ? editingBox.right - rightCoords.right : 0;\n    style = {\n      ...popupStyle,\n      right: rightPos + kPixelUnit,\n    };\n  } else {\n    const marginLeft =\n      'calc(' +\n      (rangeCoords.left - editingBox.left) +\n      'px ' +\n      ' - ' +\n      editingBoxStyle.borderLeftWidth +\n      ' - ' +\n      editingBoxStyle.paddingLeft +\n      ' - ' +\n      editingBoxStyle.marginLeft +\n      ' - 1ch' +\n      ')';\n    style = {\n      ...popupStyle,\n      marginLeft,\n    };\n  }\n\n  // calculate key\n  const key = Object.keys(style)\n    .map(attrib => `${attrib}=${style[attrib]}`)\n    .join(';');\n\n  return {\n    pos: editingNode.pos + editingNode.node.nodeSize - 1,\n    style,\n    key,\n  };\n}\n\nfunction getEditingBox(view: EditorView, pos$: ResolvedPos) {\n  const editingNode = editingRootNodeClosestToPos(pos$);\n  const editingEl = view.domAtPos(editingNode!.pos + 1).node as HTMLElement;\n  return editingEl.getBoundingClientRect();\n}\n","/*\n * select_all.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findBlockNodes, ContentNodeWithPos } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { editingRootNode } from '../api/node';\n\nconst extension: Extension = {\n  commands: () => {\n    return [new ProsemirrorCommand(EditorCommandId.SelectAll, ['Mod-a'], selectAll)];\n  },\n};\n\nexport function selectAll(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n  if (dispatch) {\n    const editingRoot = editingRootNode(state.selection);\n    if (editingRoot) {\n      const schema = state.schema;\n      const tr = state.tr;\n      if (editingRoot.node.type === schema.nodes.note) {\n        tr.setSelection(childBlocksSelection(tr.doc, editingRoot));\n      } else {\n        const start = tr.doc.resolve(editingRoot.pos);\n        const end = tr.doc.resolve(editingRoot.pos + editingRoot.node.nodeSize);\n        tr.setSelection(new TextSelection(start, end));\n      }\n      dispatch(tr);\n      if (view) {\n        // we do this to escape from embedded editors e.g. codemirror\n        view.focus();\n      }\n    }\n  }\n  return true;\n}\n\nfunction childBlocksSelection(doc: ProsemirrorNode, parent: ContentNodeWithPos) {\n  const blocks = findBlockNodes(parent.node);\n  const begin = parent.start + blocks[0].pos + 1;\n  const lastBlock = blocks[blocks.length - 1];\n  const end = parent.start + lastBlock.pos + lastBlock.node.nodeSize;\n  return TextSelection.create(doc, begin, end);\n}\n\nexport default extension;\n","/*\n * history.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { history, redo, undo } from 'prosemirror-history';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n  commands: () => {\n    return [\n      new ProsemirrorCommand(EditorCommandId.Undo, ['Mod-z'], undo),\n      new ProsemirrorCommand(EditorCommandId.Redo, ['Shift-Mod-z'], redo),\n    ];\n  },\n\n  plugins: () => {\n    return [history()];\n  },\n};\n\nexport default extension;\n","/*\n * cursor.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey, Plugin, EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { dropCursor } from 'prosemirror-dropcursor';\nimport { gapCursor, GapCursor } from 'prosemirror-gapcursor';\nimport 'prosemirror-gapcursor/style/gapcursor.css';\n\nimport { findParentNodeOfTypeClosestToPos, findParentNodeOfType, findParentNode } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { BaseKey, verticalArrowCanAdvanceWithinTextBlock } from '../api/basekeys';\n\nimport './cursor.css';\nimport { ResolvedPos } from 'prosemirror-model';\nimport { isList } from '../api/list';\n\n\nconst extension: Extension = {\n\n  baseKeys: () => {\n    return [\n      { key: BaseKey.ArrowLeft, command: gapArrowHandler('left') },\n      { key: BaseKey.ArrowUp, command: gapArrowHandler('up') }\n    ];\n  },\n\n  plugins: () => {\n    return [\n      gapCursor(), \n      dropCursor(),\n      new Plugin({\n        key: new PluginKey('div-gap-cursor'),\n        props: {\n          handleDOMEvents: {\n            click: gapClickHandler,\n          },\n        },\n      })];\n  },\n};\n\nfunction gapArrowHandler(dir: 'up' | 'left') {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    \n\n    // function to create a gap cursor\n    const createGapCursor = ($pos: ResolvedPos) => {\n      if (dispatch) {\n        const cursor = new GapCursor($pos, $pos);\n        const tr = state.tr;\n        tr.setSelection(cursor);\n        dispatch(tr);\n      }\n      return true;\n    };\n\n    if (state.selection.empty && view && view.endOfTextblock(dir)) {\n      \n      // get the selection\n      const $head = state.selection.$head;\n\n      // if we are in a block that handles up/down (e.g. display math)\n      // then we don't want to make a gap cursor\n      if (dir === 'up' && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n        return false;\n      }\n\n      // check if we are in a div\n      const div = findParentNodeOfType(state.schema.nodes.div)(state.selection);\n      \n      // if we are at the very top of a div then create a gap cursor\n      if (div) {\n        \n        const $divPos = state.doc.resolve(div.pos);\n        if ($head.index($head.depth - 1) === 0 && !(state.selection instanceof GapCursor)) {\n\n          // if we are in a list item the calculations about view.endOfTextblock will be off\n          if (findParentNode(isList)(state.selection)) {\n            return false;\n          }\n\n          return createGapCursor(state.doc.resolve($divPos.pos + 1));\n        } \n      }\n\n      // if we are at the top of the document then create a gap cursor\n      if (!$head.nodeBefore && ($head.pos <= 2)) {\n        return createGapCursor(state.doc.resolve($head.pos - 1));\n      }\n      \n      return false;\n\n    } else {\n      return false;\n    }\n\n   \n  };\n}\n\n\nfunction gapClickHandler(view: EditorView, event: Event): boolean {\n\n  const schema = view.state.schema;\n  const mouseEvent = event as MouseEvent;\n  const clickPos = view.posAtCoords({ left: mouseEvent.clientX, top: mouseEvent.clientY } );\n\n  if (clickPos) {\n\n    // resolve click pos\n    const $clickPos = view.state.doc.resolve(clickPos.pos);    \n\n    // create a gap cursor at the click position\n    const createGapCursor = () => {\n      // focus the view\n      view.focus();\n        \n      // create the gap cursor\n      const tr = view.state.tr;\n      const cursor = new GapCursor($clickPos, $clickPos); \n      tr.setSelection(cursor);\n      view.dispatch(tr);\n      \n      // prevent default event handling\n      event.preventDefault();\n      event.stopImmediatePropagation();\n      return false;\n    };\n     \n    // handle clicks at the top of divs\n     if (schema.nodes.div) {\n      const div = findParentNodeOfTypeClosestToPos(\n        view.state.doc.resolve(clickPos.pos), schema.nodes.div\n      );\n      if (div && div.pos === clickPos.inside) {\n        const divNode = view.nodeDOM(div.start);\n        if (divNode instanceof HTMLElement) {\n          if (Math.abs(mouseEvent.clientX - divNode.getBoundingClientRect().left) < 150) {\n            return createGapCursor();\n          }\n        }\n      }\n    }\n\n    // handle clicks above body\n    // Take this out for now b/c it was interfering with other mouse \n    // gestures (e.g. clicking on attr editor). keyboard gestures still\n    // work to get to the top of the body\n    /*\n    if ($clickPos.parent.type === schema.nodes.body &&\n        $clickPos.start() === $clickPos.pos) {\n      \n      return createGapCursor();\n\n    }\n    */\n  }\n\n  return false;\n}\n\nexport default extension;\n","/*\n * clear_formatting.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { Extension } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { liftTarget } from 'prosemirror-transform';\n\n// marks included in clear formatting\nconst kFormattingMarks = ['code', 'em', 'underline', 'smallcaps', 'span', 'strikeout', 'strong', 'superscript', 'subscript'];\n\n// for nodes, all nodes with isTextblock === true will be converted to paragraph, and all\n// nodes in this list will be lifted\nconst kLiftFormattingNodes = ['blockquote', 'line_block', 'div', 'raw_block'];\n\nconst extension: Extension = {\n  commands: () => {\n    return [new ProsemirrorCommand(EditorCommandId.ClearFormatting, ['Mod-\\\\'], clearFormatting)];\n  },\n};\n\nexport function clearFormatting(state: EditorState, dispatch?: (tr: Transaction) => void) {\n  if (dispatch) {\n    // create transaction\n    const tr = state.tr;\n\n    // alias schema and selection\n    const schema = state.schema;\n    const { from, to } = tr.selection;\n\n    // clear formatting marks\n    kFormattingMarks.forEach(markName => {\n      const mark = state.schema.marks[markName];\n      if (mark) {\n        tr.removeMark(from, to, mark);\n      }\n    });\n    tr.setStoredMarks([]);\n\n    // lift / set nodes as required\n    tr.doc.nodesBetween(from, to, (node: ProsemirrorNode, pos: number) => {\n      // ignore paragraph and text nodes (already have 'cleared' formatting)\n      if (node.type === schema.nodes.paragraph || node.type === schema.nodes.text) {\n        return;\n      }\n\n      // pass recursively through list container nodes\n      if (\n        node.type === schema.nodes.bullet_list ||\n        node.type === schema.nodes.ordered_list ||\n        node.type === schema.nodes.definition_list ||\n        node.type === schema.nodes.definition_list_term ||\n        node.type === schema.nodes.definition_list_description\n      ) {\n        return;\n      }\n\n      // get node range (map positions)\n      const fromPos = tr.doc.resolve(tr.mapping.map(pos + 1));\n      const toPos = tr.doc.resolve(tr.mapping.map(pos + node.nodeSize - 1));\n      const nodeRange = fromPos.blockRange(toPos);\n\n      // process text blocks and blocks that can be lifted (e.g. blockquote)\n      if (nodeRange) {\n        if (node.type.isTextblock) {\n          tr.setNodeMarkup(nodeRange.start, schema.nodes.paragraph);\n        } else if (kLiftFormattingNodes.includes(node.type.name)) {\n          const targetLiftDepth = liftTarget(nodeRange);\n          if (targetLiftDepth || targetLiftDepth === 0) {\n            tr.lift(nodeRange, targetLiftDepth);\n          }\n        }\n      }\n    });\n\n    dispatch(tr);\n  }\n\n  return true;\n}\n\nexport default extension;\n","/*\n * smarty.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ellipsis, InputRule } from 'prosemirror-inputrules';\nimport { Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { fancyQuotesToSimple } from '../api/quote';\n\nconst plugin = new PluginKey('smartypaste');\n\n// match enDash but only for lines that aren't an html comment\nconst enDash = new InputRule(/[^!-`]--$/, (state: EditorState, match: string[], start: number, end: number) => {\n  const { parent, parentOffset } = state.selection.$head;\n  const precedingText = parent.textBetween(0, parentOffset);\n  if (precedingText.indexOf('<!--') === -1) {\n    const tr = state.tr;\n    tr.insertText('–', end - 1, end);\n    return tr;\n  } else {\n    return null;\n  }\n});\n\nconst emDash = new InputRule(/(^|[^`])–-$/, (state: EditorState, match: string[], start: number, end: number) => {\n  const tr = state.tr;\n  tr.insertText('—', end - 1, end);\n  return tr;\n});\n\nconst extension: Extension = {\n  inputRules: () => {\n    return [ellipsis, enDash, emDash];\n  },\n\n  plugins: (schema: Schema) => {\n    return [\n      // apply smarty rules to plain text pastes\n      new Plugin({\n        key: plugin,\n        props: {\n          transformPastedText(text: string) {\n            // emdash\n            text = text.replace(/(\\w)---(\\w)/g, '$1—$2');\n\n            // endash\n            text = text.replace(/(\\w)--(\\w)/g, '$1–$2');\n\n            // ellipses\n            text = text.replace(/\\.\\.\\./g, '…');\n\n            // we explicitly don't want fancy quotes in the editor\n            text = fancyQuotesToSimple(text);\n\n            return text;\n          },\n        },\n      }),\n    ];\n  },\n};\n\nexport default extensionIfEnabled(extension, 'smart');\n","/*\n * attr_duplicate_id.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Step, AddMarkStep } from 'prosemirror-transform';\nimport { findChildren } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { getMarkAttrs, getMarkRange } from '../api/mark';\nimport { extensionIfPandocAttrEnabled } from '../api/pandoc_attr';\n\nconst extension: Extension = {\n  appendTransaction: (_schema: Schema) => {\n    // detect changes in content with ids\n    const hasAttrId = (node: ProsemirrorNode) => {\n      return !!node.attrs.id || node.marks.some(mark => !!mark.attrs.id);\n    };\n\n    // detect mark steps with new ids\n    const attrMarkStep = (step: Step) => {\n      return step instanceof AddMarkStep && !!(step as any).mark.attrs.id;\n    };\n\n    return [\n      {\n        name: 'attr_duplicate_id',\n        filter: (transactions: Transaction[]) => transactions.some(transaction => transaction.steps.some(attrMarkStep)),\n        nodeFilter: hasAttrId,\n        append: (tr: Transaction) => {\n          const usedIds = new Set<string>();\n          const scannedRanges: Array<{ from: number; to: number }> = [];\n          findChildren(tr.doc, hasAttrId, true).forEach(attrNode => {\n            if (attrNode.node.attrs.id) {\n              const id = attrNode.node.attrs.id;\n              if (usedIds.has(id)) {\n                const node = attrNode.node;\n                tr.setNodeMarkup(attrNode.pos, undefined, { ...node.attrs, id: null }, node.marks);\n              } else {\n                usedIds.add(id);\n              }\n            } else {\n              const mark = attrNode.node.marks.find(mk => !!mk.attrs.id)!;\n              const markRange = getMarkRange(tr.doc.resolve(attrNode.pos), mark.type) as { from: number; to: number };\n              const markAttrs = getMarkAttrs(tr.doc, markRange, mark.type);\n              const id = markAttrs.id;\n              if (id && !scannedRanges.find(range => range.from === markRange.from && range.to === markRange.to)) {\n                scannedRanges.push(markRange);\n                if (usedIds.has(id)) {\n                  tr.removeMark(markRange.from, markRange.to, mark.type);\n                  tr.addMark(markRange.from, markRange.to, mark.type.create({ ...mark.attrs, id: null }));\n                } else {\n                  usedIds.add(id);\n                }\n              }\n            }\n          });\n        },\n      },\n    ];\n  },\n};\n\nexport default extensionIfPandocAttrEnabled(extension);\n","/*\n * trailing_p.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction, Selection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { Transform } from 'prosemirror-transform';\nimport { ContentNodeWithPos } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { editingRootNode } from '../api/node';\nimport { FixupContext } from '../api/fixup';\nimport { trTransform } from '../api/transaction';\n\nconst extension: Extension = {\n  fixups: (schema: Schema) => {\n    return [\n      (tr: Transaction, context: FixupContext) => {\n        if (context === FixupContext.Load) {\n          if (requiresTrailingP(tr.selection)) {\n            insertTrailingP(tr);\n          }\n        }\n        return tr;\n      },\n    ];\n  },\n\n  appendTransaction: (schema: Schema) => {\n    return [\n      {\n        name: 'trailing_p',\n        append: (tr: Transaction) => {\n          if (requiresTrailingP(tr.selection)) {\n            insertTrailingP(tr);\n          }\n          return tr;\n        },\n      },\n    ];\n  },\n};\n\nfunction insertTrailingP(tr: Transaction) {\n  const editingNode = editingRootNode(tr.selection);\n  if (editingNode) {\n    trTransform(tr, insertTrailingPTransform(editingNode));\n  }\n}\n\nfunction insertTrailingPTransform(editingNode: ContentNodeWithPos) {\n  return (tr: Transform) => {\n    const schema = editingNode.node.type.schema;\n    tr.insert(editingNode.pos + editingNode.node.nodeSize - 1, schema.nodes.paragraph.create());\n  };\n}\n\nfunction requiresTrailingP(selection: Selection) {\n  const editingRoot = editingRootNode(selection);\n  if (editingRoot) {\n    return !isParagraphNode(editingRoot.node.lastChild) || isDisplayMathNode(editingRoot.node.lastChild);\n  } else {\n    return false;\n  }\n}\n\nfunction isParagraphNode(node: ProsemirrorNode | null | undefined) {\n  if (node) {\n    const schema = node.type.schema;\n    return node.type === schema.nodes.paragraph;\n  } else {\n    return false;\n  }\n}\n\nfunction isDisplayMathNode(node: ProsemirrorNode | null | undefined) {\n  if (node && node.firstChild) {\n    return node.childCount === 1 && node.type.schema.marks.math?.isInSet(node.firstChild.marks);\n  } else {\n    return false;\n  }\n}\n\nexport default extension;\n","/*\n * empty_mark.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { Transaction, EditorState } from 'prosemirror-state';\nimport { ReplaceStep } from 'prosemirror-transform';\n\nimport { Extension } from '../api/extension';\nimport { getMarkRange } from '../api/mark';\n\nconst extension: Extension = {\n  appendTransaction: (schema: Schema) => {\n    return [\n      {\n        name: 'clear_empty_mark',\n        append: (tr: Transaction, transactions: Transaction[], _oldState: EditorState, newState: EditorState) => {\n          // if we have an empty selection\n          if (newState.selection.empty) {\n            // if the last change removed text\n            const removedText = transactions.some(transaction =>\n              transaction.steps.some(step => {\n                return step instanceof ReplaceStep && (step as any).slice.content.size === 0;\n              }),\n            );\n            if (removedText) {\n              // if there is a stored mark w/ 0 range then remove it\n              newState.storedMarks?.forEach(mark => {\n                const markRange = getMarkRange(tr.doc.resolve(tr.selection.from), mark.type);\n                if (!markRange || markRange.from === markRange.to) {\n                  tr.removeStoredMark(mark);\n                }\n              });\n            }\n          }\n        },\n      },\n    ];\n  },\n};\n\nexport default extension;\n","/*\n * escape_mark.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport { BaseKey } from '../api/basekeys';\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n  baseKeys: (_schema: Schema) => {\n    return [\n      {\n        key: BaseKey.ArrowRight,\n        command: (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n          if (state.selection.empty) {\n            // if we are at the end of a parent text block and there are\n            // marks stored in the state or active on the selection then\n            // clear the stored marks and insert a space.\n            const $head = state.selection.$head;\n            const parent = $head.node($head.depth);\n            if (\n              parent.type.isTextblock &&\n              $head.parentOffset === parent.textContent.length &&\n              ($head.marks().length > 0 || !!state.storedMarks)\n            ) {\n              if (dispatch) {\n                const tr = state.tr;\n                tr.setStoredMarks([]);\n                tr.insertText(' ');\n                dispatch(tr);\n              }\n              return true;\n            }\n          }\n          return false;\n        },\n      },\n    ];\n  },\n};\n\nexport default extension;\n","/*\n * code_block_input.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, ResolvedPos, Fragment } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocExtensions } from '../api/pandoc';\nimport { EditorFormat } from '../api/format';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { precedingListItemInsertPos, precedingListItemInsert } from '../api/list';\nimport { pandocAttrFrom } from '../api/pandoc_attr';\nimport { BaseKey } from '../api/basekeys';\n\nimport { markIsActive } from '../api/mark';\nimport { canInsertRmdChunk } from '../api/rmd';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, format } = context;\n\n  const fencedAttributes = pandocExtensions.fenced_code_attributes || !!format.rmdExtensions.codeChunks;\n\n  return {\n    baseKeys: () => {\n      return [{ key: BaseKey.Enter, command: codeBlockInputRuleEnter(pandocExtensions, fencedAttributes, format) }];\n    },\n\n    inputRules: () => {\n      if (fencedAttributes) {\n        return [\n          new InputRule(/^```{$/, (state: EditorState, match: string[], start: number, end: number) => {\n            if (!canApplyCodeBlockInputRule(state)) {\n              return null;\n            }\n            const tr = state.tr;\n            tr.insertText('{}');\n            setTextSelection(start + match[0].length)(tr);\n            return tr;\n          }),\n        ];\n      } else {\n        return [];\n      }\n    },\n  };\n};\n\nfunction codeBlockInputRuleEnter(pandocExtensions: PandocExtensions, fencedAttributes: boolean, format: EditorFormat) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // see if the parent consist of a pending code block input rule\n    const schema = state.schema;\n    const { $head } = state.selection;\n\n    // selection must be empty\n    if (!state.selection.empty) {\n      return false;\n    }\n\n    // full text of parent must meet the pattern\n    // eslint-disable-next-line no-useless-escape\n    const match = $head.parent.textContent.match(/^```(?:(\\w+)|\\{([\\.=]?[^\\}]+)\\})?$/);\n    if (!match) {\n      return false;\n    }\n\n    // no inline code marks\n    if (markIsActive(state, schema.marks.code)) {\n      return false;\n    }\n\n    // must be able to perform the replacement\n    if (!canApplyCodeBlockInputRule(state)) {\n      return false;\n    }\n\n    // determine nature of insert\n    const fenced = fencedAttributes && !!match[2];\n    const langAttrib = fenced ? match[2] : match[1] || '';\n    const rawBlock = fenced && pandocExtensions.raw_attribute && langAttrib.match(/^=\\w.*$/);\n    const rmdChunk = fenced && !!format.rmdExtensions.codeChunks && langAttrib.match(/^\\w.*$/);\n\n    // if it's an rmd chunk then apply further validation\n    if (rmdChunk && !canInsertRmdChunk(state)) {\n      return false;\n    }\n\n    // execute\n    if (dispatch) {\n      // eslint-disable-next-line no-useless-escape\n      const lang = langAttrib.replace(/^[\\.=]/, '');\n\n      // create transaction and clear input\n      const tr = state.tr;\n      const start = $head.start();\n      const end = start + $head.parent.textContent.length;\n      tr.deleteRange(start, end);\n\n      // determine type and attrs\n      const type = rawBlock ? schema.nodes.raw_block : rmdChunk ? schema.nodes.rmd_chunk : schema.nodes.code_block;\n      const content = rmdChunk ? schema.text(`{${match[2]}}\\n`) : Fragment.empty;\n      const attrs = rawBlock ? { format: lang } : !rmdChunk && lang.length ? pandocAttrFrom({ classes: [lang] }) : {};\n\n      // see if this should go into a preceding list item\n      const prevListItemPos = precedingListItemInsertPos(state.doc, state.selection);\n      if (prevListItemPos) {\n        const block = type.createAndFill(attrs, content);\n        precedingListItemInsert(tr, prevListItemPos, block);\n      } else {\n        tr.insert(start, content);\n        tr.setBlockType(start, start, type, attrs);\n      }\n\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nfunction canReplaceNodeWithCodeBlock(schema: Schema, $pos: ResolvedPos) {\n  return $pos.node(-1).canReplaceWith($pos.index(-1), $pos.indexAfter(-1), schema.nodes.code_block);\n}\n\nfunction canApplyCodeBlockInputRule(state: EditorState) {\n  const schema = state.schema;\n  const { $head } = state.selection;\n  return canReplaceNodeWithCodeBlock(schema, $head) || precedingListItemInsertPos(state.doc, state.selection);\n}\n\nexport default extension;\n","/*\n * plain_text_paste.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos, Schema, Fragment, Slice } from 'prosemirror-model';\nimport { Plugin, PluginKey } from 'prosemirror-state';\n\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n  plugins: (schema: Schema) => [pasteTextPlugin(schema)],\n};\n\nfunction pasteTextPlugin(schema: Schema) {\n  return new Plugin({\n    key: new PluginKey('paste-text'),\n\n    props: {\n      clipboardTextParser: (text: string, $context: ResolvedPos): any => {\n        // if it's a single line then create a slice w/ marks from the context active\n        if (text.indexOf('\\n') === -1) {\n          const marks = $context.marks();\n          const textNode = schema.text(text, marks);\n          return new Slice(Fragment.from(textNode), 0, 0);\n        } else {\n          return null;\n        }\n      },\n    },\n  });\n}\n\nexport default extension;\n","/*\n * bottom_padding.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport zenscroll from 'zenscroll';\n\nimport { Extension } from '../api/extension';\nimport { editingRootNode } from '../api/node';\nimport { selectionIsBodyTopLevel } from '../api/selection';\nimport { EditorView } from 'prosemirror-view';\nimport { bodyElement } from '../api/dom';\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\n// when we get close to the bottom, we autoscroll to provide more padding\nconst kAutoscrollGapPx = 25;\n\nconst extension: Extension = {\n  plugins: (schema: Schema) => {\n    return [\n      new Plugin({\n        key: new PluginKey('bottom_padding'),\n        view: () => ({\n          update: (view: EditorView, prevState: EditorState) => {\n            const selection = view.state.selection;\n            if (selectionWithinLastBodyParagraph(selection)) {\n              const paragraphNode = findParentNodeOfType(schema.nodes.paragraph)(selection);\n              if (paragraphNode) {\n                const paragraphEl = view.nodeDOM(paragraphNode.pos) as HTMLElement;\n                const paragraphRect = paragraphEl.getBoundingClientRect();\n                const editorEl = view.dom;\n                const editorRect = editorEl.getBoundingClientRect();\n                if (Math.abs(paragraphRect.bottom - editorRect.bottom) < kAutoscrollGapPx) {\n                  const bodyEl = bodyElement(view);\n                  const scroller = zenscroll.createScroller(bodyEl);\n                  scroller.toY(bodyEl.scrollHeight, 0);\n                }\n              }\n            }\n          },\n        }),\n      }),\n    ];\n  },\n};\n\nfunction selectionWithinLastBodyParagraph(selection: Selection) {\n  if (selectionIsBodyTopLevel(selection)) {\n    const editingRoot = editingRootNode(selection);\n    if (editingRoot) {\n      const node = selection.$head.node();\n      return node === editingRoot.node.lastChild && node.type === node.type.schema.nodes.paragraph;\n    }\n  }\n  return false;\n}\n\nexport default extension;\n","/*\n * insert_symbol.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey, Transaction, EditorState } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { EditorUI } from '../../api/ui';\nimport { parseCodepoint } from '../../api/unicode';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { performInsertSymbol, InsertSymbolPlugin } from './insert_symbol-plugin';\nimport { SymbolDataProvider, SymbolCharacterGroup, SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport symbolData from './symbols';\n\nconst key = new PluginKey<boolean>('insert-symbol');\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { ui, events } = context;\n  return {\n    commands: () => {\n      return [new ProsemirrorCommand(EditorCommandId.Symbol, [], performInsertSymbol(key), symbolOmniInsert(ui))];\n    },\n    plugins: (_schema: Schema) => {\n      return [new InsertSymbolPlugin(key, new UnicodeSymbolDataProvider(), ui, events)];\n    },\n  };\n};\n\nfunction symbolOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Symbol...'),\n    keywords: ['unicode', 'special', 'character'],\n    description: ui.context.translateText('Unicode symbol / special character'),\n    group: OmniInsertGroup.Content,\n    priority: 6,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.symbol_dark! : ui.images.omni_insert?.symbol!),\n  };\n}\n\nclass UnicodeSymbolDataProvider implements SymbolDataProvider {\n  constructor() {\n    this.symbolGroups = symbolData.sort((a, b) => a.name.localeCompare(b.name));\n  }\n  private readonly symbolGroups: SymbolCharacterGroup[];\n\n  public insertSymbolTransaction(\n    symbolCharacter: SymbolCharacter,\n    searchTerm: string,\n    state: EditorState,\n  ): Transaction {\n    const tr = state.tr;\n    tr.insertText(symbolCharacter.value);\n    return tr;\n  }\n\n  public readonly filterPlaceholderHint = 'keyword or codepoint';\n\n  public readonly symbolPreviewStyle: React.CSSProperties = { fontSize: '28px' } as React.CSSProperties;\n\n  public symbolGroupNames(): string[] {\n    return [kCategoryAll, ...this.symbolGroups.map(symbolGroup => symbolGroup.name)];\n  }\n\n  public getSymbols(groupName: string | undefined) {\n    if (groupName === undefined || groupName === kCategoryAll) {\n      return this.symbolGroups\n        .map(symbolGroup => symbolGroup.symbols)\n        .flat()\n        .sort((a, b) => a.codepoint! - b.codepoint!);\n    }\n    return this.symbolGroups\n      .filter(symbolGroup => groupName === symbolGroup.name)\n      .map(symbolGroup => symbolGroup.symbols)\n      .flat();\n  }\n\n  public filterSymbols(filterText: string, symbols: SymbolCharacter[]): SymbolCharacter[] {\n    const codepoint = parseCodepoint(filterText);\n    const filteredSymbols = symbols.filter(symbol => {\n      // Search by name\n      if (symbol.name.includes(filterText.toUpperCase())) {\n        return true;\n      }\n\n      // Search by codepoint\n      if (codepoint && symbol.codepoint === codepoint) {\n        return true;\n      }\n\n      return false;\n    });\n\n    if (filteredSymbols.length === 0 && codepoint !== undefined) {\n      return [\n        {\n          name: codepoint.toString(16),\n          value: String.fromCodePoint(codepoint),\n          codepoint,\n        },\n      ];\n    }\n    return filteredSymbols;\n  }\n}\nconst kCategoryAll = 'All';\n\nexport default extension;\n","/*\n * unicode.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Tries to parse a unicode codepoint string that a user might enter\n// For example:\n// U+2A1F\n// 2A1F\n// 10783\nconst kMinValidCodepoint = 0;\nconst kMaxValidCodepoint = 1114112;\n\nconst kHexCodepointPrefix = 'U+';\nconst kHexNumberPrefex = '0x';\n\nexport function parseCodepoint(codepointText: string): number | undefined {\n  // Try parsing it as a base 10 int\n  // Use non primitive Number so we get strict parsing\n  const base10Value = Number(codepointText).valueOf();\n  if (!Number.isNaN(base10Value)) {\n    if (isValidCodepoint(base10Value)) {\n      return base10Value;\n    }\n  }\n\n  // It might have a user prefix for unicode character, remove\n  let hexOnlyText = codepointText.toUpperCase();\n  if (hexOnlyText.startsWith(kHexCodepointPrefix.toUpperCase())) {\n    hexOnlyText = codepointText.substr(kHexCodepointPrefix.length, codepointText.length - kHexCodepointPrefix.length);\n  }\n\n  // try parsing it as a hex string\n  // Use non primitive Number so we get strict parsing, prefix with 0x to ensure treatment as hex\n  if (!hexOnlyText.startsWith(kHexNumberPrefex)) {\n    hexOnlyText = kHexNumberPrefex + hexOnlyText;\n  }\n  const hexValue = Number(hexOnlyText).valueOf();\n  if (!Number.isNaN(hexValue) && isValidCodepoint(hexValue)) {\n    return hexValue;\n  }\n\n  return undefined;\n}\n\nfunction isValidCodepoint(codepoint: number) {\n  return codepoint > kMinValidCodepoint && codepoint < kMaxValidCodepoint;\n}\n","/*\n * insert_symbol-plugin.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { applyStyles } from '../../api/css';\nimport { EditorEvents } from '../../api/events';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\n\nimport { InsertSymbolPopup } from './insert_symbol-popup';\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport { ScrollEvent } from '../../api/event-types';\n\nconst kMinimumPanelPaddingToEdgeOfView = 5;\n\nexport const performInsertSymbol = (pluginKey: PluginKey<boolean>) => {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    if (!isEnabled(state)) {\n      return false;\n    }\n\n    if (dispatch && view) {\n      const plugin = pluginKey.get(state) as InsertSymbolPlugin;\n      plugin.showPopup(view);\n    }\n    return true;\n  };\n};\n\nfunction isEnabled(state: EditorState) {\n  return canInsertNode(state, state.schema.nodes.text);\n}\n\nexport class InsertSymbolPlugin extends Plugin<boolean> {\n  private readonly scrollUnsubscribe: VoidFunction;\n  private readonly ui: EditorUI;\n  private popup: HTMLElement | null = null;\n  private dataProvider: SymbolDataProvider;\n\n  constructor(pluginKey: PluginKey<boolean>, dataProvider: SymbolDataProvider, ui: EditorUI, events: EditorEvents) {\n    super({\n      key: pluginKey,\n      view: () => ({\n        update: () => {\n          this.closePopup();\n        },\n        destroy: () => {\n          this.closePopup();\n          this.scrollUnsubscribe();\n          window.document.removeEventListener('focusin', this.focusChanged);\n        },\n      }),\n    });\n\n    this.dataProvider = dataProvider;\n    this.ui = ui;\n    this.closePopup = this.closePopup.bind(this);\n    this.scrollUnsubscribe = events.subscribe(ScrollEvent, this.closePopup);\n\n    this.focusChanged = this.focusChanged.bind(this);\n    window.document.addEventListener('focusin', this.focusChanged);\n  }\n\n  public showPopup(view: EditorView) {\n    if (!this.popup) {\n      const kHeight = 336;\n      const kWidth = 450;\n\n      this.popup = window.document.createElement('div');\n      this.popup.tabIndex = 0;\n      this.popup.style.position = 'absolute';\n      this.popup.style.zIndex = '900';\n\n      applyStyles(this.popup, [], this.panelPositionStylesForCurrentSelection(view, kHeight, kWidth));\n      ReactDOM.render(this.insertSymbolPopup(view, [kHeight, kWidth]), this.popup);\n      window.document.body.appendChild(this.popup);\n    }\n  }\n\n  private panelPositionStylesForCurrentSelection(view: EditorView, height: number, width: number) {\n    const selection = view.state.selection;\n    const editorRect = view.dom.getBoundingClientRect();\n\n    const selectionCoords = view.coordsAtPos(selection.from);\n\n    const maximumTopPosition = Math.min(\n      selectionCoords.bottom,\n      window.innerHeight - height - kMinimumPanelPaddingToEdgeOfView,\n    );\n    const minimumTopPosition = editorRect.y;\n    const popupTopPosition = Math.max(minimumTopPosition, maximumTopPosition);\n\n    const maximumLeftPosition = Math.min(\n      selectionCoords.right,\n      window.innerWidth - width - kMinimumPanelPaddingToEdgeOfView,\n    );\n    const minimumLeftPosition = editorRect.x;\n    const popupLeftPosition = Math.max(minimumLeftPosition, maximumLeftPosition);\n\n    // styles we'll return\n    const styles = {\n      top: popupTopPosition + 'px',\n      left: popupLeftPosition + 'px',\n    };\n\n    return styles;\n  }\n\n  private focusChanged() {\n    if (window.document.activeElement !== this.popup && !this.popup?.contains(window.document.activeElement)) {\n      this.closePopup();\n    }\n  }\n\n  private closePopup() {\n    if (this.popup) {\n      ReactDOM.unmountComponentAtNode(this.popup);\n      this.popup.remove();\n      this.popup = null;\n    }\n  }\n\n  private insertSymbolPopup(view: EditorView, size: [number, number]) {\n    const insertSymbol = (symbolCharacter: SymbolCharacter, searchTerm: string) => {\n      const tr = this.dataProvider.insertSymbolTransaction(symbolCharacter, searchTerm, view.state);\n      view.dispatch(tr);\n      view.focus();\n    };\n\n    const closePopup = () => {\n      this.closePopup();\n      view.focus();\n    };\n\n    return (\n      <InsertSymbolPopup\n        symbolDataProvider={this.dataProvider}\n        onClose={closePopup}\n        onInsertSymbol={insertSymbol}\n        enabled={isEnabled(view.state)}\n        size={size}\n        searchImage={this.ui.images.search}\n        searchPlaceholder={this.ui.context.translateText(this.dataProvider.filterPlaceholderHint)}\n        ui={this.ui}\n      />\n    );\n  }\n}\n","/*\n * insert_symbol-popup.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEvent } from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { isElementFocused, focusElement } from '../../api/focus';\nimport { Popup } from '../../api/widgets/popup';\nimport { SelectInput } from '../../api/widgets/select';\nimport { TextInput } from '../../api/widgets/text';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\nimport SymbolCharacterGrid, { newIndexForKeyboardEvent } from './insert_symbol-grid';\n\nimport './insert_symbol-styles.css';\nimport { SymbolPreview } from './insert_symbol-grid-preview';\n\ninterface InsertSymbolPopupProps extends WidgetProps {\n  symbolDataProvider: SymbolDataProvider;\n  enabled: boolean;\n  size: [number, number];\n  onInsertSymbol: (symbolCharacter: SymbolCharacter, searchTerm: string) => void;\n  onClose: VoidFunction;\n  ui: EditorUI;\n  searchImage?: string;\n  searchPlaceholder?: string;\n}\n\nexport const InsertSymbolPopup: React.FC<InsertSymbolPopupProps> = props => {\n  const kPopupChromeHeight = 25;\n  const popupHeight = props.size[0] - kPopupChromeHeight;\n  const popupWidth = props.size[1];\n  const style: React.CSSProperties = {\n    ...props.style,\n    height: popupHeight + 'px',\n    width: popupWidth + 'px',\n  };\n  const classNames = ['pm-popup-insert-symbol'].concat(props.classes || []);\n\n  const gridHeight = popupHeight - 108;\n  const gridWidth = popupWidth;\n  const kNumberOfcolumns = 11;\n\n  const [filterText, setFilterText] = React.useState<string>('');\n  const [selectedSymbolGroup, setSelectedSymbolGroup] = React.useState<string>();\n  const [selectedSymbolIndex, setSelectedSymbolIndex] = React.useState<number>(0);\n  const [preferenceChanged, setPreferenceChanged] = React.useState<number>(0);\n\n  const symbols = React.useMemo(() => props.symbolDataProvider.getSymbols(selectedSymbolGroup), [\n    selectedSymbolGroup,\n    preferenceChanged,\n    props.symbolDataProvider,\n  ]);\n  const filteredSymbols = React.useMemo(() => props.symbolDataProvider.filterSymbols(filterText, symbols), [\n    filterText,\n    symbols,\n    props.symbolDataProvider,\n  ]);\n\n  // If the symbol list gets shorter than the selected index, move\n  // selected cell into range\n  React.useEffect(() => {\n    if (selectedSymbolIndex > filteredSymbols.length) {\n      setSelectedSymbolIndex(Math.max(filteredSymbols.length - 1, 0));\n    }\n  }, [selectedSymbolIndex, filteredSymbols]);\n\n  const textRef = React.useRef<HTMLInputElement>(null);\n  const selectRef = React.useRef<HTMLSelectElement>(null);\n  const gridRef = React.useRef<HTMLDivElement>(null);\n  const preferenceRef = React.useRef<HTMLElement>(null);\n\n  // Focus the first text box\n  React.useEffect(() => {\n    focusElement(textRef.current);\n  }, []);\n\n  const options = props.symbolDataProvider.symbolGroupNames().map(name => (\n    <option key={name} value={name}>\n      {props.ui.context.translateText(name)}\n    </option>\n  ));\n\n  const handleSelectChanged = (event: ChangeEvent<Element>) => {\n    const value: string = (event.target as HTMLSelectElement).selectedOptions[0].value;\n    const selectedGroupName: string | undefined = props.symbolDataProvider\n      .symbolGroupNames()\n      .find(name => name === value);\n    if (selectedGroupName) {\n      setSelectedSymbolGroup(selectedGroupName);\n    }\n  };\n\n  const handleKeyboardEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n    // The last element might be the preference panel, if a provider\n    // provides one\n    function lastElement(): React.RefObject<HTMLElement> {\n      if (preferenceRef.current !== null) {\n        return preferenceRef;\n      }\n      return gridRef;\n    }\n\n    // Global Key Handling\n    switch (event.key) {\n      case 'Escape':\n        // Esc key - close popup\n        props.onClose();\n        event.preventDefault();\n        break;\n\n      case 'Tab':\n        if (event.shiftKey && isElementFocused(textRef.current)) {\n          focusElement(lastElement().current);\n          event.preventDefault();\n        } else if (!event.shiftKey && isElementFocused(lastElement().current)) {\n          focusElement(textRef.current);\n          event.preventDefault();\n        }\n        break;\n\n      case 'Enter':\n        if (isElementFocused(textRef.current) || isElementFocused(gridRef.current)) {\n          handleSelectedSymbolCommitted();\n          event.preventDefault();\n        }\n        break;\n\n      case 'ArrowLeft':\n      case 'ArrowRight':\n      case 'ArrowUp':\n      case 'ArrowDown':\n      case 'PageUp':\n      case 'PageDown':\n        // If the text filter is focused, forward arrow keys to the grid. If other elements are focused\n        // they may need to handle arrow keys, so don't handle them in this case\n        if (isElementFocused(textRef.current) && !event.shiftKey && !event.altKey && !event.ctrlKey) {\n          const newIndex = newIndexForKeyboardEvent(\n            event,\n            selectedSymbolIndex,\n            kNumberOfcolumns,\n            filteredSymbols.length,\n          );\n          if (newIndex !== undefined && newIndex >= 0 && newIndex !== selectedSymbolIndex) {\n            event.preventDefault();\n            setSelectedSymbolIndex(newIndex);\n          }\n        }\n        break;\n      default:\n        break;\n    }\n  };\n\n  const handleSelectedSymbolChanged = (symbolIndex: number) => {\n    setSelectedSymbolIndex(symbolIndex);\n  };\n\n  const handleSelectedSymbolCommitted = () => {\n    if (filteredSymbols.length > selectedSymbolIndex) {\n      props.onInsertSymbol(filteredSymbols[selectedSymbolIndex], textRef.current?.value || '');\n    }\n  };\n\n  const handleTextChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    setFilterText(event?.target.value);\n  };\n\n  const handlePreferencesChanged = () => {\n    setPreferenceChanged(preferenceChanged + 1);\n  };\n\n  const preferencesProps = {\n    selectedSymbolIndex,\n    context: props.ui.context,\n    prefs: props.ui.prefs,\n    onPreferencesChanged: handlePreferencesChanged,\n    ref: preferenceRef,\n  };\n\n  const preferencesPanel = props.symbolDataProvider.symbolPreferencesPanel\n    ? React.createElement(props.symbolDataProvider.symbolPreferencesPanel, preferencesProps)\n    : undefined;\n\n  return (\n    <Popup classes={classNames} style={style}>\n      <div onKeyDown={handleKeyboardEvent}>\n        <div className=\"pm-popup-insert-symbol-search-container\" style={{ width: gridWidth }}>\n          <TextInput\n            width={20 + 'ch'}\n            iconAdornment={props.searchImage}\n            tabIndex={0}\n            className=\"pm-popup-insert-symbol-search-textbox\"\n            placeholder={props.searchPlaceholder}\n            onChange={handleTextChange}\n            ref={textRef}\n          />\n          <SelectInput\n            tabIndex={0}\n            ref={selectRef}\n            className=\"pm-popup-insert-symbol-select-category\"\n            onChange={handleSelectChanged}\n          >\n            {options}\n          </SelectInput>\n        </div>\n\n        <hr className=\"pm-popup-insert-symbol-separator pm-border-background-color\" />\n        <div className=\"pm-popup-insert-symbol-grid-container\">\n          <SymbolCharacterGrid\n            symbolCharacters={filteredSymbols}\n            selectedIndex={selectedSymbolIndex}\n            onSelectionChanged={handleSelectedSymbolChanged}\n            onSelectionCommitted={handleSelectedSymbolCommitted}\n            height={gridHeight}\n            width={gridWidth}\n            numberOfColumns={kNumberOfcolumns}\n            ref={gridRef}\n            ui={props.ui}\n          />\n          <div\n            className=\"pm-popup-insert-symbol-no-matching pm-light-text-color\"\n            style={{ display: filteredSymbols.length > 0 ? 'none' : 'block' }}\n          >\n            No matching symbols\n          </div>\n        </div>\n        <hr className=\"pm-popup-insert-symbol-separator pm-border-background-color\" />\n        {filteredSymbols[selectedSymbolIndex] && (\n          <SymbolPreview\n            symbolCharacter={filteredSymbols[selectedSymbolIndex]}\n            symbolPreviewStyle={props.symbolDataProvider.symbolPreviewStyle}\n            ui={props.ui}\n          >\n            {preferencesPanel}\n          </SymbolPreview>\n        )}\n      </div>\n    </Popup>\n  );\n};\n","/*\n * focus.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function isElementFocused(element: HTMLElement | null): boolean {\n  if (element) {\n    return window.document.activeElement === element;\n  }\n  return false;\n}\n\nexport function focusElement(element: HTMLElement | null) {\n  if (element) {\n    element.focus();\n  }\n}\n","/*\n * select.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, ReactNode } from 'react';\n\nimport { WidgetProps } from './react';\n\nexport interface SelectInputProps extends WidgetProps {\n  tabIndex?: number;\n  className?: string;\n  onChange?: ChangeEventHandler;\n  children: ReactNode;\n  defaultValue?: string;\n}\n\nexport const SelectInput = React.forwardRef<HTMLSelectElement, SelectInputProps>((props, ref) => {\n  const style: React.CSSProperties = {\n    ...props.style,\n  };\n\n  return (\n    <select\n      className={`pm-input-select pm-background-color pm-pane-border-color pm-text-color ${props.className}`}\n      style={style}\n      tabIndex={props.tabIndex}\n      ref={ref}\n      onChange={props.onChange}\n      defaultValue={props.defaultValue}\n    >\n      {props.children}\n    </select>\n  );\n});\n","/*\n * text.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, KeyboardEventHandler, FocusEventHandler, ClipboardEventHandler } from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './text.css';\n\nexport interface TextInputProps extends WidgetProps {\n  width: string;\n  tabIndex?: number;\n  className?: string;\n  placeholder?: string;\n  iconAdornment?: string;\n  value?: string;\n  onChange?: ChangeEventHandler;\n  onKeyDown?: KeyboardEventHandler<HTMLInputElement>;\n  onKeyUp?: KeyboardEventHandler<HTMLInputElement>;\n  onKeyPress?: KeyboardEventHandler<HTMLInputElement>;\n  onBlur?: FocusEventHandler<HTMLInputElement>;\n  onPaste?: ClipboardEventHandler<HTMLInputElement>;\n  onFocus?: FocusEventHandler<HTMLInputElement>;\n}\n\nexport const TextInput = React.forwardRef<HTMLInputElement, TextInputProps>((props, ref) => {\n  // Allow specifying an actual width (e.g. a percentage) or a character width\n  // If a character width is specified, we should prefer to use the size attribute of the input\n  // as the focus widget that is added to focus elements is confused by the 'ch' size in styles\n  const characterWidth = props.width.endsWith('ch')\n    ? parseInt(props.width.substr(0, props.width.length - 2), 10)\n    : undefined;\n  const style: React.CSSProperties = {\n    ...props.style,\n    width: characterWidth ? undefined : props.width,\n  };\n\n  return (\n    <div className=\"pm-textinput-container\" style={style}>\n      {props.iconAdornment ? <img src={props.iconAdornment} className=\"pm-textinput-icon\" alt=\"\" /> : undefined}\n      <input\n        type=\"text\"\n        placeholder={props.placeholder}\n        size={characterWidth}\n        className={`\n          pm-input-text \n          pm-textinput-input \n          pm-text-color \n          pm-background-color \n          ${props.className}\n          ${props.iconAdornment ? 'pm-textinput-input-with-icon' : ''}`}\n        value={props.value !== undefined ? props.value : undefined}\n        onChange={props.onChange}\n        onKeyDown={props.onKeyDown}\n        onKeyUp={props.onKeyUp}\n        onKeyPress={props.onKeyPress}\n        onBlur={props.onBlur}\n        onFocus={props.onFocus}\n        tabIndex={props.tabIndex}\n        onPaste={props.onPaste}\n        ref={ref}\n        spellCheck={false}\n      />\n    </div>\n  );\n});\n","/*\n * insert_symbol-grid.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { FixedSizeGrid } from 'react-window';\n\nimport debounce from 'lodash.debounce';\n\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { CharacterGridCellItemData, SymbolCharacterCell } from './insert_symbol-grid-cell';\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-grid-styles.css';\n\ninterface CharacterGridProps extends WidgetProps {\n  height: number;\n  width: number;\n  numberOfColumns: number;\n  symbolCharacters: SymbolCharacter[];\n  selectedIndex: number;\n  onSelectionChanged: (selectedIndex: number) => void;\n  onSelectionCommitted: VoidFunction;\n  ui: EditorUI;\n}\n\nconst selectedItemClassName = 'pm-grid-item-selected';\n\nconst SymbolCharacterGrid = React.forwardRef<any, CharacterGridProps>((props, ref) => {\n  const columnWidth = Math.floor(props.width / props.numberOfColumns);\n  const characterCellData: CharacterGridCellItemData = {\n    symbolCharacters: props.symbolCharacters,\n    numberOfColumns: props.numberOfColumns,\n    selectedIndex: props.selectedIndex,\n    onSelectionChanged: props.onSelectionChanged,\n    onSelectionCommitted: props.onSelectionCommitted,\n    selectedItemClassName,\n  };\n\n  const gridRef = React.useRef<FixedSizeGrid>(null);\n  const handleScroll = debounce(() => {\n    gridRef.current?.scrollToItem({ rowIndex: Math.floor(props.selectedIndex / props.numberOfColumns) });\n  }, 5);\n\n  React.useEffect(handleScroll, [props.selectedIndex]);\n\n  const handleKeyDown = (event: React.KeyboardEvent) => {\n    const newIndex = newIndexForKeyboardEvent(\n      event,\n      props.selectedIndex,\n      props.numberOfColumns,\n      props.symbolCharacters.length,\n    );\n    if (newIndex !== undefined) {\n      props.onSelectionChanged(newIndex);\n      event.preventDefault();\n    }\n  };\n\n  return (\n    <div onKeyDown={handleKeyDown} tabIndex={0} ref={ref}>\n      <FixedSizeGrid\n        columnCount={props.numberOfColumns}\n        rowCount={Math.ceil(props.symbolCharacters.length / props.numberOfColumns)}\n        height={props.height}\n        width={props.width + 1}\n        rowHeight={columnWidth}\n        columnWidth={columnWidth}\n        itemData={characterCellData}\n        className=\"pm-symbol-grid\"\n        ref={gridRef}\n      >\n        {SymbolCharacterCell}\n      </FixedSizeGrid>\n    </div>\n  );\n});\n\nfunction previous(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex - 1;\n  return Math.max(0, newIndex);\n}\nfunction next(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex + 1;\n  return Math.min(numberOfCells - 1, newIndex);\n}\nfunction prevRow(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex - numberOfColumns;\n  return newIndex >= 0 ? newIndex : currentIndex;\n}\nfunction nextRow(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex + numberOfColumns;\n  return newIndex < numberOfCells ? newIndex : currentIndex;\n}\nfunction nextPage(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex + 6 * numberOfColumns;\n  return Math.min(numberOfCells - 1, newIndex);\n}\nfunction prevPage(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex - 6 * numberOfColumns;\n  return Math.max(0, newIndex);\n}\n\nexport const newIndexForKeyboardEvent = (\n  event: React.KeyboardEvent,\n  selectedIndex: number,\n  numberOfColumns: number,\n  numberOfCells: number,\n): number | undefined => {\n  switch (event.key) {\n    case 'ArrowLeft': // left\n      return previous(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'ArrowUp': // up\n      return prevRow(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'ArrowRight': // right\n      return next(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'ArrowDown': // down\n      return nextRow(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'PageDown':\n      return nextPage(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'PageUp':\n      return prevPage(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'Home':\n      return 0;\n\n    case 'End':\n      return numberOfCells - 1;\n\n    default:\n      return undefined;\n  }\n};\n\nexport default SymbolCharacterGrid;\n","/*\n * insert_symbol-grid-cell.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { GridChildComponentProps } from 'react-window';\n\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nexport interface CharacterGridCellItemData {\n  symbolCharacters: SymbolCharacter[];\n  numberOfColumns: number;\n  selectedIndex: number;\n  selectedItemClassName: string;\n  onSelectionChanged: (selectedIndex: number) => void;\n  onSelectionCommitted: VoidFunction;\n}\n\nexport const SymbolCharacterCell = (props: GridChildComponentProps) => {\n  const characterGridCellItemData = props.data as CharacterGridCellItemData;\n  const symbolCharacters = characterGridCellItemData.symbolCharacters;\n  const itemIndex = props.rowIndex * characterGridCellItemData.numberOfColumns + props.columnIndex;\n\n  const handleMouseEnter = (event: React.MouseEvent) => {\n    characterGridCellItemData.onSelectionChanged(itemIndex);\n  };\n\n  // If we don't handle and eat the mouse down event, the mouse down will propagate to the parent\n  // editor and result in loss of focus to this element\n  const handleMouseDown = (event: React.MouseEvent) => {\n    event.preventDefault();\n    event.stopPropagation();\n  };\n\n  const handleMouseClick = (event: React.MouseEvent) => {\n    event.preventDefault();\n    event.stopPropagation();\n    characterGridCellItemData.onSelectionCommitted();\n  };\n\n  if (itemIndex < symbolCharacters.length) {\n    const ch = symbolCharacters[itemIndex];\n    return (\n      <div\n        tabIndex={-1}\n        style={props.style}\n        className=\"pm-symbol-grid-container\"\n        onClick={handleMouseClick}\n        onMouseDown={handleMouseDown}\n        onMouseEnter={handleMouseEnter}\n      >\n        <div\n          className={`pm-symbol-grid-cell pm-grid-item pm-emoji-font ${\n            characterGridCellItemData.selectedIndex === itemIndex ? characterGridCellItemData.selectedItemClassName : ''\n            }`}\n        >\n          {ch.value || ''}\n        </div>\n      </div>\n    );\n  } else {\n    return null;\n  }\n};\n","/*\n * insert_symbol-grid-preview.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { CSSProperties, ReactNode } from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-grid-preview.css';\n\ninterface SymbolPreviewProps extends WidgetProps {\n  symbolCharacter: SymbolCharacter;\n  symbolPreviewStyle: CSSProperties;\n  ui: EditorUI;\n  children: ReactNode;\n}\n\nexport const SymbolPreview = React.forwardRef<any, SymbolPreviewProps>((props, ref) => {\n  return (\n    <div style={{ height: '54px' }} className=\"pm-popup-insert-symbol-preview-container\" ref={ref}>\n      <div className=\"pm-popup-insert-symbol-preview-thumbnail\">\n        <div style={props.symbolPreviewStyle}>{props.symbolCharacter.value}</div>\n        <div className=\"pm-popup-insert-symbol-preview-summary\">\n          <div className=\"pm-popup-insert-symbol-preview-name pm-text-color\">\n            {props.ui.context.translateText(props.symbolCharacter.name)}\n          </div>\n          <div className=\"pm-popup-insert-symbol-preview-markdown pm-light-text-color\">\n            {props.symbolCharacter.markdown || `U+${props.symbolCharacter.codepoint?.toString(16)}`}\n          </div>\n        </div>\n      </div>\n      <div className=\"pm-popup-insert-symbol-preview-action\">{props.children}</div>\n    </div>\n  );\n});\n","import { SymbolCharacterGroup } from './insert_symbol-dataprovider';\n\nconst symbols: SymbolCharacterGroup[] = [\n  {\n    name: 'Miscellaneous',\n    symbols: [\n      {\n        name: 'NO-BREAK SPACE',\n        value: ' ',\n        codepoint: 160,\n      },\n      {\n        name: 'INVERTED EXCLAMATION MARK',\n        value: '¡',\n        codepoint: 161,\n      },\n      {\n        name: 'CENT SIGN',\n        value: '¢',\n        codepoint: 162,\n      },\n      {\n        name: 'POUND SIGN',\n        value: '£',\n        codepoint: 163,\n      },\n      {\n        name: 'CURRENCY SIGN',\n        value: '¤',\n        codepoint: 164,\n      },\n      {\n        name: 'YEN SIGN',\n        value: '¥',\n        codepoint: 165,\n      },\n      {\n        name: 'BROKEN BAR',\n        value: '¦',\n        codepoint: 166,\n      },\n      {\n        name: 'SECTION SIGN',\n        value: '§',\n        codepoint: 167,\n      },\n      {\n        name: 'DIAERESIS',\n        value: '¨',\n        codepoint: 168,\n      },\n      {\n        name: 'FEMININE ORDINAL INDICATOR',\n        value: 'ª',\n        codepoint: 170,\n      },\n      {\n        name: 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK',\n        value: '«',\n        codepoint: 171,\n      },\n      {\n        name: 'NOT SIGN',\n        value: '¬',\n        codepoint: 172,\n      },\n      {\n        name: 'MACRON',\n        value: '¯',\n        codepoint: 175,\n      },\n      {\n        name: 'DEGREE SIGN',\n        value: '°',\n        codepoint: 176,\n      },\n      {\n        name: 'PLUS-MINUS SIGN',\n        value: '±',\n        codepoint: 177,\n      },\n      {\n        name: 'SUPERSCRIPT TWO',\n        value: '²',\n        codepoint: 178,\n      },\n      {\n        name: 'SUPERSCRIPT THREE',\n        value: '³',\n        codepoint: 179,\n      },\n      {\n        name: 'ACUTE ACCENT',\n        value: '´',\n        codepoint: 180,\n      },\n      {\n        name: 'MICRO SIGN',\n        value: 'µ',\n        codepoint: 181,\n      },\n      {\n        name: 'PILCROW SIGN',\n        value: '¶',\n        codepoint: 182,\n      },\n      {\n        name: 'MIDDLE DOT',\n        value: '·',\n        codepoint: 183,\n      },\n      {\n        name: 'CEDILLA',\n        value: '¸',\n        codepoint: 184,\n      },\n      {\n        name: 'SUPERSCRIPT ONE',\n        value: '¹',\n        codepoint: 185,\n      },\n      {\n        name: 'MASCULINE ORDINAL INDICATOR',\n        value: 'º',\n        codepoint: 186,\n      },\n      {\n        name: 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK',\n        value: '»',\n        codepoint: 187,\n      },\n      {\n        name: 'VULGAR FRACTION ONE QUARTER',\n        value: '¼',\n        codepoint: 188,\n      },\n      {\n        name: 'VULGAR FRACTION ONE HALF',\n        value: '½',\n        codepoint: 189,\n      },\n      {\n        name: 'VULGAR FRACTION THREE QUARTERS',\n        value: '¾',\n        codepoint: 190,\n      },\n      {\n        name: 'INVERTED QUESTION MARK',\n        value: '¿',\n        codepoint: 191,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH GRAVE',\n        value: 'À',\n        codepoint: 192,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH ACUTE',\n        value: 'Á',\n        codepoint: 193,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX',\n        value: 'Â',\n        codepoint: 194,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH TILDE',\n        value: 'Ã',\n        codepoint: 195,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH DIAERESIS',\n        value: 'Ä',\n        codepoint: 196,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH RING ABOVE',\n        value: 'Å',\n        codepoint: 197,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER AE',\n        value: 'Æ',\n        codepoint: 198,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER C WITH CEDILLA',\n        value: 'Ç',\n        codepoint: 199,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER E WITH GRAVE',\n        value: 'È',\n        codepoint: 200,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER E WITH ACUTE',\n        value: 'É',\n        codepoint: 201,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX',\n        value: 'Ê',\n        codepoint: 202,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER E WITH DIAERESIS',\n        value: 'Ë',\n        codepoint: 203,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER I WITH GRAVE',\n        value: 'Ì',\n        codepoint: 204,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER I WITH ACUTE',\n        value: 'Í',\n        codepoint: 205,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX',\n        value: 'Î',\n        codepoint: 206,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER I WITH DIAERESIS',\n        value: 'Ï',\n        codepoint: 207,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER ETH',\n        value: 'Ð',\n        codepoint: 208,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER N WITH TILDE',\n        value: 'Ñ',\n        codepoint: 209,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH GRAVE',\n        value: 'Ò',\n        codepoint: 210,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH ACUTE',\n        value: 'Ó',\n        codepoint: 211,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX',\n        value: 'Ô',\n        codepoint: 212,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH TILDE',\n        value: 'Õ',\n        codepoint: 213,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH DIAERESIS',\n        value: 'Ö',\n        codepoint: 214,\n      },\n      {\n        name: 'MULTIPLICATION SIGN',\n        value: '×',\n        codepoint: 215,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH STROKE',\n        value: 'Ø',\n        codepoint: 216,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER U WITH GRAVE',\n        value: 'Ù',\n        codepoint: 217,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER U WITH ACUTE',\n        value: 'Ú',\n        codepoint: 218,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX',\n        value: 'Û',\n        codepoint: 219,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER U WITH DIAERESIS',\n        value: 'Ü',\n        codepoint: 220,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER Y WITH ACUTE',\n        value: 'Ý',\n        codepoint: 221,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER THORN',\n        value: 'Þ',\n        codepoint: 222,\n      },\n      {\n        name: 'LATIN SMALL LETTER SHARP S',\n        value: 'ß',\n        codepoint: 223,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH GRAVE',\n        value: 'à',\n        codepoint: 224,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH ACUTE',\n        value: 'á',\n        codepoint: 225,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH CIRCUMFLEX',\n        value: 'â',\n        codepoint: 226,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH TILDE',\n        value: 'ã',\n        codepoint: 227,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH DIAERESIS',\n        value: 'ä',\n        codepoint: 228,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH RING ABOVE',\n        value: 'å',\n        codepoint: 229,\n      },\n      {\n        name: 'LATIN SMALL LETTER AE',\n        value: 'æ',\n        codepoint: 230,\n      },\n      {\n        name: 'LATIN SMALL LETTER C WITH CEDILLA',\n        value: 'ç',\n        codepoint: 231,\n      },\n      {\n        name: 'LATIN SMALL LETTER E WITH GRAVE',\n        value: 'è',\n        codepoint: 232,\n      },\n      {\n        name: 'LATIN SMALL LETTER E WITH ACUTE',\n        value: 'é',\n        codepoint: 233,\n      },\n      {\n        name: 'LATIN SMALL LETTER E WITH CIRCUMFLEX',\n        value: 'ê',\n        codepoint: 234,\n      },\n      {\n        name: 'LATIN SMALL LETTER E WITH DIAERESIS',\n        value: 'ë',\n        codepoint: 235,\n      },\n      {\n        name: 'LATIN SMALL LETTER I WITH GRAVE',\n        value: 'ì',\n        codepoint: 236,\n      },\n      {\n        name: 'LATIN SMALL LETTER I WITH ACUTE',\n        value: 'í',\n        codepoint: 237,\n      },\n      {\n        name: 'LATIN SMALL LETTER I WITH CIRCUMFLEX',\n        value: 'î',\n        codepoint: 238,\n      },\n      {\n        name: 'LATIN SMALL LETTER I WITH DIAERESIS',\n        value: 'ï',\n        codepoint: 239,\n      },\n      {\n        name: 'LATIN SMALL LETTER ETH',\n        value: 'ð',\n        codepoint: 240,\n      },\n      {\n        name: 'LATIN SMALL LETTER N WITH TILDE',\n        value: 'ñ',\n        codepoint: 241,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH GRAVE',\n        value: 'ò',\n        codepoint: 242,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH ACUTE',\n        value: 'ó',\n        codepoint: 243,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH CIRCUMFLEX',\n        value: 'ô',\n        codepoint: 244,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH TILDE',\n        value: 'õ',\n        codepoint: 245,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH DIAERESIS',\n        value: 'ö',\n        codepoint: 246,\n      },\n      {\n        name: 'DIVISION SIGN',\n        value: '÷',\n        codepoint: 247,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH STROKE',\n        value: 'ø',\n        codepoint: 248,\n      },\n      {\n        name: 'LATIN SMALL LETTER U WITH GRAVE',\n        value: 'ù',\n        codepoint: 249,\n      },\n      {\n        name: 'LATIN SMALL LETTER U WITH ACUTE',\n        value: 'ú',\n        codepoint: 250,\n      },\n      {\n        name: 'LATIN SMALL LETTER U WITH CIRCUMFLEX',\n        value: 'û',\n        codepoint: 251,\n      },\n      {\n        name: 'LATIN SMALL LETTER U WITH DIAERESIS',\n        value: 'ü',\n        codepoint: 252,\n      },\n      {\n        name: 'LATIN SMALL LETTER Y WITH ACUTE',\n        value: 'ý',\n        codepoint: 253,\n      },\n      {\n        name: 'LATIN SMALL LETTER THORN',\n        value: 'þ',\n        codepoint: 254,\n      },\n      {\n        name: 'LATIN SMALL LETTER Y WITH DIAERESIS',\n        value: 'ÿ',\n        codepoint: 255,\n      },\n      {\n        name: 'ACCOUNT OF',\n        value: '℀',\n        codepoint: 8448,\n      },\n      {\n        name: 'ADDRESSED TO THE SUBJECT',\n        value: '℁',\n        codepoint: 8449,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL C',\n        value: 'ℂ',\n        codepoint: 8450,\n      },\n      {\n        name: 'DEGREE CELSIUS',\n        value: '℃',\n        codepoint: 8451,\n      },\n      {\n        name: 'CENTRE LINE SYMBOL',\n        value: '℄',\n        codepoint: 8452,\n      },\n      {\n        name: 'CARE OF',\n        value: '℅',\n        codepoint: 8453,\n      },\n      {\n        name: 'CADA UNA',\n        value: '℆',\n        codepoint: 8454,\n      },\n      {\n        name: 'EULER CONSTANT',\n        value: 'ℇ',\n        codepoint: 8455,\n      },\n      {\n        name: 'SCRUPLE',\n        value: '℈',\n        codepoint: 8456,\n      },\n      {\n        name: 'DEGREE FAHRENHEIT',\n        value: '℉',\n        codepoint: 8457,\n      },\n      {\n        name: 'SCRIPT SMALL G',\n        value: 'ℊ',\n        codepoint: 8458,\n      },\n      {\n        name: 'SCRIPT CAPITAL H',\n        value: 'ℋ',\n        codepoint: 8459,\n      },\n      {\n        name: 'BLACK-LETTER CAPITAL H',\n        value: 'ℌ',\n        codepoint: 8460,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL H',\n        value: 'ℍ',\n        codepoint: 8461,\n      },\n      {\n        name: 'PLANCK CONSTANT',\n        value: 'ℎ',\n        codepoint: 8462,\n      },\n      {\n        name: 'PLANCK CONSTANT OVER TWO PI',\n        value: 'ℏ',\n        codepoint: 8463,\n      },\n      {\n        name: 'SCRIPT CAPITAL I',\n        value: 'ℐ',\n        codepoint: 8464,\n      },\n      {\n        name: 'BLACK-LETTER CAPITAL I',\n        value: 'ℑ',\n        codepoint: 8465,\n      },\n      {\n        name: 'SCRIPT CAPITAL L',\n        value: 'ℒ',\n        codepoint: 8466,\n      },\n      {\n        name: 'SCRIPT SMALL L',\n        value: 'ℓ',\n        codepoint: 8467,\n      },\n      {\n        name: 'L B BAR SYMBOL',\n        value: '℔',\n        codepoint: 8468,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL N',\n        value: 'ℕ',\n        codepoint: 8469,\n      },\n      {\n        name: 'NUMERO SIGN',\n        value: '№',\n        codepoint: 8470,\n      },\n      {\n        name: 'SOUND RECORDING COPYRIGHT',\n        value: '℗',\n        codepoint: 8471,\n      },\n      {\n        name: 'SCRIPT CAPITAL P',\n        value: '℘',\n        codepoint: 8472,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL P',\n        value: 'ℙ',\n        codepoint: 8473,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL Q',\n        value: 'ℚ',\n        codepoint: 8474,\n      },\n      {\n        name: 'SCRIPT CAPITAL R',\n        value: 'ℛ',\n        codepoint: 8475,\n      },\n      {\n        name: 'BLACK-LETTER CAPITAL R',\n        value: 'ℜ',\n        codepoint: 8476,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL R',\n        value: 'ℝ',\n        codepoint: 8477,\n      },\n      {\n        name: 'PRESCRIPTION TAKE',\n        value: '℞',\n        codepoint: 8478,\n      },\n      {\n        name: 'RESPONSE',\n        value: '℟',\n        codepoint: 8479,\n      },\n      {\n        name: 'SERVICE MARK',\n        value: '℠',\n        codepoint: 8480,\n      },\n      {\n        name: 'TELEPHONE SIGN',\n        value: '℡',\n        codepoint: 8481,\n      },\n      {\n        name: 'VERSICLE',\n        value: '℣',\n        codepoint: 8483,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL Z',\n        value: 'ℤ',\n        codepoint: 8484,\n      },\n      {\n        name: 'OUNCE SIGN',\n        value: '℥',\n        codepoint: 8485,\n      },\n      {\n        name: 'OHM SIGN',\n        value: 'Ω',\n        codepoint: 8486,\n      },\n      {\n        name: 'INVERTED OHM SIGN',\n        value: '℧',\n        codepoint: 8487,\n      },\n      {\n        name: 'BLACK-LETTER CAPITAL Z',\n        value: 'ℨ',\n        codepoint: 8488,\n      },\n      {\n        name: 'TURNED GREEK SMALL LETTER IOTA',\n        value: '℩',\n        codepoint: 8489,\n      },\n      {\n        name: 'KELVIN SIGN',\n        value: 'K',\n        codepoint: 8490,\n      },\n      {\n        name: 'ANGSTROM SIGN',\n        value: 'Å',\n        codepoint: 8491,\n      },\n      {\n        name: 'SCRIPT CAPITAL B',\n        value: 'ℬ',\n        codepoint: 8492,\n      },\n      {\n        name: 'BLACK-LETTER CAPITAL C',\n        value: 'ℭ',\n        codepoint: 8493,\n      },\n      {\n        name: 'ESTIMATED SYMBOL',\n        value: '℮',\n        codepoint: 8494,\n      },\n      {\n        name: 'SCRIPT SMALL E',\n        value: 'ℯ',\n        codepoint: 8495,\n      },\n      {\n        name: 'SCRIPT CAPITAL E',\n        value: 'ℰ',\n        codepoint: 8496,\n      },\n      {\n        name: 'SCRIPT CAPITAL F',\n        value: 'ℱ',\n        codepoint: 8497,\n      },\n      {\n        name: 'TURNED CAPITAL F',\n        value: 'Ⅎ',\n        codepoint: 8498,\n      },\n      {\n        name: 'SCRIPT CAPITAL M',\n        value: 'ℳ',\n        codepoint: 8499,\n      },\n      {\n        name: 'SCRIPT SMALL O',\n        value: 'ℴ',\n        codepoint: 8500,\n      },\n      {\n        name: 'ALEF SYMBOL',\n        value: 'ℵ',\n        codepoint: 8501,\n      },\n      {\n        name: 'BET SYMBOL',\n        value: 'ℶ',\n        codepoint: 8502,\n      },\n      {\n        name: 'GIMEL SYMBOL',\n        value: 'ℷ',\n        codepoint: 8503,\n      },\n      {\n        name: 'DALET SYMBOL',\n        value: 'ℸ',\n        codepoint: 8504,\n      },\n      {\n        name: 'ROTATED CAPITAL Q',\n        value: '℺',\n        codepoint: 8506,\n      },\n      {\n        name: 'FACSIMILE SIGN',\n        value: '℻',\n        codepoint: 8507,\n      },\n      {\n        name: 'DOUBLE-STRUCK SMALL PI',\n        value: 'ℼ',\n        codepoint: 8508,\n      },\n      {\n        name: 'DOUBLE-STRUCK SMALL GAMMA',\n        value: 'ℽ',\n        codepoint: 8509,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL GAMMA',\n        value: 'ℾ',\n        codepoint: 8510,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL PI',\n        value: 'ℿ',\n        codepoint: 8511,\n      },\n      {\n        name: 'DOUBLE-STRUCK N-ARY SUMMATION',\n        value: '⅀',\n        codepoint: 8512,\n      },\n      {\n        name: 'TURNED SANS-SERIF CAPITAL G',\n        value: '⅁',\n        codepoint: 8513,\n      },\n      {\n        name: 'TURNED SANS-SERIF CAPITAL L',\n        value: '⅂',\n        codepoint: 8514,\n      },\n      {\n        name: 'REVERSED SANS-SERIF CAPITAL L',\n        value: '⅃',\n        codepoint: 8515,\n      },\n      {\n        name: 'TURNED SANS-SERIF CAPITAL Y',\n        value: '⅄',\n        codepoint: 8516,\n      },\n      {\n        name: 'DOUBLE-STRUCK ITALIC CAPITAL D',\n        value: 'ⅅ',\n        codepoint: 8517,\n      },\n      {\n        name: 'DOUBLE-STRUCK ITALIC SMALL D',\n        value: 'ⅆ',\n        codepoint: 8518,\n      },\n      {\n        name: 'DOUBLE-STRUCK ITALIC SMALL E',\n        value: 'ⅇ',\n        codepoint: 8519,\n      },\n      {\n        name: 'DOUBLE-STRUCK ITALIC SMALL I',\n        value: 'ⅈ',\n        codepoint: 8520,\n      },\n      {\n        name: 'DOUBLE-STRUCK ITALIC SMALL J',\n        value: 'ⅉ',\n        codepoint: 8521,\n      },\n      {\n        name: 'PROPERTY LINE',\n        value: '⅊',\n        codepoint: 8522,\n      },\n      {\n        name: 'TURNED AMPERSAND',\n        value: '⅋',\n        codepoint: 8523,\n      },\n      {\n        name: 'PER SIGN',\n        value: '⅌',\n        codepoint: 8524,\n      },\n      {\n        name: 'AKTIESELSKAB',\n        value: '⅍',\n        codepoint: 8525,\n      },\n      {\n        name: 'TURNED SMALL F',\n        value: 'ⅎ',\n        codepoint: 8526,\n      },\n      {\n        name: 'SYMBOL FOR SAMARITAN SOURCE',\n        value: '⅏',\n        codepoint: 8527,\n      },\n      {\n        name: 'CIRCLED DIGIT ONE',\n        value: '①',\n        codepoint: 9312,\n      },\n      {\n        name: 'CIRCLED DIGIT TWO',\n        value: '②',\n        codepoint: 9313,\n      },\n      {\n        name: 'CIRCLED DIGIT THREE',\n        value: '③',\n        codepoint: 9314,\n      },\n      {\n        name: 'CIRCLED DIGIT FOUR',\n        value: '④',\n        codepoint: 9315,\n      },\n      {\n        name: 'CIRCLED DIGIT FIVE',\n        value: '⑤',\n        codepoint: 9316,\n      },\n      {\n        name: 'CIRCLED DIGIT SIX',\n        value: '⑥',\n        codepoint: 9317,\n      },\n      {\n        name: 'CIRCLED DIGIT SEVEN',\n        value: '⑦',\n        codepoint: 9318,\n      },\n      {\n        name: 'CIRCLED DIGIT EIGHT',\n        value: '⑧',\n        codepoint: 9319,\n      },\n      {\n        name: 'CIRCLED DIGIT NINE',\n        value: '⑨',\n        codepoint: 9320,\n      },\n      {\n        name: 'CIRCLED NUMBER TEN',\n        value: '⑩',\n        codepoint: 9321,\n      },\n      {\n        name: 'CIRCLED NUMBER ELEVEN',\n        value: '⑪',\n        codepoint: 9322,\n      },\n      {\n        name: 'CIRCLED NUMBER TWELVE',\n        value: '⑫',\n        codepoint: 9323,\n      },\n      {\n        name: 'CIRCLED NUMBER THIRTEEN',\n        value: '⑬',\n        codepoint: 9324,\n      },\n      {\n        name: 'CIRCLED NUMBER FOURTEEN',\n        value: '⑭',\n        codepoint: 9325,\n      },\n      {\n        name: 'CIRCLED NUMBER FIFTEEN',\n        value: '⑮',\n        codepoint: 9326,\n      },\n      {\n        name: 'CIRCLED NUMBER SIXTEEN',\n        value: '⑯',\n        codepoint: 9327,\n      },\n      {\n        name: 'CIRCLED NUMBER SEVENTEEN',\n        value: '⑰',\n        codepoint: 9328,\n      },\n      {\n        name: 'CIRCLED NUMBER EIGHTEEN',\n        value: '⑱',\n        codepoint: 9329,\n      },\n      {\n        name: 'CIRCLED NUMBER NINETEEN',\n        value: '⑲',\n        codepoint: 9330,\n      },\n      {\n        name: 'CIRCLED NUMBER TWENTY',\n        value: '⑳',\n        codepoint: 9331,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT ONE',\n        value: '⑴',\n        codepoint: 9332,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT TWO',\n        value: '⑵',\n        codepoint: 9333,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT THREE',\n        value: '⑶',\n        codepoint: 9334,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT FOUR',\n        value: '⑷',\n        codepoint: 9335,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT FIVE',\n        value: '⑸',\n        codepoint: 9336,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT SIX',\n        value: '⑹',\n        codepoint: 9337,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT SEVEN',\n        value: '⑺',\n        codepoint: 9338,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT EIGHT',\n        value: '⑻',\n        codepoint: 9339,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT NINE',\n        value: '⑼',\n        codepoint: 9340,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER TEN',\n        value: '⑽',\n        codepoint: 9341,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER ELEVEN',\n        value: '⑾',\n        codepoint: 9342,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER TWELVE',\n        value: '⑿',\n        codepoint: 9343,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER THIRTEEN',\n        value: '⒀',\n        codepoint: 9344,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER FOURTEEN',\n        value: '⒁',\n        codepoint: 9345,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER FIFTEEN',\n        value: '⒂',\n        codepoint: 9346,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER SIXTEEN',\n        value: '⒃',\n        codepoint: 9347,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER SEVENTEEN',\n        value: '⒄',\n        codepoint: 9348,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER EIGHTEEN',\n        value: '⒅',\n        codepoint: 9349,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER NINETEEN',\n        value: '⒆',\n        codepoint: 9350,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER TWENTY',\n        value: '⒇',\n        codepoint: 9351,\n      },\n      {\n        name: 'DIGIT ONE FULL STOP',\n        value: '⒈',\n        codepoint: 9352,\n      },\n      {\n        name: 'DIGIT TWO FULL STOP',\n        value: '⒉',\n        codepoint: 9353,\n      },\n      {\n        name: 'DIGIT THREE FULL STOP',\n        value: '⒊',\n        codepoint: 9354,\n      },\n      {\n        name: 'DIGIT FOUR FULL STOP',\n        value: '⒋',\n        codepoint: 9355,\n      },\n      {\n        name: 'DIGIT FIVE FULL STOP',\n        value: '⒌',\n        codepoint: 9356,\n      },\n      {\n        name: 'DIGIT SIX FULL STOP',\n        value: '⒍',\n        codepoint: 9357,\n      },\n      {\n        name: 'DIGIT SEVEN FULL STOP',\n        value: '⒎',\n        codepoint: 9358,\n      },\n      {\n        name: 'DIGIT EIGHT FULL STOP',\n        value: '⒏',\n        codepoint: 9359,\n      },\n      {\n        name: 'DIGIT NINE FULL STOP',\n        value: '⒐',\n        codepoint: 9360,\n      },\n      {\n        name: 'NUMBER TEN FULL STOP',\n        value: '⒑',\n        codepoint: 9361,\n      },\n      {\n        name: 'NUMBER ELEVEN FULL STOP',\n        value: '⒒',\n        codepoint: 9362,\n      },\n      {\n        name: 'NUMBER TWELVE FULL STOP',\n        value: '⒓',\n        codepoint: 9363,\n      },\n      {\n        name: 'NUMBER THIRTEEN FULL STOP',\n        value: '⒔',\n        codepoint: 9364,\n      },\n      {\n        name: 'NUMBER FOURTEEN FULL STOP',\n        value: '⒕',\n        codepoint: 9365,\n      },\n      {\n        name: 'NUMBER FIFTEEN FULL STOP',\n        value: '⒖',\n        codepoint: 9366,\n      },\n      {\n        name: 'NUMBER SIXTEEN FULL STOP',\n        value: '⒗',\n        codepoint: 9367,\n      },\n      {\n        name: 'NUMBER SEVENTEEN FULL STOP',\n        value: '⒘',\n        codepoint: 9368,\n      },\n      {\n        name: 'NUMBER EIGHTEEN FULL STOP',\n        value: '⒙',\n        codepoint: 9369,\n      },\n      {\n        name: 'NUMBER NINETEEN FULL STOP',\n        value: '⒚',\n        codepoint: 9370,\n      },\n      {\n        name: 'NUMBER TWENTY FULL STOP',\n        value: '⒛',\n        codepoint: 9371,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER A',\n        value: '⒜',\n        codepoint: 9372,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER B',\n        value: '⒝',\n        codepoint: 9373,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER C',\n        value: '⒞',\n        codepoint: 9374,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER D',\n        value: '⒟',\n        codepoint: 9375,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER E',\n        value: '⒠',\n        codepoint: 9376,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER F',\n        value: '⒡',\n        codepoint: 9377,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER G',\n        value: '⒢',\n        codepoint: 9378,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER H',\n        value: '⒣',\n        codepoint: 9379,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER I',\n        value: '⒤',\n        codepoint: 9380,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER J',\n        value: '⒥',\n        codepoint: 9381,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER K',\n        value: '⒦',\n        codepoint: 9382,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER L',\n        value: '⒧',\n        codepoint: 9383,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER M',\n        value: '⒨',\n        codepoint: 9384,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER N',\n        value: '⒩',\n        codepoint: 9385,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER O',\n        value: '⒪',\n        codepoint: 9386,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER P',\n        value: '⒫',\n        codepoint: 9387,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER Q',\n        value: '⒬',\n        codepoint: 9388,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER R',\n        value: '⒭',\n        codepoint: 9389,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER S',\n        value: '⒮',\n        codepoint: 9390,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER T',\n        value: '⒯',\n        codepoint: 9391,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER U',\n        value: '⒰',\n        codepoint: 9392,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER V',\n        value: '⒱',\n        codepoint: 9393,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER W',\n        value: '⒲',\n        codepoint: 9394,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER X',\n        value: '⒳',\n        codepoint: 9395,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER Y',\n        value: '⒴',\n        codepoint: 9396,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER Z',\n        value: '⒵',\n        codepoint: 9397,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER A',\n        value: 'Ⓐ',\n        codepoint: 9398,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER B',\n        value: 'Ⓑ',\n        codepoint: 9399,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER C',\n        value: 'Ⓒ',\n        codepoint: 9400,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER D',\n        value: 'Ⓓ',\n        codepoint: 9401,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER E',\n        value: 'Ⓔ',\n        codepoint: 9402,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER F',\n        value: 'Ⓕ',\n        codepoint: 9403,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER G',\n        value: 'Ⓖ',\n        codepoint: 9404,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER H',\n        value: 'Ⓗ',\n        codepoint: 9405,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER I',\n        value: 'Ⓘ',\n        codepoint: 9406,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER J',\n        value: 'Ⓙ',\n        codepoint: 9407,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER K',\n        value: 'Ⓚ',\n        codepoint: 9408,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER L',\n        value: 'Ⓛ',\n        codepoint: 9409,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER N',\n        value: 'Ⓝ',\n        codepoint: 9411,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER O',\n        value: 'Ⓞ',\n        codepoint: 9412,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER P',\n        value: 'Ⓟ',\n        codepoint: 9413,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER Q',\n        value: 'Ⓠ',\n        codepoint: 9414,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER R',\n        value: 'Ⓡ',\n        codepoint: 9415,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER S',\n        value: 'Ⓢ',\n        codepoint: 9416,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER T',\n        value: 'Ⓣ',\n        codepoint: 9417,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER U',\n        value: 'Ⓤ',\n        codepoint: 9418,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER V',\n        value: 'Ⓥ',\n        codepoint: 9419,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER W',\n        value: 'Ⓦ',\n        codepoint: 9420,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER X',\n        value: 'Ⓧ',\n        codepoint: 9421,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER Y',\n        value: 'Ⓨ',\n        codepoint: 9422,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER Z',\n        value: 'Ⓩ',\n        codepoint: 9423,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER A',\n        value: 'ⓐ',\n        codepoint: 9424,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER B',\n        value: 'ⓑ',\n        codepoint: 9425,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER C',\n        value: 'ⓒ',\n        codepoint: 9426,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER D',\n        value: 'ⓓ',\n        codepoint: 9427,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER E',\n        value: 'ⓔ',\n        codepoint: 9428,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER F',\n        value: 'ⓕ',\n        codepoint: 9429,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER G',\n        value: 'ⓖ',\n        codepoint: 9430,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER H',\n        value: 'ⓗ',\n        codepoint: 9431,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER I',\n        value: 'ⓘ',\n        codepoint: 9432,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER J',\n        value: 'ⓙ',\n        codepoint: 9433,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER K',\n        value: 'ⓚ',\n        codepoint: 9434,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER L',\n        value: 'ⓛ',\n        codepoint: 9435,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER M',\n        value: 'ⓜ',\n        codepoint: 9436,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER N',\n        value: 'ⓝ',\n        codepoint: 9437,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER O',\n        value: 'ⓞ',\n        codepoint: 9438,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER P',\n        value: 'ⓟ',\n        codepoint: 9439,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER Q',\n        value: 'ⓠ',\n        codepoint: 9440,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER R',\n        value: 'ⓡ',\n        codepoint: 9441,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER S',\n        value: 'ⓢ',\n        codepoint: 9442,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER T',\n        value: 'ⓣ',\n        codepoint: 9443,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER U',\n        value: 'ⓤ',\n        codepoint: 9444,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER V',\n        value: 'ⓥ',\n        codepoint: 9445,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER W',\n        value: 'ⓦ',\n        codepoint: 9446,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER X',\n        value: 'ⓧ',\n        codepoint: 9447,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER Y',\n        value: 'ⓨ',\n        codepoint: 9448,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER Z',\n        value: 'ⓩ',\n        codepoint: 9449,\n      },\n      {\n        name: 'CIRCLED DIGIT ZERO',\n        value: '⓪',\n        codepoint: 9450,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER ELEVEN',\n        value: '⓫',\n        codepoint: 9451,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER TWELVE',\n        value: '⓬',\n        codepoint: 9452,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER THIRTEEN',\n        value: '⓭',\n        codepoint: 9453,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER FOURTEEN',\n        value: '⓮',\n        codepoint: 9454,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER FIFTEEN',\n        value: '⓯',\n        codepoint: 9455,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER SIXTEEN',\n        value: '⓰',\n        codepoint: 9456,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER SEVENTEEN',\n        value: '⓱',\n        codepoint: 9457,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER EIGHTEEN',\n        value: '⓲',\n        codepoint: 9458,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER NINETEEN',\n        value: '⓳',\n        codepoint: 9459,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER TWENTY',\n        value: '⓴',\n        codepoint: 9460,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT ONE',\n        value: '⓵',\n        codepoint: 9461,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT TWO',\n        value: '⓶',\n        codepoint: 9462,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT THREE',\n        value: '⓷',\n        codepoint: 9463,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT FOUR',\n        value: '⓸',\n        codepoint: 9464,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT FIVE',\n        value: '⓹',\n        codepoint: 9465,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT SIX',\n        value: '⓺',\n        codepoint: 9466,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT SEVEN',\n        value: '⓻',\n        codepoint: 9467,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT EIGHT',\n        value: '⓼',\n        codepoint: 9468,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT NINE',\n        value: '⓽',\n        codepoint: 9469,\n      },\n      {\n        name: 'DOUBLE CIRCLED NUMBER TEN',\n        value: '⓾',\n        codepoint: 9470,\n      },\n      {\n        name: 'NEGATIVE CIRCLED DIGIT ZERO',\n        value: '⓿',\n        codepoint: 9471,\n      },\n      {\n        name: 'BLACK STAR',\n        value: '★',\n        codepoint: 9733,\n      },\n      {\n        name: 'WHITE STAR',\n        value: '☆',\n        codepoint: 9734,\n      },\n      {\n        name: 'LIGHTNING',\n        value: '☇',\n        codepoint: 9735,\n      },\n      {\n        name: 'THUNDERSTORM',\n        value: '☈',\n        codepoint: 9736,\n      },\n      {\n        name: 'SUN',\n        value: '☉',\n        codepoint: 9737,\n      },\n      {\n        name: 'ASCENDING NODE',\n        value: '☊',\n        codepoint: 9738,\n      },\n      {\n        name: 'DESCENDING NODE',\n        value: '☋',\n        codepoint: 9739,\n      },\n      {\n        name: 'CONJUNCTION',\n        value: '☌',\n        codepoint: 9740,\n      },\n      {\n        name: 'OPPOSITION',\n        value: '☍',\n        codepoint: 9741,\n      },\n      {\n        name: 'WHITE TELEPHONE',\n        value: '☏',\n        codepoint: 9743,\n      },\n      {\n        name: 'BALLOT BOX',\n        value: '☐',\n        codepoint: 9744,\n      },\n      {\n        name: 'BALLOT BOX WITH X',\n        value: '☒',\n        codepoint: 9746,\n      },\n      {\n        name: 'SALTIRE',\n        value: '☓',\n        codepoint: 9747,\n      },\n      {\n        name: 'WHITE SHOGI PIECE',\n        value: '☖',\n        codepoint: 9750,\n      },\n      {\n        name: 'BLACK SHOGI PIECE',\n        value: '☗',\n        codepoint: 9751,\n      },\n      {\n        name: 'REVERSED ROTATED FLORAL HEART BULLET',\n        value: '☙',\n        codepoint: 9753,\n      },\n      {\n        name: 'BLACK LEFT POINTING INDEX',\n        value: '☚',\n        codepoint: 9754,\n      },\n      {\n        name: 'BLACK RIGHT POINTING INDEX',\n        value: '☛',\n        codepoint: 9755,\n      },\n      {\n        name: 'WHITE LEFT POINTING INDEX',\n        value: '☜',\n        codepoint: 9756,\n      },\n      {\n        name: 'WHITE RIGHT POINTING INDEX',\n        value: '☞',\n        codepoint: 9758,\n      },\n      {\n        name: 'WHITE DOWN POINTING INDEX',\n        value: '☟',\n        codepoint: 9759,\n      },\n      {\n        name: 'CAUTION SIGN',\n        value: '☡',\n        codepoint: 9761,\n      },\n      {\n        name: 'CADUCEUS',\n        value: '☤',\n        codepoint: 9764,\n      },\n      {\n        name: 'ANKH',\n        value: '☥',\n        codepoint: 9765,\n      },\n      {\n        name: 'CHI RHO',\n        value: '☧',\n        codepoint: 9767,\n      },\n      {\n        name: 'CROSS OF LORRAINE',\n        value: '☨',\n        codepoint: 9768,\n      },\n      {\n        name: 'CROSS OF JERUSALEM',\n        value: '☩',\n        codepoint: 9769,\n      },\n      {\n        name: 'FARSI SYMBOL',\n        value: '☫',\n        codepoint: 9771,\n      },\n      {\n        name: 'ADI SHAKTI',\n        value: '☬',\n        codepoint: 9772,\n      },\n      {\n        name: 'HAMMER AND SICKLE',\n        value: '☭',\n        codepoint: 9773,\n      },\n      {\n        name: 'TRIGRAM FOR HEAVEN',\n        value: '☰',\n        codepoint: 9776,\n      },\n      {\n        name: 'TRIGRAM FOR LAKE',\n        value: '☱',\n        codepoint: 9777,\n      },\n      {\n        name: 'TRIGRAM FOR FIRE',\n        value: '☲',\n        codepoint: 9778,\n      },\n      {\n        name: 'TRIGRAM FOR THUNDER',\n        value: '☳',\n        codepoint: 9779,\n      },\n      {\n        name: 'TRIGRAM FOR WIND',\n        value: '☴',\n        codepoint: 9780,\n      },\n      {\n        name: 'TRIGRAM FOR WATER',\n        value: '☵',\n        codepoint: 9781,\n      },\n      {\n        name: 'TRIGRAM FOR MOUNTAIN',\n        value: '☶',\n        codepoint: 9782,\n      },\n      {\n        name: 'TRIGRAM FOR EARTH',\n        value: '☷',\n        codepoint: 9783,\n      },\n      {\n        name: 'BLACK SMILING FACE',\n        value: '☻',\n        codepoint: 9787,\n      },\n      {\n        name: 'WHITE SUN WITH RAYS',\n        value: '☼',\n        codepoint: 9788,\n      },\n      {\n        name: 'FIRST QUARTER MOON',\n        value: '☽',\n        codepoint: 9789,\n      },\n      {\n        name: 'LAST QUARTER MOON',\n        value: '☾',\n        codepoint: 9790,\n      },\n      {\n        name: 'MERCURY',\n        value: '☿',\n        codepoint: 9791,\n      },\n      {\n        name: 'EARTH',\n        value: '♁',\n        codepoint: 9793,\n      },\n      {\n        name: 'JUPITER',\n        value: '♃',\n        codepoint: 9795,\n      },\n      {\n        name: 'SATURN',\n        value: '♄',\n        codepoint: 9796,\n      },\n      {\n        name: 'URANUS',\n        value: '♅',\n        codepoint: 9797,\n      },\n      {\n        name: 'NEPTUNE',\n        value: '♆',\n        codepoint: 9798,\n      },\n      {\n        name: 'PLUTO',\n        value: '♇',\n        codepoint: 9799,\n      },\n      {\n        name: 'WHITE CHESS KING',\n        value: '♔',\n        codepoint: 9812,\n      },\n      {\n        name: 'WHITE CHESS QUEEN',\n        value: '♕',\n        codepoint: 9813,\n      },\n      {\n        name: 'WHITE CHESS ROOK',\n        value: '♖',\n        codepoint: 9814,\n      },\n      {\n        name: 'WHITE CHESS BISHOP',\n        value: '♗',\n        codepoint: 9815,\n      },\n      {\n        name: 'WHITE CHESS KNIGHT',\n        value: '♘',\n        codepoint: 9816,\n      },\n      {\n        name: 'WHITE CHESS PAWN',\n        value: '♙',\n        codepoint: 9817,\n      },\n      {\n        name: 'BLACK CHESS KING',\n        value: '♚',\n        codepoint: 9818,\n      },\n      {\n        name: 'BLACK CHESS QUEEN',\n        value: '♛',\n        codepoint: 9819,\n      },\n      {\n        name: 'BLACK CHESS ROOK',\n        value: '♜',\n        codepoint: 9820,\n      },\n      {\n        name: 'BLACK CHESS BISHOP',\n        value: '♝',\n        codepoint: 9821,\n      },\n      {\n        name: 'BLACK CHESS KNIGHT',\n        value: '♞',\n        codepoint: 9822,\n      },\n      {\n        name: 'WHITE HEART SUIT',\n        value: '♡',\n        codepoint: 9825,\n      },\n      {\n        name: 'WHITE DIAMOND SUIT',\n        value: '♢',\n        codepoint: 9826,\n      },\n      {\n        name: 'WHITE SPADE SUIT',\n        value: '♤',\n        codepoint: 9828,\n      },\n      {\n        name: 'WHITE CLUB SUIT',\n        value: '♧',\n        codepoint: 9831,\n      },\n      {\n        name: 'QUARTER NOTE',\n        value: '♩',\n        codepoint: 9833,\n      },\n      {\n        name: 'EIGHTH NOTE',\n        value: '♪',\n        codepoint: 9834,\n      },\n      {\n        name: 'BEAMED EIGHTH NOTES',\n        value: '♫',\n        codepoint: 9835,\n      },\n      {\n        name: 'BEAMED SIXTEENTH NOTES',\n        value: '♬',\n        codepoint: 9836,\n      },\n      {\n        name: 'MUSIC FLAT SIGN',\n        value: '♭',\n        codepoint: 9837,\n      },\n      {\n        name: 'MUSIC NATURAL SIGN',\n        value: '♮',\n        codepoint: 9838,\n      },\n      {\n        name: 'MUSIC SHARP SIGN',\n        value: '♯',\n        codepoint: 9839,\n      },\n      {\n        name: 'WEST SYRIAC CROSS',\n        value: '♰',\n        codepoint: 9840,\n      },\n      {\n        name: 'EAST SYRIAC CROSS',\n        value: '♱',\n        codepoint: 9841,\n      },\n      {\n        name: 'UNIVERSAL RECYCLING SYMBOL',\n        value: '♲',\n        codepoint: 9842,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-1 PLASTICS',\n        value: '♳',\n        codepoint: 9843,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-2 PLASTICS',\n        value: '♴',\n        codepoint: 9844,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-3 PLASTICS',\n        value: '♵',\n        codepoint: 9845,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-4 PLASTICS',\n        value: '♶',\n        codepoint: 9846,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-5 PLASTICS',\n        value: '♷',\n        codepoint: 9847,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-6 PLASTICS',\n        value: '♸',\n        codepoint: 9848,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-7 PLASTICS',\n        value: '♹',\n        codepoint: 9849,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR GENERIC MATERIALS',\n        value: '♺',\n        codepoint: 9850,\n      },\n      {\n        name: 'RECYCLED PAPER SYMBOL',\n        value: '♼',\n        codepoint: 9852,\n      },\n      {\n        name: 'PARTIALLY-RECYCLED PAPER SYMBOL',\n        value: '♽',\n        codepoint: 9853,\n      },\n      {\n        name: 'DIE FACE-1',\n        value: '⚀',\n        codepoint: 9856,\n      },\n      {\n        name: 'DIE FACE-2',\n        value: '⚁',\n        codepoint: 9857,\n      },\n      {\n        name: 'DIE FACE-3',\n        value: '⚂',\n        codepoint: 9858,\n      },\n      {\n        name: 'DIE FACE-4',\n        value: '⚃',\n        codepoint: 9859,\n      },\n      {\n        name: 'DIE FACE-5',\n        value: '⚄',\n        codepoint: 9860,\n      },\n      {\n        name: 'DIE FACE-6',\n        value: '⚅',\n        codepoint: 9861,\n      },\n      {\n        name: 'WHITE CIRCLE WITH DOT RIGHT',\n        value: '⚆',\n        codepoint: 9862,\n      },\n      {\n        name: 'WHITE CIRCLE WITH TWO DOTS',\n        value: '⚇',\n        codepoint: 9863,\n      },\n      {\n        name: 'BLACK CIRCLE WITH WHITE DOT RIGHT',\n        value: '⚈',\n        codepoint: 9864,\n      },\n      {\n        name: 'BLACK CIRCLE WITH TWO WHITE DOTS',\n        value: '⚉',\n        codepoint: 9865,\n      },\n      {\n        name: 'MONOGRAM FOR YANG',\n        value: '⚊',\n        codepoint: 9866,\n      },\n      {\n        name: 'MONOGRAM FOR YIN',\n        value: '⚋',\n        codepoint: 9867,\n      },\n      {\n        name: 'DIGRAM FOR GREATER YANG',\n        value: '⚌',\n        codepoint: 9868,\n      },\n      {\n        name: 'DIGRAM FOR LESSER YIN',\n        value: '⚍',\n        codepoint: 9869,\n      },\n      {\n        name: 'DIGRAM FOR LESSER YANG',\n        value: '⚎',\n        codepoint: 9870,\n      },\n      {\n        name: 'DIGRAM FOR GREATER YIN',\n        value: '⚏',\n        codepoint: 9871,\n      },\n      {\n        name: 'WHITE FLAG',\n        value: '⚐',\n        codepoint: 9872,\n      },\n      {\n        name: 'BLACK FLAG',\n        value: '⚑',\n        codepoint: 9873,\n      },\n      {\n        name: 'FLOWER',\n        value: '⚘',\n        codepoint: 9880,\n      },\n      {\n        name: 'STAFF OF HERMES',\n        value: '⚚',\n        codepoint: 9882,\n      },\n      {\n        name: 'DOUBLED FEMALE SIGN',\n        value: '⚢',\n        codepoint: 9890,\n      },\n      {\n        name: 'DOUBLED MALE SIGN',\n        value: '⚣',\n        codepoint: 9891,\n      },\n      {\n        name: 'INTERLOCKED FEMALE AND MALE SIGN',\n        value: '⚤',\n        codepoint: 9892,\n      },\n      {\n        name: 'MALE AND FEMALE SIGN',\n        value: '⚥',\n        codepoint: 9893,\n      },\n      {\n        name: 'MALE WITH STROKE SIGN',\n        value: '⚦',\n        codepoint: 9894,\n      },\n      {\n        name: 'VERTICAL MALE WITH STROKE SIGN',\n        value: '⚨',\n        codepoint: 9896,\n      },\n      {\n        name: 'HORIZONTAL MALE WITH STROKE SIGN',\n        value: '⚩',\n        codepoint: 9897,\n      },\n      {\n        name: 'MEDIUM SMALL WHITE CIRCLE',\n        value: '⚬',\n        codepoint: 9900,\n      },\n      {\n        name: 'MARRIAGE SYMBOL',\n        value: '⚭',\n        codepoint: 9901,\n      },\n      {\n        name: 'DIVORCE SYMBOL',\n        value: '⚮',\n        codepoint: 9902,\n      },\n      {\n        name: 'UNMARRIED PARTNERSHIP SYMBOL',\n        value: '⚯',\n        codepoint: 9903,\n      },\n      {\n        name: 'NEUTER',\n        value: '⚲',\n        codepoint: 9906,\n      },\n      {\n        name: 'WHITE DIAMOND IN SQUARE',\n        value: '⛋',\n        codepoint: 9931,\n      },\n      {\n        name: 'ASTRONOMICAL SYMBOL FOR URANUS',\n        value: '⛢',\n        codepoint: 9954,\n      },\n      {\n        name: 'UPPER BLADE SCISSORS',\n        value: '✁',\n        codepoint: 9985,\n      },\n      {\n        name: 'LOWER BLADE SCISSORS',\n        value: '✃',\n        codepoint: 9987,\n      },\n      {\n        name: 'WHITE SCISSORS',\n        value: '✄',\n        codepoint: 9988,\n      },\n      {\n        name: 'TELEPHONE LOCATION SIGN',\n        value: '✆',\n        codepoint: 9990,\n      },\n      {\n        name: 'TAPE DRIVE',\n        value: '✇',\n        codepoint: 9991,\n      },\n      {\n        name: 'LOWER RIGHT PENCIL',\n        value: '✎',\n        codepoint: 9998,\n      },\n      {\n        name: 'UPPER RIGHT PENCIL',\n        value: '✐',\n        codepoint: 10000,\n      },\n      {\n        name: 'WHITE NIB',\n        value: '✑',\n        codepoint: 10001,\n      },\n      {\n        name: 'CHECK MARK',\n        value: '✓',\n        codepoint: 10003,\n      },\n      {\n        name: 'MULTIPLICATION X',\n        value: '✕',\n        codepoint: 10005,\n      },\n      {\n        name: 'BALLOT X',\n        value: '✗',\n        codepoint: 10007,\n      },\n      {\n        name: 'HEAVY BALLOT X',\n        value: '✘',\n        codepoint: 10008,\n      },\n      {\n        name: 'OUTLINED GREEK CROSS',\n        value: '✙',\n        codepoint: 10009,\n      },\n      {\n        name: 'HEAVY GREEK CROSS',\n        value: '✚',\n        codepoint: 10010,\n      },\n      {\n        name: 'OPEN CENTRE CROSS',\n        value: '✛',\n        codepoint: 10011,\n      },\n      {\n        name: 'HEAVY OPEN CENTRE CROSS',\n        value: '✜',\n        codepoint: 10012,\n      },\n      {\n        name: 'SHADOWED WHITE LATIN CROSS',\n        value: '✞',\n        codepoint: 10014,\n      },\n      {\n        name: 'OUTLINED LATIN CROSS',\n        value: '✟',\n        codepoint: 10015,\n      },\n      {\n        name: 'MALTESE CROSS',\n        value: '✠',\n        codepoint: 10016,\n      },\n      {\n        name: 'FOUR TEARDROP-SPOKED ASTERISK',\n        value: '✢',\n        codepoint: 10018,\n      },\n      {\n        name: 'FOUR BALLOON-SPOKED ASTERISK',\n        value: '✣',\n        codepoint: 10019,\n      },\n      {\n        name: 'HEAVY FOUR BALLOON-SPOKED ASTERISK',\n        value: '✤',\n        codepoint: 10020,\n      },\n      {\n        name: 'FOUR CLUB-SPOKED ASTERISK',\n        value: '✥',\n        codepoint: 10021,\n      },\n      {\n        name: 'BLACK FOUR POINTED STAR',\n        value: '✦',\n        codepoint: 10022,\n      },\n      {\n        name: 'WHITE FOUR POINTED STAR',\n        value: '✧',\n        codepoint: 10023,\n      },\n      {\n        name: 'STRESS OUTLINED WHITE STAR',\n        value: '✩',\n        codepoint: 10025,\n      },\n      {\n        name: 'CIRCLED WHITE STAR',\n        value: '✪',\n        codepoint: 10026,\n      },\n      {\n        name: 'OPEN CENTRE BLACK STAR',\n        value: '✫',\n        codepoint: 10027,\n      },\n      {\n        name: 'BLACK CENTRE WHITE STAR',\n        value: '✬',\n        codepoint: 10028,\n      },\n      {\n        name: 'OUTLINED BLACK STAR',\n        value: '✭',\n        codepoint: 10029,\n      },\n      {\n        name: 'HEAVY OUTLINED BLACK STAR',\n        value: '✮',\n        codepoint: 10030,\n      },\n      {\n        name: 'PINWHEEL STAR',\n        value: '✯',\n        codepoint: 10031,\n      },\n      {\n        name: 'SHADOWED WHITE STAR',\n        value: '✰',\n        codepoint: 10032,\n      },\n      {\n        name: 'HEAVY ASTERISK',\n        value: '✱',\n        codepoint: 10033,\n      },\n      {\n        name: 'OPEN CENTRE ASTERISK',\n        value: '✲',\n        codepoint: 10034,\n      },\n      {\n        name: 'EIGHT POINTED PINWHEEL STAR',\n        value: '✵',\n        codepoint: 10037,\n      },\n      {\n        name: 'SIX POINTED BLACK STAR',\n        value: '✶',\n        codepoint: 10038,\n      },\n      {\n        name: 'EIGHT POINTED RECTILINEAR BLACK STAR',\n        value: '✷',\n        codepoint: 10039,\n      },\n      {\n        name: 'HEAVY EIGHT POINTED RECTILINEAR BLACK STAR',\n        value: '✸',\n        codepoint: 10040,\n      },\n      {\n        name: 'TWELVE POINTED BLACK STAR',\n        value: '✹',\n        codepoint: 10041,\n      },\n      {\n        name: 'SIXTEEN POINTED ASTERISK',\n        value: '✺',\n        codepoint: 10042,\n      },\n      {\n        name: 'TEARDROP-SPOKED ASTERISK',\n        value: '✻',\n        codepoint: 10043,\n      },\n      {\n        name: 'OPEN CENTRE TEARDROP-SPOKED ASTERISK',\n        value: '✼',\n        codepoint: 10044,\n      },\n      {\n        name: 'HEAVY TEARDROP-SPOKED ASTERISK',\n        value: '✽',\n        codepoint: 10045,\n      },\n      {\n        name: 'SIX PETALLED BLACK AND WHITE FLORETTE',\n        value: '✾',\n        codepoint: 10046,\n      },\n      {\n        name: 'BLACK FLORETTE',\n        value: '✿',\n        codepoint: 10047,\n      },\n      {\n        name: 'WHITE FLORETTE',\n        value: '❀',\n        codepoint: 10048,\n      },\n      {\n        name: 'EIGHT PETALLED OUTLINED BLACK FLORETTE',\n        value: '❁',\n        codepoint: 10049,\n      },\n      {\n        name: 'CIRCLED OPEN CENTRE EIGHT POINTED STAR',\n        value: '❂',\n        codepoint: 10050,\n      },\n      {\n        name: 'HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK',\n        value: '❃',\n        codepoint: 10051,\n      },\n      {\n        name: 'TIGHT TRIFOLIATE SNOWFLAKE',\n        value: '❅',\n        codepoint: 10053,\n      },\n      {\n        name: 'HEAVY CHEVRON SNOWFLAKE',\n        value: '❆',\n        codepoint: 10054,\n      },\n      {\n        name: 'HEAVY SPARKLE',\n        value: '❈',\n        codepoint: 10056,\n      },\n      {\n        name: 'BALLOON-SPOKED ASTERISK',\n        value: '❉',\n        codepoint: 10057,\n      },\n      {\n        name: 'EIGHT TEARDROP-SPOKED PROPELLER ASTERISK',\n        value: '❊',\n        codepoint: 10058,\n      },\n      {\n        name: 'HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK',\n        value: '❋',\n        codepoint: 10059,\n      },\n      {\n        name: 'SHADOWED WHITE CIRCLE',\n        value: '❍',\n        codepoint: 10061,\n      },\n      {\n        name: 'LOWER RIGHT DROP-SHADOWED WHITE SQUARE',\n        value: '❏',\n        codepoint: 10063,\n      },\n      {\n        name: 'UPPER RIGHT DROP-SHADOWED WHITE SQUARE',\n        value: '❐',\n        codepoint: 10064,\n      },\n      {\n        name: 'LOWER RIGHT SHADOWED WHITE SQUARE',\n        value: '❑',\n        codepoint: 10065,\n      },\n      {\n        name: 'UPPER RIGHT SHADOWED WHITE SQUARE',\n        value: '❒',\n        codepoint: 10066,\n      },\n      {\n        name: 'BLACK DIAMOND MINUS WHITE X',\n        value: '❖',\n        codepoint: 10070,\n      },\n      {\n        name: 'LIGHT VERTICAL BAR',\n        value: '❘',\n        codepoint: 10072,\n      },\n      {\n        name: 'MEDIUM VERTICAL BAR',\n        value: '❙',\n        codepoint: 10073,\n      },\n      {\n        name: 'HEAVY VERTICAL BAR',\n        value: '❚',\n        codepoint: 10074,\n      },\n      {\n        name: 'HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT',\n        value: '❛',\n        codepoint: 10075,\n      },\n      {\n        name: 'HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT',\n        value: '❜',\n        codepoint: 10076,\n      },\n      {\n        name: 'HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT',\n        value: '❝',\n        codepoint: 10077,\n      },\n      {\n        name: 'HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT',\n        value: '❞',\n        codepoint: 10078,\n      },\n      {\n        name: 'CURVED STEM PARAGRAPH SIGN ORNAMENT',\n        value: '❡',\n        codepoint: 10081,\n      },\n      {\n        name: 'HEAVY EXCLAMATION MARK ORNAMENT',\n        value: '❢',\n        codepoint: 10082,\n      },\n      {\n        name: 'ROTATED HEAVY BLACK HEART BULLET',\n        value: '❥',\n        codepoint: 10085,\n      },\n      {\n        name: 'FLORAL HEART',\n        value: '❦',\n        codepoint: 10086,\n      },\n      {\n        name: 'ROTATED FLORAL HEART BULLET',\n        value: '❧',\n        codepoint: 10087,\n      },\n      {\n        name: 'MEDIUM LEFT PARENTHESIS ORNAMENT',\n        value: '❨',\n        codepoint: 10088,\n      },\n      {\n        name: 'MEDIUM RIGHT PARENTHESIS ORNAMENT',\n        value: '❩',\n        codepoint: 10089,\n      },\n      {\n        name: 'MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT',\n        value: '❪',\n        codepoint: 10090,\n      },\n      {\n        name: 'MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT',\n        value: '❫',\n        codepoint: 10091,\n      },\n      {\n        name: 'MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT',\n        value: '❬',\n        codepoint: 10092,\n      },\n      {\n        name: 'MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT',\n        value: '❭',\n        codepoint: 10093,\n      },\n      {\n        name: 'HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT',\n        value: '❮',\n        codepoint: 10094,\n      },\n      {\n        name: 'HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT',\n        value: '❯',\n        codepoint: 10095,\n      },\n      {\n        name: 'HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT',\n        value: '❰',\n        codepoint: 10096,\n      },\n      {\n        name: 'HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT',\n        value: '❱',\n        codepoint: 10097,\n      },\n      {\n        name: 'LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT',\n        value: '❲',\n        codepoint: 10098,\n      },\n      {\n        name: 'LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT',\n        value: '❳',\n        codepoint: 10099,\n      },\n      {\n        name: 'MEDIUM LEFT CURLY BRACKET ORNAMENT',\n        value: '❴',\n        codepoint: 10100,\n      },\n      {\n        name: 'MEDIUM RIGHT CURLY BRACKET ORNAMENT',\n        value: '❵',\n        codepoint: 10101,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT ONE',\n        value: '❶',\n        codepoint: 10102,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT TWO',\n        value: '❷',\n        codepoint: 10103,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT THREE',\n        value: '❸',\n        codepoint: 10104,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT FOUR',\n        value: '❹',\n        codepoint: 10105,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT FIVE',\n        value: '❺',\n        codepoint: 10106,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT SIX',\n        value: '❻',\n        codepoint: 10107,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT SEVEN',\n        value: '❼',\n        codepoint: 10108,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT EIGHT',\n        value: '❽',\n        codepoint: 10109,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT NINE',\n        value: '❾',\n        codepoint: 10110,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED NUMBER TEN',\n        value: '❿',\n        codepoint: 10111,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT ONE',\n        value: '➀',\n        codepoint: 10112,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT TWO',\n        value: '➁',\n        codepoint: 10113,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT THREE',\n        value: '➂',\n        codepoint: 10114,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT FOUR',\n        value: '➃',\n        codepoint: 10115,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT FIVE',\n        value: '➄',\n        codepoint: 10116,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT SIX',\n        value: '➅',\n        codepoint: 10117,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN',\n        value: '➆',\n        codepoint: 10118,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT',\n        value: '➇',\n        codepoint: 10119,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT NINE',\n        value: '➈',\n        codepoint: 10120,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF NUMBER TEN',\n        value: '➉',\n        codepoint: 10121,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE',\n        value: '➊',\n        codepoint: 10122,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO',\n        value: '➋',\n        codepoint: 10123,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE',\n        value: '➌',\n        codepoint: 10124,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR',\n        value: '➍',\n        codepoint: 10125,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE',\n        value: '➎',\n        codepoint: 10126,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX',\n        value: '➏',\n        codepoint: 10127,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN',\n        value: '➐',\n        codepoint: 10128,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT',\n        value: '➑',\n        codepoint: 10129,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE',\n        value: '➒',\n        codepoint: 10130,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN',\n        value: '➓',\n        codepoint: 10131,\n      },\n      {\n        name: 'HEAVY WIDE-HEADED RIGHTWARDS ARROW',\n        value: '➔',\n        codepoint: 10132,\n      },\n      {\n        name: 'HEAVY SOUTH EAST ARROW',\n        value: '➘',\n        codepoint: 10136,\n      },\n      {\n        name: 'HEAVY RIGHTWARDS ARROW',\n        value: '➙',\n        codepoint: 10137,\n      },\n      {\n        name: 'HEAVY NORTH EAST ARROW',\n        value: '➚',\n        codepoint: 10138,\n      },\n      {\n        name: 'DRAFTING POINT RIGHTWARDS ARROW',\n        value: '➛',\n        codepoint: 10139,\n      },\n      {\n        name: 'HEAVY ROUND-TIPPED RIGHTWARDS ARROW',\n        value: '➜',\n        codepoint: 10140,\n      },\n      {\n        name: 'TRIANGLE-HEADED RIGHTWARDS ARROW',\n        value: '➝',\n        codepoint: 10141,\n      },\n      {\n        name: 'HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW',\n        value: '➞',\n        codepoint: 10142,\n      },\n      {\n        name: 'DASHED TRIANGLE-HEADED RIGHTWARDS ARROW',\n        value: '➟',\n        codepoint: 10143,\n      },\n      {\n        name: 'HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW',\n        value: '➠',\n        codepoint: 10144,\n      },\n      {\n        name: 'THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD',\n        value: '➢',\n        codepoint: 10146,\n      },\n      {\n        name: 'THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD',\n        value: '➣',\n        codepoint: 10147,\n      },\n      {\n        name: 'BLACK RIGHTWARDS ARROWHEAD',\n        value: '➤',\n        codepoint: 10148,\n      },\n      {\n        name: 'HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW',\n        value: '➥',\n        codepoint: 10149,\n      },\n      {\n        name: 'HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW',\n        value: '➦',\n        codepoint: 10150,\n      },\n      {\n        name: 'SQUAT BLACK RIGHTWARDS ARROW',\n        value: '➧',\n        codepoint: 10151,\n      },\n      {\n        name: 'HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW',\n        value: '➨',\n        codepoint: 10152,\n      },\n      {\n        name: 'RIGHT-SHADED WHITE RIGHTWARDS ARROW',\n        value: '➩',\n        codepoint: 10153,\n      },\n      {\n        name: 'LEFT-SHADED WHITE RIGHTWARDS ARROW',\n        value: '➪',\n        codepoint: 10154,\n      },\n      {\n        name: 'BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➫',\n        codepoint: 10155,\n      },\n      {\n        name: 'FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➬',\n        codepoint: 10156,\n      },\n      {\n        name: 'HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➭',\n        codepoint: 10157,\n      },\n      {\n        name: 'HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➮',\n        codepoint: 10158,\n      },\n      {\n        name: 'NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➯',\n        codepoint: 10159,\n      },\n      {\n        name: 'NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➱',\n        codepoint: 10161,\n      },\n      {\n        name: 'CIRCLED HEAVY WHITE RIGHTWARDS ARROW',\n        value: '➲',\n        codepoint: 10162,\n      },\n      {\n        name: 'WHITE-FEATHERED RIGHTWARDS ARROW',\n        value: '➳',\n        codepoint: 10163,\n      },\n      {\n        name: 'BLACK-FEATHERED SOUTH EAST ARROW',\n        value: '➴',\n        codepoint: 10164,\n      },\n      {\n        name: 'BLACK-FEATHERED RIGHTWARDS ARROW',\n        value: '➵',\n        codepoint: 10165,\n      },\n      {\n        name: 'BLACK-FEATHERED NORTH EAST ARROW',\n        value: '➶',\n        codepoint: 10166,\n      },\n      {\n        name: 'HEAVY BLACK-FEATHERED SOUTH EAST ARROW',\n        value: '➷',\n        codepoint: 10167,\n      },\n      {\n        name: 'HEAVY BLACK-FEATHERED RIGHTWARDS ARROW',\n        value: '➸',\n        codepoint: 10168,\n      },\n      {\n        name: 'HEAVY BLACK-FEATHERED NORTH EAST ARROW',\n        value: '➹',\n        codepoint: 10169,\n      },\n      {\n        name: 'TEARDROP-BARBED RIGHTWARDS ARROW',\n        value: '➺',\n        codepoint: 10170,\n      },\n      {\n        name: 'HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW',\n        value: '➻',\n        codepoint: 10171,\n      },\n      {\n        name: 'WEDGE-TAILED RIGHTWARDS ARROW',\n        value: '➼',\n        codepoint: 10172,\n      },\n      {\n        name: 'HEAVY WEDGE-TAILED RIGHTWARDS ARROW',\n        value: '➽',\n        codepoint: 10173,\n      },\n      {\n        name: 'OPEN-OUTLINED RIGHTWARDS ARROW',\n        value: '➾',\n        codepoint: 10174,\n      },\n    ],\n  },\n  {\n    name: 'Mathematical',\n    symbols: [\n      {\n        name: 'FOR ALL',\n        value: '∀',\n        codepoint: 8704,\n      },\n      {\n        name: 'COMPLEMENT',\n        value: '∁',\n        codepoint: 8705,\n      },\n      {\n        name: 'PARTIAL DIFFERENTIAL',\n        value: '∂',\n        codepoint: 8706,\n      },\n      {\n        name: 'THERE EXISTS',\n        value: '∃',\n        codepoint: 8707,\n      },\n      {\n        name: 'THERE DOES NOT EXIST',\n        value: '∄',\n        codepoint: 8708,\n      },\n      {\n        name: 'EMPTY SET',\n        value: '∅',\n        codepoint: 8709,\n      },\n      {\n        name: 'INCREMENT',\n        value: '∆',\n        codepoint: 8710,\n      },\n      {\n        name: 'NABLA',\n        value: '∇',\n        codepoint: 8711,\n      },\n      {\n        name: 'ELEMENT OF',\n        value: '∈',\n        codepoint: 8712,\n      },\n      {\n        name: 'NOT AN ELEMENT OF',\n        value: '∉',\n        codepoint: 8713,\n      },\n      {\n        name: 'SMALL ELEMENT OF',\n        value: '∊',\n        codepoint: 8714,\n      },\n      {\n        name: 'CONTAINS AS MEMBER',\n        value: '∋',\n        codepoint: 8715,\n      },\n      {\n        name: 'DOES NOT CONTAIN AS MEMBER',\n        value: '∌',\n        codepoint: 8716,\n      },\n      {\n        name: 'SMALL CONTAINS AS MEMBER',\n        value: '∍',\n        codepoint: 8717,\n      },\n      {\n        name: 'END OF PROOF',\n        value: '∎',\n        codepoint: 8718,\n      },\n      {\n        name: 'N-ARY PRODUCT',\n        value: '∏',\n        codepoint: 8719,\n      },\n      {\n        name: 'N-ARY COPRODUCT',\n        value: '∐',\n        codepoint: 8720,\n      },\n      {\n        name: 'N-ARY SUMMATION',\n        value: '∑',\n        codepoint: 8721,\n      },\n      {\n        name: 'MINUS SIGN',\n        value: '−',\n        codepoint: 8722,\n      },\n      {\n        name: 'MINUS-OR-PLUS SIGN',\n        value: '∓',\n        codepoint: 8723,\n      },\n      {\n        name: 'DOT PLUS',\n        value: '∔',\n        codepoint: 8724,\n      },\n      {\n        name: 'DIVISION SLASH',\n        value: '∕',\n        codepoint: 8725,\n      },\n      {\n        name: 'SET MINUS',\n        value: '∖',\n        codepoint: 8726,\n      },\n      {\n        name: 'ASTERISK OPERATOR',\n        value: '∗',\n        codepoint: 8727,\n      },\n      {\n        name: 'RING OPERATOR',\n        value: '∘',\n        codepoint: 8728,\n      },\n      {\n        name: 'BULLET OPERATOR',\n        value: '∙',\n        codepoint: 8729,\n      },\n      {\n        name: 'SQUARE ROOT',\n        value: '√',\n        codepoint: 8730,\n      },\n      {\n        name: 'CUBE ROOT',\n        value: '∛',\n        codepoint: 8731,\n      },\n      {\n        name: 'FOURTH ROOT',\n        value: '∜',\n        codepoint: 8732,\n      },\n      {\n        name: 'PROPORTIONAL TO',\n        value: '∝',\n        codepoint: 8733,\n      },\n      {\n        name: 'INFINITY',\n        value: '∞',\n        codepoint: 8734,\n      },\n      {\n        name: 'RIGHT ANGLE',\n        value: '∟',\n        codepoint: 8735,\n      },\n      {\n        name: 'ANGLE',\n        value: '∠',\n        codepoint: 8736,\n      },\n      {\n        name: 'MEASURED ANGLE',\n        value: '∡',\n        codepoint: 8737,\n      },\n      {\n        name: 'SPHERICAL ANGLE',\n        value: '∢',\n        codepoint: 8738,\n      },\n      {\n        name: 'DIVIDES',\n        value: '∣',\n        codepoint: 8739,\n      },\n      {\n        name: 'DOES NOT DIVIDE',\n        value: '∤',\n        codepoint: 8740,\n      },\n      {\n        name: 'PARALLEL TO',\n        value: '∥',\n        codepoint: 8741,\n      },\n      {\n        name: 'NOT PARALLEL TO',\n        value: '∦',\n        codepoint: 8742,\n      },\n      {\n        name: 'LOGICAL AND',\n        value: '∧',\n        codepoint: 8743,\n      },\n      {\n        name: 'LOGICAL OR',\n        value: '∨',\n        codepoint: 8744,\n      },\n      {\n        name: 'INTERSECTION',\n        value: '∩',\n        codepoint: 8745,\n      },\n      {\n        name: 'UNION',\n        value: '∪',\n        codepoint: 8746,\n      },\n      {\n        name: 'INTEGRAL',\n        value: '∫',\n        codepoint: 8747,\n      },\n      {\n        name: 'DOUBLE INTEGRAL',\n        value: '∬',\n        codepoint: 8748,\n      },\n      {\n        name: 'TRIPLE INTEGRAL',\n        value: '∭',\n        codepoint: 8749,\n      },\n      {\n        name: 'CONTOUR INTEGRAL',\n        value: '∮',\n        codepoint: 8750,\n      },\n      {\n        name: 'SURFACE INTEGRAL',\n        value: '∯',\n        codepoint: 8751,\n      },\n      {\n        name: 'VOLUME INTEGRAL',\n        value: '∰',\n        codepoint: 8752,\n      },\n      {\n        name: 'CLOCKWISE INTEGRAL',\n        value: '∱',\n        codepoint: 8753,\n      },\n      {\n        name: 'CLOCKWISE CONTOUR INTEGRAL',\n        value: '∲',\n        codepoint: 8754,\n      },\n      {\n        name: 'ANTICLOCKWISE CONTOUR INTEGRAL',\n        value: '∳',\n        codepoint: 8755,\n      },\n      {\n        name: 'THEREFORE',\n        value: '∴',\n        codepoint: 8756,\n      },\n      {\n        name: 'BECAUSE',\n        value: '∵',\n        codepoint: 8757,\n      },\n      {\n        name: 'RATIO',\n        value: '∶',\n        codepoint: 8758,\n      },\n      {\n        name: 'PROPORTION',\n        value: '∷',\n        codepoint: 8759,\n      },\n      {\n        name: 'DOT MINUS',\n        value: '∸',\n        codepoint: 8760,\n      },\n      {\n        name: 'EXCESS',\n        value: '∹',\n        codepoint: 8761,\n      },\n      {\n        name: 'GEOMETRIC PROPORTION',\n        value: '∺',\n        codepoint: 8762,\n      },\n      {\n        name: 'HOMOTHETIC',\n        value: '∻',\n        codepoint: 8763,\n      },\n      {\n        name: 'TILDE OPERATOR',\n        value: '∼',\n        codepoint: 8764,\n      },\n      {\n        name: 'REVERSED TILDE',\n        value: '∽',\n        codepoint: 8765,\n      },\n      {\n        name: 'INVERTED LAZY S',\n        value: '∾',\n        codepoint: 8766,\n      },\n      {\n        name: 'SINE WAVE',\n        value: '∿',\n        codepoint: 8767,\n      },\n      {\n        name: 'WREATH PRODUCT',\n        value: '≀',\n        codepoint: 8768,\n      },\n      {\n        name: 'NOT TILDE',\n        value: '≁',\n        codepoint: 8769,\n      },\n      {\n        name: 'MINUS TILDE',\n        value: '≂',\n        codepoint: 8770,\n      },\n      {\n        name: 'ASYMPTOTICALLY EQUAL TO',\n        value: '≃',\n        codepoint: 8771,\n      },\n      {\n        name: 'NOT ASYMPTOTICALLY EQUAL TO',\n        value: '≄',\n        codepoint: 8772,\n      },\n      {\n        name: 'APPROXIMATELY EQUAL TO',\n        value: '≅',\n        codepoint: 8773,\n      },\n      {\n        name: 'APPROXIMATELY BUT NOT ACTUALLY EQUAL TO',\n        value: '≆',\n        codepoint: 8774,\n      },\n      {\n        name: 'NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO',\n        value: '≇',\n        codepoint: 8775,\n      },\n      {\n        name: 'ALMOST EQUAL TO',\n        value: '≈',\n        codepoint: 8776,\n      },\n      {\n        name: 'NOT ALMOST EQUAL TO',\n        value: '≉',\n        codepoint: 8777,\n      },\n      {\n        name: 'ALMOST EQUAL OR EQUAL TO',\n        value: '≊',\n        codepoint: 8778,\n      },\n      {\n        name: 'TRIPLE TILDE',\n        value: '≋',\n        codepoint: 8779,\n      },\n      {\n        name: 'ALL EQUAL TO',\n        value: '≌',\n        codepoint: 8780,\n      },\n      {\n        name: 'EQUIVALENT TO',\n        value: '≍',\n        codepoint: 8781,\n      },\n      {\n        name: 'GEOMETRICALLY EQUIVALENT TO',\n        value: '≎',\n        codepoint: 8782,\n      },\n      {\n        name: 'DIFFERENCE BETWEEN',\n        value: '≏',\n        codepoint: 8783,\n      },\n      {\n        name: 'APPROACHES THE LIMIT',\n        value: '≐',\n        codepoint: 8784,\n      },\n      {\n        name: 'GEOMETRICALLY EQUAL TO',\n        value: '≑',\n        codepoint: 8785,\n      },\n      {\n        name: 'APPROXIMATELY EQUAL TO OR THE IMAGE OF',\n        value: '≒',\n        codepoint: 8786,\n      },\n      {\n        name: 'IMAGE OF OR APPROXIMATELY EQUAL TO',\n        value: '≓',\n        codepoint: 8787,\n      },\n      {\n        name: 'COLON EQUALS',\n        value: '≔',\n        codepoint: 8788,\n      },\n      {\n        name: 'EQUALS COLON',\n        value: '≕',\n        codepoint: 8789,\n      },\n      {\n        name: 'RING IN EQUAL TO',\n        value: '≖',\n        codepoint: 8790,\n      },\n      {\n        name: 'RING EQUAL TO',\n        value: '≗',\n        codepoint: 8791,\n      },\n      {\n        name: 'CORRESPONDS TO',\n        value: '≘',\n        codepoint: 8792,\n      },\n      {\n        name: 'ESTIMATES',\n        value: '≙',\n        codepoint: 8793,\n      },\n      {\n        name: 'EQUIANGULAR TO',\n        value: '≚',\n        codepoint: 8794,\n      },\n      {\n        name: 'STAR EQUALS',\n        value: '≛',\n        codepoint: 8795,\n      },\n      {\n        name: 'DELTA EQUAL TO',\n        value: '≜',\n        codepoint: 8796,\n      },\n      {\n        name: 'EQUAL TO BY DEFINITION',\n        value: '≝',\n        codepoint: 8797,\n      },\n      {\n        name: 'MEASURED BY',\n        value: '≞',\n        codepoint: 8798,\n      },\n      {\n        name: 'QUESTIONED EQUAL TO',\n        value: '≟',\n        codepoint: 8799,\n      },\n      {\n        name: 'NOT EQUAL TO',\n        value: '≠',\n        codepoint: 8800,\n      },\n      {\n        name: 'IDENTICAL TO',\n        value: '≡',\n        codepoint: 8801,\n      },\n      {\n        name: 'NOT IDENTICAL TO',\n        value: '≢',\n        codepoint: 8802,\n      },\n      {\n        name: 'STRICTLY EQUIVALENT TO',\n        value: '≣',\n        codepoint: 8803,\n      },\n      {\n        name: 'LESS-THAN OR EQUAL TO',\n        value: '≤',\n        codepoint: 8804,\n      },\n      {\n        name: 'GREATER-THAN OR EQUAL TO',\n        value: '≥',\n        codepoint: 8805,\n      },\n      {\n        name: 'LESS-THAN OVER EQUAL TO',\n        value: '≦',\n        codepoint: 8806,\n      },\n      {\n        name: 'GREATER-THAN OVER EQUAL TO',\n        value: '≧',\n        codepoint: 8807,\n      },\n      {\n        name: 'LESS-THAN BUT NOT EQUAL TO',\n        value: '≨',\n        codepoint: 8808,\n      },\n      {\n        name: 'GREATER-THAN BUT NOT EQUAL TO',\n        value: '≩',\n        codepoint: 8809,\n      },\n      {\n        name: 'MUCH LESS-THAN',\n        value: '≪',\n        codepoint: 8810,\n      },\n      {\n        name: 'MUCH GREATER-THAN',\n        value: '≫',\n        codepoint: 8811,\n      },\n      {\n        name: 'BETWEEN',\n        value: '≬',\n        codepoint: 8812,\n      },\n      {\n        name: 'NOT EQUIVALENT TO',\n        value: '≭',\n        codepoint: 8813,\n      },\n      {\n        name: 'NOT LESS-THAN',\n        value: '≮',\n        codepoint: 8814,\n      },\n      {\n        name: 'NOT GREATER-THAN',\n        value: '≯',\n        codepoint: 8815,\n      },\n      {\n        name: 'NEITHER LESS-THAN NOR EQUAL TO',\n        value: '≰',\n        codepoint: 8816,\n      },\n      {\n        name: 'NEITHER GREATER-THAN NOR EQUAL TO',\n        value: '≱',\n        codepoint: 8817,\n      },\n      {\n        name: 'LESS-THAN OR EQUIVALENT TO',\n        value: '≲',\n        codepoint: 8818,\n      },\n      {\n        name: 'GREATER-THAN OR EQUIVALENT TO',\n        value: '≳',\n        codepoint: 8819,\n      },\n      {\n        name: 'NEITHER LESS-THAN NOR EQUIVALENT TO',\n        value: '≴',\n        codepoint: 8820,\n      },\n      {\n        name: 'NEITHER GREATER-THAN NOR EQUIVALENT TO',\n        value: '≵',\n        codepoint: 8821,\n      },\n      {\n        name: 'LESS-THAN OR GREATER-THAN',\n        value: '≶',\n        codepoint: 8822,\n      },\n      {\n        name: 'GREATER-THAN OR LESS-THAN',\n        value: '≷',\n        codepoint: 8823,\n      },\n      {\n        name: 'NEITHER LESS-THAN NOR GREATER-THAN',\n        value: '≸',\n        codepoint: 8824,\n      },\n      {\n        name: 'NEITHER GREATER-THAN NOR LESS-THAN',\n        value: '≹',\n        codepoint: 8825,\n      },\n      {\n        name: 'PRECEDES',\n        value: '≺',\n        codepoint: 8826,\n      },\n      {\n        name: 'SUCCEEDS',\n        value: '≻',\n        codepoint: 8827,\n      },\n      {\n        name: 'PRECEDES OR EQUAL TO',\n        value: '≼',\n        codepoint: 8828,\n      },\n      {\n        name: 'SUCCEEDS OR EQUAL TO',\n        value: '≽',\n        codepoint: 8829,\n      },\n      {\n        name: 'PRECEDES OR EQUIVALENT TO',\n        value: '≾',\n        codepoint: 8830,\n      },\n      {\n        name: 'SUCCEEDS OR EQUIVALENT TO',\n        value: '≿',\n        codepoint: 8831,\n      },\n      {\n        name: 'DOES NOT PRECEDE',\n        value: '⊀',\n        codepoint: 8832,\n      },\n      {\n        name: 'DOES NOT SUCCEED',\n        value: '⊁',\n        codepoint: 8833,\n      },\n      {\n        name: 'SUBSET OF',\n        value: '⊂',\n        codepoint: 8834,\n      },\n      {\n        name: 'SUPERSET OF',\n        value: '⊃',\n        codepoint: 8835,\n      },\n      {\n        name: 'NOT A SUBSET OF',\n        value: '⊄',\n        codepoint: 8836,\n      },\n      {\n        name: 'NOT A SUPERSET OF',\n        value: '⊅',\n        codepoint: 8837,\n      },\n      {\n        name: 'SUBSET OF OR EQUAL TO',\n        value: '⊆',\n        codepoint: 8838,\n      },\n      {\n        name: 'SUPERSET OF OR EQUAL TO',\n        value: '⊇',\n        codepoint: 8839,\n      },\n      {\n        name: 'NEITHER A SUBSET OF NOR EQUAL TO',\n        value: '⊈',\n        codepoint: 8840,\n      },\n      {\n        name: 'NEITHER A SUPERSET OF NOR EQUAL TO',\n        value: '⊉',\n        codepoint: 8841,\n      },\n      {\n        name: 'SUBSET OF WITH NOT EQUAL TO',\n        value: '⊊',\n        codepoint: 8842,\n      },\n      {\n        name: 'SUPERSET OF WITH NOT EQUAL TO',\n        value: '⊋',\n        codepoint: 8843,\n      },\n      {\n        name: 'MULTISET',\n        value: '⊌',\n        codepoint: 8844,\n      },\n      {\n        name: 'MULTISET MULTIPLICATION',\n        value: '⊍',\n        codepoint: 8845,\n      },\n      {\n        name: 'MULTISET UNION',\n        value: '⊎',\n        codepoint: 8846,\n      },\n      {\n        name: 'SQUARE IMAGE OF',\n        value: '⊏',\n        codepoint: 8847,\n      },\n      {\n        name: 'SQUARE ORIGINAL OF',\n        value: '⊐',\n        codepoint: 8848,\n      },\n      {\n        name: 'SQUARE IMAGE OF OR EQUAL TO',\n        value: '⊑',\n        codepoint: 8849,\n      },\n      {\n        name: 'SQUARE ORIGINAL OF OR EQUAL TO',\n        value: '⊒',\n        codepoint: 8850,\n      },\n      {\n        name: 'SQUARE CAP',\n        value: '⊓',\n        codepoint: 8851,\n      },\n      {\n        name: 'SQUARE CUP',\n        value: '⊔',\n        codepoint: 8852,\n      },\n      {\n        name: 'CIRCLED PLUS',\n        value: '⊕',\n        codepoint: 8853,\n      },\n      {\n        name: 'CIRCLED MINUS',\n        value: '⊖',\n        codepoint: 8854,\n      },\n      {\n        name: 'CIRCLED TIMES',\n        value: '⊗',\n        codepoint: 8855,\n      },\n      {\n        name: 'CIRCLED DIVISION SLASH',\n        value: '⊘',\n        codepoint: 8856,\n      },\n      {\n        name: 'CIRCLED DOT OPERATOR',\n        value: '⊙',\n        codepoint: 8857,\n      },\n      {\n        name: 'CIRCLED RING OPERATOR',\n        value: '⊚',\n        codepoint: 8858,\n      },\n      {\n        name: 'CIRCLED ASTERISK OPERATOR',\n        value: '⊛',\n        codepoint: 8859,\n      },\n      {\n        name: 'CIRCLED EQUALS',\n        value: '⊜',\n        codepoint: 8860,\n      },\n      {\n        name: 'CIRCLED DASH',\n        value: '⊝',\n        codepoint: 8861,\n      },\n      {\n        name: 'SQUARED PLUS',\n        value: '⊞',\n        codepoint: 8862,\n      },\n      {\n        name: 'SQUARED MINUS',\n        value: '⊟',\n        codepoint: 8863,\n      },\n      {\n        name: 'SQUARED TIMES',\n        value: '⊠',\n        codepoint: 8864,\n      },\n      {\n        name: 'SQUARED DOT OPERATOR',\n        value: '⊡',\n        codepoint: 8865,\n      },\n      {\n        name: 'RIGHT TACK',\n        value: '⊢',\n        codepoint: 8866,\n      },\n      {\n        name: 'LEFT TACK',\n        value: '⊣',\n        codepoint: 8867,\n      },\n      {\n        name: 'DOWN TACK',\n        value: '⊤',\n        codepoint: 8868,\n      },\n      {\n        name: 'UP TACK',\n        value: '⊥',\n        codepoint: 8869,\n      },\n      {\n        name: 'ASSERTION',\n        value: '⊦',\n        codepoint: 8870,\n      },\n      {\n        name: 'MODELS',\n        value: '⊧',\n        codepoint: 8871,\n      },\n      {\n        name: 'TRUE',\n        value: '⊨',\n        codepoint: 8872,\n      },\n      {\n        name: 'FORCES',\n        value: '⊩',\n        codepoint: 8873,\n      },\n      {\n        name: 'TRIPLE VERTICAL BAR RIGHT TURNSTILE',\n        value: '⊪',\n        codepoint: 8874,\n      },\n      {\n        name: 'DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE',\n        value: '⊫',\n        codepoint: 8875,\n      },\n      {\n        name: 'DOES NOT PROVE',\n        value: '⊬',\n        codepoint: 8876,\n      },\n      {\n        name: 'NOT TRUE',\n        value: '⊭',\n        codepoint: 8877,\n      },\n      {\n        name: 'DOES NOT FORCE',\n        value: '⊮',\n        codepoint: 8878,\n      },\n      {\n        name: 'NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE',\n        value: '⊯',\n        codepoint: 8879,\n      },\n      {\n        name: 'PRECEDES UNDER RELATION',\n        value: '⊰',\n        codepoint: 8880,\n      },\n      {\n        name: 'SUCCEEDS UNDER RELATION',\n        value: '⊱',\n        codepoint: 8881,\n      },\n      {\n        name: 'NORMAL SUBGROUP OF',\n        value: '⊲',\n        codepoint: 8882,\n      },\n      {\n        name: 'CONTAINS AS NORMAL SUBGROUP',\n        value: '⊳',\n        codepoint: 8883,\n      },\n      {\n        name: 'NORMAL SUBGROUP OF OR EQUAL TO',\n        value: '⊴',\n        codepoint: 8884,\n      },\n      {\n        name: 'CONTAINS AS NORMAL SUBGROUP OR EQUAL TO',\n        value: '⊵',\n        codepoint: 8885,\n      },\n      {\n        name: 'ORIGINAL OF',\n        value: '⊶',\n        codepoint: 8886,\n      },\n      {\n        name: 'IMAGE OF',\n        value: '⊷',\n        codepoint: 8887,\n      },\n      {\n        name: 'MULTIMAP',\n        value: '⊸',\n        codepoint: 8888,\n      },\n      {\n        name: 'HERMITIAN CONJUGATE MATRIX',\n        value: '⊹',\n        codepoint: 8889,\n      },\n      {\n        name: 'INTERCALATE',\n        value: '⊺',\n        codepoint: 8890,\n      },\n      {\n        name: 'XOR',\n        value: '⊻',\n        codepoint: 8891,\n      },\n      {\n        name: 'NAND',\n        value: '⊼',\n        codepoint: 8892,\n      },\n      {\n        name: 'NOR',\n        value: '⊽',\n        codepoint: 8893,\n      },\n      {\n        name: 'RIGHT ANGLE WITH ARC',\n        value: '⊾',\n        codepoint: 8894,\n      },\n      {\n        name: 'RIGHT TRIANGLE',\n        value: '⊿',\n        codepoint: 8895,\n      },\n      {\n        name: 'N-ARY LOGICAL AND',\n        value: '⋀',\n        codepoint: 8896,\n      },\n      {\n        name: 'N-ARY LOGICAL OR',\n        value: '⋁',\n        codepoint: 8897,\n      },\n      {\n        name: 'N-ARY INTERSECTION',\n        value: '⋂',\n        codepoint: 8898,\n      },\n      {\n        name: 'N-ARY UNION',\n        value: '⋃',\n        codepoint: 8899,\n      },\n      {\n        name: 'DIAMOND OPERATOR',\n        value: '⋄',\n        codepoint: 8900,\n      },\n      {\n        name: 'DOT OPERATOR',\n        value: '⋅',\n        codepoint: 8901,\n      },\n      {\n        name: 'STAR OPERATOR',\n        value: '⋆',\n        codepoint: 8902,\n      },\n      {\n        name: 'DIVISION TIMES',\n        value: '⋇',\n        codepoint: 8903,\n      },\n      {\n        name: 'BOWTIE',\n        value: '⋈',\n        codepoint: 8904,\n      },\n      {\n        name: 'LEFT NORMAL FACTOR SEMIDIRECT PRODUCT',\n        value: '⋉',\n        codepoint: 8905,\n      },\n      {\n        name: 'RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT',\n        value: '⋊',\n        codepoint: 8906,\n      },\n      {\n        name: 'LEFT SEMIDIRECT PRODUCT',\n        value: '⋋',\n        codepoint: 8907,\n      },\n      {\n        name: 'RIGHT SEMIDIRECT PRODUCT',\n        value: '⋌',\n        codepoint: 8908,\n      },\n      {\n        name: 'REVERSED TILDE EQUALS',\n        value: '⋍',\n        codepoint: 8909,\n      },\n      {\n        name: 'CURLY LOGICAL OR',\n        value: '⋎',\n        codepoint: 8910,\n      },\n      {\n        name: 'CURLY LOGICAL AND',\n        value: '⋏',\n        codepoint: 8911,\n      },\n      {\n        name: 'DOUBLE SUBSET',\n        value: '⋐',\n        codepoint: 8912,\n      },\n      {\n        name: 'DOUBLE SUPERSET',\n        value: '⋑',\n        codepoint: 8913,\n      },\n      {\n        name: 'DOUBLE INTERSECTION',\n        value: '⋒',\n        codepoint: 8914,\n      },\n      {\n        name: 'DOUBLE UNION',\n        value: '⋓',\n        codepoint: 8915,\n      },\n      {\n        name: 'PITCHFORK',\n        value: '⋔',\n        codepoint: 8916,\n      },\n      {\n        name: 'EQUAL AND PARALLEL TO',\n        value: '⋕',\n        codepoint: 8917,\n      },\n      {\n        name: 'LESS-THAN WITH DOT',\n        value: '⋖',\n        codepoint: 8918,\n      },\n      {\n        name: 'GREATER-THAN WITH DOT',\n        value: '⋗',\n        codepoint: 8919,\n      },\n      {\n        name: 'VERY MUCH LESS-THAN',\n        value: '⋘',\n        codepoint: 8920,\n      },\n      {\n        name: 'VERY MUCH GREATER-THAN',\n        value: '⋙',\n        codepoint: 8921,\n      },\n      {\n        name: 'LESS-THAN EQUAL TO OR GREATER-THAN',\n        value: '⋚',\n        codepoint: 8922,\n      },\n      {\n        name: 'GREATER-THAN EQUAL TO OR LESS-THAN',\n        value: '⋛',\n        codepoint: 8923,\n      },\n      {\n        name: 'EQUAL TO OR LESS-THAN',\n        value: '⋜',\n        codepoint: 8924,\n      },\n      {\n        name: 'EQUAL TO OR GREATER-THAN',\n        value: '⋝',\n        codepoint: 8925,\n      },\n      {\n        name: 'EQUAL TO OR PRECEDES',\n        value: '⋞',\n        codepoint: 8926,\n      },\n      {\n        name: 'EQUAL TO OR SUCCEEDS',\n        value: '⋟',\n        codepoint: 8927,\n      },\n      {\n        name: 'DOES NOT PRECEDE OR EQUAL',\n        value: '⋠',\n        codepoint: 8928,\n      },\n      {\n        name: 'DOES NOT SUCCEED OR EQUAL',\n        value: '⋡',\n        codepoint: 8929,\n      },\n      {\n        name: 'NOT SQUARE IMAGE OF OR EQUAL TO',\n        value: '⋢',\n        codepoint: 8930,\n      },\n      {\n        name: 'NOT SQUARE ORIGINAL OF OR EQUAL TO',\n        value: '⋣',\n        codepoint: 8931,\n      },\n      {\n        name: 'SQUARE IMAGE OF OR NOT EQUAL TO',\n        value: '⋤',\n        codepoint: 8932,\n      },\n      {\n        name: 'SQUARE ORIGINAL OF OR NOT EQUAL TO',\n        value: '⋥',\n        codepoint: 8933,\n      },\n      {\n        name: 'LESS-THAN BUT NOT EQUIVALENT TO',\n        value: '⋦',\n        codepoint: 8934,\n      },\n      {\n        name: 'GREATER-THAN BUT NOT EQUIVALENT TO',\n        value: '⋧',\n        codepoint: 8935,\n      },\n      {\n        name: 'PRECEDES BUT NOT EQUIVALENT TO',\n        value: '⋨',\n        codepoint: 8936,\n      },\n      {\n        name: 'SUCCEEDS BUT NOT EQUIVALENT TO',\n        value: '⋩',\n        codepoint: 8937,\n      },\n      {\n        name: 'NOT NORMAL SUBGROUP OF',\n        value: '⋪',\n        codepoint: 8938,\n      },\n      {\n        name: 'DOES NOT CONTAIN AS NORMAL SUBGROUP',\n        value: '⋫',\n        codepoint: 8939,\n      },\n      {\n        name: 'NOT NORMAL SUBGROUP OF OR EQUAL TO',\n        value: '⋬',\n        codepoint: 8940,\n      },\n      {\n        name: 'DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL',\n        value: '⋭',\n        codepoint: 8941,\n      },\n      {\n        name: 'VERTICAL ELLIPSIS',\n        value: '⋮',\n        codepoint: 8942,\n      },\n      {\n        name: 'MIDLINE HORIZONTAL ELLIPSIS',\n        value: '⋯',\n        codepoint: 8943,\n      },\n      {\n        name: 'UP RIGHT DIAGONAL ELLIPSIS',\n        value: '⋰',\n        codepoint: 8944,\n      },\n      {\n        name: 'DOWN RIGHT DIAGONAL ELLIPSIS',\n        value: '⋱',\n        codepoint: 8945,\n      },\n      {\n        name: 'ELEMENT OF WITH LONG HORIZONTAL STROKE',\n        value: '⋲',\n        codepoint: 8946,\n      },\n      {\n        name: 'ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n        value: '⋳',\n        codepoint: 8947,\n      },\n      {\n        name: 'SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n        value: '⋴',\n        codepoint: 8948,\n      },\n      {\n        name: 'ELEMENT OF WITH DOT ABOVE',\n        value: '⋵',\n        codepoint: 8949,\n      },\n      {\n        name: 'ELEMENT OF WITH OVERBAR',\n        value: '⋶',\n        codepoint: 8950,\n      },\n      {\n        name: 'SMALL ELEMENT OF WITH OVERBAR',\n        value: '⋷',\n        codepoint: 8951,\n      },\n      {\n        name: 'ELEMENT OF WITH UNDERBAR',\n        value: '⋸',\n        codepoint: 8952,\n      },\n      {\n        name: 'ELEMENT OF WITH TWO HORIZONTAL STROKES',\n        value: '⋹',\n        codepoint: 8953,\n      },\n      {\n        name: 'CONTAINS WITH LONG HORIZONTAL STROKE',\n        value: '⋺',\n        codepoint: 8954,\n      },\n      {\n        name: 'CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n        value: '⋻',\n        codepoint: 8955,\n      },\n      {\n        name: 'SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n        value: '⋼',\n        codepoint: 8956,\n      },\n      {\n        name: 'CONTAINS WITH OVERBAR',\n        value: '⋽',\n        codepoint: 8957,\n      },\n      {\n        name: 'SMALL CONTAINS WITH OVERBAR',\n        value: '⋾',\n        codepoint: 8958,\n      },\n      {\n        name: 'Z NOTATION BAG MEMBERSHIP',\n        value: '⋿',\n        codepoint: 8959,\n      },\n      {\n        name: 'THREE DIMENSIONAL ANGLE',\n        value: '⟀',\n        codepoint: 10176,\n      },\n      {\n        name: 'WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE',\n        value: '⟁',\n        codepoint: 10177,\n      },\n      {\n        name: 'PERPENDICULAR',\n        value: '⟂',\n        codepoint: 10178,\n      },\n      {\n        name: 'OPEN SUBSET',\n        value: '⟃',\n        codepoint: 10179,\n      },\n      {\n        name: 'OPEN SUPERSET',\n        value: '⟄',\n        codepoint: 10180,\n      },\n      {\n        name: 'LEFT S-SHAPED BAG DELIMITER',\n        value: '⟅',\n        codepoint: 10181,\n      },\n      {\n        name: 'RIGHT S-SHAPED BAG DELIMITER',\n        value: '⟆',\n        codepoint: 10182,\n      },\n      {\n        name: 'OR WITH DOT INSIDE',\n        value: '⟇',\n        codepoint: 10183,\n      },\n      {\n        name: 'REVERSE SOLIDUS PRECEDING SUBSET',\n        value: '⟈',\n        codepoint: 10184,\n      },\n      {\n        name: 'SUPERSET PRECEDING SOLIDUS',\n        value: '⟉',\n        codepoint: 10185,\n      },\n      {\n        name: 'VERTICAL BAR WITH HORIZONTAL STROKE',\n        value: '⟊',\n        codepoint: 10186,\n      },\n      {\n        name: 'LONG DIVISION',\n        value: '⟌',\n        codepoint: 10188,\n      },\n      {\n        name: 'WHITE DIAMOND WITH CENTRED DOT',\n        value: '⟐',\n        codepoint: 10192,\n      },\n      {\n        name: 'AND WITH DOT',\n        value: '⟑',\n        codepoint: 10193,\n      },\n      {\n        name: 'ELEMENT OF OPENING UPWARDS',\n        value: '⟒',\n        codepoint: 10194,\n      },\n      {\n        name: 'LOWER RIGHT CORNER WITH DOT',\n        value: '⟓',\n        codepoint: 10195,\n      },\n      {\n        name: 'UPPER LEFT CORNER WITH DOT',\n        value: '⟔',\n        codepoint: 10196,\n      },\n      {\n        name: 'LEFT OUTER JOIN',\n        value: '⟕',\n        codepoint: 10197,\n      },\n      {\n        name: 'RIGHT OUTER JOIN',\n        value: '⟖',\n        codepoint: 10198,\n      },\n      {\n        name: 'FULL OUTER JOIN',\n        value: '⟗',\n        codepoint: 10199,\n      },\n      {\n        name: 'LARGE UP TACK',\n        value: '⟘',\n        codepoint: 10200,\n      },\n      {\n        name: 'LARGE DOWN TACK',\n        value: '⟙',\n        codepoint: 10201,\n      },\n      {\n        name: 'LEFT AND RIGHT DOUBLE TURNSTILE',\n        value: '⟚',\n        codepoint: 10202,\n      },\n      {\n        name: 'LEFT AND RIGHT TACK',\n        value: '⟛',\n        codepoint: 10203,\n      },\n      {\n        name: 'LEFT MULTIMAP',\n        value: '⟜',\n        codepoint: 10204,\n      },\n      {\n        name: 'LONG RIGHT TACK',\n        value: '⟝',\n        codepoint: 10205,\n      },\n      {\n        name: 'LONG LEFT TACK',\n        value: '⟞',\n        codepoint: 10206,\n      },\n      {\n        name: 'UP TACK WITH CIRCLE ABOVE',\n        value: '⟟',\n        codepoint: 10207,\n      },\n      {\n        name: 'LOZENGE DIVIDED BY HORIZONTAL RULE',\n        value: '⟠',\n        codepoint: 10208,\n      },\n      {\n        name: 'WHITE CONCAVE-SIDED DIAMOND',\n        value: '⟡',\n        codepoint: 10209,\n      },\n      {\n        name: 'WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK',\n        value: '⟢',\n        codepoint: 10210,\n      },\n      {\n        name: 'WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK',\n        value: '⟣',\n        codepoint: 10211,\n      },\n      {\n        name: 'WHITE SQUARE WITH LEFTWARDS TICK',\n        value: '⟤',\n        codepoint: 10212,\n      },\n      {\n        name: 'WHITE SQUARE WITH RIGHTWARDS TICK',\n        value: '⟥',\n        codepoint: 10213,\n      },\n      {\n        name: 'MATHEMATICAL LEFT WHITE SQUARE BRACKET',\n        value: '⟦',\n        codepoint: 10214,\n      },\n      {\n        name: 'MATHEMATICAL RIGHT WHITE SQUARE BRACKET',\n        value: '⟧',\n        codepoint: 10215,\n      },\n      {\n        name: 'MATHEMATICAL LEFT ANGLE BRACKET',\n        value: '⟨',\n        codepoint: 10216,\n      },\n      {\n        name: 'MATHEMATICAL RIGHT ANGLE BRACKET',\n        value: '⟩',\n        codepoint: 10217,\n      },\n      {\n        name: 'MATHEMATICAL LEFT DOUBLE ANGLE BRACKET',\n        value: '⟪',\n        codepoint: 10218,\n      },\n      {\n        name: 'MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET',\n        value: '⟫',\n        codepoint: 10219,\n      },\n      {\n        name: 'MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET',\n        value: '⟬',\n        codepoint: 10220,\n      },\n      {\n        name: 'MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET',\n        value: '⟭',\n        codepoint: 10221,\n      },\n      {\n        name: 'MATHEMATICAL LEFT FLATTENED PARENTHESIS',\n        value: '⟮',\n        codepoint: 10222,\n      },\n      {\n        name: 'MATHEMATICAL RIGHT FLATTENED PARENTHESIS',\n        value: '⟯',\n        codepoint: 10223,\n      },\n      {\n        name: 'TRIPLE VERTICAL BAR DELIMITER',\n        value: '⦀',\n        codepoint: 10624,\n      },\n      {\n        name: 'Z NOTATION SPOT',\n        value: '⦁',\n        codepoint: 10625,\n      },\n      {\n        name: 'Z NOTATION TYPE COLON',\n        value: '⦂',\n        codepoint: 10626,\n      },\n      {\n        name: 'LEFT WHITE CURLY BRACKET',\n        value: '⦃',\n        codepoint: 10627,\n      },\n      {\n        name: 'RIGHT WHITE CURLY BRACKET',\n        value: '⦄',\n        codepoint: 10628,\n      },\n      {\n        name: 'LEFT WHITE PARENTHESIS',\n        value: '⦅',\n        codepoint: 10629,\n      },\n      {\n        name: 'RIGHT WHITE PARENTHESIS',\n        value: '⦆',\n        codepoint: 10630,\n      },\n      {\n        name: 'Z NOTATION LEFT IMAGE BRACKET',\n        value: '⦇',\n        codepoint: 10631,\n      },\n      {\n        name: 'Z NOTATION RIGHT IMAGE BRACKET',\n        value: '⦈',\n        codepoint: 10632,\n      },\n      {\n        name: 'Z NOTATION LEFT BINDING BRACKET',\n        value: '⦉',\n        codepoint: 10633,\n      },\n      {\n        name: 'Z NOTATION RIGHT BINDING BRACKET',\n        value: '⦊',\n        codepoint: 10634,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET WITH UNDERBAR',\n        value: '⦋',\n        codepoint: 10635,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET WITH UNDERBAR',\n        value: '⦌',\n        codepoint: 10636,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET WITH TICK IN TOP CORNER',\n        value: '⦍',\n        codepoint: 10637,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER',\n        value: '⦎',\n        codepoint: 10638,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER',\n        value: '⦏',\n        codepoint: 10639,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER',\n        value: '⦐',\n        codepoint: 10640,\n      },\n      {\n        name: 'LEFT ANGLE BRACKET WITH DOT',\n        value: '⦑',\n        codepoint: 10641,\n      },\n      {\n        name: 'RIGHT ANGLE BRACKET WITH DOT',\n        value: '⦒',\n        codepoint: 10642,\n      },\n      {\n        name: 'LEFT ARC LESS-THAN BRACKET',\n        value: '⦓',\n        codepoint: 10643,\n      },\n      {\n        name: 'RIGHT ARC GREATER-THAN BRACKET',\n        value: '⦔',\n        codepoint: 10644,\n      },\n      {\n        name: 'DOUBLE LEFT ARC GREATER-THAN BRACKET',\n        value: '⦕',\n        codepoint: 10645,\n      },\n      {\n        name: 'DOUBLE RIGHT ARC LESS-THAN BRACKET',\n        value: '⦖',\n        codepoint: 10646,\n      },\n      {\n        name: 'LEFT BLACK TORTOISE SHELL BRACKET',\n        value: '⦗',\n        codepoint: 10647,\n      },\n      {\n        name: 'RIGHT BLACK TORTOISE SHELL BRACKET',\n        value: '⦘',\n        codepoint: 10648,\n      },\n      {\n        name: 'DOTTED FENCE',\n        value: '⦙',\n        codepoint: 10649,\n      },\n      {\n        name: 'VERTICAL ZIGZAG LINE',\n        value: '⦚',\n        codepoint: 10650,\n      },\n      {\n        name: 'MEASURED ANGLE OPENING LEFT',\n        value: '⦛',\n        codepoint: 10651,\n      },\n      {\n        name: 'RIGHT ANGLE VARIANT WITH SQUARE',\n        value: '⦜',\n        codepoint: 10652,\n      },\n      {\n        name: 'MEASURED RIGHT ANGLE WITH DOT',\n        value: '⦝',\n        codepoint: 10653,\n      },\n      {\n        name: 'ANGLE WITH S INSIDE',\n        value: '⦞',\n        codepoint: 10654,\n      },\n      {\n        name: 'ACUTE ANGLE',\n        value: '⦟',\n        codepoint: 10655,\n      },\n      {\n        name: 'SPHERICAL ANGLE OPENING LEFT',\n        value: '⦠',\n        codepoint: 10656,\n      },\n      {\n        name: 'SPHERICAL ANGLE OPENING UP',\n        value: '⦡',\n        codepoint: 10657,\n      },\n      {\n        name: 'TURNED ANGLE',\n        value: '⦢',\n        codepoint: 10658,\n      },\n      {\n        name: 'REVERSED ANGLE',\n        value: '⦣',\n        codepoint: 10659,\n      },\n      {\n        name: 'ANGLE WITH UNDERBAR',\n        value: '⦤',\n        codepoint: 10660,\n      },\n      {\n        name: 'REVERSED ANGLE WITH UNDERBAR',\n        value: '⦥',\n        codepoint: 10661,\n      },\n      {\n        name: 'OBLIQUE ANGLE OPENING UP',\n        value: '⦦',\n        codepoint: 10662,\n      },\n      {\n        name: 'OBLIQUE ANGLE OPENING DOWN',\n        value: '⦧',\n        codepoint: 10663,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT',\n        value: '⦨',\n        codepoint: 10664,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT',\n        value: '⦩',\n        codepoint: 10665,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT',\n        value: '⦪',\n        codepoint: 10666,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT',\n        value: '⦫',\n        codepoint: 10667,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP',\n        value: '⦬',\n        codepoint: 10668,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP',\n        value: '⦭',\n        codepoint: 10669,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN',\n        value: '⦮',\n        codepoint: 10670,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN',\n        value: '⦯',\n        codepoint: 10671,\n      },\n      {\n        name: 'REVERSED EMPTY SET',\n        value: '⦰',\n        codepoint: 10672,\n      },\n      {\n        name: 'EMPTY SET WITH OVERBAR',\n        value: '⦱',\n        codepoint: 10673,\n      },\n      {\n        name: 'EMPTY SET WITH SMALL CIRCLE ABOVE',\n        value: '⦲',\n        codepoint: 10674,\n      },\n      {\n        name: 'EMPTY SET WITH RIGHT ARROW ABOVE',\n        value: '⦳',\n        codepoint: 10675,\n      },\n      {\n        name: 'EMPTY SET WITH LEFT ARROW ABOVE',\n        value: '⦴',\n        codepoint: 10676,\n      },\n      {\n        name: 'CIRCLE WITH HORIZONTAL BAR',\n        value: '⦵',\n        codepoint: 10677,\n      },\n      {\n        name: 'CIRCLED VERTICAL BAR',\n        value: '⦶',\n        codepoint: 10678,\n      },\n      {\n        name: 'CIRCLED PARALLEL',\n        value: '⦷',\n        codepoint: 10679,\n      },\n      {\n        name: 'CIRCLED REVERSE SOLIDUS',\n        value: '⦸',\n        codepoint: 10680,\n      },\n      {\n        name: 'CIRCLED PERPENDICULAR',\n        value: '⦹',\n        codepoint: 10681,\n      },\n      {\n        name: 'CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR',\n        value: '⦺',\n        codepoint: 10682,\n      },\n      {\n        name: 'CIRCLE WITH SUPERIMPOSED X',\n        value: '⦻',\n        codepoint: 10683,\n      },\n      {\n        name: 'CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN',\n        value: '⦼',\n        codepoint: 10684,\n      },\n      {\n        name: 'UP ARROW THROUGH CIRCLE',\n        value: '⦽',\n        codepoint: 10685,\n      },\n      {\n        name: 'CIRCLED WHITE BULLET',\n        value: '⦾',\n        codepoint: 10686,\n      },\n      {\n        name: 'CIRCLED BULLET',\n        value: '⦿',\n        codepoint: 10687,\n      },\n      {\n        name: 'CIRCLED LESS-THAN',\n        value: '⧀',\n        codepoint: 10688,\n      },\n      {\n        name: 'CIRCLED GREATER-THAN',\n        value: '⧁',\n        codepoint: 10689,\n      },\n      {\n        name: 'CIRCLE WITH SMALL CIRCLE TO THE RIGHT',\n        value: '⧂',\n        codepoint: 10690,\n      },\n      {\n        name: 'CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT',\n        value: '⧃',\n        codepoint: 10691,\n      },\n      {\n        name: 'SQUARED RISING DIAGONAL SLASH',\n        value: '⧄',\n        codepoint: 10692,\n      },\n      {\n        name: 'SQUARED FALLING DIAGONAL SLASH',\n        value: '⧅',\n        codepoint: 10693,\n      },\n      {\n        name: 'SQUARED ASTERISK',\n        value: '⧆',\n        codepoint: 10694,\n      },\n      {\n        name: 'SQUARED SMALL CIRCLE',\n        value: '⧇',\n        codepoint: 10695,\n      },\n      {\n        name: 'SQUARED SQUARE',\n        value: '⧈',\n        codepoint: 10696,\n      },\n      {\n        name: 'TWO JOINED SQUARES',\n        value: '⧉',\n        codepoint: 10697,\n      },\n      {\n        name: 'TRIANGLE WITH DOT ABOVE',\n        value: '⧊',\n        codepoint: 10698,\n      },\n      {\n        name: 'TRIANGLE WITH UNDERBAR',\n        value: '⧋',\n        codepoint: 10699,\n      },\n      {\n        name: 'S IN TRIANGLE',\n        value: '⧌',\n        codepoint: 10700,\n      },\n      {\n        name: 'TRIANGLE WITH SERIFS AT BOTTOM',\n        value: '⧍',\n        codepoint: 10701,\n      },\n      {\n        name: 'RIGHT TRIANGLE ABOVE LEFT TRIANGLE',\n        value: '⧎',\n        codepoint: 10702,\n      },\n      {\n        name: 'LEFT TRIANGLE BESIDE VERTICAL BAR',\n        value: '⧏',\n        codepoint: 10703,\n      },\n      {\n        name: 'VERTICAL BAR BESIDE RIGHT TRIANGLE',\n        value: '⧐',\n        codepoint: 10704,\n      },\n      {\n        name: 'BOWTIE WITH LEFT HALF BLACK',\n        value: '⧑',\n        codepoint: 10705,\n      },\n      {\n        name: 'BOWTIE WITH RIGHT HALF BLACK',\n        value: '⧒',\n        codepoint: 10706,\n      },\n      {\n        name: 'BLACK BOWTIE',\n        value: '⧓',\n        codepoint: 10707,\n      },\n      {\n        name: 'TIMES WITH LEFT HALF BLACK',\n        value: '⧔',\n        codepoint: 10708,\n      },\n      {\n        name: 'TIMES WITH RIGHT HALF BLACK',\n        value: '⧕',\n        codepoint: 10709,\n      },\n      {\n        name: 'WHITE HOURGLASS',\n        value: '⧖',\n        codepoint: 10710,\n      },\n      {\n        name: 'BLACK HOURGLASS',\n        value: '⧗',\n        codepoint: 10711,\n      },\n      {\n        name: 'LEFT WIGGLY FENCE',\n        value: '⧘',\n        codepoint: 10712,\n      },\n      {\n        name: 'RIGHT WIGGLY FENCE',\n        value: '⧙',\n        codepoint: 10713,\n      },\n      {\n        name: 'LEFT DOUBLE WIGGLY FENCE',\n        value: '⧚',\n        codepoint: 10714,\n      },\n      {\n        name: 'RIGHT DOUBLE WIGGLY FENCE',\n        value: '⧛',\n        codepoint: 10715,\n      },\n      {\n        name: 'INCOMPLETE INFINITY',\n        value: '⧜',\n        codepoint: 10716,\n      },\n      {\n        name: 'TIE OVER INFINITY',\n        value: '⧝',\n        codepoint: 10717,\n      },\n      {\n        name: 'INFINITY NEGATED WITH VERTICAL BAR',\n        value: '⧞',\n        codepoint: 10718,\n      },\n      {\n        name: 'DOUBLE-ENDED MULTIMAP',\n        value: '⧟',\n        codepoint: 10719,\n      },\n      {\n        name: 'SQUARE WITH CONTOURED OUTLINE',\n        value: '⧠',\n        codepoint: 10720,\n      },\n      {\n        name: 'INCREASES AS',\n        value: '⧡',\n        codepoint: 10721,\n      },\n      {\n        name: 'SHUFFLE PRODUCT',\n        value: '⧢',\n        codepoint: 10722,\n      },\n      {\n        name: 'EQUALS SIGN AND SLANTED PARALLEL',\n        value: '⧣',\n        codepoint: 10723,\n      },\n      {\n        name: 'EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE',\n        value: '⧤',\n        codepoint: 10724,\n      },\n      {\n        name: 'IDENTICAL TO AND SLANTED PARALLEL',\n        value: '⧥',\n        codepoint: 10725,\n      },\n      {\n        name: 'GLEICH STARK',\n        value: '⧦',\n        codepoint: 10726,\n      },\n      {\n        name: 'THERMODYNAMIC',\n        value: '⧧',\n        codepoint: 10727,\n      },\n      {\n        name: 'DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK',\n        value: '⧨',\n        codepoint: 10728,\n      },\n      {\n        name: 'DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK',\n        value: '⧩',\n        codepoint: 10729,\n      },\n      {\n        name: 'BLACK DIAMOND WITH DOWN ARROW',\n        value: '⧪',\n        codepoint: 10730,\n      },\n      {\n        name: 'BLACK LOZENGE',\n        value: '⧫',\n        codepoint: 10731,\n      },\n      {\n        name: 'WHITE CIRCLE WITH DOWN ARROW',\n        value: '⧬',\n        codepoint: 10732,\n      },\n      {\n        name: 'BLACK CIRCLE WITH DOWN ARROW',\n        value: '⧭',\n        codepoint: 10733,\n      },\n      {\n        name: 'ERROR-BARRED WHITE SQUARE',\n        value: '⧮',\n        codepoint: 10734,\n      },\n      {\n        name: 'ERROR-BARRED BLACK SQUARE',\n        value: '⧯',\n        codepoint: 10735,\n      },\n      {\n        name: 'ERROR-BARRED WHITE DIAMOND',\n        value: '⧰',\n        codepoint: 10736,\n      },\n      {\n        name: 'ERROR-BARRED BLACK DIAMOND',\n        value: '⧱',\n        codepoint: 10737,\n      },\n      {\n        name: 'ERROR-BARRED WHITE CIRCLE',\n        value: '⧲',\n        codepoint: 10738,\n      },\n      {\n        name: 'ERROR-BARRED BLACK CIRCLE',\n        value: '⧳',\n        codepoint: 10739,\n      },\n      {\n        name: 'RULE-DELAYED',\n        value: '⧴',\n        codepoint: 10740,\n      },\n      {\n        name: 'REVERSE SOLIDUS OPERATOR',\n        value: '⧵',\n        codepoint: 10741,\n      },\n      {\n        name: 'SOLIDUS WITH OVERBAR',\n        value: '⧶',\n        codepoint: 10742,\n      },\n      {\n        name: 'REVERSE SOLIDUS WITH HORIZONTAL STROKE',\n        value: '⧷',\n        codepoint: 10743,\n      },\n      {\n        name: 'BIG SOLIDUS',\n        value: '⧸',\n        codepoint: 10744,\n      },\n      {\n        name: 'BIG REVERSE SOLIDUS',\n        value: '⧹',\n        codepoint: 10745,\n      },\n      {\n        name: 'DOUBLE PLUS',\n        value: '⧺',\n        codepoint: 10746,\n      },\n      {\n        name: 'TRIPLE PLUS',\n        value: '⧻',\n        codepoint: 10747,\n      },\n      {\n        name: 'LEFT-POINTING CURVED ANGLE BRACKET',\n        value: '⧼',\n        codepoint: 10748,\n      },\n      {\n        name: 'RIGHT-POINTING CURVED ANGLE BRACKET',\n        value: '⧽',\n        codepoint: 10749,\n      },\n      {\n        name: 'TINY',\n        value: '⧾',\n        codepoint: 10750,\n      },\n      {\n        name: 'MINY',\n        value: '⧿',\n        codepoint: 10751,\n      },\n      {\n        name: 'N-ARY CIRCLED DOT OPERATOR',\n        value: '⨀',\n        codepoint: 10752,\n      },\n      {\n        name: 'N-ARY CIRCLED PLUS OPERATOR',\n        value: '⨁',\n        codepoint: 10753,\n      },\n      {\n        name: 'N-ARY CIRCLED TIMES OPERATOR',\n        value: '⨂',\n        codepoint: 10754,\n      },\n      {\n        name: 'N-ARY UNION OPERATOR WITH DOT',\n        value: '⨃',\n        codepoint: 10755,\n      },\n      {\n        name: 'N-ARY UNION OPERATOR WITH PLUS',\n        value: '⨄',\n        codepoint: 10756,\n      },\n      {\n        name: 'N-ARY SQUARE INTERSECTION OPERATOR',\n        value: '⨅',\n        codepoint: 10757,\n      },\n      {\n        name: 'N-ARY SQUARE UNION OPERATOR',\n        value: '⨆',\n        codepoint: 10758,\n      },\n      {\n        name: 'TWO LOGICAL AND OPERATOR',\n        value: '⨇',\n        codepoint: 10759,\n      },\n      {\n        name: 'TWO LOGICAL OR OPERATOR',\n        value: '⨈',\n        codepoint: 10760,\n      },\n      {\n        name: 'N-ARY TIMES OPERATOR',\n        value: '⨉',\n        codepoint: 10761,\n      },\n      {\n        name: 'MODULO TWO SUM',\n        value: '⨊',\n        codepoint: 10762,\n      },\n      {\n        name: 'SUMMATION WITH INTEGRAL',\n        value: '⨋',\n        codepoint: 10763,\n      },\n      {\n        name: 'QUADRUPLE INTEGRAL OPERATOR',\n        value: '⨌',\n        codepoint: 10764,\n      },\n      {\n        name: 'FINITE PART INTEGRAL',\n        value: '⨍',\n        codepoint: 10765,\n      },\n      {\n        name: 'INTEGRAL WITH DOUBLE STROKE',\n        value: '⨎',\n        codepoint: 10766,\n      },\n      {\n        name: 'INTEGRAL AVERAGE WITH SLASH',\n        value: '⨏',\n        codepoint: 10767,\n      },\n      {\n        name: 'CIRCULATION FUNCTION',\n        value: '⨐',\n        codepoint: 10768,\n      },\n      {\n        name: 'ANTICLOCKWISE INTEGRATION',\n        value: '⨑',\n        codepoint: 10769,\n      },\n      {\n        name: 'LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE',\n        value: '⨒',\n        codepoint: 10770,\n      },\n      {\n        name: 'LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE',\n        value: '⨓',\n        codepoint: 10771,\n      },\n      {\n        name: 'LINE INTEGRATION NOT INCLUDING THE POLE',\n        value: '⨔',\n        codepoint: 10772,\n      },\n      {\n        name: 'INTEGRAL AROUND A POINT OPERATOR',\n        value: '⨕',\n        codepoint: 10773,\n      },\n      {\n        name: 'QUATERNION INTEGRAL OPERATOR',\n        value: '⨖',\n        codepoint: 10774,\n      },\n      {\n        name: 'INTEGRAL WITH LEFTWARDS ARROW WITH HOOK',\n        value: '⨗',\n        codepoint: 10775,\n      },\n      {\n        name: 'INTEGRAL WITH TIMES SIGN',\n        value: '⨘',\n        codepoint: 10776,\n      },\n      {\n        name: 'INTEGRAL WITH INTERSECTION',\n        value: '⨙',\n        codepoint: 10777,\n      },\n      {\n        name: 'INTEGRAL WITH UNION',\n        value: '⨚',\n        codepoint: 10778,\n      },\n      {\n        name: 'INTEGRAL WITH OVERBAR',\n        value: '⨛',\n        codepoint: 10779,\n      },\n      {\n        name: 'INTEGRAL WITH UNDERBAR',\n        value: '⨜',\n        codepoint: 10780,\n      },\n      {\n        name: 'JOIN',\n        value: '⨝',\n        codepoint: 10781,\n      },\n      {\n        name: 'LARGE LEFT TRIANGLE OPERATOR',\n        value: '⨞',\n        codepoint: 10782,\n      },\n      {\n        name: 'Z NOTATION SCHEMA COMPOSITION',\n        value: '⨟',\n        codepoint: 10783,\n      },\n      {\n        name: 'Z NOTATION SCHEMA PIPING',\n        value: '⨠',\n        codepoint: 10784,\n      },\n      {\n        name: 'Z NOTATION SCHEMA PROJECTION',\n        value: '⨡',\n        codepoint: 10785,\n      },\n      {\n        name: 'PLUS SIGN WITH SMALL CIRCLE ABOVE',\n        value: '⨢',\n        codepoint: 10786,\n      },\n      {\n        name: 'PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE',\n        value: '⨣',\n        codepoint: 10787,\n      },\n      {\n        name: 'PLUS SIGN WITH TILDE ABOVE',\n        value: '⨤',\n        codepoint: 10788,\n      },\n      {\n        name: 'PLUS SIGN WITH DOT BELOW',\n        value: '⨥',\n        codepoint: 10789,\n      },\n      {\n        name: 'PLUS SIGN WITH TILDE BELOW',\n        value: '⨦',\n        codepoint: 10790,\n      },\n      {\n        name: 'PLUS SIGN WITH SUBSCRIPT TWO',\n        value: '⨧',\n        codepoint: 10791,\n      },\n      {\n        name: 'PLUS SIGN WITH BLACK TRIANGLE',\n        value: '⨨',\n        codepoint: 10792,\n      },\n      {\n        name: 'MINUS SIGN WITH COMMA ABOVE',\n        value: '⨩',\n        codepoint: 10793,\n      },\n      {\n        name: 'MINUS SIGN WITH DOT BELOW',\n        value: '⨪',\n        codepoint: 10794,\n      },\n      {\n        name: 'MINUS SIGN WITH FALLING DOTS',\n        value: '⨫',\n        codepoint: 10795,\n      },\n      {\n        name: 'MINUS SIGN WITH RISING DOTS',\n        value: '⨬',\n        codepoint: 10796,\n      },\n      {\n        name: 'PLUS SIGN IN LEFT HALF CIRCLE',\n        value: '⨭',\n        codepoint: 10797,\n      },\n      {\n        name: 'PLUS SIGN IN RIGHT HALF CIRCLE',\n        value: '⨮',\n        codepoint: 10798,\n      },\n      {\n        name: 'VECTOR OR CROSS PRODUCT',\n        value: '⨯',\n        codepoint: 10799,\n      },\n      {\n        name: 'MULTIPLICATION SIGN WITH DOT ABOVE',\n        value: '⨰',\n        codepoint: 10800,\n      },\n      {\n        name: 'MULTIPLICATION SIGN WITH UNDERBAR',\n        value: '⨱',\n        codepoint: 10801,\n      },\n      {\n        name: 'SEMIDIRECT PRODUCT WITH BOTTOM CLOSED',\n        value: '⨲',\n        codepoint: 10802,\n      },\n      {\n        name: 'SMASH PRODUCT',\n        value: '⨳',\n        codepoint: 10803,\n      },\n      {\n        name: 'MULTIPLICATION SIGN IN LEFT HALF CIRCLE',\n        value: '⨴',\n        codepoint: 10804,\n      },\n      {\n        name: 'MULTIPLICATION SIGN IN RIGHT HALF CIRCLE',\n        value: '⨵',\n        codepoint: 10805,\n      },\n      {\n        name: 'CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT',\n        value: '⨶',\n        codepoint: 10806,\n      },\n      {\n        name: 'MULTIPLICATION SIGN IN DOUBLE CIRCLE',\n        value: '⨷',\n        codepoint: 10807,\n      },\n      {\n        name: 'CIRCLED DIVISION SIGN',\n        value: '⨸',\n        codepoint: 10808,\n      },\n      {\n        name: 'PLUS SIGN IN TRIANGLE',\n        value: '⨹',\n        codepoint: 10809,\n      },\n      {\n        name: 'MINUS SIGN IN TRIANGLE',\n        value: '⨺',\n        codepoint: 10810,\n      },\n      {\n        name: 'MULTIPLICATION SIGN IN TRIANGLE',\n        value: '⨻',\n        codepoint: 10811,\n      },\n      {\n        name: 'INTERIOR PRODUCT',\n        value: '⨼',\n        codepoint: 10812,\n      },\n      {\n        name: 'RIGHTHAND INTERIOR PRODUCT',\n        value: '⨽',\n        codepoint: 10813,\n      },\n      {\n        name: 'Z NOTATION RELATIONAL COMPOSITION',\n        value: '⨾',\n        codepoint: 10814,\n      },\n      {\n        name: 'AMALGAMATION OR COPRODUCT',\n        value: '⨿',\n        codepoint: 10815,\n      },\n      {\n        name: 'INTERSECTION WITH DOT',\n        value: '⩀',\n        codepoint: 10816,\n      },\n      {\n        name: 'UNION WITH MINUS SIGN',\n        value: '⩁',\n        codepoint: 10817,\n      },\n      {\n        name: 'UNION WITH OVERBAR',\n        value: '⩂',\n        codepoint: 10818,\n      },\n      {\n        name: 'INTERSECTION WITH OVERBAR',\n        value: '⩃',\n        codepoint: 10819,\n      },\n      {\n        name: 'INTERSECTION WITH LOGICAL AND',\n        value: '⩄',\n        codepoint: 10820,\n      },\n      {\n        name: 'UNION WITH LOGICAL OR',\n        value: '⩅',\n        codepoint: 10821,\n      },\n      {\n        name: 'UNION ABOVE INTERSECTION',\n        value: '⩆',\n        codepoint: 10822,\n      },\n      {\n        name: 'INTERSECTION ABOVE UNION',\n        value: '⩇',\n        codepoint: 10823,\n      },\n      {\n        name: 'UNION ABOVE BAR ABOVE INTERSECTION',\n        value: '⩈',\n        codepoint: 10824,\n      },\n      {\n        name: 'INTERSECTION ABOVE BAR ABOVE UNION',\n        value: '⩉',\n        codepoint: 10825,\n      },\n      {\n        name: 'UNION BESIDE AND JOINED WITH UNION',\n        value: '⩊',\n        codepoint: 10826,\n      },\n      {\n        name: 'INTERSECTION BESIDE AND JOINED WITH INTERSECTION',\n        value: '⩋',\n        codepoint: 10827,\n      },\n      {\n        name: 'CLOSED UNION WITH SERIFS',\n        value: '⩌',\n        codepoint: 10828,\n      },\n      {\n        name: 'CLOSED INTERSECTION WITH SERIFS',\n        value: '⩍',\n        codepoint: 10829,\n      },\n      {\n        name: 'DOUBLE SQUARE INTERSECTION',\n        value: '⩎',\n        codepoint: 10830,\n      },\n      {\n        name: 'DOUBLE SQUARE UNION',\n        value: '⩏',\n        codepoint: 10831,\n      },\n      {\n        name: 'CLOSED UNION WITH SERIFS AND SMASH PRODUCT',\n        value: '⩐',\n        codepoint: 10832,\n      },\n      {\n        name: 'LOGICAL AND WITH DOT ABOVE',\n        value: '⩑',\n        codepoint: 10833,\n      },\n      {\n        name: 'LOGICAL OR WITH DOT ABOVE',\n        value: '⩒',\n        codepoint: 10834,\n      },\n      {\n        name: 'DOUBLE LOGICAL AND',\n        value: '⩓',\n        codepoint: 10835,\n      },\n      {\n        name: 'DOUBLE LOGICAL OR',\n        value: '⩔',\n        codepoint: 10836,\n      },\n      {\n        name: 'TWO INTERSECTING LOGICAL AND',\n        value: '⩕',\n        codepoint: 10837,\n      },\n      {\n        name: 'TWO INTERSECTING LOGICAL OR',\n        value: '⩖',\n        codepoint: 10838,\n      },\n      {\n        name: 'SLOPING LARGE OR',\n        value: '⩗',\n        codepoint: 10839,\n      },\n      {\n        name: 'SLOPING LARGE AND',\n        value: '⩘',\n        codepoint: 10840,\n      },\n      {\n        name: 'LOGICAL OR OVERLAPPING LOGICAL AND',\n        value: '⩙',\n        codepoint: 10841,\n      },\n      {\n        name: 'LOGICAL AND WITH MIDDLE STEM',\n        value: '⩚',\n        codepoint: 10842,\n      },\n      {\n        name: 'LOGICAL OR WITH MIDDLE STEM',\n        value: '⩛',\n        codepoint: 10843,\n      },\n      {\n        name: 'LOGICAL AND WITH HORIZONTAL DASH',\n        value: '⩜',\n        codepoint: 10844,\n      },\n      {\n        name: 'LOGICAL OR WITH HORIZONTAL DASH',\n        value: '⩝',\n        codepoint: 10845,\n      },\n      {\n        name: 'LOGICAL AND WITH DOUBLE OVERBAR',\n        value: '⩞',\n        codepoint: 10846,\n      },\n      {\n        name: 'LOGICAL AND WITH UNDERBAR',\n        value: '⩟',\n        codepoint: 10847,\n      },\n      {\n        name: 'LOGICAL AND WITH DOUBLE UNDERBAR',\n        value: '⩠',\n        codepoint: 10848,\n      },\n      {\n        name: 'SMALL VEE WITH UNDERBAR',\n        value: '⩡',\n        codepoint: 10849,\n      },\n      {\n        name: 'LOGICAL OR WITH DOUBLE OVERBAR',\n        value: '⩢',\n        codepoint: 10850,\n      },\n      {\n        name: 'LOGICAL OR WITH DOUBLE UNDERBAR',\n        value: '⩣',\n        codepoint: 10851,\n      },\n      {\n        name: 'Z NOTATION DOMAIN ANTIRESTRICTION',\n        value: '⩤',\n        codepoint: 10852,\n      },\n      {\n        name: 'Z NOTATION RANGE ANTIRESTRICTION',\n        value: '⩥',\n        codepoint: 10853,\n      },\n      {\n        name: 'EQUALS SIGN WITH DOT BELOW',\n        value: '⩦',\n        codepoint: 10854,\n      },\n      {\n        name: 'IDENTICAL WITH DOT ABOVE',\n        value: '⩧',\n        codepoint: 10855,\n      },\n      {\n        name: 'TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE',\n        value: '⩨',\n        codepoint: 10856,\n      },\n      {\n        name: 'TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE',\n        value: '⩩',\n        codepoint: 10857,\n      },\n      {\n        name: 'TILDE OPERATOR WITH DOT ABOVE',\n        value: '⩪',\n        codepoint: 10858,\n      },\n      {\n        name: 'TILDE OPERATOR WITH RISING DOTS',\n        value: '⩫',\n        codepoint: 10859,\n      },\n      {\n        name: 'SIMILAR MINUS SIMILAR',\n        value: '⩬',\n        codepoint: 10860,\n      },\n      {\n        name: 'CONGRUENT WITH DOT ABOVE',\n        value: '⩭',\n        codepoint: 10861,\n      },\n      {\n        name: 'EQUALS WITH ASTERISK',\n        value: '⩮',\n        codepoint: 10862,\n      },\n      {\n        name: 'ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT',\n        value: '⩯',\n        codepoint: 10863,\n      },\n      {\n        name: 'APPROXIMATELY EQUAL OR EQUAL TO',\n        value: '⩰',\n        codepoint: 10864,\n      },\n      {\n        name: 'EQUALS SIGN ABOVE PLUS SIGN',\n        value: '⩱',\n        codepoint: 10865,\n      },\n      {\n        name: 'PLUS SIGN ABOVE EQUALS SIGN',\n        value: '⩲',\n        codepoint: 10866,\n      },\n      {\n        name: 'EQUALS SIGN ABOVE TILDE OPERATOR',\n        value: '⩳',\n        codepoint: 10867,\n      },\n      {\n        name: 'DOUBLE COLON EQUAL',\n        value: '⩴',\n        codepoint: 10868,\n      },\n      {\n        name: 'TWO CONSECUTIVE EQUALS SIGNS',\n        value: '⩵',\n        codepoint: 10869,\n      },\n      {\n        name: 'THREE CONSECUTIVE EQUALS SIGNS',\n        value: '⩶',\n        codepoint: 10870,\n      },\n      {\n        name: 'EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW',\n        value: '⩷',\n        codepoint: 10871,\n      },\n      {\n        name: 'EQUIVALENT WITH FOUR DOTS ABOVE',\n        value: '⩸',\n        codepoint: 10872,\n      },\n      {\n        name: 'LESS-THAN WITH CIRCLE INSIDE',\n        value: '⩹',\n        codepoint: 10873,\n      },\n      {\n        name: 'GREATER-THAN WITH CIRCLE INSIDE',\n        value: '⩺',\n        codepoint: 10874,\n      },\n      {\n        name: 'LESS-THAN WITH QUESTION MARK ABOVE',\n        value: '⩻',\n        codepoint: 10875,\n      },\n      {\n        name: 'GREATER-THAN WITH QUESTION MARK ABOVE',\n        value: '⩼',\n        codepoint: 10876,\n      },\n      {\n        name: 'LESS-THAN OR SLANTED EQUAL TO',\n        value: '⩽',\n        codepoint: 10877,\n      },\n      {\n        name: 'GREATER-THAN OR SLANTED EQUAL TO',\n        value: '⩾',\n        codepoint: 10878,\n      },\n      {\n        name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE',\n        value: '⩿',\n        codepoint: 10879,\n      },\n      {\n        name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE',\n        value: '⪀',\n        codepoint: 10880,\n      },\n      {\n        name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE',\n        value: '⪁',\n        codepoint: 10881,\n      },\n      {\n        name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE',\n        value: '⪂',\n        codepoint: 10882,\n      },\n      {\n        name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT',\n        value: '⪃',\n        codepoint: 10883,\n      },\n      {\n        name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT',\n        value: '⪄',\n        codepoint: 10884,\n      },\n      {\n        name: 'LESS-THAN OR APPROXIMATE',\n        value: '⪅',\n        codepoint: 10885,\n      },\n      {\n        name: 'GREATER-THAN OR APPROXIMATE',\n        value: '⪆',\n        codepoint: 10886,\n      },\n      {\n        name: 'LESS-THAN AND SINGLE-LINE NOT EQUAL TO',\n        value: '⪇',\n        codepoint: 10887,\n      },\n      {\n        name: 'GREATER-THAN AND SINGLE-LINE NOT EQUAL TO',\n        value: '⪈',\n        codepoint: 10888,\n      },\n      {\n        name: 'LESS-THAN AND NOT APPROXIMATE',\n        value: '⪉',\n        codepoint: 10889,\n      },\n      {\n        name: 'GREATER-THAN AND NOT APPROXIMATE',\n        value: '⪊',\n        codepoint: 10890,\n      },\n      {\n        name: 'LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN',\n        value: '⪋',\n        codepoint: 10891,\n      },\n      {\n        name: 'GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN',\n        value: '⪌',\n        codepoint: 10892,\n      },\n      {\n        name: 'LESS-THAN ABOVE SIMILAR OR EQUAL',\n        value: '⪍',\n        codepoint: 10893,\n      },\n      {\n        name: 'GREATER-THAN ABOVE SIMILAR OR EQUAL',\n        value: '⪎',\n        codepoint: 10894,\n      },\n      {\n        name: 'LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN',\n        value: '⪏',\n        codepoint: 10895,\n      },\n      {\n        name: 'GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN',\n        value: '⪐',\n        codepoint: 10896,\n      },\n      {\n        name: 'LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL',\n        value: '⪑',\n        codepoint: 10897,\n      },\n      {\n        name: 'GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL',\n        value: '⪒',\n        codepoint: 10898,\n      },\n      {\n        name: 'LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL',\n        value: '⪓',\n        codepoint: 10899,\n      },\n      {\n        name: 'GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL',\n        value: '⪔',\n        codepoint: 10900,\n      },\n      {\n        name: 'SLANTED EQUAL TO OR LESS-THAN',\n        value: '⪕',\n        codepoint: 10901,\n      },\n      {\n        name: 'SLANTED EQUAL TO OR GREATER-THAN',\n        value: '⪖',\n        codepoint: 10902,\n      },\n      {\n        name: 'SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE',\n        value: '⪗',\n        codepoint: 10903,\n      },\n      {\n        name: 'SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE',\n        value: '⪘',\n        codepoint: 10904,\n      },\n      {\n        name: 'DOUBLE-LINE EQUAL TO OR LESS-THAN',\n        value: '⪙',\n        codepoint: 10905,\n      },\n      {\n        name: 'DOUBLE-LINE EQUAL TO OR GREATER-THAN',\n        value: '⪚',\n        codepoint: 10906,\n      },\n      {\n        name: 'DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN',\n        value: '⪛',\n        codepoint: 10907,\n      },\n      {\n        name: 'DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN',\n        value: '⪜',\n        codepoint: 10908,\n      },\n      {\n        name: 'SIMILAR OR LESS-THAN',\n        value: '⪝',\n        codepoint: 10909,\n      },\n      {\n        name: 'SIMILAR OR GREATER-THAN',\n        value: '⪞',\n        codepoint: 10910,\n      },\n      {\n        name: 'SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN',\n        value: '⪟',\n        codepoint: 10911,\n      },\n      {\n        name: 'SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN',\n        value: '⪠',\n        codepoint: 10912,\n      },\n      {\n        name: 'DOUBLE NESTED LESS-THAN',\n        value: '⪡',\n        codepoint: 10913,\n      },\n      {\n        name: 'DOUBLE NESTED GREATER-THAN',\n        value: '⪢',\n        codepoint: 10914,\n      },\n      {\n        name: 'DOUBLE NESTED LESS-THAN WITH UNDERBAR',\n        value: '⪣',\n        codepoint: 10915,\n      },\n      {\n        name: 'GREATER-THAN OVERLAPPING LESS-THAN',\n        value: '⪤',\n        codepoint: 10916,\n      },\n      {\n        name: 'GREATER-THAN BESIDE LESS-THAN',\n        value: '⪥',\n        codepoint: 10917,\n      },\n      {\n        name: 'LESS-THAN CLOSED BY CURVE',\n        value: '⪦',\n        codepoint: 10918,\n      },\n      {\n        name: 'GREATER-THAN CLOSED BY CURVE',\n        value: '⪧',\n        codepoint: 10919,\n      },\n      {\n        name: 'LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL',\n        value: '⪨',\n        codepoint: 10920,\n      },\n      {\n        name: 'GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL',\n        value: '⪩',\n        codepoint: 10921,\n      },\n      {\n        name: 'SMALLER THAN',\n        value: '⪪',\n        codepoint: 10922,\n      },\n      {\n        name: 'LARGER THAN',\n        value: '⪫',\n        codepoint: 10923,\n      },\n      {\n        name: 'SMALLER THAN OR EQUAL TO',\n        value: '⪬',\n        codepoint: 10924,\n      },\n      {\n        name: 'LARGER THAN OR EQUAL TO',\n        value: '⪭',\n        codepoint: 10925,\n      },\n      {\n        name: 'EQUALS SIGN WITH BUMPY ABOVE',\n        value: '⪮',\n        codepoint: 10926,\n      },\n      {\n        name: 'PRECEDES ABOVE SINGLE-LINE EQUALS SIGN',\n        value: '⪯',\n        codepoint: 10927,\n      },\n      {\n        name: 'SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN',\n        value: '⪰',\n        codepoint: 10928,\n      },\n      {\n        name: 'PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO',\n        value: '⪱',\n        codepoint: 10929,\n      },\n      {\n        name: 'SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO',\n        value: '⪲',\n        codepoint: 10930,\n      },\n      {\n        name: 'PRECEDES ABOVE EQUALS SIGN',\n        value: '⪳',\n        codepoint: 10931,\n      },\n      {\n        name: 'SUCCEEDS ABOVE EQUALS SIGN',\n        value: '⪴',\n        codepoint: 10932,\n      },\n      {\n        name: 'PRECEDES ABOVE NOT EQUAL TO',\n        value: '⪵',\n        codepoint: 10933,\n      },\n      {\n        name: 'SUCCEEDS ABOVE NOT EQUAL TO',\n        value: '⪶',\n        codepoint: 10934,\n      },\n      {\n        name: 'PRECEDES ABOVE ALMOST EQUAL TO',\n        value: '⪷',\n        codepoint: 10935,\n      },\n      {\n        name: 'SUCCEEDS ABOVE ALMOST EQUAL TO',\n        value: '⪸',\n        codepoint: 10936,\n      },\n      {\n        name: 'PRECEDES ABOVE NOT ALMOST EQUAL TO',\n        value: '⪹',\n        codepoint: 10937,\n      },\n      {\n        name: 'SUCCEEDS ABOVE NOT ALMOST EQUAL TO',\n        value: '⪺',\n        codepoint: 10938,\n      },\n      {\n        name: 'DOUBLE PRECEDES',\n        value: '⪻',\n        codepoint: 10939,\n      },\n      {\n        name: 'DOUBLE SUCCEEDS',\n        value: '⪼',\n        codepoint: 10940,\n      },\n      {\n        name: 'SUBSET WITH DOT',\n        value: '⪽',\n        codepoint: 10941,\n      },\n      {\n        name: 'SUPERSET WITH DOT',\n        value: '⪾',\n        codepoint: 10942,\n      },\n      {\n        name: 'SUBSET WITH PLUS SIGN BELOW',\n        value: '⪿',\n        codepoint: 10943,\n      },\n      {\n        name: 'SUPERSET WITH PLUS SIGN BELOW',\n        value: '⫀',\n        codepoint: 10944,\n      },\n      {\n        name: 'SUBSET WITH MULTIPLICATION SIGN BELOW',\n        value: '⫁',\n        codepoint: 10945,\n      },\n      {\n        name: 'SUPERSET WITH MULTIPLICATION SIGN BELOW',\n        value: '⫂',\n        codepoint: 10946,\n      },\n      {\n        name: 'SUBSET OF OR EQUAL TO WITH DOT ABOVE',\n        value: '⫃',\n        codepoint: 10947,\n      },\n      {\n        name: 'SUPERSET OF OR EQUAL TO WITH DOT ABOVE',\n        value: '⫄',\n        codepoint: 10948,\n      },\n      {\n        name: 'SUBSET OF ABOVE EQUALS SIGN',\n        value: '⫅',\n        codepoint: 10949,\n      },\n      {\n        name: 'SUPERSET OF ABOVE EQUALS SIGN',\n        value: '⫆',\n        codepoint: 10950,\n      },\n      {\n        name: 'SUBSET OF ABOVE TILDE OPERATOR',\n        value: '⫇',\n        codepoint: 10951,\n      },\n      {\n        name: 'SUPERSET OF ABOVE TILDE OPERATOR',\n        value: '⫈',\n        codepoint: 10952,\n      },\n      {\n        name: 'SUBSET OF ABOVE ALMOST EQUAL TO',\n        value: '⫉',\n        codepoint: 10953,\n      },\n      {\n        name: 'SUPERSET OF ABOVE ALMOST EQUAL TO',\n        value: '⫊',\n        codepoint: 10954,\n      },\n      {\n        name: 'SUBSET OF ABOVE NOT EQUAL TO',\n        value: '⫋',\n        codepoint: 10955,\n      },\n      {\n        name: 'SUPERSET OF ABOVE NOT EQUAL TO',\n        value: '⫌',\n        codepoint: 10956,\n      },\n      {\n        name: 'SQUARE LEFT OPEN BOX OPERATOR',\n        value: '⫍',\n        codepoint: 10957,\n      },\n      {\n        name: 'SQUARE RIGHT OPEN BOX OPERATOR',\n        value: '⫎',\n        codepoint: 10958,\n      },\n      {\n        name: 'CLOSED SUBSET',\n        value: '⫏',\n        codepoint: 10959,\n      },\n      {\n        name: 'CLOSED SUPERSET',\n        value: '⫐',\n        codepoint: 10960,\n      },\n      {\n        name: 'CLOSED SUBSET OR EQUAL TO',\n        value: '⫑',\n        codepoint: 10961,\n      },\n      {\n        name: 'CLOSED SUPERSET OR EQUAL TO',\n        value: '⫒',\n        codepoint: 10962,\n      },\n      {\n        name: 'SUBSET ABOVE SUPERSET',\n        value: '⫓',\n        codepoint: 10963,\n      },\n      {\n        name: 'SUPERSET ABOVE SUBSET',\n        value: '⫔',\n        codepoint: 10964,\n      },\n      {\n        name: 'SUBSET ABOVE SUBSET',\n        value: '⫕',\n        codepoint: 10965,\n      },\n      {\n        name: 'SUPERSET ABOVE SUPERSET',\n        value: '⫖',\n        codepoint: 10966,\n      },\n      {\n        name: 'SUPERSET BESIDE SUBSET',\n        value: '⫗',\n        codepoint: 10967,\n      },\n      {\n        name: 'SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET',\n        value: '⫘',\n        codepoint: 10968,\n      },\n      {\n        name: 'ELEMENT OF OPENING DOWNWARDS',\n        value: '⫙',\n        codepoint: 10969,\n      },\n      {\n        name: 'PITCHFORK WITH TEE TOP',\n        value: '⫚',\n        codepoint: 10970,\n      },\n      {\n        name: 'TRANSVERSAL INTERSECTION',\n        value: '⫛',\n        codepoint: 10971,\n      },\n      {\n        name: 'FORKING',\n        value: '⫝̸',\n        codepoint: 10972,\n      },\n      {\n        name: 'NONFORKING',\n        value: '⫝',\n        codepoint: 10973,\n      },\n      {\n        name: 'SHORT LEFT TACK',\n        value: '⫞',\n        codepoint: 10974,\n      },\n      {\n        name: 'SHORT DOWN TACK',\n        value: '⫟',\n        codepoint: 10975,\n      },\n      {\n        name: 'SHORT UP TACK',\n        value: '⫠',\n        codepoint: 10976,\n      },\n      {\n        name: 'PERPENDICULAR WITH S',\n        value: '⫡',\n        codepoint: 10977,\n      },\n      {\n        name: 'VERTICAL BAR TRIPLE RIGHT TURNSTILE',\n        value: '⫢',\n        codepoint: 10978,\n      },\n      {\n        name: 'DOUBLE VERTICAL BAR LEFT TURNSTILE',\n        value: '⫣',\n        codepoint: 10979,\n      },\n      {\n        name: 'VERTICAL BAR DOUBLE LEFT TURNSTILE',\n        value: '⫤',\n        codepoint: 10980,\n      },\n      {\n        name: 'DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE',\n        value: '⫥',\n        codepoint: 10981,\n      },\n      {\n        name: 'LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL',\n        value: '⫦',\n        codepoint: 10982,\n      },\n      {\n        name: 'SHORT DOWN TACK WITH OVERBAR',\n        value: '⫧',\n        codepoint: 10983,\n      },\n      {\n        name: 'SHORT UP TACK WITH UNDERBAR',\n        value: '⫨',\n        codepoint: 10984,\n      },\n      {\n        name: 'SHORT UP TACK ABOVE SHORT DOWN TACK',\n        value: '⫩',\n        codepoint: 10985,\n      },\n      {\n        name: 'DOUBLE DOWN TACK',\n        value: '⫪',\n        codepoint: 10986,\n      },\n      {\n        name: 'DOUBLE UP TACK',\n        value: '⫫',\n        codepoint: 10987,\n      },\n      {\n        name: 'DOUBLE STROKE NOT SIGN',\n        value: '⫬',\n        codepoint: 10988,\n      },\n      {\n        name: 'REVERSED DOUBLE STROKE NOT SIGN',\n        value: '⫭',\n        codepoint: 10989,\n      },\n      {\n        name: 'DOES NOT DIVIDE WITH REVERSED NEGATION SLASH',\n        value: '⫮',\n        codepoint: 10990,\n      },\n      {\n        name: 'VERTICAL LINE WITH CIRCLE ABOVE',\n        value: '⫯',\n        codepoint: 10991,\n      },\n      {\n        name: 'VERTICAL LINE WITH CIRCLE BELOW',\n        value: '⫰',\n        codepoint: 10992,\n      },\n      {\n        name: 'DOWN TACK WITH CIRCLE BELOW',\n        value: '⫱',\n        codepoint: 10993,\n      },\n      {\n        name: 'PARALLEL WITH HORIZONTAL STROKE',\n        value: '⫲',\n        codepoint: 10994,\n      },\n      {\n        name: 'PARALLEL WITH TILDE OPERATOR',\n        value: '⫳',\n        codepoint: 10995,\n      },\n      {\n        name: 'TRIPLE VERTICAL BAR BINARY RELATION',\n        value: '⫴',\n        codepoint: 10996,\n      },\n      {\n        name: 'TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE',\n        value: '⫵',\n        codepoint: 10997,\n      },\n      {\n        name: 'TRIPLE COLON OPERATOR',\n        value: '⫶',\n        codepoint: 10998,\n      },\n      {\n        name: 'TRIPLE NESTED LESS-THAN',\n        value: '⫷',\n        codepoint: 10999,\n      },\n      {\n        name: 'TRIPLE NESTED GREATER-THAN',\n        value: '⫸',\n        codepoint: 11000,\n      },\n      {\n        name: 'DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO',\n        value: '⫹',\n        codepoint: 11001,\n      },\n      {\n        name: 'DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO',\n        value: '⫺',\n        codepoint: 11002,\n      },\n      {\n        name: 'TRIPLE SOLIDUS BINARY RELATION',\n        value: '⫻',\n        codepoint: 11003,\n      },\n      {\n        name: 'LARGE TRIPLE VERTICAL BAR OPERATOR',\n        value: '⫼',\n        codepoint: 11004,\n      },\n      {\n        name: 'DOUBLE SOLIDUS OPERATOR',\n        value: '⫽',\n        codepoint: 11005,\n      },\n      {\n        name: 'WHITE VERTICAL BAR',\n        value: '⫾',\n        codepoint: 11006,\n      },\n      {\n        name: 'N-ARY WHITE VERTICAL BAR',\n        value: '⫿',\n        codepoint: 11007,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL A',\n        value: '𝐀',\n        codepoint: 119808,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL B',\n        value: '𝐁',\n        codepoint: 119809,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL C',\n        value: '𝐂',\n        codepoint: 119810,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL D',\n        value: '𝐃',\n        codepoint: 119811,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL E',\n        value: '𝐄',\n        codepoint: 119812,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL F',\n        value: '𝐅',\n        codepoint: 119813,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL G',\n        value: '𝐆',\n        codepoint: 119814,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL H',\n        value: '𝐇',\n        codepoint: 119815,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL I',\n        value: '𝐈',\n        codepoint: 119816,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL J',\n        value: '𝐉',\n        codepoint: 119817,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL K',\n        value: '𝐊',\n        codepoint: 119818,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL L',\n        value: '𝐋',\n        codepoint: 119819,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL M',\n        value: '𝐌',\n        codepoint: 119820,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL N',\n        value: '𝐍',\n        codepoint: 119821,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL O',\n        value: '𝐎',\n        codepoint: 119822,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL P',\n        value: '𝐏',\n        codepoint: 119823,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL Q',\n        value: '𝐐',\n        codepoint: 119824,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL R',\n        value: '𝐑',\n        codepoint: 119825,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL S',\n        value: '𝐒',\n        codepoint: 119826,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL T',\n        value: '𝐓',\n        codepoint: 119827,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL U',\n        value: '𝐔',\n        codepoint: 119828,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL V',\n        value: '𝐕',\n        codepoint: 119829,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL W',\n        value: '𝐖',\n        codepoint: 119830,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL X',\n        value: '𝐗',\n        codepoint: 119831,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL Y',\n        value: '𝐘',\n        codepoint: 119832,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL Z',\n        value: '𝐙',\n        codepoint: 119833,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL A',\n        value: '𝐚',\n        codepoint: 119834,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL B',\n        value: '𝐛',\n        codepoint: 119835,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL C',\n        value: '𝐜',\n        codepoint: 119836,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL D',\n        value: '𝐝',\n        codepoint: 119837,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL E',\n        value: '𝐞',\n        codepoint: 119838,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL F',\n        value: '𝐟',\n        codepoint: 119839,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL G',\n        value: '𝐠',\n        codepoint: 119840,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL H',\n        value: '𝐡',\n        codepoint: 119841,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL I',\n        value: '𝐢',\n        codepoint: 119842,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL J',\n        value: '𝐣',\n        codepoint: 119843,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL K',\n        value: '𝐤',\n        codepoint: 119844,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL L',\n        value: '𝐥',\n        codepoint: 119845,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL M',\n        value: '𝐦',\n        codepoint: 119846,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL N',\n        value: '𝐧',\n        codepoint: 119847,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL O',\n        value: '𝐨',\n        codepoint: 119848,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL P',\n        value: '𝐩',\n        codepoint: 119849,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL Q',\n        value: '𝐪',\n        codepoint: 119850,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL R',\n        value: '𝐫',\n        codepoint: 119851,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL S',\n        value: '𝐬',\n        codepoint: 119852,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL T',\n        value: '𝐭',\n        codepoint: 119853,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL U',\n        value: '𝐮',\n        codepoint: 119854,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL V',\n        value: '𝐯',\n        codepoint: 119855,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL W',\n        value: '𝐰',\n        codepoint: 119856,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL X',\n        value: '𝐱',\n        codepoint: 119857,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL Y',\n        value: '𝐲',\n        codepoint: 119858,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL Z',\n        value: '𝐳',\n        codepoint: 119859,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL A',\n        value: '𝐴',\n        codepoint: 119860,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL B',\n        value: '𝐵',\n        codepoint: 119861,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL C',\n        value: '𝐶',\n        codepoint: 119862,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL D',\n        value: '𝐷',\n        codepoint: 119863,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL E',\n        value: '𝐸',\n        codepoint: 119864,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL F',\n        value: '𝐹',\n        codepoint: 119865,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL G',\n        value: '𝐺',\n        codepoint: 119866,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL H',\n        value: '𝐻',\n        codepoint: 119867,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL I',\n        value: '𝐼',\n        codepoint: 119868,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL J',\n        value: '𝐽',\n        codepoint: 119869,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL K',\n        value: '𝐾',\n        codepoint: 119870,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL L',\n        value: '𝐿',\n        codepoint: 119871,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL M',\n        value: '𝑀',\n        codepoint: 119872,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL N',\n        value: '𝑁',\n        codepoint: 119873,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL O',\n        value: '𝑂',\n        codepoint: 119874,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL P',\n        value: '𝑃',\n        codepoint: 119875,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL Q',\n        value: '𝑄',\n        codepoint: 119876,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL R',\n        value: '𝑅',\n        codepoint: 119877,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL S',\n        value: '𝑆',\n        codepoint: 119878,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL T',\n        value: '𝑇',\n        codepoint: 119879,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL U',\n        value: '𝑈',\n        codepoint: 119880,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL V',\n        value: '𝑉',\n        codepoint: 119881,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL W',\n        value: '𝑊',\n        codepoint: 119882,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL X',\n        value: '𝑋',\n        codepoint: 119883,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL Y',\n        value: '𝑌',\n        codepoint: 119884,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL Z',\n        value: '𝑍',\n        codepoint: 119885,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL A',\n        value: '𝑎',\n        codepoint: 119886,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL B',\n        value: '𝑏',\n        codepoint: 119887,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL C',\n        value: '𝑐',\n        codepoint: 119888,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL D',\n        value: '𝑑',\n        codepoint: 119889,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL E',\n        value: '𝑒',\n        codepoint: 119890,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL F',\n        value: '𝑓',\n        codepoint: 119891,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL G',\n        value: '𝑔',\n        codepoint: 119892,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL I',\n        value: '𝑖',\n        codepoint: 119894,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL J',\n        value: '𝑗',\n        codepoint: 119895,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL K',\n        value: '𝑘',\n        codepoint: 119896,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL L',\n        value: '𝑙',\n        codepoint: 119897,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL M',\n        value: '𝑚',\n        codepoint: 119898,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL N',\n        value: '𝑛',\n        codepoint: 119899,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL O',\n        value: '𝑜',\n        codepoint: 119900,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL P',\n        value: '𝑝',\n        codepoint: 119901,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL Q',\n        value: '𝑞',\n        codepoint: 119902,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL R',\n        value: '𝑟',\n        codepoint: 119903,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL S',\n        value: '𝑠',\n        codepoint: 119904,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL T',\n        value: '𝑡',\n        codepoint: 119905,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL U',\n        value: '𝑢',\n        codepoint: 119906,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL V',\n        value: '𝑣',\n        codepoint: 119907,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL W',\n        value: '𝑤',\n        codepoint: 119908,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL X',\n        value: '𝑥',\n        codepoint: 119909,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL Y',\n        value: '𝑦',\n        codepoint: 119910,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL Z',\n        value: '𝑧',\n        codepoint: 119911,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL A',\n        value: '𝑨',\n        codepoint: 119912,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL B',\n        value: '𝑩',\n        codepoint: 119913,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL C',\n        value: '𝑪',\n        codepoint: 119914,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL D',\n        value: '𝑫',\n        codepoint: 119915,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL E',\n        value: '𝑬',\n        codepoint: 119916,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL F',\n        value: '𝑭',\n        codepoint: 119917,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL G',\n        value: '𝑮',\n        codepoint: 119918,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL H',\n        value: '𝑯',\n        codepoint: 119919,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL I',\n        value: '𝑰',\n        codepoint: 119920,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL J',\n        value: '𝑱',\n        codepoint: 119921,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL K',\n        value: '𝑲',\n        codepoint: 119922,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL L',\n        value: '𝑳',\n        codepoint: 119923,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL M',\n        value: '𝑴',\n        codepoint: 119924,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL N',\n        value: '𝑵',\n        codepoint: 119925,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL O',\n        value: '𝑶',\n        codepoint: 119926,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL P',\n        value: '𝑷',\n        codepoint: 119927,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL Q',\n        value: '𝑸',\n        codepoint: 119928,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL R',\n        value: '𝑹',\n        codepoint: 119929,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL S',\n        value: '𝑺',\n        codepoint: 119930,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL T',\n        value: '𝑻',\n        codepoint: 119931,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL U',\n        value: '𝑼',\n        codepoint: 119932,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL V',\n        value: '𝑽',\n        codepoint: 119933,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL W',\n        value: '𝑾',\n        codepoint: 119934,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL X',\n        value: '𝑿',\n        codepoint: 119935,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL Y',\n        value: '𝒀',\n        codepoint: 119936,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL Z',\n        value: '𝒁',\n        codepoint: 119937,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL A',\n        value: '𝒂',\n        codepoint: 119938,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL B',\n        value: '𝒃',\n        codepoint: 119939,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL C',\n        value: '𝒄',\n        codepoint: 119940,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL D',\n        value: '𝒅',\n        codepoint: 119941,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL E',\n        value: '𝒆',\n        codepoint: 119942,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL F',\n        value: '𝒇',\n        codepoint: 119943,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL G',\n        value: '𝒈',\n        codepoint: 119944,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL H',\n        value: '𝒉',\n        codepoint: 119945,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL I',\n        value: '𝒊',\n        codepoint: 119946,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL J',\n        value: '𝒋',\n        codepoint: 119947,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL K',\n        value: '𝒌',\n        codepoint: 119948,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL L',\n        value: '𝒍',\n        codepoint: 119949,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL M',\n        value: '𝒎',\n        codepoint: 119950,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL N',\n        value: '𝒏',\n        codepoint: 119951,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL O',\n        value: '𝒐',\n        codepoint: 119952,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL P',\n        value: '𝒑',\n        codepoint: 119953,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL Q',\n        value: '𝒒',\n        codepoint: 119954,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL R',\n        value: '𝒓',\n        codepoint: 119955,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL S',\n        value: '𝒔',\n        codepoint: 119956,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL T',\n        value: '𝒕',\n        codepoint: 119957,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL U',\n        value: '𝒖',\n        codepoint: 119958,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL V',\n        value: '𝒗',\n        codepoint: 119959,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL W',\n        value: '𝒘',\n        codepoint: 119960,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL X',\n        value: '𝒙',\n        codepoint: 119961,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL Y',\n        value: '𝒚',\n        codepoint: 119962,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL Z',\n        value: '𝒛',\n        codepoint: 119963,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL A',\n        value: '𝒜',\n        codepoint: 119964,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL C',\n        value: '𝒞',\n        codepoint: 119966,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL D',\n        value: '𝒟',\n        codepoint: 119967,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL G',\n        value: '𝒢',\n        codepoint: 119970,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL J',\n        value: '𝒥',\n        codepoint: 119973,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL K',\n        value: '𝒦',\n        codepoint: 119974,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL N',\n        value: '𝒩',\n        codepoint: 119977,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL O',\n        value: '𝒪',\n        codepoint: 119978,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL P',\n        value: '𝒫',\n        codepoint: 119979,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL Q',\n        value: '𝒬',\n        codepoint: 119980,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL S',\n        value: '𝒮',\n        codepoint: 119982,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL T',\n        value: '𝒯',\n        codepoint: 119983,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL U',\n        value: '𝒰',\n        codepoint: 119984,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL V',\n        value: '𝒱',\n        codepoint: 119985,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL W',\n        value: '𝒲',\n        codepoint: 119986,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL X',\n        value: '𝒳',\n        codepoint: 119987,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL Y',\n        value: '𝒴',\n        codepoint: 119988,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL Z',\n        value: '𝒵',\n        codepoint: 119989,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL A',\n        value: '𝒶',\n        codepoint: 119990,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL B',\n        value: '𝒷',\n        codepoint: 119991,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL C',\n        value: '𝒸',\n        codepoint: 119992,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL D',\n        value: '𝒹',\n        codepoint: 119993,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL F',\n        value: '𝒻',\n        codepoint: 119995,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL H',\n        value: '𝒽',\n        codepoint: 119997,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL I',\n        value: '𝒾',\n        codepoint: 119998,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL J',\n        value: '𝒿',\n        codepoint: 119999,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL K',\n        value: '𝓀',\n        codepoint: 120000,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL L',\n        value: '𝓁',\n        codepoint: 120001,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL M',\n        value: '𝓂',\n        codepoint: 120002,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL N',\n        value: '𝓃',\n        codepoint: 120003,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL P',\n        value: '𝓅',\n        codepoint: 120005,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL Q',\n        value: '𝓆',\n        codepoint: 120006,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL R',\n        value: '𝓇',\n        codepoint: 120007,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL S',\n        value: '𝓈',\n        codepoint: 120008,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL T',\n        value: '𝓉',\n        codepoint: 120009,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL U',\n        value: '𝓊',\n        codepoint: 120010,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL V',\n        value: '𝓋',\n        codepoint: 120011,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL W',\n        value: '𝓌',\n        codepoint: 120012,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL X',\n        value: '𝓍',\n        codepoint: 120013,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL Y',\n        value: '𝓎',\n        codepoint: 120014,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL Z',\n        value: '𝓏',\n        codepoint: 120015,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL A',\n        value: '𝓐',\n        codepoint: 120016,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL B',\n        value: '𝓑',\n        codepoint: 120017,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL C',\n        value: '𝓒',\n        codepoint: 120018,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL D',\n        value: '𝓓',\n        codepoint: 120019,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL E',\n        value: '𝓔',\n        codepoint: 120020,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL F',\n        value: '𝓕',\n        codepoint: 120021,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL G',\n        value: '𝓖',\n        codepoint: 120022,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL H',\n        value: '𝓗',\n        codepoint: 120023,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL I',\n        value: '𝓘',\n        codepoint: 120024,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL J',\n        value: '𝓙',\n        codepoint: 120025,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL K',\n        value: '𝓚',\n        codepoint: 120026,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL L',\n        value: '𝓛',\n        codepoint: 120027,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL M',\n        value: '𝓜',\n        codepoint: 120028,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL N',\n        value: '𝓝',\n        codepoint: 120029,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL O',\n        value: '𝓞',\n        codepoint: 120030,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL P',\n        value: '𝓟',\n        codepoint: 120031,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Q',\n        value: '𝓠',\n        codepoint: 120032,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL R',\n        value: '𝓡',\n        codepoint: 120033,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL S',\n        value: '𝓢',\n        codepoint: 120034,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL T',\n        value: '𝓣',\n        codepoint: 120035,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL U',\n        value: '𝓤',\n        codepoint: 120036,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL V',\n        value: '𝓥',\n        codepoint: 120037,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL W',\n        value: '𝓦',\n        codepoint: 120038,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL X',\n        value: '𝓧',\n        codepoint: 120039,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Y',\n        value: '𝓨',\n        codepoint: 120040,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Z',\n        value: '𝓩',\n        codepoint: 120041,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL A',\n        value: '𝓪',\n        codepoint: 120042,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL B',\n        value: '𝓫',\n        codepoint: 120043,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL C',\n        value: '𝓬',\n        codepoint: 120044,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL D',\n        value: '𝓭',\n        codepoint: 120045,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL E',\n        value: '𝓮',\n        codepoint: 120046,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL F',\n        value: '𝓯',\n        codepoint: 120047,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL G',\n        value: '𝓰',\n        codepoint: 120048,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL H',\n        value: '𝓱',\n        codepoint: 120049,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL I',\n        value: '𝓲',\n        codepoint: 120050,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL J',\n        value: '𝓳',\n        codepoint: 120051,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL K',\n        value: '𝓴',\n        codepoint: 120052,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL L',\n        value: '𝓵',\n        codepoint: 120053,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL M',\n        value: '𝓶',\n        codepoint: 120054,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL N',\n        value: '𝓷',\n        codepoint: 120055,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL O',\n        value: '𝓸',\n        codepoint: 120056,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL P',\n        value: '𝓹',\n        codepoint: 120057,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL Q',\n        value: '𝓺',\n        codepoint: 120058,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL R',\n        value: '𝓻',\n        codepoint: 120059,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL S',\n        value: '𝓼',\n        codepoint: 120060,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL T',\n        value: '𝓽',\n        codepoint: 120061,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL U',\n        value: '𝓾',\n        codepoint: 120062,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL V',\n        value: '𝓿',\n        codepoint: 120063,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL W',\n        value: '𝔀',\n        codepoint: 120064,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL X',\n        value: '𝔁',\n        codepoint: 120065,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL Y',\n        value: '𝔂',\n        codepoint: 120066,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL Z',\n        value: '𝔃',\n        codepoint: 120067,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL A',\n        value: '𝔄',\n        codepoint: 120068,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL B',\n        value: '𝔅',\n        codepoint: 120069,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL D',\n        value: '𝔇',\n        codepoint: 120071,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL E',\n        value: '𝔈',\n        codepoint: 120072,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL F',\n        value: '𝔉',\n        codepoint: 120073,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL G',\n        value: '𝔊',\n        codepoint: 120074,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL J',\n        value: '𝔍',\n        codepoint: 120077,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL K',\n        value: '𝔎',\n        codepoint: 120078,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL L',\n        value: '𝔏',\n        codepoint: 120079,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL M',\n        value: '𝔐',\n        codepoint: 120080,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL N',\n        value: '𝔑',\n        codepoint: 120081,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL O',\n        value: '𝔒',\n        codepoint: 120082,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL P',\n        value: '𝔓',\n        codepoint: 120083,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL Q',\n        value: '𝔔',\n        codepoint: 120084,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL S',\n        value: '𝔖',\n        codepoint: 120086,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL T',\n        value: '𝔗',\n        codepoint: 120087,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL U',\n        value: '𝔘',\n        codepoint: 120088,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL V',\n        value: '𝔙',\n        codepoint: 120089,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL W',\n        value: '𝔚',\n        codepoint: 120090,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL X',\n        value: '𝔛',\n        codepoint: 120091,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL Y',\n        value: '𝔜',\n        codepoint: 120092,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL A',\n        value: '𝔞',\n        codepoint: 120094,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL B',\n        value: '𝔟',\n        codepoint: 120095,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL C',\n        value: '𝔠',\n        codepoint: 120096,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL D',\n        value: '𝔡',\n        codepoint: 120097,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL E',\n        value: '𝔢',\n        codepoint: 120098,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL F',\n        value: '𝔣',\n        codepoint: 120099,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL G',\n        value: '𝔤',\n        codepoint: 120100,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL H',\n        value: '𝔥',\n        codepoint: 120101,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL I',\n        value: '𝔦',\n        codepoint: 120102,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL J',\n        value: '𝔧',\n        codepoint: 120103,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL K',\n        value: '𝔨',\n        codepoint: 120104,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL L',\n        value: '𝔩',\n        codepoint: 120105,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL M',\n        value: '𝔪',\n        codepoint: 120106,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL N',\n        value: '𝔫',\n        codepoint: 120107,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL O',\n        value: '𝔬',\n        codepoint: 120108,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL P',\n        value: '𝔭',\n        codepoint: 120109,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL Q',\n        value: '𝔮',\n        codepoint: 120110,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL R',\n        value: '𝔯',\n        codepoint: 120111,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL S',\n        value: '𝔰',\n        codepoint: 120112,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL T',\n        value: '𝔱',\n        codepoint: 120113,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL U',\n        value: '𝔲',\n        codepoint: 120114,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL V',\n        value: '𝔳',\n        codepoint: 120115,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL W',\n        value: '𝔴',\n        codepoint: 120116,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL X',\n        value: '𝔵',\n        codepoint: 120117,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL Y',\n        value: '𝔶',\n        codepoint: 120118,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL Z',\n        value: '𝔷',\n        codepoint: 120119,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL A',\n        value: '𝔸',\n        codepoint: 120120,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL B',\n        value: '𝔹',\n        codepoint: 120121,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL D',\n        value: '𝔻',\n        codepoint: 120123,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL E',\n        value: '𝔼',\n        codepoint: 120124,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL F',\n        value: '𝔽',\n        codepoint: 120125,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL G',\n        value: '𝔾',\n        codepoint: 120126,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL I',\n        value: '𝕀',\n        codepoint: 120128,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL J',\n        value: '𝕁',\n        codepoint: 120129,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL K',\n        value: '𝕂',\n        codepoint: 120130,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL L',\n        value: '𝕃',\n        codepoint: 120131,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL M',\n        value: '𝕄',\n        codepoint: 120132,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL O',\n        value: '𝕆',\n        codepoint: 120134,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL S',\n        value: '𝕊',\n        codepoint: 120138,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL T',\n        value: '𝕋',\n        codepoint: 120139,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL U',\n        value: '𝕌',\n        codepoint: 120140,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL V',\n        value: '𝕍',\n        codepoint: 120141,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL W',\n        value: '𝕎',\n        codepoint: 120142,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL X',\n        value: '𝕏',\n        codepoint: 120143,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL Y',\n        value: '𝕐',\n        codepoint: 120144,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL A',\n        value: '𝕒',\n        codepoint: 120146,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL B',\n        value: '𝕓',\n        codepoint: 120147,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL C',\n        value: '𝕔',\n        codepoint: 120148,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL D',\n        value: '𝕕',\n        codepoint: 120149,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL E',\n        value: '𝕖',\n        codepoint: 120150,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL F',\n        value: '𝕗',\n        codepoint: 120151,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL G',\n        value: '𝕘',\n        codepoint: 120152,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL H',\n        value: '𝕙',\n        codepoint: 120153,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL I',\n        value: '𝕚',\n        codepoint: 120154,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL J',\n        value: '𝕛',\n        codepoint: 120155,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL K',\n        value: '𝕜',\n        codepoint: 120156,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL L',\n        value: '𝕝',\n        codepoint: 120157,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL M',\n        value: '𝕞',\n        codepoint: 120158,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL N',\n        value: '𝕟',\n        codepoint: 120159,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL O',\n        value: '𝕠',\n        codepoint: 120160,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL P',\n        value: '𝕡',\n        codepoint: 120161,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Q',\n        value: '𝕢',\n        codepoint: 120162,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL R',\n        value: '𝕣',\n        codepoint: 120163,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL S',\n        value: '𝕤',\n        codepoint: 120164,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL T',\n        value: '𝕥',\n        codepoint: 120165,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL U',\n        value: '𝕦',\n        codepoint: 120166,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL V',\n        value: '𝕧',\n        codepoint: 120167,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL W',\n        value: '𝕨',\n        codepoint: 120168,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL X',\n        value: '𝕩',\n        codepoint: 120169,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Y',\n        value: '𝕪',\n        codepoint: 120170,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Z',\n        value: '𝕫',\n        codepoint: 120171,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL A',\n        value: '𝕬',\n        codepoint: 120172,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL B',\n        value: '𝕭',\n        codepoint: 120173,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL C',\n        value: '𝕮',\n        codepoint: 120174,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL D',\n        value: '𝕯',\n        codepoint: 120175,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL E',\n        value: '𝕰',\n        codepoint: 120176,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL F',\n        value: '𝕱',\n        codepoint: 120177,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL G',\n        value: '𝕲',\n        codepoint: 120178,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL H',\n        value: '𝕳',\n        codepoint: 120179,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL I',\n        value: '𝕴',\n        codepoint: 120180,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL J',\n        value: '𝕵',\n        codepoint: 120181,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL K',\n        value: '𝕶',\n        codepoint: 120182,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL L',\n        value: '𝕷',\n        codepoint: 120183,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL M',\n        value: '𝕸',\n        codepoint: 120184,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL N',\n        value: '𝕹',\n        codepoint: 120185,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL O',\n        value: '𝕺',\n        codepoint: 120186,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL P',\n        value: '𝕻',\n        codepoint: 120187,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Q',\n        value: '𝕼',\n        codepoint: 120188,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL R',\n        value: '𝕽',\n        codepoint: 120189,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL S',\n        value: '𝕾',\n        codepoint: 120190,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL T',\n        value: '𝕿',\n        codepoint: 120191,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL U',\n        value: '𝖀',\n        codepoint: 120192,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL V',\n        value: '𝖁',\n        codepoint: 120193,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL W',\n        value: '𝖂',\n        codepoint: 120194,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL X',\n        value: '𝖃',\n        codepoint: 120195,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Y',\n        value: '𝖄',\n        codepoint: 120196,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Z',\n        value: '𝖅',\n        codepoint: 120197,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL A',\n        value: '𝖆',\n        codepoint: 120198,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL B',\n        value: '𝖇',\n        codepoint: 120199,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL C',\n        value: '𝖈',\n        codepoint: 120200,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL D',\n        value: '𝖉',\n        codepoint: 120201,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL E',\n        value: '𝖊',\n        codepoint: 120202,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL F',\n        value: '𝖋',\n        codepoint: 120203,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL G',\n        value: '𝖌',\n        codepoint: 120204,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL H',\n        value: '𝖍',\n        codepoint: 120205,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL I',\n        value: '𝖎',\n        codepoint: 120206,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL J',\n        value: '𝖏',\n        codepoint: 120207,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL K',\n        value: '𝖐',\n        codepoint: 120208,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL L',\n        value: '𝖑',\n        codepoint: 120209,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL M',\n        value: '𝖒',\n        codepoint: 120210,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL N',\n        value: '𝖓',\n        codepoint: 120211,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL O',\n        value: '𝖔',\n        codepoint: 120212,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL P',\n        value: '𝖕',\n        codepoint: 120213,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL Q',\n        value: '𝖖',\n        codepoint: 120214,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL R',\n        value: '𝖗',\n        codepoint: 120215,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL S',\n        value: '𝖘',\n        codepoint: 120216,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL T',\n        value: '𝖙',\n        codepoint: 120217,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL U',\n        value: '𝖚',\n        codepoint: 120218,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL V',\n        value: '𝖛',\n        codepoint: 120219,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL W',\n        value: '𝖜',\n        codepoint: 120220,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL X',\n        value: '𝖝',\n        codepoint: 120221,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL Y',\n        value: '𝖞',\n        codepoint: 120222,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL Z',\n        value: '𝖟',\n        codepoint: 120223,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL A',\n        value: '𝖠',\n        codepoint: 120224,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL B',\n        value: '𝖡',\n        codepoint: 120225,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL C',\n        value: '𝖢',\n        codepoint: 120226,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL D',\n        value: '𝖣',\n        codepoint: 120227,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL E',\n        value: '𝖤',\n        codepoint: 120228,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL F',\n        value: '𝖥',\n        codepoint: 120229,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL G',\n        value: '𝖦',\n        codepoint: 120230,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL H',\n        value: '𝖧',\n        codepoint: 120231,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL I',\n        value: '𝖨',\n        codepoint: 120232,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL J',\n        value: '𝖩',\n        codepoint: 120233,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL K',\n        value: '𝖪',\n        codepoint: 120234,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL L',\n        value: '𝖫',\n        codepoint: 120235,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL M',\n        value: '𝖬',\n        codepoint: 120236,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL N',\n        value: '𝖭',\n        codepoint: 120237,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL O',\n        value: '𝖮',\n        codepoint: 120238,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL P',\n        value: '𝖯',\n        codepoint: 120239,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL Q',\n        value: '𝖰',\n        codepoint: 120240,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL R',\n        value: '𝖱',\n        codepoint: 120241,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL S',\n        value: '𝖲',\n        codepoint: 120242,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL T',\n        value: '𝖳',\n        codepoint: 120243,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL U',\n        value: '𝖴',\n        codepoint: 120244,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL V',\n        value: '𝖵',\n        codepoint: 120245,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL W',\n        value: '𝖶',\n        codepoint: 120246,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL X',\n        value: '𝖷',\n        codepoint: 120247,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL Y',\n        value: '𝖸',\n        codepoint: 120248,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL Z',\n        value: '𝖹',\n        codepoint: 120249,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL A',\n        value: '𝖺',\n        codepoint: 120250,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL B',\n        value: '𝖻',\n        codepoint: 120251,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL C',\n        value: '𝖼',\n        codepoint: 120252,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL D',\n        value: '𝖽',\n        codepoint: 120253,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL E',\n        value: '𝖾',\n        codepoint: 120254,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL F',\n        value: '𝖿',\n        codepoint: 120255,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL G',\n        value: '𝗀',\n        codepoint: 120256,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL H',\n        value: '𝗁',\n        codepoint: 120257,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL I',\n        value: '𝗂',\n        codepoint: 120258,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL J',\n        value: '𝗃',\n        codepoint: 120259,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL K',\n        value: '𝗄',\n        codepoint: 120260,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL L',\n        value: '𝗅',\n        codepoint: 120261,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL M',\n        value: '𝗆',\n        codepoint: 120262,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL N',\n        value: '𝗇',\n        codepoint: 120263,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL O',\n        value: '𝗈',\n        codepoint: 120264,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL P',\n        value: '𝗉',\n        codepoint: 120265,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL Q',\n        value: '𝗊',\n        codepoint: 120266,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL R',\n        value: '𝗋',\n        codepoint: 120267,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL S',\n        value: '𝗌',\n        codepoint: 120268,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL T',\n        value: '𝗍',\n        codepoint: 120269,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL U',\n        value: '𝗎',\n        codepoint: 120270,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL V',\n        value: '𝗏',\n        codepoint: 120271,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL W',\n        value: '𝗐',\n        codepoint: 120272,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL X',\n        value: '𝗑',\n        codepoint: 120273,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL Y',\n        value: '𝗒',\n        codepoint: 120274,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL Z',\n        value: '𝗓',\n        codepoint: 120275,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL A',\n        value: '𝗔',\n        codepoint: 120276,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL B',\n        value: '𝗕',\n        codepoint: 120277,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL C',\n        value: '𝗖',\n        codepoint: 120278,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL D',\n        value: '𝗗',\n        codepoint: 120279,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL E',\n        value: '𝗘',\n        codepoint: 120280,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL F',\n        value: '𝗙',\n        codepoint: 120281,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL G',\n        value: '𝗚',\n        codepoint: 120282,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL H',\n        value: '𝗛',\n        codepoint: 120283,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL I',\n        value: '𝗜',\n        codepoint: 120284,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL J',\n        value: '𝗝',\n        codepoint: 120285,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL K',\n        value: '𝗞',\n        codepoint: 120286,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL L',\n        value: '𝗟',\n        codepoint: 120287,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL M',\n        value: '𝗠',\n        codepoint: 120288,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL N',\n        value: '𝗡',\n        codepoint: 120289,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL O',\n        value: '𝗢',\n        codepoint: 120290,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL P',\n        value: '𝗣',\n        codepoint: 120291,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Q',\n        value: '𝗤',\n        codepoint: 120292,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL R',\n        value: '𝗥',\n        codepoint: 120293,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL S',\n        value: '𝗦',\n        codepoint: 120294,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL T',\n        value: '𝗧',\n        codepoint: 120295,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL U',\n        value: '𝗨',\n        codepoint: 120296,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL V',\n        value: '𝗩',\n        codepoint: 120297,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL W',\n        value: '𝗪',\n        codepoint: 120298,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL X',\n        value: '𝗫',\n        codepoint: 120299,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Y',\n        value: '𝗬',\n        codepoint: 120300,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Z',\n        value: '𝗭',\n        codepoint: 120301,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL A',\n        value: '𝗮',\n        codepoint: 120302,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL B',\n        value: '𝗯',\n        codepoint: 120303,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL C',\n        value: '𝗰',\n        codepoint: 120304,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL D',\n        value: '𝗱',\n        codepoint: 120305,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL E',\n        value: '𝗲',\n        codepoint: 120306,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL F',\n        value: '𝗳',\n        codepoint: 120307,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL G',\n        value: '𝗴',\n        codepoint: 120308,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL H',\n        value: '𝗵',\n        codepoint: 120309,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL I',\n        value: '𝗶',\n        codepoint: 120310,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL J',\n        value: '𝗷',\n        codepoint: 120311,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL K',\n        value: '𝗸',\n        codepoint: 120312,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL L',\n        value: '𝗹',\n        codepoint: 120313,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL M',\n        value: '𝗺',\n        codepoint: 120314,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL N',\n        value: '𝗻',\n        codepoint: 120315,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL O',\n        value: '𝗼',\n        codepoint: 120316,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL P',\n        value: '𝗽',\n        codepoint: 120317,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Q',\n        value: '𝗾',\n        codepoint: 120318,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL R',\n        value: '𝗿',\n        codepoint: 120319,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL S',\n        value: '𝘀',\n        codepoint: 120320,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL T',\n        value: '𝘁',\n        codepoint: 120321,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL U',\n        value: '𝘂',\n        codepoint: 120322,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL V',\n        value: '𝘃',\n        codepoint: 120323,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL W',\n        value: '𝘄',\n        codepoint: 120324,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL X',\n        value: '𝘅',\n        codepoint: 120325,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Y',\n        value: '𝘆',\n        codepoint: 120326,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Z',\n        value: '𝘇',\n        codepoint: 120327,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL A',\n        value: '𝘈',\n        codepoint: 120328,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL B',\n        value: '𝘉',\n        codepoint: 120329,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL C',\n        value: '𝘊',\n        codepoint: 120330,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL D',\n        value: '𝘋',\n        codepoint: 120331,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL E',\n        value: '𝘌',\n        codepoint: 120332,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL F',\n        value: '𝘍',\n        codepoint: 120333,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL G',\n        value: '𝘎',\n        codepoint: 120334,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL H',\n        value: '𝘏',\n        codepoint: 120335,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL I',\n        value: '𝘐',\n        codepoint: 120336,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL J',\n        value: '𝘑',\n        codepoint: 120337,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL K',\n        value: '𝘒',\n        codepoint: 120338,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL L',\n        value: '𝘓',\n        codepoint: 120339,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL M',\n        value: '𝘔',\n        codepoint: 120340,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL N',\n        value: '𝘕',\n        codepoint: 120341,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL O',\n        value: '𝘖',\n        codepoint: 120342,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL P',\n        value: '𝘗',\n        codepoint: 120343,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q',\n        value: '𝘘',\n        codepoint: 120344,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL R',\n        value: '𝘙',\n        codepoint: 120345,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL S',\n        value: '𝘚',\n        codepoint: 120346,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL T',\n        value: '𝘛',\n        codepoint: 120347,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL U',\n        value: '𝘜',\n        codepoint: 120348,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL V',\n        value: '𝘝',\n        codepoint: 120349,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL W',\n        value: '𝘞',\n        codepoint: 120350,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL X',\n        value: '𝘟',\n        codepoint: 120351,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y',\n        value: '𝘠',\n        codepoint: 120352,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z',\n        value: '𝘡',\n        codepoint: 120353,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL A',\n        value: '𝘢',\n        codepoint: 120354,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL B',\n        value: '𝘣',\n        codepoint: 120355,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL C',\n        value: '𝘤',\n        codepoint: 120356,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL D',\n        value: '𝘥',\n        codepoint: 120357,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL E',\n        value: '𝘦',\n        codepoint: 120358,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL F',\n        value: '𝘧',\n        codepoint: 120359,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL G',\n        value: '𝘨',\n        codepoint: 120360,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL H',\n        value: '𝘩',\n        codepoint: 120361,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL I',\n        value: '𝘪',\n        codepoint: 120362,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL J',\n        value: '𝘫',\n        codepoint: 120363,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL K',\n        value: '𝘬',\n        codepoint: 120364,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL L',\n        value: '𝘭',\n        codepoint: 120365,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL M',\n        value: '𝘮',\n        codepoint: 120366,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL N',\n        value: '𝘯',\n        codepoint: 120367,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL O',\n        value: '𝘰',\n        codepoint: 120368,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL P',\n        value: '𝘱',\n        codepoint: 120369,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Q',\n        value: '𝘲',\n        codepoint: 120370,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL R',\n        value: '𝘳',\n        codepoint: 120371,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL S',\n        value: '𝘴',\n        codepoint: 120372,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL T',\n        value: '𝘵',\n        codepoint: 120373,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL U',\n        value: '𝘶',\n        codepoint: 120374,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL V',\n        value: '𝘷',\n        codepoint: 120375,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL W',\n        value: '𝘸',\n        codepoint: 120376,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL X',\n        value: '𝘹',\n        codepoint: 120377,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Y',\n        value: '𝘺',\n        codepoint: 120378,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Z',\n        value: '𝘻',\n        codepoint: 120379,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A',\n        value: '𝘼',\n        codepoint: 120380,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B',\n        value: '𝘽',\n        codepoint: 120381,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C',\n        value: '𝘾',\n        codepoint: 120382,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D',\n        value: '𝘿',\n        codepoint: 120383,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E',\n        value: '𝙀',\n        codepoint: 120384,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F',\n        value: '𝙁',\n        codepoint: 120385,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G',\n        value: '𝙂',\n        codepoint: 120386,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H',\n        value: '𝙃',\n        codepoint: 120387,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I',\n        value: '𝙄',\n        codepoint: 120388,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J',\n        value: '𝙅',\n        codepoint: 120389,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K',\n        value: '𝙆',\n        codepoint: 120390,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L',\n        value: '𝙇',\n        codepoint: 120391,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M',\n        value: '𝙈',\n        codepoint: 120392,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N',\n        value: '𝙉',\n        codepoint: 120393,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O',\n        value: '𝙊',\n        codepoint: 120394,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P',\n        value: '𝙋',\n        codepoint: 120395,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q',\n        value: '𝙌',\n        codepoint: 120396,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R',\n        value: '𝙍',\n        codepoint: 120397,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S',\n        value: '𝙎',\n        codepoint: 120398,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T',\n        value: '𝙏',\n        codepoint: 120399,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U',\n        value: '𝙐',\n        codepoint: 120400,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V',\n        value: '𝙑',\n        codepoint: 120401,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W',\n        value: '𝙒',\n        codepoint: 120402,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X',\n        value: '𝙓',\n        codepoint: 120403,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y',\n        value: '𝙔',\n        codepoint: 120404,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z',\n        value: '𝙕',\n        codepoint: 120405,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A',\n        value: '𝙖',\n        codepoint: 120406,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B',\n        value: '𝙗',\n        codepoint: 120407,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C',\n        value: '𝙘',\n        codepoint: 120408,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D',\n        value: '𝙙',\n        codepoint: 120409,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E',\n        value: '𝙚',\n        codepoint: 120410,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F',\n        value: '𝙛',\n        codepoint: 120411,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G',\n        value: '𝙜',\n        codepoint: 120412,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H',\n        value: '𝙝',\n        codepoint: 120413,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I',\n        value: '𝙞',\n        codepoint: 120414,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J',\n        value: '𝙟',\n        codepoint: 120415,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K',\n        value: '𝙠',\n        codepoint: 120416,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L',\n        value: '𝙡',\n        codepoint: 120417,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M',\n        value: '𝙢',\n        codepoint: 120418,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N',\n        value: '𝙣',\n        codepoint: 120419,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O',\n        value: '𝙤',\n        codepoint: 120420,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P',\n        value: '𝙥',\n        codepoint: 120421,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q',\n        value: '𝙦',\n        codepoint: 120422,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R',\n        value: '𝙧',\n        codepoint: 120423,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S',\n        value: '𝙨',\n        codepoint: 120424,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T',\n        value: '𝙩',\n        codepoint: 120425,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U',\n        value: '𝙪',\n        codepoint: 120426,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V',\n        value: '𝙫',\n        codepoint: 120427,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W',\n        value: '𝙬',\n        codepoint: 120428,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X',\n        value: '𝙭',\n        codepoint: 120429,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y',\n        value: '𝙮',\n        codepoint: 120430,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z',\n        value: '𝙯',\n        codepoint: 120431,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL A',\n        value: '𝙰',\n        codepoint: 120432,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL B',\n        value: '𝙱',\n        codepoint: 120433,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL C',\n        value: '𝙲',\n        codepoint: 120434,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL D',\n        value: '𝙳',\n        codepoint: 120435,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL E',\n        value: '𝙴',\n        codepoint: 120436,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL F',\n        value: '𝙵',\n        codepoint: 120437,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL G',\n        value: '𝙶',\n        codepoint: 120438,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL H',\n        value: '𝙷',\n        codepoint: 120439,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL I',\n        value: '𝙸',\n        codepoint: 120440,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL J',\n        value: '𝙹',\n        codepoint: 120441,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL K',\n        value: '𝙺',\n        codepoint: 120442,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL L',\n        value: '𝙻',\n        codepoint: 120443,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL M',\n        value: '𝙼',\n        codepoint: 120444,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL N',\n        value: '𝙽',\n        codepoint: 120445,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL O',\n        value: '𝙾',\n        codepoint: 120446,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL P',\n        value: '𝙿',\n        codepoint: 120447,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL Q',\n        value: '𝚀',\n        codepoint: 120448,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL R',\n        value: '𝚁',\n        codepoint: 120449,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL S',\n        value: '𝚂',\n        codepoint: 120450,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL T',\n        value: '𝚃',\n        codepoint: 120451,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL U',\n        value: '𝚄',\n        codepoint: 120452,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL V',\n        value: '𝚅',\n        codepoint: 120453,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL W',\n        value: '𝚆',\n        codepoint: 120454,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL X',\n        value: '𝚇',\n        codepoint: 120455,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL Y',\n        value: '𝚈',\n        codepoint: 120456,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL Z',\n        value: '𝚉',\n        codepoint: 120457,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL A',\n        value: '𝚊',\n        codepoint: 120458,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL B',\n        value: '𝚋',\n        codepoint: 120459,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL C',\n        value: '𝚌',\n        codepoint: 120460,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL D',\n        value: '𝚍',\n        codepoint: 120461,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL E',\n        value: '𝚎',\n        codepoint: 120462,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL F',\n        value: '𝚏',\n        codepoint: 120463,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL G',\n        value: '𝚐',\n        codepoint: 120464,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL H',\n        value: '𝚑',\n        codepoint: 120465,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL I',\n        value: '𝚒',\n        codepoint: 120466,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL J',\n        value: '𝚓',\n        codepoint: 120467,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL K',\n        value: '𝚔',\n        codepoint: 120468,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL L',\n        value: '𝚕',\n        codepoint: 120469,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL M',\n        value: '𝚖',\n        codepoint: 120470,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL N',\n        value: '𝚗',\n        codepoint: 120471,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL O',\n        value: '𝚘',\n        codepoint: 120472,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL P',\n        value: '𝚙',\n        codepoint: 120473,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL Q',\n        value: '𝚚',\n        codepoint: 120474,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL R',\n        value: '𝚛',\n        codepoint: 120475,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL S',\n        value: '𝚜',\n        codepoint: 120476,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL T',\n        value: '𝚝',\n        codepoint: 120477,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL U',\n        value: '𝚞',\n        codepoint: 120478,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL V',\n        value: '𝚟',\n        codepoint: 120479,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL W',\n        value: '𝚠',\n        codepoint: 120480,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL X',\n        value: '𝚡',\n        codepoint: 120481,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL Y',\n        value: '𝚢',\n        codepoint: 120482,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL Z',\n        value: '𝚣',\n        codepoint: 120483,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL DOTLESS I',\n        value: '𝚤',\n        codepoint: 120484,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL DOTLESS J',\n        value: '𝚥',\n        codepoint: 120485,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL ALPHA',\n        value: '𝚨',\n        codepoint: 120488,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL BETA',\n        value: '𝚩',\n        codepoint: 120489,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL GAMMA',\n        value: '𝚪',\n        codepoint: 120490,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL DELTA',\n        value: '𝚫',\n        codepoint: 120491,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL EPSILON',\n        value: '𝚬',\n        codepoint: 120492,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL ZETA',\n        value: '𝚭',\n        codepoint: 120493,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL ETA',\n        value: '𝚮',\n        codepoint: 120494,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL THETA',\n        value: '𝚯',\n        codepoint: 120495,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL IOTA',\n        value: '𝚰',\n        codepoint: 120496,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL KAPPA',\n        value: '𝚱',\n        codepoint: 120497,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL LAMDA',\n        value: '𝚲',\n        codepoint: 120498,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL MU',\n        value: '𝚳',\n        codepoint: 120499,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL NU',\n        value: '𝚴',\n        codepoint: 120500,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL XI',\n        value: '𝚵',\n        codepoint: 120501,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL OMICRON',\n        value: '𝚶',\n        codepoint: 120502,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL PI',\n        value: '𝚷',\n        codepoint: 120503,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL RHO',\n        value: '𝚸',\n        codepoint: 120504,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL THETA SYMBOL',\n        value: '𝚹',\n        codepoint: 120505,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL SIGMA',\n        value: '𝚺',\n        codepoint: 120506,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL TAU',\n        value: '𝚻',\n        codepoint: 120507,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL UPSILON',\n        value: '𝚼',\n        codepoint: 120508,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL PHI',\n        value: '𝚽',\n        codepoint: 120509,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL CHI',\n        value: '𝚾',\n        codepoint: 120510,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL PSI',\n        value: '𝚿',\n        codepoint: 120511,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL OMEGA',\n        value: '𝛀',\n        codepoint: 120512,\n      },\n      {\n        name: 'MATHEMATICAL BOLD NABLA',\n        value: '𝛁',\n        codepoint: 120513,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL ALPHA',\n        value: '𝛂',\n        codepoint: 120514,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL BETA',\n        value: '𝛃',\n        codepoint: 120515,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL GAMMA',\n        value: '𝛄',\n        codepoint: 120516,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL DELTA',\n        value: '𝛅',\n        codepoint: 120517,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL EPSILON',\n        value: '𝛆',\n        codepoint: 120518,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL ZETA',\n        value: '𝛇',\n        codepoint: 120519,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL ETA',\n        value: '𝛈',\n        codepoint: 120520,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL THETA',\n        value: '𝛉',\n        codepoint: 120521,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL IOTA',\n        value: '𝛊',\n        codepoint: 120522,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL KAPPA',\n        value: '𝛋',\n        codepoint: 120523,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL LAMDA',\n        value: '𝛌',\n        codepoint: 120524,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL MU',\n        value: '𝛍',\n        codepoint: 120525,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL NU',\n        value: '𝛎',\n        codepoint: 120526,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL XI',\n        value: '𝛏',\n        codepoint: 120527,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL OMICRON',\n        value: '𝛐',\n        codepoint: 120528,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL PI',\n        value: '𝛑',\n        codepoint: 120529,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL RHO',\n        value: '𝛒',\n        codepoint: 120530,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL FINAL SIGMA',\n        value: '𝛓',\n        codepoint: 120531,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL SIGMA',\n        value: '𝛔',\n        codepoint: 120532,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL TAU',\n        value: '𝛕',\n        codepoint: 120533,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL UPSILON',\n        value: '𝛖',\n        codepoint: 120534,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL PHI',\n        value: '𝛗',\n        codepoint: 120535,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL CHI',\n        value: '𝛘',\n        codepoint: 120536,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL PSI',\n        value: '𝛙',\n        codepoint: 120537,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL OMEGA',\n        value: '𝛚',\n        codepoint: 120538,\n      },\n      {\n        name: 'MATHEMATICAL BOLD PARTIAL DIFFERENTIAL',\n        value: '𝛛',\n        codepoint: 120539,\n      },\n      {\n        name: 'MATHEMATICAL BOLD EPSILON SYMBOL',\n        value: '𝛜',\n        codepoint: 120540,\n      },\n      {\n        name: 'MATHEMATICAL BOLD THETA SYMBOL',\n        value: '𝛝',\n        codepoint: 120541,\n      },\n      {\n        name: 'MATHEMATICAL BOLD KAPPA SYMBOL',\n        value: '𝛞',\n        codepoint: 120542,\n      },\n      {\n        name: 'MATHEMATICAL BOLD PHI SYMBOL',\n        value: '𝛟',\n        codepoint: 120543,\n      },\n      {\n        name: 'MATHEMATICAL BOLD RHO SYMBOL',\n        value: '𝛠',\n        codepoint: 120544,\n      },\n      {\n        name: 'MATHEMATICAL BOLD PI SYMBOL',\n        value: '𝛡',\n        codepoint: 120545,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL ALPHA',\n        value: '𝛢',\n        codepoint: 120546,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL BETA',\n        value: '𝛣',\n        codepoint: 120547,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL GAMMA',\n        value: '𝛤',\n        codepoint: 120548,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL DELTA',\n        value: '𝛥',\n        codepoint: 120549,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL EPSILON',\n        value: '𝛦',\n        codepoint: 120550,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL ZETA',\n        value: '𝛧',\n        codepoint: 120551,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL ETA',\n        value: '𝛨',\n        codepoint: 120552,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL THETA',\n        value: '𝛩',\n        codepoint: 120553,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL IOTA',\n        value: '𝛪',\n        codepoint: 120554,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL KAPPA',\n        value: '𝛫',\n        codepoint: 120555,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL LAMDA',\n        value: '𝛬',\n        codepoint: 120556,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL MU',\n        value: '𝛭',\n        codepoint: 120557,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL NU',\n        value: '𝛮',\n        codepoint: 120558,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL XI',\n        value: '𝛯',\n        codepoint: 120559,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL OMICRON',\n        value: '𝛰',\n        codepoint: 120560,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL PI',\n        value: '𝛱',\n        codepoint: 120561,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL RHO',\n        value: '𝛲',\n        codepoint: 120562,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL THETA SYMBOL',\n        value: '𝛳',\n        codepoint: 120563,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL SIGMA',\n        value: '𝛴',\n        codepoint: 120564,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL TAU',\n        value: '𝛵',\n        codepoint: 120565,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL UPSILON',\n        value: '𝛶',\n        codepoint: 120566,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL PHI',\n        value: '𝛷',\n        codepoint: 120567,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL CHI',\n        value: '𝛸',\n        codepoint: 120568,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL PSI',\n        value: '𝛹',\n        codepoint: 120569,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL OMEGA',\n        value: '𝛺',\n        codepoint: 120570,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC NABLA',\n        value: '𝛻',\n        codepoint: 120571,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL ALPHA',\n        value: '𝛼',\n        codepoint: 120572,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL BETA',\n        value: '𝛽',\n        codepoint: 120573,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL GAMMA',\n        value: '𝛾',\n        codepoint: 120574,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL DELTA',\n        value: '𝛿',\n        codepoint: 120575,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL EPSILON',\n        value: '𝜀',\n        codepoint: 120576,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL ZETA',\n        value: '𝜁',\n        codepoint: 120577,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL ETA',\n        value: '𝜂',\n        codepoint: 120578,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL THETA',\n        value: '𝜃',\n        codepoint: 120579,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL IOTA',\n        value: '𝜄',\n        codepoint: 120580,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL KAPPA',\n        value: '𝜅',\n        codepoint: 120581,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL LAMDA',\n        value: '𝜆',\n        codepoint: 120582,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL MU',\n        value: '𝜇',\n        codepoint: 120583,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL NU',\n        value: '𝜈',\n        codepoint: 120584,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL XI',\n        value: '𝜉',\n        codepoint: 120585,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL OMICRON',\n        value: '𝜊',\n        codepoint: 120586,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL PI',\n        value: '𝜋',\n        codepoint: 120587,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL RHO',\n        value: '𝜌',\n        codepoint: 120588,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL FINAL SIGMA',\n        value: '𝜍',\n        codepoint: 120589,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL SIGMA',\n        value: '𝜎',\n        codepoint: 120590,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL TAU',\n        value: '𝜏',\n        codepoint: 120591,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL UPSILON',\n        value: '𝜐',\n        codepoint: 120592,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL PHI',\n        value: '𝜑',\n        codepoint: 120593,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL CHI',\n        value: '𝜒',\n        codepoint: 120594,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL PSI',\n        value: '𝜓',\n        codepoint: 120595,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL OMEGA',\n        value: '𝜔',\n        codepoint: 120596,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL',\n        value: '𝜕',\n        codepoint: 120597,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC EPSILON SYMBOL',\n        value: '𝜖',\n        codepoint: 120598,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC THETA SYMBOL',\n        value: '𝜗',\n        codepoint: 120599,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC KAPPA SYMBOL',\n        value: '𝜘',\n        codepoint: 120600,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC PHI SYMBOL',\n        value: '𝜙',\n        codepoint: 120601,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC RHO SYMBOL',\n        value: '𝜚',\n        codepoint: 120602,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC PI SYMBOL',\n        value: '𝜛',\n        codepoint: 120603,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL ALPHA',\n        value: '𝜜',\n        codepoint: 120604,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL BETA',\n        value: '𝜝',\n        codepoint: 120605,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL GAMMA',\n        value: '𝜞',\n        codepoint: 120606,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL DELTA',\n        value: '𝜟',\n        codepoint: 120607,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL EPSILON',\n        value: '𝜠',\n        codepoint: 120608,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL ZETA',\n        value: '𝜡',\n        codepoint: 120609,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL ETA',\n        value: '𝜢',\n        codepoint: 120610,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL THETA',\n        value: '𝜣',\n        codepoint: 120611,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL IOTA',\n        value: '𝜤',\n        codepoint: 120612,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL KAPPA',\n        value: '𝜥',\n        codepoint: 120613,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL LAMDA',\n        value: '𝜦',\n        codepoint: 120614,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL MU',\n        value: '𝜧',\n        codepoint: 120615,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL NU',\n        value: '𝜨',\n        codepoint: 120616,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL XI',\n        value: '𝜩',\n        codepoint: 120617,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL OMICRON',\n        value: '𝜪',\n        codepoint: 120618,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL PI',\n        value: '𝜫',\n        codepoint: 120619,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL RHO',\n        value: '𝜬',\n        codepoint: 120620,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL',\n        value: '𝜭',\n        codepoint: 120621,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL SIGMA',\n        value: '𝜮',\n        codepoint: 120622,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL TAU',\n        value: '𝜯',\n        codepoint: 120623,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL UPSILON',\n        value: '𝜰',\n        codepoint: 120624,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL PHI',\n        value: '𝜱',\n        codepoint: 120625,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL CHI',\n        value: '𝜲',\n        codepoint: 120626,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL PSI',\n        value: '𝜳',\n        codepoint: 120627,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL OMEGA',\n        value: '𝜴',\n        codepoint: 120628,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC NABLA',\n        value: '𝜵',\n        codepoint: 120629,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL ALPHA',\n        value: '𝜶',\n        codepoint: 120630,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL BETA',\n        value: '𝜷',\n        codepoint: 120631,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL GAMMA',\n        value: '𝜸',\n        codepoint: 120632,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL DELTA',\n        value: '𝜹',\n        codepoint: 120633,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL EPSILON',\n        value: '𝜺',\n        codepoint: 120634,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL ZETA',\n        value: '𝜻',\n        codepoint: 120635,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL ETA',\n        value: '𝜼',\n        codepoint: 120636,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL THETA',\n        value: '𝜽',\n        codepoint: 120637,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL IOTA',\n        value: '𝜾',\n        codepoint: 120638,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL KAPPA',\n        value: '𝜿',\n        codepoint: 120639,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL LAMDA',\n        value: '𝝀',\n        codepoint: 120640,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL MU',\n        value: '𝝁',\n        codepoint: 120641,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL NU',\n        value: '𝝂',\n        codepoint: 120642,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL XI',\n        value: '𝝃',\n        codepoint: 120643,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL OMICRON',\n        value: '𝝄',\n        codepoint: 120644,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL PI',\n        value: '𝝅',\n        codepoint: 120645,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL RHO',\n        value: '𝝆',\n        codepoint: 120646,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA',\n        value: '𝝇',\n        codepoint: 120647,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL SIGMA',\n        value: '𝝈',\n        codepoint: 120648,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL TAU',\n        value: '𝝉',\n        codepoint: 120649,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL UPSILON',\n        value: '𝝊',\n        codepoint: 120650,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL PHI',\n        value: '𝝋',\n        codepoint: 120651,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL CHI',\n        value: '𝝌',\n        codepoint: 120652,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL PSI',\n        value: '𝝍',\n        codepoint: 120653,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL OMEGA',\n        value: '𝝎',\n        codepoint: 120654,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL',\n        value: '𝝏',\n        codepoint: 120655,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC EPSILON SYMBOL',\n        value: '𝝐',\n        codepoint: 120656,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC THETA SYMBOL',\n        value: '𝝑',\n        codepoint: 120657,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC KAPPA SYMBOL',\n        value: '𝝒',\n        codepoint: 120658,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC PHI SYMBOL',\n        value: '𝝓',\n        codepoint: 120659,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC RHO SYMBOL',\n        value: '𝝔',\n        codepoint: 120660,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC PI SYMBOL',\n        value: '𝝕',\n        codepoint: 120661,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA',\n        value: '𝝖',\n        codepoint: 120662,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA',\n        value: '𝝗',\n        codepoint: 120663,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA',\n        value: '𝝘',\n        codepoint: 120664,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA',\n        value: '𝝙',\n        codepoint: 120665,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON',\n        value: '𝝚',\n        codepoint: 120666,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA',\n        value: '𝝛',\n        codepoint: 120667,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA',\n        value: '𝝜',\n        codepoint: 120668,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA',\n        value: '𝝝',\n        codepoint: 120669,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA',\n        value: '𝝞',\n        codepoint: 120670,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA',\n        value: '𝝟',\n        codepoint: 120671,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA',\n        value: '𝝠',\n        codepoint: 120672,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL MU',\n        value: '𝝡',\n        codepoint: 120673,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL NU',\n        value: '𝝢',\n        codepoint: 120674,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL XI',\n        value: '𝝣',\n        codepoint: 120675,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON',\n        value: '𝝤',\n        codepoint: 120676,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PI',\n        value: '𝝥',\n        codepoint: 120677,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO',\n        value: '𝝦',\n        codepoint: 120678,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL',\n        value: '𝝧',\n        codepoint: 120679,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA',\n        value: '𝝨',\n        codepoint: 120680,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU',\n        value: '𝝩',\n        codepoint: 120681,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON',\n        value: '𝝪',\n        codepoint: 120682,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI',\n        value: '𝝫',\n        codepoint: 120683,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI',\n        value: '𝝬',\n        codepoint: 120684,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI',\n        value: '𝝭',\n        codepoint: 120685,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA',\n        value: '𝝮',\n        codepoint: 120686,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD NABLA',\n        value: '𝝯',\n        codepoint: 120687,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA',\n        value: '𝝰',\n        codepoint: 120688,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL BETA',\n        value: '𝝱',\n        codepoint: 120689,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA',\n        value: '𝝲',\n        codepoint: 120690,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL DELTA',\n        value: '𝝳',\n        codepoint: 120691,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON',\n        value: '𝝴',\n        codepoint: 120692,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ZETA',\n        value: '𝝵',\n        codepoint: 120693,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ETA',\n        value: '𝝶',\n        codepoint: 120694,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL THETA',\n        value: '𝝷',\n        codepoint: 120695,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL IOTA',\n        value: '𝝸',\n        codepoint: 120696,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA',\n        value: '𝝹',\n        codepoint: 120697,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA',\n        value: '𝝺',\n        codepoint: 120698,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL MU',\n        value: '𝝻',\n        codepoint: 120699,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL NU',\n        value: '𝝼',\n        codepoint: 120700,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL XI',\n        value: '𝝽',\n        codepoint: 120701,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON',\n        value: '𝝾',\n        codepoint: 120702,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PI',\n        value: '𝝿',\n        codepoint: 120703,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL RHO',\n        value: '𝞀',\n        codepoint: 120704,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA',\n        value: '𝞁',\n        codepoint: 120705,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA',\n        value: '𝞂',\n        codepoint: 120706,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL TAU',\n        value: '𝞃',\n        codepoint: 120707,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON',\n        value: '𝞄',\n        codepoint: 120708,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PHI',\n        value: '𝞅',\n        codepoint: 120709,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL CHI',\n        value: '𝞆',\n        codepoint: 120710,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PSI',\n        value: '𝞇',\n        codepoint: 120711,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA',\n        value: '𝞈',\n        codepoint: 120712,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL',\n        value: '𝞉',\n        codepoint: 120713,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL',\n        value: '𝞊',\n        codepoint: 120714,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL',\n        value: '𝞋',\n        codepoint: 120715,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL',\n        value: '𝞌',\n        codepoint: 120716,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL',\n        value: '𝞍',\n        codepoint: 120717,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL',\n        value: '𝞎',\n        codepoint: 120718,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD PI SYMBOL',\n        value: '𝞏',\n        codepoint: 120719,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA',\n        value: '𝞐',\n        codepoint: 120720,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA',\n        value: '𝞑',\n        codepoint: 120721,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA',\n        value: '𝞒',\n        codepoint: 120722,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA',\n        value: '𝞓',\n        codepoint: 120723,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON',\n        value: '𝞔',\n        codepoint: 120724,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA',\n        value: '𝞕',\n        codepoint: 120725,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA',\n        value: '𝞖',\n        codepoint: 120726,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA',\n        value: '𝞗',\n        codepoint: 120727,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA',\n        value: '𝞘',\n        codepoint: 120728,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA',\n        value: '𝞙',\n        codepoint: 120729,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA',\n        value: '𝞚',\n        codepoint: 120730,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU',\n        value: '𝞛',\n        codepoint: 120731,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU',\n        value: '𝞜',\n        codepoint: 120732,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI',\n        value: '𝞝',\n        codepoint: 120733,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON',\n        value: '𝞞',\n        codepoint: 120734,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI',\n        value: '𝞟',\n        codepoint: 120735,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO',\n        value: '𝞠',\n        codepoint: 120736,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL',\n        value: '𝞡',\n        codepoint: 120737,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA',\n        value: '𝞢',\n        codepoint: 120738,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU',\n        value: '𝞣',\n        codepoint: 120739,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON',\n        value: '𝞤',\n        codepoint: 120740,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI',\n        value: '𝞥',\n        codepoint: 120741,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI',\n        value: '𝞦',\n        codepoint: 120742,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI',\n        value: '𝞧',\n        codepoint: 120743,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA',\n        value: '𝞨',\n        codepoint: 120744,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA',\n        value: '𝞩',\n        codepoint: 120745,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA',\n        value: '𝞪',\n        codepoint: 120746,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA',\n        value: '𝞫',\n        codepoint: 120747,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA',\n        value: '𝞬',\n        codepoint: 120748,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA',\n        value: '𝞭',\n        codepoint: 120749,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON',\n        value: '𝞮',\n        codepoint: 120750,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA',\n        value: '𝞯',\n        codepoint: 120751,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA',\n        value: '𝞰',\n        codepoint: 120752,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA',\n        value: '𝞱',\n        codepoint: 120753,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA',\n        value: '𝞲',\n        codepoint: 120754,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA',\n        value: '𝞳',\n        codepoint: 120755,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA',\n        value: '𝞴',\n        codepoint: 120756,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU',\n        value: '𝞵',\n        codepoint: 120757,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU',\n        value: '𝞶',\n        codepoint: 120758,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI',\n        value: '𝞷',\n        codepoint: 120759,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON',\n        value: '𝞸',\n        codepoint: 120760,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI',\n        value: '𝞹',\n        codepoint: 120761,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO',\n        value: '𝞺',\n        codepoint: 120762,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA',\n        value: '𝞻',\n        codepoint: 120763,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA',\n        value: '𝞼',\n        codepoint: 120764,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU',\n        value: '𝞽',\n        codepoint: 120765,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON',\n        value: '𝞾',\n        codepoint: 120766,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI',\n        value: '𝞿',\n        codepoint: 120767,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI',\n        value: '𝟀',\n        codepoint: 120768,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI',\n        value: '𝟁',\n        codepoint: 120769,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA',\n        value: '𝟂',\n        codepoint: 120770,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL',\n        value: '𝟃',\n        codepoint: 120771,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL',\n        value: '𝟄',\n        codepoint: 120772,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL',\n        value: '𝟅',\n        codepoint: 120773,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL',\n        value: '𝟆',\n        codepoint: 120774,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL',\n        value: '𝟇',\n        codepoint: 120775,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL',\n        value: '𝟈',\n        codepoint: 120776,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL',\n        value: '𝟉',\n        codepoint: 120777,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT ZERO',\n        value: '𝟎',\n        codepoint: 120782,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT ONE',\n        value: '𝟏',\n        codepoint: 120783,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT TWO',\n        value: '𝟐',\n        codepoint: 120784,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT THREE',\n        value: '𝟑',\n        codepoint: 120785,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT FOUR',\n        value: '𝟒',\n        codepoint: 120786,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT FIVE',\n        value: '𝟓',\n        codepoint: 120787,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT SIX',\n        value: '𝟔',\n        codepoint: 120788,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT SEVEN',\n        value: '𝟕',\n        codepoint: 120789,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT EIGHT',\n        value: '𝟖',\n        codepoint: 120790,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT NINE',\n        value: '𝟗',\n        codepoint: 120791,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO',\n        value: '𝟘',\n        codepoint: 120792,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT ONE',\n        value: '𝟙',\n        codepoint: 120793,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT TWO',\n        value: '𝟚',\n        codepoint: 120794,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT THREE',\n        value: '𝟛',\n        codepoint: 120795,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR',\n        value: '𝟜',\n        codepoint: 120796,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE',\n        value: '𝟝',\n        codepoint: 120797,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT SIX',\n        value: '𝟞',\n        codepoint: 120798,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN',\n        value: '𝟟',\n        codepoint: 120799,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT',\n        value: '𝟠',\n        codepoint: 120800,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT NINE',\n        value: '𝟡',\n        codepoint: 120801,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT ZERO',\n        value: '𝟢',\n        codepoint: 120802,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT ONE',\n        value: '𝟣',\n        codepoint: 120803,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT TWO',\n        value: '𝟤',\n        codepoint: 120804,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT THREE',\n        value: '𝟥',\n        codepoint: 120805,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT FOUR',\n        value: '𝟦',\n        codepoint: 120806,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT FIVE',\n        value: '𝟧',\n        codepoint: 120807,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT SIX',\n        value: '𝟨',\n        codepoint: 120808,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT SEVEN',\n        value: '𝟩',\n        codepoint: 120809,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT EIGHT',\n        value: '𝟪',\n        codepoint: 120810,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT NINE',\n        value: '𝟫',\n        codepoint: 120811,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO',\n        value: '𝟬',\n        codepoint: 120812,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT ONE',\n        value: '𝟭',\n        codepoint: 120813,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT TWO',\n        value: '𝟮',\n        codepoint: 120814,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT THREE',\n        value: '𝟯',\n        codepoint: 120815,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR',\n        value: '𝟰',\n        codepoint: 120816,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE',\n        value: '𝟱',\n        codepoint: 120817,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT SIX',\n        value: '𝟲',\n        codepoint: 120818,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN',\n        value: '𝟳',\n        codepoint: 120819,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT',\n        value: '𝟴',\n        codepoint: 120820,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT NINE',\n        value: '𝟵',\n        codepoint: 120821,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT ZERO',\n        value: '𝟶',\n        codepoint: 120822,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT ONE',\n        value: '𝟷',\n        codepoint: 120823,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT TWO',\n        value: '𝟸',\n        codepoint: 120824,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT THREE',\n        value: '𝟹',\n        codepoint: 120825,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT FOUR',\n        value: '𝟺',\n        codepoint: 120826,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT FIVE',\n        value: '𝟻',\n        codepoint: 120827,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT SIX',\n        value: '𝟼',\n        codepoint: 120828,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT SEVEN',\n        value: '𝟽',\n        codepoint: 120829,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT EIGHT',\n        value: '𝟾',\n        codepoint: 120830,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT NINE',\n        value: '𝟿',\n        codepoint: 120831,\n      },\n    ],\n  },\n  {\n    name: 'Punctuation',\n    symbols: [\n      {\n        name: 'HYPHEN',\n        value: '‐',\n        codepoint: 8208,\n      },\n      {\n        name: 'NON-BREAKING HYPHEN',\n        value: '‑',\n        codepoint: 8209,\n      },\n      {\n        name: 'FIGURE DASH',\n        value: '‒',\n        codepoint: 8210,\n      },\n      {\n        name: 'EN DASH',\n        value: '–',\n        codepoint: 8211,\n      },\n      {\n        name: 'EM DASH',\n        value: '—',\n        codepoint: 8212,\n      },\n      {\n        name: 'HORIZONTAL BAR',\n        value: '―',\n        codepoint: 8213,\n      },\n      {\n        name: 'DOUBLE VERTICAL LINE',\n        value: '‖',\n        codepoint: 8214,\n      },\n      {\n        name: 'DOUBLE LOW LINE',\n        value: '‗',\n        codepoint: 8215,\n      },\n      {\n        name: 'LEFT SINGLE QUOTATION MARK',\n        value: '‘',\n        codepoint: 8216,\n      },\n      {\n        name: 'RIGHT SINGLE QUOTATION MARK',\n        value: '’',\n        codepoint: 8217,\n      },\n      {\n        name: 'SINGLE LOW-9 QUOTATION MARK',\n        value: '‚',\n        codepoint: 8218,\n      },\n      {\n        name: 'SINGLE HIGH-REVERSED-9 QUOTATION MARK',\n        value: '‛',\n        codepoint: 8219,\n      },\n      {\n        name: 'LEFT DOUBLE QUOTATION MARK',\n        value: '“',\n        codepoint: 8220,\n      },\n      {\n        name: 'RIGHT DOUBLE QUOTATION MARK',\n        value: '”',\n        codepoint: 8221,\n      },\n      {\n        name: 'DOUBLE LOW-9 QUOTATION MARK',\n        value: '„',\n        codepoint: 8222,\n      },\n      {\n        name: 'DOUBLE HIGH-REVERSED-9 QUOTATION MARK',\n        value: '‟',\n        codepoint: 8223,\n      },\n      {\n        name: 'DAGGER',\n        value: '†',\n        codepoint: 8224,\n      },\n      {\n        name: 'DOUBLE DAGGER',\n        value: '‡',\n        codepoint: 8225,\n      },\n      {\n        name: 'BULLET',\n        value: '•',\n        codepoint: 8226,\n      },\n      {\n        name: 'TRIANGULAR BULLET',\n        value: '‣',\n        codepoint: 8227,\n      },\n      {\n        name: 'ONE DOT LEADER',\n        value: '․',\n        codepoint: 8228,\n      },\n      {\n        name: 'TWO DOT LEADER',\n        value: '‥',\n        codepoint: 8229,\n      },\n      {\n        name: 'HORIZONTAL ELLIPSIS',\n        value: '…',\n        codepoint: 8230,\n      },\n      {\n        name: 'HYPHENATION POINT',\n        value: '‧',\n        codepoint: 8231,\n      },\n      {\n        name: 'NARROW NO-BREAK SPACE',\n        value: ' ',\n        codepoint: 8239,\n      },\n      {\n        name: 'PER MILLE SIGN',\n        value: '‰',\n        codepoint: 8240,\n      },\n      {\n        name: 'PER TEN THOUSAND SIGN',\n        value: '‱',\n        codepoint: 8241,\n      },\n      {\n        name: 'PRIME',\n        value: '′',\n        codepoint: 8242,\n      },\n      {\n        name: 'DOUBLE PRIME',\n        value: '″',\n        codepoint: 8243,\n      },\n      {\n        name: 'TRIPLE PRIME',\n        value: '‴',\n        codepoint: 8244,\n      },\n      {\n        name: 'REVERSED PRIME',\n        value: '‵',\n        codepoint: 8245,\n      },\n      {\n        name: 'REVERSED DOUBLE PRIME',\n        value: '‶',\n        codepoint: 8246,\n      },\n      {\n        name: 'REVERSED TRIPLE PRIME',\n        value: '‷',\n        codepoint: 8247,\n      },\n      {\n        name: 'CARET',\n        value: '‸',\n        codepoint: 8248,\n      },\n      {\n        name: 'SINGLE LEFT-POINTING ANGLE QUOTATION MARK',\n        value: '‹',\n        codepoint: 8249,\n      },\n      {\n        name: 'SINGLE RIGHT-POINTING ANGLE QUOTATION MARK',\n        value: '›',\n        codepoint: 8250,\n      },\n      {\n        name: 'REFERENCE MARK',\n        value: '※',\n        codepoint: 8251,\n      },\n      {\n        name: 'INTERROBANG',\n        value: '‽',\n        codepoint: 8253,\n      },\n      {\n        name: 'OVERLINE',\n        value: '‾',\n        codepoint: 8254,\n      },\n      {\n        name: 'UNDERTIE',\n        value: '‿',\n        codepoint: 8255,\n      },\n      {\n        name: 'CHARACTER TIE',\n        value: '⁀',\n        codepoint: 8256,\n      },\n      {\n        name: 'CARET INSERTION POINT',\n        value: '⁁',\n        codepoint: 8257,\n      },\n      {\n        name: 'ASTERISM',\n        value: '⁂',\n        codepoint: 8258,\n      },\n      {\n        name: 'HYPHEN BULLET',\n        value: '⁃',\n        codepoint: 8259,\n      },\n      {\n        name: 'FRACTION SLASH',\n        value: '⁄',\n        codepoint: 8260,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET WITH QUILL',\n        value: '⁅',\n        codepoint: 8261,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET WITH QUILL',\n        value: '⁆',\n        codepoint: 8262,\n      },\n      {\n        name: 'DOUBLE QUESTION MARK',\n        value: '⁇',\n        codepoint: 8263,\n      },\n      {\n        name: 'QUESTION EXCLAMATION MARK',\n        value: '⁈',\n        codepoint: 8264,\n      },\n      {\n        name: 'TIRONIAN SIGN ET',\n        value: '⁊',\n        codepoint: 8266,\n      },\n      {\n        name: 'REVERSED PILCROW SIGN',\n        value: '⁋',\n        codepoint: 8267,\n      },\n      {\n        name: 'BLACK LEFTWARDS BULLET',\n        value: '⁌',\n        codepoint: 8268,\n      },\n      {\n        name: 'BLACK RIGHTWARDS BULLET',\n        value: '⁍',\n        codepoint: 8269,\n      },\n      {\n        name: 'LOW ASTERISK',\n        value: '⁎',\n        codepoint: 8270,\n      },\n      {\n        name: 'REVERSED SEMICOLON',\n        value: '⁏',\n        codepoint: 8271,\n      },\n      {\n        name: 'CLOSE UP',\n        value: '⁐',\n        codepoint: 8272,\n      },\n      {\n        name: 'TWO ASTERISKS ALIGNED VERTICALLY',\n        value: '⁑',\n        codepoint: 8273,\n      },\n      {\n        name: 'COMMERCIAL MINUS SIGN',\n        value: '⁒',\n        codepoint: 8274,\n      },\n      {\n        name: 'SWUNG DASH',\n        value: '⁓',\n        codepoint: 8275,\n      },\n      {\n        name: 'INVERTED UNDERTIE',\n        value: '⁔',\n        codepoint: 8276,\n      },\n      {\n        name: 'FLOWER PUNCTUATION MARK',\n        value: '⁕',\n        codepoint: 8277,\n      },\n      {\n        name: 'THREE DOT PUNCTUATION',\n        value: '⁖',\n        codepoint: 8278,\n      },\n      {\n        name: 'QUADRUPLE PRIME',\n        value: '⁗',\n        codepoint: 8279,\n      },\n      {\n        name: 'FOUR DOT PUNCTUATION',\n        value: '⁘',\n        codepoint: 8280,\n      },\n      {\n        name: 'FIVE DOT PUNCTUATION',\n        value: '⁙',\n        codepoint: 8281,\n      },\n      {\n        name: 'TWO DOT PUNCTUATION',\n        value: '⁚',\n        codepoint: 8282,\n      },\n      {\n        name: 'FOUR DOT MARK',\n        value: '⁛',\n        codepoint: 8283,\n      },\n      {\n        name: 'DOTTED CROSS',\n        value: '⁜',\n        codepoint: 8284,\n      },\n      {\n        name: 'TRICOLON',\n        value: '⁝',\n        codepoint: 8285,\n      },\n      {\n        name: 'VERTICAL FOUR DOTS',\n        value: '⁞',\n        codepoint: 8286,\n      },\n      {\n        name: 'MEDIUM MATHEMATICAL SPACE',\n        value: ' ',\n        codepoint: 8287,\n      },\n      {\n        name: 'RIGHT ANGLE SUBSTITUTION MARKER',\n        value: '⸀',\n        codepoint: 11776,\n      },\n      {\n        name: 'RIGHT ANGLE DOTTED SUBSTITUTION MARKER',\n        value: '⸁',\n        codepoint: 11777,\n      },\n      {\n        name: 'LEFT SUBSTITUTION BRACKET',\n        value: '⸂',\n        codepoint: 11778,\n      },\n      {\n        name: 'RIGHT SUBSTITUTION BRACKET',\n        value: '⸃',\n        codepoint: 11779,\n      },\n      {\n        name: 'LEFT DOTTED SUBSTITUTION BRACKET',\n        value: '⸄',\n        codepoint: 11780,\n      },\n      {\n        name: 'RIGHT DOTTED SUBSTITUTION BRACKET',\n        value: '⸅',\n        codepoint: 11781,\n      },\n      {\n        name: 'RAISED INTERPOLATION MARKER',\n        value: '⸆',\n        codepoint: 11782,\n      },\n      {\n        name: 'RAISED DOTTED INTERPOLATION MARKER',\n        value: '⸇',\n        codepoint: 11783,\n      },\n      {\n        name: 'DOTTED TRANSPOSITION MARKER',\n        value: '⸈',\n        codepoint: 11784,\n      },\n      {\n        name: 'LEFT TRANSPOSITION BRACKET',\n        value: '⸉',\n        codepoint: 11785,\n      },\n      {\n        name: 'RIGHT TRANSPOSITION BRACKET',\n        value: '⸊',\n        codepoint: 11786,\n      },\n      {\n        name: 'RAISED SQUARE',\n        value: '⸋',\n        codepoint: 11787,\n      },\n      {\n        name: 'LEFT RAISED OMISSION BRACKET',\n        value: '⸌',\n        codepoint: 11788,\n      },\n      {\n        name: 'RIGHT RAISED OMISSION BRACKET',\n        value: '⸍',\n        codepoint: 11789,\n      },\n      {\n        name: 'EDITORIAL CORONIS',\n        value: '⸎',\n        codepoint: 11790,\n      },\n      {\n        name: 'PARAGRAPHOS',\n        value: '⸏',\n        codepoint: 11791,\n      },\n      {\n        name: 'FORKED PARAGRAPHOS',\n        value: '⸐',\n        codepoint: 11792,\n      },\n      {\n        name: 'REVERSED FORKED PARAGRAPHOS',\n        value: '⸑',\n        codepoint: 11793,\n      },\n      {\n        name: 'HYPODIASTOLE',\n        value: '⸒',\n        codepoint: 11794,\n      },\n      {\n        name: 'DOTTED OBELOS',\n        value: '⸓',\n        codepoint: 11795,\n      },\n      {\n        name: 'DOWNWARDS ANCORA',\n        value: '⸔',\n        codepoint: 11796,\n      },\n      {\n        name: 'UPWARDS ANCORA',\n        value: '⸕',\n        codepoint: 11797,\n      },\n      {\n        name: 'DOTTED RIGHT-POINTING ANGLE',\n        value: '⸖',\n        codepoint: 11798,\n      },\n      {\n        name: 'DOUBLE OBLIQUE HYPHEN',\n        value: '⸗',\n        codepoint: 11799,\n      },\n      {\n        name: 'INVERTED INTERROBANG',\n        value: '⸘',\n        codepoint: 11800,\n      },\n      {\n        name: 'HYPHEN WITH DIAERESIS',\n        value: '⸚',\n        codepoint: 11802,\n      },\n      {\n        name: 'TILDE WITH RING ABOVE',\n        value: '⸛',\n        codepoint: 11803,\n      },\n      {\n        name: 'LEFT LOW PARAPHRASE BRACKET',\n        value: '⸜',\n        codepoint: 11804,\n      },\n      {\n        name: 'RIGHT LOW PARAPHRASE BRACKET',\n        value: '⸝',\n        codepoint: 11805,\n      },\n      {\n        name: 'TILDE WITH DOT ABOVE',\n        value: '⸞',\n        codepoint: 11806,\n      },\n      {\n        name: 'TILDE WITH DOT BELOW',\n        value: '⸟',\n        codepoint: 11807,\n      },\n      {\n        name: 'LEFT VERTICAL BAR WITH QUILL',\n        value: '⸠',\n        codepoint: 11808,\n      },\n      {\n        name: 'RIGHT VERTICAL BAR WITH QUILL',\n        value: '⸡',\n        codepoint: 11809,\n      },\n      {\n        name: 'TOP LEFT HALF BRACKET',\n        value: '⸢',\n        codepoint: 11810,\n      },\n      {\n        name: 'TOP RIGHT HALF BRACKET',\n        value: '⸣',\n        codepoint: 11811,\n      },\n      {\n        name: 'BOTTOM LEFT HALF BRACKET',\n        value: '⸤',\n        codepoint: 11812,\n      },\n      {\n        name: 'BOTTOM RIGHT HALF BRACKET',\n        value: '⸥',\n        codepoint: 11813,\n      },\n      {\n        name: 'LEFT SIDEWAYS U BRACKET',\n        value: '⸦',\n        codepoint: 11814,\n      },\n      {\n        name: 'RIGHT SIDEWAYS U BRACKET',\n        value: '⸧',\n        codepoint: 11815,\n      },\n      {\n        name: 'LEFT DOUBLE PARENTHESIS',\n        value: '⸨',\n        codepoint: 11816,\n      },\n      {\n        name: 'RIGHT DOUBLE PARENTHESIS',\n        value: '⸩',\n        codepoint: 11817,\n      },\n      {\n        name: 'TWO DOTS OVER ONE DOT PUNCTUATION',\n        value: '⸪',\n        codepoint: 11818,\n      },\n      {\n        name: 'ONE DOT OVER TWO DOTS PUNCTUATION',\n        value: '⸫',\n        codepoint: 11819,\n      },\n      {\n        name: 'SQUARED FOUR DOT PUNCTUATION',\n        value: '⸬',\n        codepoint: 11820,\n      },\n      {\n        name: 'FIVE DOT MARK',\n        value: '⸭',\n        codepoint: 11821,\n      },\n      {\n        name: 'REVERSED QUESTION MARK',\n        value: '⸮',\n        codepoint: 11822,\n      },\n      {\n        name: 'VERTICAL TILDE',\n        value: 'ⸯ',\n        codepoint: 11823,\n      },\n      {\n        name: 'RING POINT',\n        value: '⸰',\n        codepoint: 11824,\n      },\n      {\n        name: 'WORD SEPARATOR MIDDLE DOT',\n        value: '⸱',\n        codepoint: 11825,\n      },\n    ],\n  },\n  {\n    name: 'Technical',\n    symbols: [\n      {\n        name: 'DIAMETER SIGN',\n        value: '⌀',\n        codepoint: 8960,\n      },\n      {\n        name: 'ELECTRIC ARROW',\n        value: '⌁',\n        codepoint: 8961,\n      },\n      {\n        name: 'HOUSE',\n        value: '⌂',\n        codepoint: 8962,\n      },\n      {\n        name: 'UP ARROWHEAD',\n        value: '⌃',\n        codepoint: 8963,\n      },\n      {\n        name: 'DOWN ARROWHEAD',\n        value: '⌄',\n        codepoint: 8964,\n      },\n      {\n        name: 'PROJECTIVE',\n        value: '⌅',\n        codepoint: 8965,\n      },\n      {\n        name: 'PERSPECTIVE',\n        value: '⌆',\n        codepoint: 8966,\n      },\n      {\n        name: 'WAVY LINE',\n        value: '⌇',\n        codepoint: 8967,\n      },\n      {\n        name: 'LEFT CEILING',\n        value: '⌈',\n        codepoint: 8968,\n      },\n      {\n        name: 'RIGHT CEILING',\n        value: '⌉',\n        codepoint: 8969,\n      },\n      {\n        name: 'LEFT FLOOR',\n        value: '⌊',\n        codepoint: 8970,\n      },\n      {\n        name: 'RIGHT FLOOR',\n        value: '⌋',\n        codepoint: 8971,\n      },\n      {\n        name: 'BOTTOM RIGHT CROP',\n        value: '⌌',\n        codepoint: 8972,\n      },\n      {\n        name: 'BOTTOM LEFT CROP',\n        value: '⌍',\n        codepoint: 8973,\n      },\n      {\n        name: 'TOP RIGHT CROP',\n        value: '⌎',\n        codepoint: 8974,\n      },\n      {\n        name: 'TOP LEFT CROP',\n        value: '⌏',\n        codepoint: 8975,\n      },\n      {\n        name: 'REVERSED NOT SIGN',\n        value: '⌐',\n        codepoint: 8976,\n      },\n      {\n        name: 'SQUARE LOZENGE',\n        value: '⌑',\n        codepoint: 8977,\n      },\n      {\n        name: 'ARC',\n        value: '⌒',\n        codepoint: 8978,\n      },\n      {\n        name: 'SEGMENT',\n        value: '⌓',\n        codepoint: 8979,\n      },\n      {\n        name: 'SECTOR',\n        value: '⌔',\n        codepoint: 8980,\n      },\n      {\n        name: 'TELEPHONE RECORDER',\n        value: '⌕',\n        codepoint: 8981,\n      },\n      {\n        name: 'POSITION INDICATOR',\n        value: '⌖',\n        codepoint: 8982,\n      },\n      {\n        name: 'VIEWDATA SQUARE',\n        value: '⌗',\n        codepoint: 8983,\n      },\n      {\n        name: 'PLACE OF INTEREST SIGN',\n        value: '⌘',\n        codepoint: 8984,\n      },\n      {\n        name: 'TURNED NOT SIGN',\n        value: '⌙',\n        codepoint: 8985,\n      },\n      {\n        name: 'TOP LEFT CORNER',\n        value: '⌜',\n        codepoint: 8988,\n      },\n      {\n        name: 'TOP RIGHT CORNER',\n        value: '⌝',\n        codepoint: 8989,\n      },\n      {\n        name: 'BOTTOM LEFT CORNER',\n        value: '⌞',\n        codepoint: 8990,\n      },\n      {\n        name: 'BOTTOM RIGHT CORNER',\n        value: '⌟',\n        codepoint: 8991,\n      },\n      {\n        name: 'TOP HALF INTEGRAL',\n        value: '⌠',\n        codepoint: 8992,\n      },\n      {\n        name: 'BOTTOM HALF INTEGRAL',\n        value: '⌡',\n        codepoint: 8993,\n      },\n      {\n        name: 'FROWN',\n        value: '⌢',\n        codepoint: 8994,\n      },\n      {\n        name: 'SMILE',\n        value: '⌣',\n        codepoint: 8995,\n      },\n      {\n        name: 'UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS',\n        value: '⌤',\n        codepoint: 8996,\n      },\n      {\n        name: 'OPTION KEY',\n        value: '⌥',\n        codepoint: 8997,\n      },\n      {\n        name: 'ERASE TO THE RIGHT',\n        value: '⌦',\n        codepoint: 8998,\n      },\n      {\n        name: 'X IN A RECTANGLE BOX',\n        value: '⌧',\n        codepoint: 8999,\n      },\n      {\n        name: 'LEFT-POINTING ANGLE BRACKET',\n        value: '〈',\n        codepoint: 9001,\n      },\n      {\n        name: 'RIGHT-POINTING ANGLE BRACKET',\n        value: '〉',\n        codepoint: 9002,\n      },\n      {\n        name: 'ERASE TO THE LEFT',\n        value: '⌫',\n        codepoint: 9003,\n      },\n      {\n        name: 'BENZENE RING',\n        value: '⌬',\n        codepoint: 9004,\n      },\n      {\n        name: 'CYLINDRICITY',\n        value: '⌭',\n        codepoint: 9005,\n      },\n      {\n        name: 'ALL AROUND-PROFILE',\n        value: '⌮',\n        codepoint: 9006,\n      },\n      {\n        name: 'SYMMETRY',\n        value: '⌯',\n        codepoint: 9007,\n      },\n      {\n        name: 'TOTAL RUNOUT',\n        value: '⌰',\n        codepoint: 9008,\n      },\n      {\n        name: 'DIMENSION ORIGIN',\n        value: '⌱',\n        codepoint: 9009,\n      },\n      {\n        name: 'CONICAL TAPER',\n        value: '⌲',\n        codepoint: 9010,\n      },\n      {\n        name: 'SLOPE',\n        value: '⌳',\n        codepoint: 9011,\n      },\n      {\n        name: 'COUNTERBORE',\n        value: '⌴',\n        codepoint: 9012,\n      },\n      {\n        name: 'COUNTERSINK',\n        value: '⌵',\n        codepoint: 9013,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL I-BEAM',\n        value: '⌶',\n        codepoint: 9014,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL SQUISH QUAD',\n        value: '⌷',\n        codepoint: 9015,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD EQUAL',\n        value: '⌸',\n        codepoint: 9016,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DIVIDE',\n        value: '⌹',\n        codepoint: 9017,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DIAMOND',\n        value: '⌺',\n        codepoint: 9018,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD JOT',\n        value: '⌻',\n        codepoint: 9019,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD CIRCLE',\n        value: '⌼',\n        codepoint: 9020,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE STILE',\n        value: '⌽',\n        codepoint: 9021,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE JOT',\n        value: '⌾',\n        codepoint: 9022,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL SLASH BAR',\n        value: '⌿',\n        codepoint: 9023,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL BACKSLASH BAR',\n        value: '⍀',\n        codepoint: 9024,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD SLASH',\n        value: '⍁',\n        codepoint: 9025,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD BACKSLASH',\n        value: '⍂',\n        codepoint: 9026,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD LESS-THAN',\n        value: '⍃',\n        codepoint: 9027,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD GREATER-THAN',\n        value: '⍄',\n        codepoint: 9028,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL LEFTWARDS VANE',\n        value: '⍅',\n        codepoint: 9029,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL RIGHTWARDS VANE',\n        value: '⍆',\n        codepoint: 9030,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW',\n        value: '⍇',\n        codepoint: 9031,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW',\n        value: '⍈',\n        codepoint: 9032,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH',\n        value: '⍉',\n        codepoint: 9033,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR',\n        value: '⍊',\n        codepoint: 9034,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DELTA STILE',\n        value: '⍋',\n        codepoint: 9035,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DOWN CARET',\n        value: '⍌',\n        codepoint: 9036,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DELTA',\n        value: '⍍',\n        codepoint: 9037,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DOWN TACK JOT',\n        value: '⍎',\n        codepoint: 9038,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UPWARDS VANE',\n        value: '⍏',\n        codepoint: 9039,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW',\n        value: '⍐',\n        codepoint: 9040,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UP TACK OVERBAR',\n        value: '⍑',\n        codepoint: 9041,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DEL STILE',\n        value: '⍒',\n        codepoint: 9042,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD UP CARET',\n        value: '⍓',\n        codepoint: 9043,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DEL',\n        value: '⍔',\n        codepoint: 9044,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UP TACK JOT',\n        value: '⍕',\n        codepoint: 9045,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DOWNWARDS VANE',\n        value: '⍖',\n        codepoint: 9046,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW',\n        value: '⍗',\n        codepoint: 9047,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUOTE UNDERBAR',\n        value: '⍘',\n        codepoint: 9048,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DELTA UNDERBAR',\n        value: '⍙',\n        codepoint: 9049,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR',\n        value: '⍚',\n        codepoint: 9050,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL JOT UNDERBAR',\n        value: '⍛',\n        codepoint: 9051,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR',\n        value: '⍜',\n        codepoint: 9052,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UP SHOE JOT',\n        value: '⍝',\n        codepoint: 9053,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUOTE QUAD',\n        value: '⍞',\n        codepoint: 9054,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE STAR',\n        value: '⍟',\n        codepoint: 9055,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD COLON',\n        value: '⍠',\n        codepoint: 9056,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UP TACK DIAERESIS',\n        value: '⍡',\n        codepoint: 9057,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DEL DIAERESIS',\n        value: '⍢',\n        codepoint: 9058,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL STAR DIAERESIS',\n        value: '⍣',\n        codepoint: 9059,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL JOT DIAERESIS',\n        value: '⍤',\n        codepoint: 9060,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS',\n        value: '⍥',\n        codepoint: 9061,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DOWN SHOE STILE',\n        value: '⍦',\n        codepoint: 9062,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL LEFT SHOE STILE',\n        value: '⍧',\n        codepoint: 9063,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL TILDE DIAERESIS',\n        value: '⍨',\n        codepoint: 9064,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS',\n        value: '⍩',\n        codepoint: 9065,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL COMMA BAR',\n        value: '⍪',\n        codepoint: 9066,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DEL TILDE',\n        value: '⍫',\n        codepoint: 9067,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL ZILDE',\n        value: '⍬',\n        codepoint: 9068,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL STILE TILDE',\n        value: '⍭',\n        codepoint: 9069,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR',\n        value: '⍮',\n        codepoint: 9070,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD NOT EQUAL',\n        value: '⍯',\n        codepoint: 9071,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD QUESTION',\n        value: '⍰',\n        codepoint: 9072,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DOWN CARET TILDE',\n        value: '⍱',\n        codepoint: 9073,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UP CARET TILDE',\n        value: '⍲',\n        codepoint: 9074,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL IOTA',\n        value: '⍳',\n        codepoint: 9075,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL RHO',\n        value: '⍴',\n        codepoint: 9076,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL OMEGA',\n        value: '⍵',\n        codepoint: 9077,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL ALPHA UNDERBAR',\n        value: '⍶',\n        codepoint: 9078,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL EPSILON UNDERBAR',\n        value: '⍷',\n        codepoint: 9079,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL IOTA UNDERBAR',\n        value: '⍸',\n        codepoint: 9080,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL OMEGA UNDERBAR',\n        value: '⍹',\n        codepoint: 9081,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL ALPHA',\n        value: '⍺',\n        codepoint: 9082,\n      },\n      {\n        name: 'NOT CHECK MARK',\n        value: '⍻',\n        codepoint: 9083,\n      },\n      {\n        name: 'RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW',\n        value: '⍼',\n        codepoint: 9084,\n      },\n      {\n        name: 'SHOULDERED OPEN BOX',\n        value: '⍽',\n        codepoint: 9085,\n      },\n      {\n        name: 'BELL SYMBOL',\n        value: '⍾',\n        codepoint: 9086,\n      },\n      {\n        name: 'VERTICAL LINE WITH MIDDLE DOT',\n        value: '⍿',\n        codepoint: 9087,\n      },\n      {\n        name: 'INSERTION SYMBOL',\n        value: '⎀',\n        codepoint: 9088,\n      },\n      {\n        name: 'CONTINUOUS UNDERLINE SYMBOL',\n        value: '⎁',\n        codepoint: 9089,\n      },\n      {\n        name: 'DISCONTINUOUS UNDERLINE SYMBOL',\n        value: '⎂',\n        codepoint: 9090,\n      },\n      {\n        name: 'EMPHASIS SYMBOL',\n        value: '⎃',\n        codepoint: 9091,\n      },\n      {\n        name: 'COMPOSITION SYMBOL',\n        value: '⎄',\n        codepoint: 9092,\n      },\n      {\n        name: 'WHITE SQUARE WITH CENTRE VERTICAL LINE',\n        value: '⎅',\n        codepoint: 9093,\n      },\n      {\n        name: 'ENTER SYMBOL',\n        value: '⎆',\n        codepoint: 9094,\n      },\n      {\n        name: 'ALTERNATIVE KEY SYMBOL',\n        value: '⎇',\n        codepoint: 9095,\n      },\n      {\n        name: 'HELM SYMBOL',\n        value: '⎈',\n        codepoint: 9096,\n      },\n      {\n        name: 'CIRCLED HORIZONTAL BAR WITH NOTCH',\n        value: '⎉',\n        codepoint: 9097,\n      },\n      {\n        name: 'CIRCLED TRIANGLE DOWN',\n        value: '⎊',\n        codepoint: 9098,\n      },\n      {\n        name: 'BROKEN CIRCLE WITH NORTHWEST ARROW',\n        value: '⎋',\n        codepoint: 9099,\n      },\n      {\n        name: 'UNDO SYMBOL',\n        value: '⎌',\n        codepoint: 9100,\n      },\n      {\n        name: 'MONOSTABLE SYMBOL',\n        value: '⎍',\n        codepoint: 9101,\n      },\n      {\n        name: 'HYSTERESIS SYMBOL',\n        value: '⎎',\n        codepoint: 9102,\n      },\n      {\n        name: 'OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL',\n        value: '⎏',\n        codepoint: 9103,\n      },\n      {\n        name: 'OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL',\n        value: '⎐',\n        codepoint: 9104,\n      },\n      {\n        name: 'PASSIVE-PULL-DOWN-OUTPUT SYMBOL',\n        value: '⎑',\n        codepoint: 9105,\n      },\n      {\n        name: 'PASSIVE-PULL-UP-OUTPUT SYMBOL',\n        value: '⎒',\n        codepoint: 9106,\n      },\n      {\n        name: 'DIRECT CURRENT SYMBOL FORM TWO',\n        value: '⎓',\n        codepoint: 9107,\n      },\n      {\n        name: 'SOFTWARE-FUNCTION SYMBOL',\n        value: '⎔',\n        codepoint: 9108,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD',\n        value: '⎕',\n        codepoint: 9109,\n      },\n      {\n        name: 'DECIMAL SEPARATOR KEY SYMBOL',\n        value: '⎖',\n        codepoint: 9110,\n      },\n      {\n        name: 'PREVIOUS PAGE',\n        value: '⎗',\n        codepoint: 9111,\n      },\n      {\n        name: 'NEXT PAGE',\n        value: '⎘',\n        codepoint: 9112,\n      },\n      {\n        name: 'PRINT SCREEN SYMBOL',\n        value: '⎙',\n        codepoint: 9113,\n      },\n      {\n        name: 'CLEAR SCREEN SYMBOL',\n        value: '⎚',\n        codepoint: 9114,\n      },\n      {\n        name: 'LEFT PARENTHESIS UPPER HOOK',\n        value: '⎛',\n        codepoint: 9115,\n      },\n      {\n        name: 'LEFT PARENTHESIS EXTENSION',\n        value: '⎜',\n        codepoint: 9116,\n      },\n      {\n        name: 'LEFT PARENTHESIS LOWER HOOK',\n        value: '⎝',\n        codepoint: 9117,\n      },\n      {\n        name: 'RIGHT PARENTHESIS UPPER HOOK',\n        value: '⎞',\n        codepoint: 9118,\n      },\n      {\n        name: 'RIGHT PARENTHESIS EXTENSION',\n        value: '⎟',\n        codepoint: 9119,\n      },\n      {\n        name: 'RIGHT PARENTHESIS LOWER HOOK',\n        value: '⎠',\n        codepoint: 9120,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET UPPER CORNER',\n        value: '⎡',\n        codepoint: 9121,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET EXTENSION',\n        value: '⎢',\n        codepoint: 9122,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET LOWER CORNER',\n        value: '⎣',\n        codepoint: 9123,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET UPPER CORNER',\n        value: '⎤',\n        codepoint: 9124,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET EXTENSION',\n        value: '⎥',\n        codepoint: 9125,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET LOWER CORNER',\n        value: '⎦',\n        codepoint: 9126,\n      },\n      {\n        name: 'LEFT CURLY BRACKET UPPER HOOK',\n        value: '⎧',\n        codepoint: 9127,\n      },\n      {\n        name: 'LEFT CURLY BRACKET MIDDLE PIECE',\n        value: '⎨',\n        codepoint: 9128,\n      },\n      {\n        name: 'LEFT CURLY BRACKET LOWER HOOK',\n        value: '⎩',\n        codepoint: 9129,\n      },\n      {\n        name: 'CURLY BRACKET EXTENSION',\n        value: '⎪',\n        codepoint: 9130,\n      },\n      {\n        name: 'RIGHT CURLY BRACKET UPPER HOOK',\n        value: '⎫',\n        codepoint: 9131,\n      },\n      {\n        name: 'RIGHT CURLY BRACKET MIDDLE PIECE',\n        value: '⎬',\n        codepoint: 9132,\n      },\n      {\n        name: 'RIGHT CURLY BRACKET LOWER HOOK',\n        value: '⎭',\n        codepoint: 9133,\n      },\n      {\n        name: 'INTEGRAL EXTENSION',\n        value: '⎮',\n        codepoint: 9134,\n      },\n      {\n        name: 'HORIZONTAL LINE EXTENSION',\n        value: '⎯',\n        codepoint: 9135,\n      },\n      {\n        name: 'UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION',\n        value: '⎰',\n        codepoint: 9136,\n      },\n      {\n        name: 'UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION',\n        value: '⎱',\n        codepoint: 9137,\n      },\n      {\n        name: 'SUMMATION TOP',\n        value: '⎲',\n        codepoint: 9138,\n      },\n      {\n        name: 'SUMMATION BOTTOM',\n        value: '⎳',\n        codepoint: 9139,\n      },\n      {\n        name: 'TOP SQUARE BRACKET',\n        value: '⎴',\n        codepoint: 9140,\n      },\n      {\n        name: 'BOTTOM SQUARE BRACKET',\n        value: '⎵',\n        codepoint: 9141,\n      },\n      {\n        name: 'BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET',\n        value: '⎶',\n        codepoint: 9142,\n      },\n      {\n        name: 'RADICAL SYMBOL BOTTOM',\n        value: '⎷',\n        codepoint: 9143,\n      },\n      {\n        name: 'LEFT VERTICAL BOX LINE',\n        value: '⎸',\n        codepoint: 9144,\n      },\n      {\n        name: 'RIGHT VERTICAL BOX LINE',\n        value: '⎹',\n        codepoint: 9145,\n      },\n      {\n        name: 'HORIZONTAL SCAN LINE-1',\n        value: '⎺',\n        codepoint: 9146,\n      },\n      {\n        name: 'HORIZONTAL SCAN LINE-3',\n        value: '⎻',\n        codepoint: 9147,\n      },\n      {\n        name: 'HORIZONTAL SCAN LINE-7',\n        value: '⎼',\n        codepoint: 9148,\n      },\n      {\n        name: 'HORIZONTAL SCAN LINE-9',\n        value: '⎽',\n        codepoint: 9149,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT',\n        value: '⎾',\n        codepoint: 9150,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT',\n        value: '⎿',\n        codepoint: 9151,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE',\n        value: '⏀',\n        codepoint: 9152,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE',\n        value: '⏁',\n        codepoint: 9153,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE',\n        value: '⏂',\n        codepoint: 9154,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE',\n        value: '⏃',\n        codepoint: 9155,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE',\n        value: '⏄',\n        codepoint: 9156,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE',\n        value: '⏅',\n        codepoint: 9157,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE',\n        value: '⏆',\n        codepoint: 9158,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE',\n        value: '⏇',\n        codepoint: 9159,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE',\n        value: '⏈',\n        codepoint: 9160,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL',\n        value: '⏉',\n        codepoint: 9161,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL',\n        value: '⏊',\n        codepoint: 9162,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT',\n        value: '⏋',\n        codepoint: 9163,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT',\n        value: '⏌',\n        codepoint: 9164,\n      },\n      {\n        name: 'SQUARE FOOT',\n        value: '⏍',\n        codepoint: 9165,\n      },\n      {\n        name: 'RETURN SYMBOL',\n        value: '⏎',\n        codepoint: 9166,\n      },\n      {\n        name: 'VERTICAL LINE EXTENSION',\n        value: '⏐',\n        codepoint: 9168,\n      },\n      {\n        name: 'METRICAL BREVE',\n        value: '⏑',\n        codepoint: 9169,\n      },\n      {\n        name: 'METRICAL LONG OVER SHORT',\n        value: '⏒',\n        codepoint: 9170,\n      },\n      {\n        name: 'METRICAL SHORT OVER LONG',\n        value: '⏓',\n        codepoint: 9171,\n      },\n      {\n        name: 'METRICAL LONG OVER TWO SHORTS',\n        value: '⏔',\n        codepoint: 9172,\n      },\n      {\n        name: 'METRICAL TWO SHORTS OVER LONG',\n        value: '⏕',\n        codepoint: 9173,\n      },\n      {\n        name: 'METRICAL TWO SHORTS JOINED',\n        value: '⏖',\n        codepoint: 9174,\n      },\n      {\n        name: 'METRICAL TRISEME',\n        value: '⏗',\n        codepoint: 9175,\n      },\n      {\n        name: 'METRICAL TETRASEME',\n        value: '⏘',\n        codepoint: 9176,\n      },\n      {\n        name: 'METRICAL PENTASEME',\n        value: '⏙',\n        codepoint: 9177,\n      },\n      {\n        name: 'EARTH GROUND',\n        value: '⏚',\n        codepoint: 9178,\n      },\n      {\n        name: 'FUSE',\n        value: '⏛',\n        codepoint: 9179,\n      },\n      {\n        name: 'TOP PARENTHESIS',\n        value: '⏜',\n        codepoint: 9180,\n      },\n      {\n        name: 'BOTTOM PARENTHESIS',\n        value: '⏝',\n        codepoint: 9181,\n      },\n      {\n        name: 'TOP CURLY BRACKET',\n        value: '⏞',\n        codepoint: 9182,\n      },\n      {\n        name: 'BOTTOM CURLY BRACKET',\n        value: '⏟',\n        codepoint: 9183,\n      },\n      {\n        name: 'TOP TORTOISE SHELL BRACKET',\n        value: '⏠',\n        codepoint: 9184,\n      },\n      {\n        name: 'BOTTOM TORTOISE SHELL BRACKET',\n        value: '⏡',\n        codepoint: 9185,\n      },\n      {\n        name: 'WHITE TRAPEZIUM',\n        value: '⏢',\n        codepoint: 9186,\n      },\n      {\n        name: 'BENZENE RING WITH CIRCLE',\n        value: '⏣',\n        codepoint: 9187,\n      },\n      {\n        name: 'STRAIGHTNESS',\n        value: '⏤',\n        codepoint: 9188,\n      },\n      {\n        name: 'FLATNESS',\n        value: '⏥',\n        codepoint: 9189,\n      },\n      {\n        name: 'AC CURRENT',\n        value: '⏦',\n        codepoint: 9190,\n      },\n      {\n        name: 'ELECTRICAL INTERSECTION',\n        value: '⏧',\n        codepoint: 9191,\n      },\n    ],\n  },\n  {\n    name: 'Arrows',\n    symbols: [\n      {\n        name: 'UPWARDS QUADRUPLE ARROW',\n        value: '⟰',\n        codepoint: 10224,\n      },\n      {\n        name: 'DOWNWARDS QUADRUPLE ARROW',\n        value: '⟱',\n        codepoint: 10225,\n      },\n      {\n        name: 'ANTICLOCKWISE GAPPED CIRCLE ARROW',\n        value: '⟲',\n        codepoint: 10226,\n      },\n      {\n        name: 'CLOCKWISE GAPPED CIRCLE ARROW',\n        value: '⟳',\n        codepoint: 10227,\n      },\n      {\n        name: 'RIGHT ARROW WITH CIRCLED PLUS',\n        value: '⟴',\n        codepoint: 10228,\n      },\n      {\n        name: 'LONG LEFTWARDS ARROW',\n        value: '⟵',\n        codepoint: 10229,\n      },\n      {\n        name: 'LONG RIGHTWARDS ARROW',\n        value: '⟶',\n        codepoint: 10230,\n      },\n      {\n        name: 'LONG LEFT RIGHT ARROW',\n        value: '⟷',\n        codepoint: 10231,\n      },\n      {\n        name: 'LONG LEFTWARDS DOUBLE ARROW',\n        value: '⟸',\n        codepoint: 10232,\n      },\n      {\n        name: 'LONG RIGHTWARDS DOUBLE ARROW',\n        value: '⟹',\n        codepoint: 10233,\n      },\n      {\n        name: 'LONG LEFT RIGHT DOUBLE ARROW',\n        value: '⟺',\n        codepoint: 10234,\n      },\n      {\n        name: 'LONG LEFTWARDS ARROW FROM BAR',\n        value: '⟻',\n        codepoint: 10235,\n      },\n      {\n        name: 'LONG RIGHTWARDS ARROW FROM BAR',\n        value: '⟼',\n        codepoint: 10236,\n      },\n      {\n        name: 'LONG LEFTWARDS DOUBLE ARROW FROM BAR',\n        value: '⟽',\n        codepoint: 10237,\n      },\n      {\n        name: 'LONG RIGHTWARDS DOUBLE ARROW FROM BAR',\n        value: '⟾',\n        codepoint: 10238,\n      },\n      {\n        name: 'LONG RIGHTWARDS SQUIGGLE ARROW',\n        value: '⟿',\n        codepoint: 10239,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE',\n        value: '⤀',\n        codepoint: 10496,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE',\n        value: '⤁',\n        codepoint: 10497,\n      },\n      {\n        name: 'LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE',\n        value: '⤂',\n        codepoint: 10498,\n      },\n      {\n        name: 'RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE',\n        value: '⤃',\n        codepoint: 10499,\n      },\n      {\n        name: 'LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE',\n        value: '⤄',\n        codepoint: 10500,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW FROM BAR',\n        value: '⤅',\n        codepoint: 10501,\n      },\n      {\n        name: 'LEFTWARDS DOUBLE ARROW FROM BAR',\n        value: '⤆',\n        codepoint: 10502,\n      },\n      {\n        name: 'RIGHTWARDS DOUBLE ARROW FROM BAR',\n        value: '⤇',\n        codepoint: 10503,\n      },\n      {\n        name: 'DOWNWARDS ARROW WITH HORIZONTAL STROKE',\n        value: '⤈',\n        codepoint: 10504,\n      },\n      {\n        name: 'UPWARDS ARROW WITH HORIZONTAL STROKE',\n        value: '⤉',\n        codepoint: 10505,\n      },\n      {\n        name: 'UPWARDS TRIPLE ARROW',\n        value: '⤊',\n        codepoint: 10506,\n      },\n      {\n        name: 'DOWNWARDS TRIPLE ARROW',\n        value: '⤋',\n        codepoint: 10507,\n      },\n      {\n        name: 'LEFTWARDS DOUBLE DASH ARROW',\n        value: '⤌',\n        codepoint: 10508,\n      },\n      {\n        name: 'RIGHTWARDS DOUBLE DASH ARROW',\n        value: '⤍',\n        codepoint: 10509,\n      },\n      {\n        name: 'LEFTWARDS TRIPLE DASH ARROW',\n        value: '⤎',\n        codepoint: 10510,\n      },\n      {\n        name: 'RIGHTWARDS TRIPLE DASH ARROW',\n        value: '⤏',\n        codepoint: 10511,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW',\n        value: '⤐',\n        codepoint: 10512,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH DOTTED STEM',\n        value: '⤑',\n        codepoint: 10513,\n      },\n      {\n        name: 'UPWARDS ARROW TO BAR',\n        value: '⤒',\n        codepoint: 10514,\n      },\n      {\n        name: 'DOWNWARDS ARROW TO BAR',\n        value: '⤓',\n        codepoint: 10515,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE',\n        value: '⤔',\n        codepoint: 10516,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n        value: '⤕',\n        codepoint: 10517,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL',\n        value: '⤖',\n        codepoint: 10518,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE',\n        value: '⤗',\n        codepoint: 10519,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n        value: '⤘',\n        codepoint: 10520,\n      },\n      {\n        name: 'LEFTWARDS ARROW-TAIL',\n        value: '⤙',\n        codepoint: 10521,\n      },\n      {\n        name: 'RIGHTWARDS ARROW-TAIL',\n        value: '⤚',\n        codepoint: 10522,\n      },\n      {\n        name: 'LEFTWARDS DOUBLE ARROW-TAIL',\n        value: '⤛',\n        codepoint: 10523,\n      },\n      {\n        name: 'RIGHTWARDS DOUBLE ARROW-TAIL',\n        value: '⤜',\n        codepoint: 10524,\n      },\n      {\n        name: 'LEFTWARDS ARROW TO BLACK DIAMOND',\n        value: '⤝',\n        codepoint: 10525,\n      },\n      {\n        name: 'RIGHTWARDS ARROW TO BLACK DIAMOND',\n        value: '⤞',\n        codepoint: 10526,\n      },\n      {\n        name: 'LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND',\n        value: '⤟',\n        codepoint: 10527,\n      },\n      {\n        name: 'RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND',\n        value: '⤠',\n        codepoint: 10528,\n      },\n      {\n        name: 'NORTH WEST AND SOUTH EAST ARROW',\n        value: '⤡',\n        codepoint: 10529,\n      },\n      {\n        name: 'NORTH EAST AND SOUTH WEST ARROW',\n        value: '⤢',\n        codepoint: 10530,\n      },\n      {\n        name: 'NORTH WEST ARROW WITH HOOK',\n        value: '⤣',\n        codepoint: 10531,\n      },\n      {\n        name: 'NORTH EAST ARROW WITH HOOK',\n        value: '⤤',\n        codepoint: 10532,\n      },\n      {\n        name: 'SOUTH EAST ARROW WITH HOOK',\n        value: '⤥',\n        codepoint: 10533,\n      },\n      {\n        name: 'SOUTH WEST ARROW WITH HOOK',\n        value: '⤦',\n        codepoint: 10534,\n      },\n      {\n        name: 'NORTH WEST ARROW AND NORTH EAST ARROW',\n        value: '⤧',\n        codepoint: 10535,\n      },\n      {\n        name: 'NORTH EAST ARROW AND SOUTH EAST ARROW',\n        value: '⤨',\n        codepoint: 10536,\n      },\n      {\n        name: 'SOUTH EAST ARROW AND SOUTH WEST ARROW',\n        value: '⤩',\n        codepoint: 10537,\n      },\n      {\n        name: 'SOUTH WEST ARROW AND NORTH WEST ARROW',\n        value: '⤪',\n        codepoint: 10538,\n      },\n      {\n        name: 'RISING DIAGONAL CROSSING FALLING DIAGONAL',\n        value: '⤫',\n        codepoint: 10539,\n      },\n      {\n        name: 'FALLING DIAGONAL CROSSING RISING DIAGONAL',\n        value: '⤬',\n        codepoint: 10540,\n      },\n      {\n        name: 'SOUTH EAST ARROW CROSSING NORTH EAST ARROW',\n        value: '⤭',\n        codepoint: 10541,\n      },\n      {\n        name: 'NORTH EAST ARROW CROSSING SOUTH EAST ARROW',\n        value: '⤮',\n        codepoint: 10542,\n      },\n      {\n        name: 'FALLING DIAGONAL CROSSING NORTH EAST ARROW',\n        value: '⤯',\n        codepoint: 10543,\n      },\n      {\n        name: 'RISING DIAGONAL CROSSING SOUTH EAST ARROW',\n        value: '⤰',\n        codepoint: 10544,\n      },\n      {\n        name: 'NORTH EAST ARROW CROSSING NORTH WEST ARROW',\n        value: '⤱',\n        codepoint: 10545,\n      },\n      {\n        name: 'NORTH WEST ARROW CROSSING NORTH EAST ARROW',\n        value: '⤲',\n        codepoint: 10546,\n      },\n      {\n        name: 'WAVE ARROW POINTING DIRECTLY RIGHT',\n        value: '⤳',\n        codepoint: 10547,\n      },\n      {\n        name: 'ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS',\n        value: '⤶',\n        codepoint: 10550,\n      },\n      {\n        name: 'ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS',\n        value: '⤷',\n        codepoint: 10551,\n      },\n      {\n        name: 'RIGHT-SIDE ARC CLOCKWISE ARROW',\n        value: '⤸',\n        codepoint: 10552,\n      },\n      {\n        name: 'LEFT-SIDE ARC ANTICLOCKWISE ARROW',\n        value: '⤹',\n        codepoint: 10553,\n      },\n      {\n        name: 'TOP ARC ANTICLOCKWISE ARROW',\n        value: '⤺',\n        codepoint: 10554,\n      },\n      {\n        name: 'BOTTOM ARC ANTICLOCKWISE ARROW',\n        value: '⤻',\n        codepoint: 10555,\n      },\n      {\n        name: 'TOP ARC CLOCKWISE ARROW WITH MINUS',\n        value: '⤼',\n        codepoint: 10556,\n      },\n      {\n        name: 'TOP ARC ANTICLOCKWISE ARROW WITH PLUS',\n        value: '⤽',\n        codepoint: 10557,\n      },\n      {\n        name: 'LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW',\n        value: '⤾',\n        codepoint: 10558,\n      },\n      {\n        name: 'LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW',\n        value: '⤿',\n        codepoint: 10559,\n      },\n      {\n        name: 'ANTICLOCKWISE CLOSED CIRCLE ARROW',\n        value: '⥀',\n        codepoint: 10560,\n      },\n      {\n        name: 'CLOCKWISE CLOSED CIRCLE ARROW',\n        value: '⥁',\n        codepoint: 10561,\n      },\n      {\n        name: 'RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW',\n        value: '⥂',\n        codepoint: 10562,\n      },\n      {\n        name: 'LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW',\n        value: '⥃',\n        codepoint: 10563,\n      },\n      {\n        name: 'SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW',\n        value: '⥄',\n        codepoint: 10564,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH PLUS BELOW',\n        value: '⥅',\n        codepoint: 10565,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH PLUS BELOW',\n        value: '⥆',\n        codepoint: 10566,\n      },\n      {\n        name: 'RIGHTWARDS ARROW THROUGH X',\n        value: '⥇',\n        codepoint: 10567,\n      },\n      {\n        name: 'LEFT RIGHT ARROW THROUGH SMALL CIRCLE',\n        value: '⥈',\n        codepoint: 10568,\n      },\n      {\n        name: 'UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE',\n        value: '⥉',\n        codepoint: 10569,\n      },\n      {\n        name: 'LEFT BARB UP RIGHT BARB DOWN HARPOON',\n        value: '⥊',\n        codepoint: 10570,\n      },\n      {\n        name: 'LEFT BARB DOWN RIGHT BARB UP HARPOON',\n        value: '⥋',\n        codepoint: 10571,\n      },\n      {\n        name: 'UP BARB RIGHT DOWN BARB LEFT HARPOON',\n        value: '⥌',\n        codepoint: 10572,\n      },\n      {\n        name: 'UP BARB LEFT DOWN BARB RIGHT HARPOON',\n        value: '⥍',\n        codepoint: 10573,\n      },\n      {\n        name: 'LEFT BARB UP RIGHT BARB UP HARPOON',\n        value: '⥎',\n        codepoint: 10574,\n      },\n      {\n        name: 'UP BARB RIGHT DOWN BARB RIGHT HARPOON',\n        value: '⥏',\n        codepoint: 10575,\n      },\n      {\n        name: 'LEFT BARB DOWN RIGHT BARB DOWN HARPOON',\n        value: '⥐',\n        codepoint: 10576,\n      },\n      {\n        name: 'UP BARB LEFT DOWN BARB LEFT HARPOON',\n        value: '⥑',\n        codepoint: 10577,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB UP TO BAR',\n        value: '⥒',\n        codepoint: 10578,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB UP TO BAR',\n        value: '⥓',\n        codepoint: 10579,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB RIGHT TO BAR',\n        value: '⥔',\n        codepoint: 10580,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB RIGHT TO BAR',\n        value: '⥕',\n        codepoint: 10581,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB DOWN TO BAR',\n        value: '⥖',\n        codepoint: 10582,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB DOWN TO BAR',\n        value: '⥗',\n        codepoint: 10583,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB LEFT TO BAR',\n        value: '⥘',\n        codepoint: 10584,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB LEFT TO BAR',\n        value: '⥙',\n        codepoint: 10585,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB UP FROM BAR',\n        value: '⥚',\n        codepoint: 10586,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB UP FROM BAR',\n        value: '⥛',\n        codepoint: 10587,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB RIGHT FROM BAR',\n        value: '⥜',\n        codepoint: 10588,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR',\n        value: '⥝',\n        codepoint: 10589,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB DOWN FROM BAR',\n        value: '⥞',\n        codepoint: 10590,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR',\n        value: '⥟',\n        codepoint: 10591,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB LEFT FROM BAR',\n        value: '⥠',\n        codepoint: 10592,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB LEFT FROM BAR',\n        value: '⥡',\n        codepoint: 10593,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN',\n        value: '⥢',\n        codepoint: 10594,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT',\n        value: '⥣',\n        codepoint: 10595,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN',\n        value: '⥤',\n        codepoint: 10596,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT',\n        value: '⥥',\n        codepoint: 10597,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP',\n        value: '⥦',\n        codepoint: 10598,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN',\n        value: '⥧',\n        codepoint: 10599,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP',\n        value: '⥨',\n        codepoint: 10600,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN',\n        value: '⥩',\n        codepoint: 10601,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH',\n        value: '⥪',\n        codepoint: 10602,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH',\n        value: '⥫',\n        codepoint: 10603,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH',\n        value: '⥬',\n        codepoint: 10604,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH',\n        value: '⥭',\n        codepoint: 10605,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT',\n        value: '⥮',\n        codepoint: 10606,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT',\n        value: '⥯',\n        codepoint: 10607,\n      },\n      {\n        name: 'RIGHT DOUBLE ARROW WITH ROUNDED HEAD',\n        value: '⥰',\n        codepoint: 10608,\n      },\n      {\n        name: 'EQUALS SIGN ABOVE RIGHTWARDS ARROW',\n        value: '⥱',\n        codepoint: 10609,\n      },\n      {\n        name: 'TILDE OPERATOR ABOVE RIGHTWARDS ARROW',\n        value: '⥲',\n        codepoint: 10610,\n      },\n      {\n        name: 'LEFTWARDS ARROW ABOVE TILDE OPERATOR',\n        value: '⥳',\n        codepoint: 10611,\n      },\n      {\n        name: 'RIGHTWARDS ARROW ABOVE TILDE OPERATOR',\n        value: '⥴',\n        codepoint: 10612,\n      },\n      {\n        name: 'RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO',\n        value: '⥵',\n        codepoint: 10613,\n      },\n      {\n        name: 'LESS-THAN ABOVE LEFTWARDS ARROW',\n        value: '⥶',\n        codepoint: 10614,\n      },\n      {\n        name: 'LEFTWARDS ARROW THROUGH LESS-THAN',\n        value: '⥷',\n        codepoint: 10615,\n      },\n      {\n        name: 'GREATER-THAN ABOVE RIGHTWARDS ARROW',\n        value: '⥸',\n        codepoint: 10616,\n      },\n      {\n        name: 'SUBSET ABOVE RIGHTWARDS ARROW',\n        value: '⥹',\n        codepoint: 10617,\n      },\n      {\n        name: 'LEFTWARDS ARROW THROUGH SUBSET',\n        value: '⥺',\n        codepoint: 10618,\n      },\n      {\n        name: 'SUPERSET ABOVE LEFTWARDS ARROW',\n        value: '⥻',\n        codepoint: 10619,\n      },\n      {\n        name: 'LEFT FISH TAIL',\n        value: '⥼',\n        codepoint: 10620,\n      },\n      {\n        name: 'RIGHT FISH TAIL',\n        value: '⥽',\n        codepoint: 10621,\n      },\n      {\n        name: 'UP FISH TAIL',\n        value: '⥾',\n        codepoint: 10622,\n      },\n      {\n        name: 'DOWN FISH TAIL',\n        value: '⥿',\n        codepoint: 10623,\n      },\n      {\n        name: 'NORTH EAST WHITE ARROW',\n        value: '⬀',\n        codepoint: 11008,\n      },\n      {\n        name: 'NORTH WEST WHITE ARROW',\n        value: '⬁',\n        codepoint: 11009,\n      },\n      {\n        name: 'SOUTH EAST WHITE ARROW',\n        value: '⬂',\n        codepoint: 11010,\n      },\n      {\n        name: 'SOUTH WEST WHITE ARROW',\n        value: '⬃',\n        codepoint: 11011,\n      },\n      {\n        name: 'LEFT RIGHT WHITE ARROW',\n        value: '⬄',\n        codepoint: 11012,\n      },\n      {\n        name: 'NORTH EAST BLACK ARROW',\n        value: '⬈',\n        codepoint: 11016,\n      },\n      {\n        name: 'NORTH WEST BLACK ARROW',\n        value: '⬉',\n        codepoint: 11017,\n      },\n      {\n        name: 'SOUTH EAST BLACK ARROW',\n        value: '⬊',\n        codepoint: 11018,\n      },\n      {\n        name: 'SOUTH WEST BLACK ARROW',\n        value: '⬋',\n        codepoint: 11019,\n      },\n      {\n        name: 'LEFT RIGHT BLACK ARROW',\n        value: '⬌',\n        codepoint: 11020,\n      },\n      {\n        name: 'UP DOWN BLACK ARROW',\n        value: '⬍',\n        codepoint: 11021,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH TIP DOWNWARDS',\n        value: '⬎',\n        codepoint: 11022,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH TIP UPWARDS',\n        value: '⬏',\n        codepoint: 11023,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH TIP DOWNWARDS',\n        value: '⬐',\n        codepoint: 11024,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH TIP UPWARDS',\n        value: '⬑',\n        codepoint: 11025,\n      },\n      {\n        name: 'SQUARE WITH TOP HALF BLACK',\n        value: '⬒',\n        codepoint: 11026,\n      },\n      {\n        name: 'SQUARE WITH BOTTOM HALF BLACK',\n        value: '⬓',\n        codepoint: 11027,\n      },\n      {\n        name: 'SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK',\n        value: '⬔',\n        codepoint: 11028,\n      },\n      {\n        name: 'SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK',\n        value: '⬕',\n        codepoint: 11029,\n      },\n      {\n        name: 'DIAMOND WITH LEFT HALF BLACK',\n        value: '⬖',\n        codepoint: 11030,\n      },\n      {\n        name: 'DIAMOND WITH RIGHT HALF BLACK',\n        value: '⬗',\n        codepoint: 11031,\n      },\n      {\n        name: 'DIAMOND WITH TOP HALF BLACK',\n        value: '⬘',\n        codepoint: 11032,\n      },\n      {\n        name: 'DIAMOND WITH BOTTOM HALF BLACK',\n        value: '⬙',\n        codepoint: 11033,\n      },\n      {\n        name: 'DOTTED SQUARE',\n        value: '⬚',\n        codepoint: 11034,\n      },\n      {\n        name: 'BLACK VERY SMALL SQUARE',\n        value: '⬝',\n        codepoint: 11037,\n      },\n      {\n        name: 'WHITE VERY SMALL SQUARE',\n        value: '⬞',\n        codepoint: 11038,\n      },\n      {\n        name: 'BLACK PENTAGON',\n        value: '⬟',\n        codepoint: 11039,\n      },\n      {\n        name: 'WHITE PENTAGON',\n        value: '⬠',\n        codepoint: 11040,\n      },\n      {\n        name: 'WHITE HEXAGON',\n        value: '⬡',\n        codepoint: 11041,\n      },\n      {\n        name: 'BLACK HEXAGON',\n        value: '⬢',\n        codepoint: 11042,\n      },\n      {\n        name: 'HORIZONTAL BLACK HEXAGON',\n        value: '⬣',\n        codepoint: 11043,\n      },\n      {\n        name: 'BLACK LARGE CIRCLE',\n        value: '⬤',\n        codepoint: 11044,\n      },\n      {\n        name: 'BLACK MEDIUM DIAMOND',\n        value: '⬥',\n        codepoint: 11045,\n      },\n      {\n        name: 'WHITE MEDIUM DIAMOND',\n        value: '⬦',\n        codepoint: 11046,\n      },\n      {\n        name: 'BLACK MEDIUM LOZENGE',\n        value: '⬧',\n        codepoint: 11047,\n      },\n      {\n        name: 'WHITE MEDIUM LOZENGE',\n        value: '⬨',\n        codepoint: 11048,\n      },\n      {\n        name: 'BLACK SMALL DIAMOND',\n        value: '⬩',\n        codepoint: 11049,\n      },\n      {\n        name: 'BLACK SMALL LOZENGE',\n        value: '⬪',\n        codepoint: 11050,\n      },\n      {\n        name: 'WHITE SMALL LOZENGE',\n        value: '⬫',\n        codepoint: 11051,\n      },\n      {\n        name: 'BLACK HORIZONTAL ELLIPSE',\n        value: '⬬',\n        codepoint: 11052,\n      },\n      {\n        name: 'WHITE HORIZONTAL ELLIPSE',\n        value: '⬭',\n        codepoint: 11053,\n      },\n      {\n        name: 'BLACK VERTICAL ELLIPSE',\n        value: '⬮',\n        codepoint: 11054,\n      },\n      {\n        name: 'WHITE VERTICAL ELLIPSE',\n        value: '⬯',\n        codepoint: 11055,\n      },\n      {\n        name: 'LEFT ARROW WITH SMALL CIRCLE',\n        value: '⬰',\n        codepoint: 11056,\n      },\n      {\n        name: 'THREE LEFTWARDS ARROWS',\n        value: '⬱',\n        codepoint: 11057,\n      },\n      {\n        name: 'LEFT ARROW WITH CIRCLED PLUS',\n        value: '⬲',\n        codepoint: 11058,\n      },\n      {\n        name: 'LONG LEFTWARDS SQUIGGLE ARROW',\n        value: '⬳',\n        codepoint: 11059,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE',\n        value: '⬴',\n        codepoint: 11060,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE',\n        value: '⬵',\n        codepoint: 11061,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW FROM BAR',\n        value: '⬶',\n        codepoint: 11062,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED TRIPLE DASH ARROW',\n        value: '⬷',\n        codepoint: 11063,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH DOTTED STEM',\n        value: '⬸',\n        codepoint: 11064,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE',\n        value: '⬹',\n        codepoint: 11065,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n        value: '⬺',\n        codepoint: 11066,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL',\n        value: '⬻',\n        codepoint: 11067,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE',\n        value: '⬼',\n        codepoint: 11068,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n        value: '⬽',\n        codepoint: 11069,\n      },\n      {\n        name: 'LEFTWARDS ARROW THROUGH X',\n        value: '⬾',\n        codepoint: 11070,\n      },\n      {\n        name: 'WAVE ARROW POINTING DIRECTLY LEFT',\n        value: '⬿',\n        codepoint: 11071,\n      },\n      {\n        name: 'EQUALS SIGN ABOVE LEFTWARDS ARROW',\n        value: '⭀',\n        codepoint: 11072,\n      },\n      {\n        name: 'REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW',\n        value: '⭁',\n        codepoint: 11073,\n      },\n      {\n        name: 'LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO',\n        value: '⭂',\n        codepoint: 11074,\n      },\n      {\n        name: 'RIGHTWARDS ARROW THROUGH GREATER-THAN',\n        value: '⭃',\n        codepoint: 11075,\n      },\n      {\n        name: 'RIGHTWARDS ARROW THROUGH SUPERSET',\n        value: '⭄',\n        codepoint: 11076,\n      },\n      {\n        name: 'LEFTWARDS QUADRUPLE ARROW',\n        value: '⭅',\n        codepoint: 11077,\n      },\n      {\n        name: 'RIGHTWARDS QUADRUPLE ARROW',\n        value: '⭆',\n        codepoint: 11078,\n      },\n      {\n        name: 'REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW',\n        value: '⭇',\n        codepoint: 11079,\n      },\n      {\n        name: 'RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO',\n        value: '⭈',\n        codepoint: 11080,\n      },\n      {\n        name: 'TILDE OPERATOR ABOVE LEFTWARDS ARROW',\n        value: '⭉',\n        codepoint: 11081,\n      },\n      {\n        name: 'LEFTWARDS ARROW ABOVE ALMOST EQUAL TO',\n        value: '⭊',\n        codepoint: 11082,\n      },\n      {\n        name: 'LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR',\n        value: '⭋',\n        codepoint: 11083,\n      },\n      {\n        name: 'RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR',\n        value: '⭌',\n        codepoint: 11084,\n      },\n      {\n        name: 'BLACK SMALL STAR',\n        value: '⭑',\n        codepoint: 11089,\n      },\n      {\n        name: 'WHITE SMALL STAR',\n        value: '⭒',\n        codepoint: 11090,\n      },\n      {\n        name: 'BLACK RIGHT-POINTING PENTAGON',\n        value: '⭓',\n        codepoint: 11091,\n      },\n      {\n        name: 'WHITE RIGHT-POINTING PENTAGON',\n        value: '⭔',\n        codepoint: 11092,\n      },\n    ],\n  },\n  {\n    name: 'Ancient',\n    symbols: [\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE QUARTER',\n        value: '𐅀',\n        codepoint: 65856,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE HALF',\n        value: '𐅁',\n        codepoint: 65857,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE DRACHMA',\n        value: '𐅂',\n        codepoint: 65858,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE',\n        value: '𐅃',\n        codepoint: 65859,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE THOUSAND',\n        value: '𐅆',\n        codepoint: 65862,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIFTY THOUSAND',\n        value: '𐅇',\n        codepoint: 65863,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE TALENTS',\n        value: '𐅈',\n        codepoint: 65864,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC TEN TALENTS',\n        value: '𐅉',\n        codepoint: 65865,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIFTY TALENTS',\n        value: '𐅊',\n        codepoint: 65866,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS',\n        value: '𐅋',\n        codepoint: 65867,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS',\n        value: '𐅌',\n        codepoint: 65868,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS',\n        value: '𐅍',\n        codepoint: 65869,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS',\n        value: '𐅎',\n        codepoint: 65870,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE STATERS',\n        value: '𐅏',\n        codepoint: 65871,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC TEN STATERS',\n        value: '𐅐',\n        codepoint: 65872,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIFTY STATERS',\n        value: '𐅑',\n        codepoint: 65873,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS',\n        value: '𐅒',\n        codepoint: 65874,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS',\n        value: '𐅓',\n        codepoint: 65875,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS',\n        value: '𐅔',\n        codepoint: 65876,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS',\n        value: '𐅕',\n        codepoint: 65877,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS',\n        value: '𐅖',\n        codepoint: 65878,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC TEN MNAS',\n        value: '𐅗',\n        codepoint: 65879,\n      },\n      {\n        name: 'GREEK ACROPHONIC HERAEUM ONE PLETHRON',\n        value: '𐅘',\n        codepoint: 65880,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN ONE',\n        value: '𐅙',\n        codepoint: 65881,\n      },\n      {\n        name: 'GREEK ACROPHONIC HERMIONIAN ONE',\n        value: '𐅚',\n        codepoint: 65882,\n      },\n      {\n        name: 'GREEK ACROPHONIC EPIDAUREAN TWO',\n        value: '𐅛',\n        codepoint: 65883,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN TWO',\n        value: '𐅜',\n        codepoint: 65884,\n      },\n      {\n        name: 'GREEK ACROPHONIC CYRENAIC TWO DRACHMAS',\n        value: '𐅝',\n        codepoint: 65885,\n      },\n      {\n        name: 'GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS',\n        value: '𐅞',\n        codepoint: 65886,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN FIVE',\n        value: '𐅟',\n        codepoint: 65887,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN TEN',\n        value: '𐅠',\n        codepoint: 65888,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM',\n        value: '𐅡',\n        codepoint: 65889,\n      },\n      {\n        name: 'GREEK ACROPHONIC HERMIONIAN TEN',\n        value: '𐅢',\n        codepoint: 65890,\n      },\n      {\n        name: 'GREEK ACROPHONIC MESSENIAN TEN',\n        value: '𐅣',\n        codepoint: 65891,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN TEN',\n        value: '𐅤',\n        codepoint: 65892,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN THIRTY',\n        value: '𐅥',\n        codepoint: 65893,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN FIFTY',\n        value: '𐅦',\n        codepoint: 65894,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM',\n        value: '𐅧',\n        codepoint: 65895,\n      },\n      {\n        name: 'GREEK ACROPHONIC HERMIONIAN FIFTY',\n        value: '𐅨',\n        codepoint: 65896,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN FIFTY',\n        value: '𐅩',\n        codepoint: 65897,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN ONE HUNDRED',\n        value: '𐅪',\n        codepoint: 65898,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN THREE HUNDRED',\n        value: '𐅫',\n        codepoint: 65899,\n      },\n      {\n        name: 'GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED',\n        value: '𐅬',\n        codepoint: 65900,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED',\n        value: '𐅭',\n        codepoint: 65901,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN FIVE HUNDRED',\n        value: '𐅮',\n        codepoint: 65902,\n      },\n      {\n        name: 'GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED',\n        value: '𐅯',\n        codepoint: 65903,\n      },\n      {\n        name: 'GREEK ACROPHONIC NAXIAN FIVE HUNDRED',\n        value: '𐅰',\n        codepoint: 65904,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN ONE THOUSAND',\n        value: '𐅱',\n        codepoint: 65905,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN FIVE THOUSAND',\n        value: '𐅲',\n        codepoint: 65906,\n      },\n      {\n        name: 'GREEK ACROPHONIC DELPHIC FIVE MNAS',\n        value: '𐅳',\n        codepoint: 65907,\n      },\n      {\n        name: 'GREEK ACROPHONIC STRATIAN FIFTY MNAS',\n        value: '𐅴',\n        codepoint: 65908,\n      },\n      {\n        name: 'GREEK ONE HALF SIGN',\n        value: '𐅵',\n        codepoint: 65909,\n      },\n      {\n        name: 'GREEK YEAR SIGN',\n        value: '𐅹',\n        codepoint: 65913,\n      },\n      {\n        name: 'GREEK TALENT SIGN',\n        value: '𐅺',\n        codepoint: 65914,\n      },\n      {\n        name: 'GREEK DRACHMA SIGN',\n        value: '𐅻',\n        codepoint: 65915,\n      },\n      {\n        name: 'GREEK OBOL SIGN',\n        value: '𐅼',\n        codepoint: 65916,\n      },\n      {\n        name: 'GREEK TWO OBOLS SIGN',\n        value: '𐅽',\n        codepoint: 65917,\n      },\n      {\n        name: 'GREEK THREE OBOLS SIGN',\n        value: '𐅾',\n        codepoint: 65918,\n      },\n      {\n        name: 'GREEK FOUR OBOLS SIGN',\n        value: '𐅿',\n        codepoint: 65919,\n      },\n      {\n        name: 'GREEK FIVE OBOLS SIGN',\n        value: '𐆀',\n        codepoint: 65920,\n      },\n      {\n        name: 'GREEK METRETES SIGN',\n        value: '𐆁',\n        codepoint: 65921,\n      },\n      {\n        name: 'GREEK KYATHOS BASE SIGN',\n        value: '𐆂',\n        codepoint: 65922,\n      },\n      {\n        name: 'GREEK OUNKIA SIGN',\n        value: '𐆄',\n        codepoint: 65924,\n      },\n      {\n        name: 'GREEK XESTES SIGN',\n        value: '𐆅',\n        codepoint: 65925,\n      },\n      {\n        name: 'GREEK ARTABE SIGN',\n        value: '𐆆',\n        codepoint: 65926,\n      },\n      {\n        name: 'GREEK ZERO SIGN',\n        value: '𐆊',\n        codepoint: 65930,\n      },\n      {\n        name: 'ROMAN SEXTANS SIGN',\n        value: '𐆐',\n        codepoint: 65936,\n      },\n      {\n        name: 'ROMAN UNCIA SIGN',\n        value: '𐆑',\n        codepoint: 65937,\n      },\n      {\n        name: 'ROMAN SEMUNCIA SIGN',\n        value: '𐆒',\n        codepoint: 65938,\n      },\n      {\n        name: 'ROMAN SEXTULA SIGN',\n        value: '𐆓',\n        codepoint: 65939,\n      },\n      {\n        name: 'ROMAN DIMIDIA SEXTULA SIGN',\n        value: '𐆔',\n        codepoint: 65940,\n      },\n      {\n        name: 'ROMAN SILIQUA SIGN',\n        value: '𐆕',\n        codepoint: 65941,\n      },\n      {\n        name: 'ROMAN DENARIUS SIGN',\n        value: '𐆖',\n        codepoint: 65942,\n      },\n      {\n        name: 'ROMAN QUINARIUS SIGN',\n        value: '𐆗',\n        codepoint: 65943,\n      },\n      {\n        name: 'ROMAN SESTERTIUS SIGN',\n        value: '𐆘',\n        codepoint: 65944,\n      },\n      {\n        name: 'ROMAN DUPONDIUS SIGN',\n        value: '𐆙',\n        codepoint: 65945,\n      },\n      {\n        name: 'ROMAN AS SIGN',\n        value: '𐆚',\n        codepoint: 65946,\n      },\n      {\n        name: 'ROMAN CENTURIAL SIGN',\n        value: '𐆛',\n        codepoint: 65947,\n      },\n    ],\n  },\n  {\n    name: 'Braille',\n    symbols: [\n      {\n        name: 'BRAILLE PATTERN BLANK',\n        value: '⠀',\n        codepoint: 10240,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1',\n        value: '⠁',\n        codepoint: 10241,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2',\n        value: '⠂',\n        codepoint: 10242,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12',\n        value: '⠃',\n        codepoint: 10243,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3',\n        value: '⠄',\n        codepoint: 10244,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13',\n        value: '⠅',\n        codepoint: 10245,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23',\n        value: '⠆',\n        codepoint: 10246,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123',\n        value: '⠇',\n        codepoint: 10247,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-4',\n        value: '⠈',\n        codepoint: 10248,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-14',\n        value: '⠉',\n        codepoint: 10249,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-24',\n        value: '⠊',\n        codepoint: 10250,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-124',\n        value: '⠋',\n        codepoint: 10251,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-34',\n        value: '⠌',\n        codepoint: 10252,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-134',\n        value: '⠍',\n        codepoint: 10253,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-234',\n        value: '⠎',\n        codepoint: 10254,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1234',\n        value: '⠏',\n        codepoint: 10255,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-5',\n        value: '⠐',\n        codepoint: 10256,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-15',\n        value: '⠑',\n        codepoint: 10257,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-25',\n        value: '⠒',\n        codepoint: 10258,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-125',\n        value: '⠓',\n        codepoint: 10259,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-35',\n        value: '⠔',\n        codepoint: 10260,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-135',\n        value: '⠕',\n        codepoint: 10261,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-235',\n        value: '⠖',\n        codepoint: 10262,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1235',\n        value: '⠗',\n        codepoint: 10263,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-45',\n        value: '⠘',\n        codepoint: 10264,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-145',\n        value: '⠙',\n        codepoint: 10265,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-245',\n        value: '⠚',\n        codepoint: 10266,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1245',\n        value: '⠛',\n        codepoint: 10267,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-345',\n        value: '⠜',\n        codepoint: 10268,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1345',\n        value: '⠝',\n        codepoint: 10269,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2345',\n        value: '⠞',\n        codepoint: 10270,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12345',\n        value: '⠟',\n        codepoint: 10271,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-6',\n        value: '⠠',\n        codepoint: 10272,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-16',\n        value: '⠡',\n        codepoint: 10273,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-26',\n        value: '⠢',\n        codepoint: 10274,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-126',\n        value: '⠣',\n        codepoint: 10275,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-36',\n        value: '⠤',\n        codepoint: 10276,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-136',\n        value: '⠥',\n        codepoint: 10277,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-236',\n        value: '⠦',\n        codepoint: 10278,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1236',\n        value: '⠧',\n        codepoint: 10279,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-46',\n        value: '⠨',\n        codepoint: 10280,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-146',\n        value: '⠩',\n        codepoint: 10281,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-246',\n        value: '⠪',\n        codepoint: 10282,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1246',\n        value: '⠫',\n        codepoint: 10283,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-346',\n        value: '⠬',\n        codepoint: 10284,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1346',\n        value: '⠭',\n        codepoint: 10285,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2346',\n        value: '⠮',\n        codepoint: 10286,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12346',\n        value: '⠯',\n        codepoint: 10287,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-56',\n        value: '⠰',\n        codepoint: 10288,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-156',\n        value: '⠱',\n        codepoint: 10289,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-256',\n        value: '⠲',\n        codepoint: 10290,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1256',\n        value: '⠳',\n        codepoint: 10291,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-356',\n        value: '⠴',\n        codepoint: 10292,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1356',\n        value: '⠵',\n        codepoint: 10293,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2356',\n        value: '⠶',\n        codepoint: 10294,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12356',\n        value: '⠷',\n        codepoint: 10295,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-456',\n        value: '⠸',\n        codepoint: 10296,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1456',\n        value: '⠹',\n        codepoint: 10297,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2456',\n        value: '⠺',\n        codepoint: 10298,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12456',\n        value: '⠻',\n        codepoint: 10299,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3456',\n        value: '⠼',\n        codepoint: 10300,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13456',\n        value: '⠽',\n        codepoint: 10301,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23456',\n        value: '⠾',\n        codepoint: 10302,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123456',\n        value: '⠿',\n        codepoint: 10303,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-7',\n        value: '⡀',\n        codepoint: 10304,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-17',\n        value: '⡁',\n        codepoint: 10305,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-27',\n        value: '⡂',\n        codepoint: 10306,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-127',\n        value: '⡃',\n        codepoint: 10307,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-37',\n        value: '⡄',\n        codepoint: 10308,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-137',\n        value: '⡅',\n        codepoint: 10309,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-237',\n        value: '⡆',\n        codepoint: 10310,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1237',\n        value: '⡇',\n        codepoint: 10311,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-47',\n        value: '⡈',\n        codepoint: 10312,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-147',\n        value: '⡉',\n        codepoint: 10313,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-247',\n        value: '⡊',\n        codepoint: 10314,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1247',\n        value: '⡋',\n        codepoint: 10315,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-347',\n        value: '⡌',\n        codepoint: 10316,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1347',\n        value: '⡍',\n        codepoint: 10317,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2347',\n        value: '⡎',\n        codepoint: 10318,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12347',\n        value: '⡏',\n        codepoint: 10319,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-57',\n        value: '⡐',\n        codepoint: 10320,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-157',\n        value: '⡑',\n        codepoint: 10321,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-257',\n        value: '⡒',\n        codepoint: 10322,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1257',\n        value: '⡓',\n        codepoint: 10323,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-357',\n        value: '⡔',\n        codepoint: 10324,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1357',\n        value: '⡕',\n        codepoint: 10325,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2357',\n        value: '⡖',\n        codepoint: 10326,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12357',\n        value: '⡗',\n        codepoint: 10327,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-457',\n        value: '⡘',\n        codepoint: 10328,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1457',\n        value: '⡙',\n        codepoint: 10329,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2457',\n        value: '⡚',\n        codepoint: 10330,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12457',\n        value: '⡛',\n        codepoint: 10331,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3457',\n        value: '⡜',\n        codepoint: 10332,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13457',\n        value: '⡝',\n        codepoint: 10333,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23457',\n        value: '⡞',\n        codepoint: 10334,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123457',\n        value: '⡟',\n        codepoint: 10335,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-67',\n        value: '⡠',\n        codepoint: 10336,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-167',\n        value: '⡡',\n        codepoint: 10337,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-267',\n        value: '⡢',\n        codepoint: 10338,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1267',\n        value: '⡣',\n        codepoint: 10339,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-367',\n        value: '⡤',\n        codepoint: 10340,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1367',\n        value: '⡥',\n        codepoint: 10341,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2367',\n        value: '⡦',\n        codepoint: 10342,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12367',\n        value: '⡧',\n        codepoint: 10343,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-467',\n        value: '⡨',\n        codepoint: 10344,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1467',\n        value: '⡩',\n        codepoint: 10345,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2467',\n        value: '⡪',\n        codepoint: 10346,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12467',\n        value: '⡫',\n        codepoint: 10347,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3467',\n        value: '⡬',\n        codepoint: 10348,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13467',\n        value: '⡭',\n        codepoint: 10349,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23467',\n        value: '⡮',\n        codepoint: 10350,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123467',\n        value: '⡯',\n        codepoint: 10351,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-567',\n        value: '⡰',\n        codepoint: 10352,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1567',\n        value: '⡱',\n        codepoint: 10353,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2567',\n        value: '⡲',\n        codepoint: 10354,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12567',\n        value: '⡳',\n        codepoint: 10355,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3567',\n        value: '⡴',\n        codepoint: 10356,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13567',\n        value: '⡵',\n        codepoint: 10357,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23567',\n        value: '⡶',\n        codepoint: 10358,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123567',\n        value: '⡷',\n        codepoint: 10359,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-4567',\n        value: '⡸',\n        codepoint: 10360,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-14567',\n        value: '⡹',\n        codepoint: 10361,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-24567',\n        value: '⡺',\n        codepoint: 10362,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-124567',\n        value: '⡻',\n        codepoint: 10363,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-34567',\n        value: '⡼',\n        codepoint: 10364,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-134567',\n        value: '⡽',\n        codepoint: 10365,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-234567',\n        value: '⡾',\n        codepoint: 10366,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1234567',\n        value: '⡿',\n        codepoint: 10367,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-8',\n        value: '⢀',\n        codepoint: 10368,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-18',\n        value: '⢁',\n        codepoint: 10369,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-28',\n        value: '⢂',\n        codepoint: 10370,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-128',\n        value: '⢃',\n        codepoint: 10371,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-38',\n        value: '⢄',\n        codepoint: 10372,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-138',\n        value: '⢅',\n        codepoint: 10373,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-238',\n        value: '⢆',\n        codepoint: 10374,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1238',\n        value: '⢇',\n        codepoint: 10375,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-48',\n        value: '⢈',\n        codepoint: 10376,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-148',\n        value: '⢉',\n        codepoint: 10377,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-248',\n        value: '⢊',\n        codepoint: 10378,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1248',\n        value: '⢋',\n        codepoint: 10379,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-348',\n        value: '⢌',\n        codepoint: 10380,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1348',\n        value: '⢍',\n        codepoint: 10381,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2348',\n        value: '⢎',\n        codepoint: 10382,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12348',\n        value: '⢏',\n        codepoint: 10383,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-58',\n        value: '⢐',\n        codepoint: 10384,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-158',\n        value: '⢑',\n        codepoint: 10385,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-258',\n        value: '⢒',\n        codepoint: 10386,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1258',\n        value: '⢓',\n        codepoint: 10387,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-358',\n        value: '⢔',\n        codepoint: 10388,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1358',\n        value: '⢕',\n        codepoint: 10389,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2358',\n        value: '⢖',\n        codepoint: 10390,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12358',\n        value: '⢗',\n        codepoint: 10391,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-458',\n        value: '⢘',\n        codepoint: 10392,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1458',\n        value: '⢙',\n        codepoint: 10393,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2458',\n        value: '⢚',\n        codepoint: 10394,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12458',\n        value: '⢛',\n        codepoint: 10395,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3458',\n        value: '⢜',\n        codepoint: 10396,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13458',\n        value: '⢝',\n        codepoint: 10397,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23458',\n        value: '⢞',\n        codepoint: 10398,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123458',\n        value: '⢟',\n        codepoint: 10399,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-68',\n        value: '⢠',\n        codepoint: 10400,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-168',\n        value: '⢡',\n        codepoint: 10401,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-268',\n        value: '⢢',\n        codepoint: 10402,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1268',\n        value: '⢣',\n        codepoint: 10403,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-368',\n        value: '⢤',\n        codepoint: 10404,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1368',\n        value: '⢥',\n        codepoint: 10405,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2368',\n        value: '⢦',\n        codepoint: 10406,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12368',\n        value: '⢧',\n        codepoint: 10407,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-468',\n        value: '⢨',\n        codepoint: 10408,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1468',\n        value: '⢩',\n        codepoint: 10409,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2468',\n        value: '⢪',\n        codepoint: 10410,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12468',\n        value: '⢫',\n        codepoint: 10411,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3468',\n        value: '⢬',\n        codepoint: 10412,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13468',\n        value: '⢭',\n        codepoint: 10413,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23468',\n        value: '⢮',\n        codepoint: 10414,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123468',\n        value: '⢯',\n        codepoint: 10415,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-568',\n        value: '⢰',\n        codepoint: 10416,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1568',\n        value: '⢱',\n        codepoint: 10417,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2568',\n        value: '⢲',\n        codepoint: 10418,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12568',\n        value: '⢳',\n        codepoint: 10419,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3568',\n        value: '⢴',\n        codepoint: 10420,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13568',\n        value: '⢵',\n        codepoint: 10421,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23568',\n        value: '⢶',\n        codepoint: 10422,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123568',\n        value: '⢷',\n        codepoint: 10423,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-4568',\n        value: '⢸',\n        codepoint: 10424,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-14568',\n        value: '⢹',\n        codepoint: 10425,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-24568',\n        value: '⢺',\n        codepoint: 10426,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-124568',\n        value: '⢻',\n        codepoint: 10427,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-34568',\n        value: '⢼',\n        codepoint: 10428,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-134568',\n        value: '⢽',\n        codepoint: 10429,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-234568',\n        value: '⢾',\n        codepoint: 10430,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1234568',\n        value: '⢿',\n        codepoint: 10431,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-78',\n        value: '⣀',\n        codepoint: 10432,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-178',\n        value: '⣁',\n        codepoint: 10433,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-278',\n        value: '⣂',\n        codepoint: 10434,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1278',\n        value: '⣃',\n        codepoint: 10435,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-378',\n        value: '⣄',\n        codepoint: 10436,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1378',\n        value: '⣅',\n        codepoint: 10437,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2378',\n        value: '⣆',\n        codepoint: 10438,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12378',\n        value: '⣇',\n        codepoint: 10439,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-478',\n        value: '⣈',\n        codepoint: 10440,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1478',\n        value: '⣉',\n        codepoint: 10441,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2478',\n        value: '⣊',\n        codepoint: 10442,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12478',\n        value: '⣋',\n        codepoint: 10443,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3478',\n        value: '⣌',\n        codepoint: 10444,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13478',\n        value: '⣍',\n        codepoint: 10445,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23478',\n        value: '⣎',\n        codepoint: 10446,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123478',\n        value: '⣏',\n        codepoint: 10447,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-578',\n        value: '⣐',\n        codepoint: 10448,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1578',\n        value: '⣑',\n        codepoint: 10449,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2578',\n        value: '⣒',\n        codepoint: 10450,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12578',\n        value: '⣓',\n        codepoint: 10451,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3578',\n        value: '⣔',\n        codepoint: 10452,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13578',\n        value: '⣕',\n        codepoint: 10453,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23578',\n        value: '⣖',\n        codepoint: 10454,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123578',\n        value: '⣗',\n        codepoint: 10455,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-4578',\n        value: '⣘',\n        codepoint: 10456,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-14578',\n        value: '⣙',\n        codepoint: 10457,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-24578',\n        value: '⣚',\n        codepoint: 10458,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-124578',\n        value: '⣛',\n        codepoint: 10459,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-34578',\n        value: '⣜',\n        codepoint: 10460,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-134578',\n        value: '⣝',\n        codepoint: 10461,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-234578',\n        value: '⣞',\n        codepoint: 10462,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1234578',\n        value: '⣟',\n        codepoint: 10463,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-678',\n        value: '⣠',\n        codepoint: 10464,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1678',\n        value: '⣡',\n        codepoint: 10465,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2678',\n        value: '⣢',\n        codepoint: 10466,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12678',\n        value: '⣣',\n        codepoint: 10467,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3678',\n        value: '⣤',\n        codepoint: 10468,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13678',\n        value: '⣥',\n        codepoint: 10469,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23678',\n        value: '⣦',\n        codepoint: 10470,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123678',\n        value: '⣧',\n        codepoint: 10471,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-4678',\n        value: '⣨',\n        codepoint: 10472,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-14678',\n        value: '⣩',\n        codepoint: 10473,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-24678',\n        value: '⣪',\n        codepoint: 10474,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-124678',\n        value: '⣫',\n        codepoint: 10475,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-34678',\n        value: '⣬',\n        codepoint: 10476,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-134678',\n        value: '⣭',\n        codepoint: 10477,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-234678',\n        value: '⣮',\n        codepoint: 10478,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1234678',\n        value: '⣯',\n        codepoint: 10479,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-5678',\n        value: '⣰',\n        codepoint: 10480,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-15678',\n        value: '⣱',\n        codepoint: 10481,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-25678',\n        value: '⣲',\n        codepoint: 10482,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-125678',\n        value: '⣳',\n        codepoint: 10483,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-35678',\n        value: '⣴',\n        codepoint: 10484,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-135678',\n        value: '⣵',\n        codepoint: 10485,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-235678',\n        value: '⣶',\n        codepoint: 10486,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1235678',\n        value: '⣷',\n        codepoint: 10487,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-45678',\n        value: '⣸',\n        codepoint: 10488,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-145678',\n        value: '⣹',\n        codepoint: 10489,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-245678',\n        value: '⣺',\n        codepoint: 10490,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1245678',\n        value: '⣻',\n        codepoint: 10491,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-345678',\n        value: '⣼',\n        codepoint: 10492,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1345678',\n        value: '⣽',\n        codepoint: 10493,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2345678',\n        value: '⣾',\n        codepoint: 10494,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12345678',\n        value: '⣿',\n        codepoint: 10495,\n      },\n    ],\n  },\n  {\n    name: 'Currency',\n    symbols: [\n      {\n        name: 'EURO-CURRENCY SIGN',\n        value: '₠',\n        codepoint: 8352,\n      },\n      {\n        name: 'COLON SIGN',\n        value: '₡',\n        codepoint: 8353,\n      },\n      {\n        name: 'CRUZEIRO SIGN',\n        value: '₢',\n        codepoint: 8354,\n      },\n      {\n        name: 'FRENCH FRANC SIGN',\n        value: '₣',\n        codepoint: 8355,\n      },\n      {\n        name: 'LIRA SIGN',\n        value: '₤',\n        codepoint: 8356,\n      },\n      {\n        name: 'MILL SIGN',\n        value: '₥',\n        codepoint: 8357,\n      },\n      {\n        name: 'NAIRA SIGN',\n        value: '₦',\n        codepoint: 8358,\n      },\n      {\n        name: 'PESETA SIGN',\n        value: '₧',\n        codepoint: 8359,\n      },\n      {\n        name: 'RUPEE SIGN',\n        value: '₨',\n        codepoint: 8360,\n      },\n      {\n        name: 'WON SIGN',\n        value: '₩',\n        codepoint: 8361,\n      },\n      {\n        name: 'NEW SHEQEL SIGN',\n        value: '₪',\n        codepoint: 8362,\n      },\n      {\n        name: 'DONG SIGN',\n        value: '₫',\n        codepoint: 8363,\n      },\n      {\n        name: 'EURO SIGN',\n        value: '€',\n        codepoint: 8364,\n      },\n      {\n        name: 'KIP SIGN',\n        value: '₭',\n        codepoint: 8365,\n      },\n      {\n        name: 'TUGRIK SIGN',\n        value: '₮',\n        codepoint: 8366,\n      },\n      {\n        name: 'DRACHMA SIGN',\n        value: '₯',\n        codepoint: 8367,\n      },\n      {\n        name: 'GERMAN PENNY SIGN',\n        value: '₰',\n        codepoint: 8368,\n      },\n      {\n        name: 'PESO SIGN',\n        value: '₱',\n        codepoint: 8369,\n      },\n      {\n        name: 'GUARANI SIGN',\n        value: '₲',\n        codepoint: 8370,\n      },\n      {\n        name: 'AUSTRAL SIGN',\n        value: '₳',\n        codepoint: 8371,\n      },\n      {\n        name: 'HRYVNIA SIGN',\n        value: '₴',\n        codepoint: 8372,\n      },\n      {\n        name: 'CEDI SIGN',\n        value: '₵',\n        codepoint: 8373,\n      },\n      {\n        name: 'LIVRE TOURNOIS SIGN',\n        value: '₶',\n        codepoint: 8374,\n      },\n      {\n        name: 'SPESMILO SIGN',\n        value: '₷',\n        codepoint: 8375,\n      },\n      {\n        name: 'TENGE SIGN',\n        value: '₸',\n        codepoint: 8376,\n      },\n      {\n        name: 'INDIAN RUPEE SIGN',\n        value: '₹',\n        codepoint: 8377,\n      },\n    ],\n  },\n  {\n    name: 'Game Symbols',\n    symbols: [\n      {\n        name: 'MAHJONG TILE EAST WIND',\n        value: '🀀',\n        codepoint: 126976,\n      },\n      {\n        name: 'MAHJONG TILE SOUTH WIND',\n        value: '🀁',\n        codepoint: 126977,\n      },\n      {\n        name: 'MAHJONG TILE WEST WIND',\n        value: '🀂',\n        codepoint: 126978,\n      },\n      {\n        name: 'MAHJONG TILE NORTH WIND',\n        value: '🀃',\n        codepoint: 126979,\n      },\n      {\n        name: 'MAHJONG TILE GREEN DRAGON',\n        value: '🀅',\n        codepoint: 126981,\n      },\n      {\n        name: 'MAHJONG TILE WHITE DRAGON',\n        value: '🀆',\n        codepoint: 126982,\n      },\n      {\n        name: 'MAHJONG TILE ONE OF CHARACTERS',\n        value: '🀇',\n        codepoint: 126983,\n      },\n      {\n        name: 'MAHJONG TILE TWO OF CHARACTERS',\n        value: '🀈',\n        codepoint: 126984,\n      },\n      {\n        name: 'MAHJONG TILE THREE OF CHARACTERS',\n        value: '🀉',\n        codepoint: 126985,\n      },\n      {\n        name: 'MAHJONG TILE FOUR OF CHARACTERS',\n        value: '🀊',\n        codepoint: 126986,\n      },\n      {\n        name: 'MAHJONG TILE FIVE OF CHARACTERS',\n        value: '🀋',\n        codepoint: 126987,\n      },\n      {\n        name: 'MAHJONG TILE SIX OF CHARACTERS',\n        value: '🀌',\n        codepoint: 126988,\n      },\n      {\n        name: 'MAHJONG TILE SEVEN OF CHARACTERS',\n        value: '🀍',\n        codepoint: 126989,\n      },\n      {\n        name: 'MAHJONG TILE EIGHT OF CHARACTERS',\n        value: '🀎',\n        codepoint: 126990,\n      },\n      {\n        name: 'MAHJONG TILE NINE OF CHARACTERS',\n        value: '🀏',\n        codepoint: 126991,\n      },\n      {\n        name: 'MAHJONG TILE ONE OF BAMBOOS',\n        value: '🀐',\n        codepoint: 126992,\n      },\n      {\n        name: 'MAHJONG TILE TWO OF BAMBOOS',\n        value: '🀑',\n        codepoint: 126993,\n      },\n      {\n        name: 'MAHJONG TILE THREE OF BAMBOOS',\n        value: '🀒',\n        codepoint: 126994,\n      },\n      {\n        name: 'MAHJONG TILE FOUR OF BAMBOOS',\n        value: '🀓',\n        codepoint: 126995,\n      },\n      {\n        name: 'MAHJONG TILE FIVE OF BAMBOOS',\n        value: '🀔',\n        codepoint: 126996,\n      },\n      {\n        name: 'MAHJONG TILE SIX OF BAMBOOS',\n        value: '🀕',\n        codepoint: 126997,\n      },\n      {\n        name: 'MAHJONG TILE SEVEN OF BAMBOOS',\n        value: '🀖',\n        codepoint: 126998,\n      },\n      {\n        name: 'MAHJONG TILE EIGHT OF BAMBOOS',\n        value: '🀗',\n        codepoint: 126999,\n      },\n      {\n        name: 'MAHJONG TILE NINE OF BAMBOOS',\n        value: '🀘',\n        codepoint: 127000,\n      },\n      {\n        name: 'MAHJONG TILE ONE OF CIRCLES',\n        value: '🀙',\n        codepoint: 127001,\n      },\n      {\n        name: 'MAHJONG TILE TWO OF CIRCLES',\n        value: '🀚',\n        codepoint: 127002,\n      },\n      {\n        name: 'MAHJONG TILE THREE OF CIRCLES',\n        value: '🀛',\n        codepoint: 127003,\n      },\n      {\n        name: 'MAHJONG TILE FOUR OF CIRCLES',\n        value: '🀜',\n        codepoint: 127004,\n      },\n      {\n        name: 'MAHJONG TILE FIVE OF CIRCLES',\n        value: '🀝',\n        codepoint: 127005,\n      },\n      {\n        name: 'MAHJONG TILE SIX OF CIRCLES',\n        value: '🀞',\n        codepoint: 127006,\n      },\n      {\n        name: 'MAHJONG TILE SEVEN OF CIRCLES',\n        value: '🀟',\n        codepoint: 127007,\n      },\n      {\n        name: 'MAHJONG TILE EIGHT OF CIRCLES',\n        value: '🀠',\n        codepoint: 127008,\n      },\n      {\n        name: 'MAHJONG TILE NINE OF CIRCLES',\n        value: '🀡',\n        codepoint: 127009,\n      },\n      {\n        name: 'MAHJONG TILE PLUM',\n        value: '🀢',\n        codepoint: 127010,\n      },\n      {\n        name: 'MAHJONG TILE ORCHID',\n        value: '🀣',\n        codepoint: 127011,\n      },\n      {\n        name: 'MAHJONG TILE BAMBOO',\n        value: '🀤',\n        codepoint: 127012,\n      },\n      {\n        name: 'MAHJONG TILE CHRYSANTHEMUM',\n        value: '🀥',\n        codepoint: 127013,\n      },\n      {\n        name: 'MAHJONG TILE SPRING',\n        value: '🀦',\n        codepoint: 127014,\n      },\n      {\n        name: 'MAHJONG TILE SUMMER',\n        value: '🀧',\n        codepoint: 127015,\n      },\n      {\n        name: 'MAHJONG TILE AUTUMN',\n        value: '🀨',\n        codepoint: 127016,\n      },\n      {\n        name: 'MAHJONG TILE WINTER',\n        value: '🀩',\n        codepoint: 127017,\n      },\n      {\n        name: 'MAHJONG TILE JOKER',\n        value: '🀪',\n        codepoint: 127018,\n      },\n      {\n        name: 'MAHJONG TILE BACK',\n        value: '🀫',\n        codepoint: 127019,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL BACK',\n        value: '🀰',\n        codepoint: 127024,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-00',\n        value: '🀱',\n        codepoint: 127025,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-01',\n        value: '🀲',\n        codepoint: 127026,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-02',\n        value: '🀳',\n        codepoint: 127027,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-03',\n        value: '🀴',\n        codepoint: 127028,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-04',\n        value: '🀵',\n        codepoint: 127029,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-05',\n        value: '🀶',\n        codepoint: 127030,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-06',\n        value: '🀷',\n        codepoint: 127031,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-00',\n        value: '🀸',\n        codepoint: 127032,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-01',\n        value: '🀹',\n        codepoint: 127033,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-02',\n        value: '🀺',\n        codepoint: 127034,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-03',\n        value: '🀻',\n        codepoint: 127035,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-04',\n        value: '🀼',\n        codepoint: 127036,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-05',\n        value: '🀽',\n        codepoint: 127037,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-06',\n        value: '🀾',\n        codepoint: 127038,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-00',\n        value: '🀿',\n        codepoint: 127039,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-01',\n        value: '🁀',\n        codepoint: 127040,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-02',\n        value: '🁁',\n        codepoint: 127041,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-03',\n        value: '🁂',\n        codepoint: 127042,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-04',\n        value: '🁃',\n        codepoint: 127043,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-05',\n        value: '🁄',\n        codepoint: 127044,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-06',\n        value: '🁅',\n        codepoint: 127045,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-00',\n        value: '🁆',\n        codepoint: 127046,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-01',\n        value: '🁇',\n        codepoint: 127047,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-02',\n        value: '🁈',\n        codepoint: 127048,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-03',\n        value: '🁉',\n        codepoint: 127049,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-04',\n        value: '🁊',\n        codepoint: 127050,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-05',\n        value: '🁋',\n        codepoint: 127051,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-06',\n        value: '🁌',\n        codepoint: 127052,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-00',\n        value: '🁍',\n        codepoint: 127053,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-01',\n        value: '🁎',\n        codepoint: 127054,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-02',\n        value: '🁏',\n        codepoint: 127055,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-03',\n        value: '🁐',\n        codepoint: 127056,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-04',\n        value: '🁑',\n        codepoint: 127057,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-05',\n        value: '🁒',\n        codepoint: 127058,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-06',\n        value: '🁓',\n        codepoint: 127059,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-00',\n        value: '🁔',\n        codepoint: 127060,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-01',\n        value: '🁕',\n        codepoint: 127061,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-02',\n        value: '🁖',\n        codepoint: 127062,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-03',\n        value: '🁗',\n        codepoint: 127063,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-04',\n        value: '🁘',\n        codepoint: 127064,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-05',\n        value: '🁙',\n        codepoint: 127065,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-06',\n        value: '🁚',\n        codepoint: 127066,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-00',\n        value: '🁛',\n        codepoint: 127067,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-01',\n        value: '🁜',\n        codepoint: 127068,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-02',\n        value: '🁝',\n        codepoint: 127069,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-03',\n        value: '🁞',\n        codepoint: 127070,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-04',\n        value: '🁟',\n        codepoint: 127071,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-05',\n        value: '🁠',\n        codepoint: 127072,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-06',\n        value: '🁡',\n        codepoint: 127073,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL BACK',\n        value: '🁢',\n        codepoint: 127074,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-00',\n        value: '🁣',\n        codepoint: 127075,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-01',\n        value: '🁤',\n        codepoint: 127076,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-02',\n        value: '🁥',\n        codepoint: 127077,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-03',\n        value: '🁦',\n        codepoint: 127078,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-04',\n        value: '🁧',\n        codepoint: 127079,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-05',\n        value: '🁨',\n        codepoint: 127080,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-06',\n        value: '🁩',\n        codepoint: 127081,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-00',\n        value: '🁪',\n        codepoint: 127082,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-01',\n        value: '🁫',\n        codepoint: 127083,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-02',\n        value: '🁬',\n        codepoint: 127084,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-03',\n        value: '🁭',\n        codepoint: 127085,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-04',\n        value: '🁮',\n        codepoint: 127086,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-05',\n        value: '🁯',\n        codepoint: 127087,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-06',\n        value: '🁰',\n        codepoint: 127088,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-00',\n        value: '🁱',\n        codepoint: 127089,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-01',\n        value: '🁲',\n        codepoint: 127090,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-02',\n        value: '🁳',\n        codepoint: 127091,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-03',\n        value: '🁴',\n        codepoint: 127092,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-04',\n        value: '🁵',\n        codepoint: 127093,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-05',\n        value: '🁶',\n        codepoint: 127094,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-06',\n        value: '🁷',\n        codepoint: 127095,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-00',\n        value: '🁸',\n        codepoint: 127096,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-01',\n        value: '🁹',\n        codepoint: 127097,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-02',\n        value: '🁺',\n        codepoint: 127098,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-03',\n        value: '🁻',\n        codepoint: 127099,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-04',\n        value: '🁼',\n        codepoint: 127100,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-05',\n        value: '🁽',\n        codepoint: 127101,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-06',\n        value: '🁾',\n        codepoint: 127102,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-00',\n        value: '🁿',\n        codepoint: 127103,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-01',\n        value: '🂀',\n        codepoint: 127104,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-02',\n        value: '🂁',\n        codepoint: 127105,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-03',\n        value: '🂂',\n        codepoint: 127106,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-04',\n        value: '🂃',\n        codepoint: 127107,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-05',\n        value: '🂄',\n        codepoint: 127108,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-06',\n        value: '🂅',\n        codepoint: 127109,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-00',\n        value: '🂆',\n        codepoint: 127110,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-01',\n        value: '🂇',\n        codepoint: 127111,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-02',\n        value: '🂈',\n        codepoint: 127112,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-03',\n        value: '🂉',\n        codepoint: 127113,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-04',\n        value: '🂊',\n        codepoint: 127114,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-05',\n        value: '🂋',\n        codepoint: 127115,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-06',\n        value: '🂌',\n        codepoint: 127116,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-00',\n        value: '🂍',\n        codepoint: 127117,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-01',\n        value: '🂎',\n        codepoint: 127118,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-02',\n        value: '🂏',\n        codepoint: 127119,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-03',\n        value: '🂐',\n        codepoint: 127120,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-04',\n        value: '🂑',\n        codepoint: 127121,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-05',\n        value: '🂒',\n        codepoint: 127122,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-06',\n        value: '🂓',\n        codepoint: 127123,\n      },\n      {\n        name: 'PLAYING CARD BACK',\n        value: '🂠',\n        codepoint: 127136,\n      },\n      {\n        name: 'PLAYING CARD ACE OF SPADES',\n        value: '🂡',\n        codepoint: 127137,\n      },\n      {\n        name: 'PLAYING CARD TWO OF SPADES',\n        value: '🂢',\n        codepoint: 127138,\n      },\n      {\n        name: 'PLAYING CARD THREE OF SPADES',\n        value: '🂣',\n        codepoint: 127139,\n      },\n      {\n        name: 'PLAYING CARD FOUR OF SPADES',\n        value: '🂤',\n        codepoint: 127140,\n      },\n      {\n        name: 'PLAYING CARD FIVE OF SPADES',\n        value: '🂥',\n        codepoint: 127141,\n      },\n      {\n        name: 'PLAYING CARD SIX OF SPADES',\n        value: '🂦',\n        codepoint: 127142,\n      },\n      {\n        name: 'PLAYING CARD SEVEN OF SPADES',\n        value: '🂧',\n        codepoint: 127143,\n      },\n      {\n        name: 'PLAYING CARD EIGHT OF SPADES',\n        value: '🂨',\n        codepoint: 127144,\n      },\n      {\n        name: 'PLAYING CARD NINE OF SPADES',\n        value: '🂩',\n        codepoint: 127145,\n      },\n      {\n        name: 'PLAYING CARD TEN OF SPADES',\n        value: '🂪',\n        codepoint: 127146,\n      },\n      {\n        name: 'PLAYING CARD JACK OF SPADES',\n        value: '🂫',\n        codepoint: 127147,\n      },\n      {\n        name: 'PLAYING CARD KNIGHT OF SPADES',\n        value: '🂬',\n        codepoint: 127148,\n      },\n      {\n        name: 'PLAYING CARD QUEEN OF SPADES',\n        value: '🂭',\n        codepoint: 127149,\n      },\n      {\n        name: 'PLAYING CARD KING OF SPADES',\n        value: '🂮',\n        codepoint: 127150,\n      },\n      {\n        name: 'PLAYING CARD ACE OF HEARTS',\n        value: '🂱',\n        codepoint: 127153,\n      },\n      {\n        name: 'PLAYING CARD TWO OF HEARTS',\n        value: '🂲',\n        codepoint: 127154,\n      },\n      {\n        name: 'PLAYING CARD THREE OF HEARTS',\n        value: '🂳',\n        codepoint: 127155,\n      },\n      {\n        name: 'PLAYING CARD FOUR OF HEARTS',\n        value: '🂴',\n        codepoint: 127156,\n      },\n      {\n        name: 'PLAYING CARD FIVE OF HEARTS',\n        value: '🂵',\n        codepoint: 127157,\n      },\n      {\n        name: 'PLAYING CARD SIX OF HEARTS',\n        value: '🂶',\n        codepoint: 127158,\n      },\n      {\n        name: 'PLAYING CARD SEVEN OF HEARTS',\n        value: '🂷',\n        codepoint: 127159,\n      },\n      {\n        name: 'PLAYING CARD EIGHT OF HEARTS',\n        value: '🂸',\n        codepoint: 127160,\n      },\n      {\n        name: 'PLAYING CARD NINE OF HEARTS',\n        value: '🂹',\n        codepoint: 127161,\n      },\n      {\n        name: 'PLAYING CARD TEN OF HEARTS',\n        value: '🂺',\n        codepoint: 127162,\n      },\n      {\n        name: 'PLAYING CARD JACK OF HEARTS',\n        value: '🂻',\n        codepoint: 127163,\n      },\n      {\n        name: 'PLAYING CARD KNIGHT OF HEARTS',\n        value: '🂼',\n        codepoint: 127164,\n      },\n      {\n        name: 'PLAYING CARD QUEEN OF HEARTS',\n        value: '🂽',\n        codepoint: 127165,\n      },\n      {\n        name: 'PLAYING CARD KING OF HEARTS',\n        value: '🂾',\n        codepoint: 127166,\n      },\n      {\n        name: 'PLAYING CARD ACE OF DIAMONDS',\n        value: '🃁',\n        codepoint: 127169,\n      },\n      {\n        name: 'PLAYING CARD TWO OF DIAMONDS',\n        value: '🃂',\n        codepoint: 127170,\n      },\n      {\n        name: 'PLAYING CARD THREE OF DIAMONDS',\n        value: '🃃',\n        codepoint: 127171,\n      },\n      {\n        name: 'PLAYING CARD FOUR OF DIAMONDS',\n        value: '🃄',\n        codepoint: 127172,\n      },\n      {\n        name: 'PLAYING CARD FIVE OF DIAMONDS',\n        value: '🃅',\n        codepoint: 127173,\n      },\n      {\n        name: 'PLAYING CARD SIX OF DIAMONDS',\n        value: '🃆',\n        codepoint: 127174,\n      },\n      {\n        name: 'PLAYING CARD SEVEN OF DIAMONDS',\n        value: '🃇',\n        codepoint: 127175,\n      },\n      {\n        name: 'PLAYING CARD EIGHT OF DIAMONDS',\n        value: '🃈',\n        codepoint: 127176,\n      },\n      {\n        name: 'PLAYING CARD NINE OF DIAMONDS',\n        value: '🃉',\n        codepoint: 127177,\n      },\n      {\n        name: 'PLAYING CARD TEN OF DIAMONDS',\n        value: '🃊',\n        codepoint: 127178,\n      },\n      {\n        name: 'PLAYING CARD JACK OF DIAMONDS',\n        value: '🃋',\n        codepoint: 127179,\n      },\n      {\n        name: 'PLAYING CARD KNIGHT OF DIAMONDS',\n        value: '🃌',\n        codepoint: 127180,\n      },\n      {\n        name: 'PLAYING CARD QUEEN OF DIAMONDS',\n        value: '🃍',\n        codepoint: 127181,\n      },\n      {\n        name: 'PLAYING CARD KING OF DIAMONDS',\n        value: '🃎',\n        codepoint: 127182,\n      },\n      {\n        name: 'PLAYING CARD ACE OF CLUBS',\n        value: '🃑',\n        codepoint: 127185,\n      },\n      {\n        name: 'PLAYING CARD TWO OF CLUBS',\n        value: '🃒',\n        codepoint: 127186,\n      },\n      {\n        name: 'PLAYING CARD THREE OF CLUBS',\n        value: '🃓',\n        codepoint: 127187,\n      },\n      {\n        name: 'PLAYING CARD FOUR OF CLUBS',\n        value: '🃔',\n        codepoint: 127188,\n      },\n      {\n        name: 'PLAYING CARD FIVE OF CLUBS',\n        value: '🃕',\n        codepoint: 127189,\n      },\n      {\n        name: 'PLAYING CARD SIX OF CLUBS',\n        value: '🃖',\n        codepoint: 127190,\n      },\n      {\n        name: 'PLAYING CARD SEVEN OF CLUBS',\n        value: '🃗',\n        codepoint: 127191,\n      },\n      {\n        name: 'PLAYING CARD EIGHT OF CLUBS',\n        value: '🃘',\n        codepoint: 127192,\n      },\n      {\n        name: 'PLAYING CARD NINE OF CLUBS',\n        value: '🃙',\n        codepoint: 127193,\n      },\n      {\n        name: 'PLAYING CARD TEN OF CLUBS',\n        value: '🃚',\n        codepoint: 127194,\n      },\n      {\n        name: 'PLAYING CARD JACK OF CLUBS',\n        value: '🃛',\n        codepoint: 127195,\n      },\n      {\n        name: 'PLAYING CARD KNIGHT OF CLUBS',\n        value: '🃜',\n        codepoint: 127196,\n      },\n      {\n        name: 'PLAYING CARD QUEEN OF CLUBS',\n        value: '🃝',\n        codepoint: 127197,\n      },\n      {\n        name: 'PLAYING CARD KING OF CLUBS',\n        value: '🃞',\n        codepoint: 127198,\n      },\n      {\n        name: 'PLAYING CARD WHITE JOKER',\n        value: '🃟',\n        codepoint: 127199,\n      },\n    ],\n  },\n  {\n    name: 'Music',\n    symbols: [\n      {\n        name: 'MUSICAL SYMBOL SINGLE BARLINE',\n        value: '𝄀',\n        codepoint: 119040,\n      },\n      {\n        name: 'MUSICAL SYMBOL DOUBLE BARLINE',\n        value: '𝄁',\n        codepoint: 119041,\n      },\n      {\n        name: 'MUSICAL SYMBOL FINAL BARLINE',\n        value: '𝄂',\n        codepoint: 119042,\n      },\n      {\n        name: 'MUSICAL SYMBOL REVERSE FINAL BARLINE',\n        value: '𝄃',\n        codepoint: 119043,\n      },\n      {\n        name: 'MUSICAL SYMBOL DASHED BARLINE',\n        value: '𝄄',\n        codepoint: 119044,\n      },\n      {\n        name: 'MUSICAL SYMBOL SHORT BARLINE',\n        value: '𝄅',\n        codepoint: 119045,\n      },\n      {\n        name: 'MUSICAL SYMBOL LEFT REPEAT SIGN',\n        value: '𝄆',\n        codepoint: 119046,\n      },\n      {\n        name: 'MUSICAL SYMBOL RIGHT REPEAT SIGN',\n        value: '𝄇',\n        codepoint: 119047,\n      },\n      {\n        name: 'MUSICAL SYMBOL REPEAT DOTS',\n        value: '𝄈',\n        codepoint: 119048,\n      },\n      {\n        name: 'MUSICAL SYMBOL FERMATA',\n        value: '𝄐',\n        codepoint: 119056,\n      },\n      {\n        name: 'MUSICAL SYMBOL FERMATA BELOW',\n        value: '𝄑',\n        codepoint: 119057,\n      },\n      {\n        name: 'MUSICAL SYMBOL BREATH MARK',\n        value: '𝄒',\n        codepoint: 119058,\n      },\n      {\n        name: 'MUSICAL SYMBOL G CLEF',\n        value: '𝄞',\n        codepoint: 119070,\n      },\n      {\n        name: 'MUSICAL SYMBOL C CLEF',\n        value: '𝄡',\n        codepoint: 119073,\n      },\n      {\n        name: 'MUSICAL SYMBOL F CLEF',\n        value: '𝄢',\n        codepoint: 119074,\n      },\n      {\n        name: 'MUSICAL SYMBOL DOUBLE SHARP',\n        value: '𝄪',\n        codepoint: 119082,\n      },\n      {\n        name: 'MUSICAL SYMBOL DOUBLE FLAT',\n        value: '𝄫',\n        codepoint: 119083,\n      },\n      {\n        name: 'MUSICAL SYMBOL CRESCENDO',\n        value: '𝆒',\n        codepoint: 119186,\n      },\n      {\n        name: 'MUSICAL SYMBOL DECRESCENDO',\n        value: '𝆓',\n        codepoint: 119187,\n      },\n      {\n        name: 'MUSICAL SYMBOL HAUPTSTIMME',\n        value: '𝆦',\n        codepoint: 119206,\n      },\n      {\n        name: 'MUSICAL SYMBOL NEBENSTIMME',\n        value: '𝆧',\n        codepoint: 119207,\n      },\n      {\n        name: 'MUSICAL SYMBOL END OF STIMME',\n        value: '𝆨',\n        codepoint: 119208,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA',\n        value: '𝇇',\n        codepoint: 119239,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA',\n        value: '𝇈',\n        codepoint: 119240,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1',\n        value: '𝇉',\n        codepoint: 119241,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA',\n        value: '𝇊',\n        codepoint: 119242,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA',\n        value: '𝇋',\n        codepoint: 119243,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1',\n        value: '𝇌',\n        codepoint: 119244,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2',\n        value: '𝇍',\n        codepoint: 119245,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3',\n        value: '𝇎',\n        codepoint: 119246,\n      },\n    ],\n  },\n  {\n    name: 'Geometric Shapes',\n    symbols: [\n      {\n        name: 'BLACK SQUARE',\n        value: '■',\n        codepoint: 9632,\n      },\n      {\n        name: 'WHITE SQUARE',\n        value: '□',\n        codepoint: 9633,\n      },\n      {\n        name: 'WHITE SQUARE WITH ROUNDED CORNERS',\n        value: '▢',\n        codepoint: 9634,\n      },\n      {\n        name: 'WHITE SQUARE CONTAINING BLACK SMALL SQUARE',\n        value: '▣',\n        codepoint: 9635,\n      },\n      {\n        name: 'SQUARE WITH HORIZONTAL FILL',\n        value: '▤',\n        codepoint: 9636,\n      },\n      {\n        name: 'SQUARE WITH VERTICAL FILL',\n        value: '▥',\n        codepoint: 9637,\n      },\n      {\n        name: 'SQUARE WITH ORTHOGONAL CROSSHATCH FILL',\n        value: '▦',\n        codepoint: 9638,\n      },\n      {\n        name: 'SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL',\n        value: '▧',\n        codepoint: 9639,\n      },\n      {\n        name: 'SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL',\n        value: '▨',\n        codepoint: 9640,\n      },\n      {\n        name: 'SQUARE WITH DIAGONAL CROSSHATCH FILL',\n        value: '▩',\n        codepoint: 9641,\n      },\n      {\n        name: 'BLACK RECTANGLE',\n        value: '▬',\n        codepoint: 9644,\n      },\n      {\n        name: 'WHITE RECTANGLE',\n        value: '▭',\n        codepoint: 9645,\n      },\n      {\n        name: 'BLACK VERTICAL RECTANGLE',\n        value: '▮',\n        codepoint: 9646,\n      },\n      {\n        name: 'WHITE VERTICAL RECTANGLE',\n        value: '▯',\n        codepoint: 9647,\n      },\n      {\n        name: 'BLACK PARALLELOGRAM',\n        value: '▰',\n        codepoint: 9648,\n      },\n      {\n        name: 'WHITE PARALLELOGRAM',\n        value: '▱',\n        codepoint: 9649,\n      },\n      {\n        name: 'BLACK UP-POINTING TRIANGLE',\n        value: '▲',\n        codepoint: 9650,\n      },\n      {\n        name: 'WHITE UP-POINTING TRIANGLE',\n        value: '△',\n        codepoint: 9651,\n      },\n      {\n        name: 'BLACK UP-POINTING SMALL TRIANGLE',\n        value: '▴',\n        codepoint: 9652,\n      },\n      {\n        name: 'WHITE UP-POINTING SMALL TRIANGLE',\n        value: '▵',\n        codepoint: 9653,\n      },\n      {\n        name: 'WHITE RIGHT-POINTING TRIANGLE',\n        value: '▷',\n        codepoint: 9655,\n      },\n      {\n        name: 'BLACK RIGHT-POINTING SMALL TRIANGLE',\n        value: '▸',\n        codepoint: 9656,\n      },\n      {\n        name: 'WHITE RIGHT-POINTING SMALL TRIANGLE',\n        value: '▹',\n        codepoint: 9657,\n      },\n      {\n        name: 'BLACK RIGHT-POINTING POINTER',\n        value: '►',\n        codepoint: 9658,\n      },\n      {\n        name: 'WHITE RIGHT-POINTING POINTER',\n        value: '▻',\n        codepoint: 9659,\n      },\n      {\n        name: 'BLACK DOWN-POINTING TRIANGLE',\n        value: '▼',\n        codepoint: 9660,\n      },\n      {\n        name: 'WHITE DOWN-POINTING TRIANGLE',\n        value: '▽',\n        codepoint: 9661,\n      },\n      {\n        name: 'BLACK DOWN-POINTING SMALL TRIANGLE',\n        value: '▾',\n        codepoint: 9662,\n      },\n      {\n        name: 'WHITE DOWN-POINTING SMALL TRIANGLE',\n        value: '▿',\n        codepoint: 9663,\n      },\n      {\n        name: 'WHITE LEFT-POINTING TRIANGLE',\n        value: '◁',\n        codepoint: 9665,\n      },\n      {\n        name: 'BLACK LEFT-POINTING SMALL TRIANGLE',\n        value: '◂',\n        codepoint: 9666,\n      },\n      {\n        name: 'WHITE LEFT-POINTING SMALL TRIANGLE',\n        value: '◃',\n        codepoint: 9667,\n      },\n      {\n        name: 'BLACK LEFT-POINTING POINTER',\n        value: '◄',\n        codepoint: 9668,\n      },\n      {\n        name: 'WHITE LEFT-POINTING POINTER',\n        value: '◅',\n        codepoint: 9669,\n      },\n      {\n        name: 'BLACK DIAMOND',\n        value: '◆',\n        codepoint: 9670,\n      },\n      {\n        name: 'WHITE DIAMOND',\n        value: '◇',\n        codepoint: 9671,\n      },\n      {\n        name: 'WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND',\n        value: '◈',\n        codepoint: 9672,\n      },\n      {\n        name: 'FISHEYE',\n        value: '◉',\n        codepoint: 9673,\n      },\n      {\n        name: 'LOZENGE',\n        value: '◊',\n        codepoint: 9674,\n      },\n      {\n        name: 'WHITE CIRCLE',\n        value: '○',\n        codepoint: 9675,\n      },\n      {\n        name: 'DOTTED CIRCLE',\n        value: '◌',\n        codepoint: 9676,\n      },\n      {\n        name: 'CIRCLE WITH VERTICAL FILL',\n        value: '◍',\n        codepoint: 9677,\n      },\n      {\n        name: 'BULLSEYE',\n        value: '◎',\n        codepoint: 9678,\n      },\n      {\n        name: 'BLACK CIRCLE',\n        value: '●',\n        codepoint: 9679,\n      },\n      {\n        name: 'CIRCLE WITH LEFT HALF BLACK',\n        value: '◐',\n        codepoint: 9680,\n      },\n      {\n        name: 'CIRCLE WITH RIGHT HALF BLACK',\n        value: '◑',\n        codepoint: 9681,\n      },\n      {\n        name: 'CIRCLE WITH LOWER HALF BLACK',\n        value: '◒',\n        codepoint: 9682,\n      },\n      {\n        name: 'CIRCLE WITH UPPER HALF BLACK',\n        value: '◓',\n        codepoint: 9683,\n      },\n      {\n        name: 'CIRCLE WITH UPPER RIGHT QUADRANT BLACK',\n        value: '◔',\n        codepoint: 9684,\n      },\n      {\n        name: 'CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK',\n        value: '◕',\n        codepoint: 9685,\n      },\n      {\n        name: 'LEFT HALF BLACK CIRCLE',\n        value: '◖',\n        codepoint: 9686,\n      },\n      {\n        name: 'RIGHT HALF BLACK CIRCLE',\n        value: '◗',\n        codepoint: 9687,\n      },\n      {\n        name: 'INVERSE BULLET',\n        value: '◘',\n        codepoint: 9688,\n      },\n      {\n        name: 'INVERSE WHITE CIRCLE',\n        value: '◙',\n        codepoint: 9689,\n      },\n      {\n        name: 'UPPER HALF INVERSE WHITE CIRCLE',\n        value: '◚',\n        codepoint: 9690,\n      },\n      {\n        name: 'LOWER HALF INVERSE WHITE CIRCLE',\n        value: '◛',\n        codepoint: 9691,\n      },\n      {\n        name: 'UPPER LEFT QUADRANT CIRCULAR ARC',\n        value: '◜',\n        codepoint: 9692,\n      },\n      {\n        name: 'UPPER RIGHT QUADRANT CIRCULAR ARC',\n        value: '◝',\n        codepoint: 9693,\n      },\n      {\n        name: 'LOWER RIGHT QUADRANT CIRCULAR ARC',\n        value: '◞',\n        codepoint: 9694,\n      },\n      {\n        name: 'LOWER LEFT QUADRANT CIRCULAR ARC',\n        value: '◟',\n        codepoint: 9695,\n      },\n      {\n        name: 'UPPER HALF CIRCLE',\n        value: '◠',\n        codepoint: 9696,\n      },\n      {\n        name: 'LOWER HALF CIRCLE',\n        value: '◡',\n        codepoint: 9697,\n      },\n      {\n        name: 'BLACK LOWER RIGHT TRIANGLE',\n        value: '◢',\n        codepoint: 9698,\n      },\n      {\n        name: 'BLACK LOWER LEFT TRIANGLE',\n        value: '◣',\n        codepoint: 9699,\n      },\n      {\n        name: 'BLACK UPPER LEFT TRIANGLE',\n        value: '◤',\n        codepoint: 9700,\n      },\n      {\n        name: 'BLACK UPPER RIGHT TRIANGLE',\n        value: '◥',\n        codepoint: 9701,\n      },\n      {\n        name: 'WHITE BULLET',\n        value: '◦',\n        codepoint: 9702,\n      },\n      {\n        name: 'SQUARE WITH LEFT HALF BLACK',\n        value: '◧',\n        codepoint: 9703,\n      },\n      {\n        name: 'SQUARE WITH RIGHT HALF BLACK',\n        value: '◨',\n        codepoint: 9704,\n      },\n      {\n        name: 'SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK',\n        value: '◩',\n        codepoint: 9705,\n      },\n      {\n        name: 'SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK',\n        value: '◪',\n        codepoint: 9706,\n      },\n      {\n        name: 'WHITE SQUARE WITH VERTICAL BISECTING LINE',\n        value: '◫',\n        codepoint: 9707,\n      },\n      {\n        name: 'WHITE UP-POINTING TRIANGLE WITH DOT',\n        value: '◬',\n        codepoint: 9708,\n      },\n      {\n        name: 'UP-POINTING TRIANGLE WITH LEFT HALF BLACK',\n        value: '◭',\n        codepoint: 9709,\n      },\n      {\n        name: 'UP-POINTING TRIANGLE WITH RIGHT HALF BLACK',\n        value: '◮',\n        codepoint: 9710,\n      },\n      {\n        name: 'LARGE CIRCLE',\n        value: '◯',\n        codepoint: 9711,\n      },\n      {\n        name: 'WHITE SQUARE WITH UPPER LEFT QUADRANT',\n        value: '◰',\n        codepoint: 9712,\n      },\n      {\n        name: 'WHITE SQUARE WITH LOWER LEFT QUADRANT',\n        value: '◱',\n        codepoint: 9713,\n      },\n      {\n        name: 'WHITE SQUARE WITH LOWER RIGHT QUADRANT',\n        value: '◲',\n        codepoint: 9714,\n      },\n      {\n        name: 'WHITE SQUARE WITH UPPER RIGHT QUADRANT',\n        value: '◳',\n        codepoint: 9715,\n      },\n      {\n        name: 'WHITE CIRCLE WITH UPPER LEFT QUADRANT',\n        value: '◴',\n        codepoint: 9716,\n      },\n      {\n        name: 'WHITE CIRCLE WITH LOWER LEFT QUADRANT',\n        value: '◵',\n        codepoint: 9717,\n      },\n      {\n        name: 'WHITE CIRCLE WITH LOWER RIGHT QUADRANT',\n        value: '◶',\n        codepoint: 9718,\n      },\n      {\n        name: 'WHITE CIRCLE WITH UPPER RIGHT QUADRANT',\n        value: '◷',\n        codepoint: 9719,\n      },\n      {\n        name: 'UPPER LEFT TRIANGLE',\n        value: '◸',\n        codepoint: 9720,\n      },\n      {\n        name: 'UPPER RIGHT TRIANGLE',\n        value: '◹',\n        codepoint: 9721,\n      },\n      {\n        name: 'LOWER LEFT TRIANGLE',\n        value: '◺',\n        codepoint: 9722,\n      },\n      {\n        name: 'LOWER RIGHT TRIANGLE',\n        value: '◿',\n        codepoint: 9727,\n      },\n    ],\n  },\n  {\n    name: 'Ideographic',\n    symbols: [\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT',\n        value: '⿰',\n        codepoint: 12272,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW',\n        value: '⿱',\n        codepoint: 12273,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT',\n        value: '⿲',\n        codepoint: 12274,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW',\n        value: '⿳',\n        codepoint: 12275,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND',\n        value: '⿴',\n        codepoint: 12276,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE',\n        value: '⿵',\n        codepoint: 12277,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW',\n        value: '⿶',\n        codepoint: 12278,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT',\n        value: '⿷',\n        codepoint: 12279,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT',\n        value: '⿸',\n        codepoint: 12280,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT',\n        value: '⿹',\n        codepoint: 12281,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT',\n        value: '⿺',\n        codepoint: 12282,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID',\n        value: '⿻',\n        codepoint: 12283,\n      },\n    ],\n  },\n];\n\nexport default symbols;\n","/*\n * insert_emoji.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey, EditorState } from 'prosemirror-state';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { emojiCategories, emojis, Emoji, emojiFromString, SkinTone } from '../../api/emoji';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { nodeForEmoji } from '../../marks/emoji/emoji';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { performInsertSymbol, InsertSymbolPlugin } from './insert_symbol-plugin';\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\nimport { SymbolEmojiPreferencesPanel } from './insert_symbol-emoji-skintone';\n\nconst key = new PluginKey<boolean>('insert-emoji');\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { ui, events } = context;\n  return {\n    commands: () => {\n      return [new ProsemirrorCommand(EditorCommandId.Emoji, [], performInsertSymbol(key), emojiOmniInsert(ui))];\n    },\n    plugins: (_schema: Schema) => {\n      return [new InsertSymbolPlugin(key, new EmojiSymbolDataProvider(ui), ui, events)];\n    },\n  };\n};\n\nfunction emojiOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Emoji...'),\n    description: ui.context.translateText('Image expressing idea, emotion, etc.'),\n    group: OmniInsertGroup.Content,\n    priority: 6,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.emoji_dark! : ui.images.omni_insert?.emoji!),\n  };\n}\n\nexport class EmojiSymbolDataProvider implements SymbolDataProvider {\n  public constructor(ui: EditorUI) {\n    this.ui = ui;\n  }\n  private readonly ui: EditorUI;\n\n  public readonly filterPlaceholderHint = 'emoji name';\n\n  public readonly symbolPreviewStyle: React.CSSProperties = { fontSize: '36px' } as React.CSSProperties;\n\n  public symbolPreferencesPanel = SymbolEmojiPreferencesPanel;\n\n  public insertSymbolTransaction(symbolCharacter: SymbolCharacter, searchTerm: string, state: EditorState) {\n    const emoji = emojiFromString(symbolCharacter.value, this.skinTone());\n    const tr = state.tr;\n    if (emoji) {\n      // Try to find an alias that matches the user's search term\n      const bestAlias = emoji.aliases.find(alias => alias.includes(searchTerm));\n      tr.replaceSelectionWith(nodeForEmoji(state.schema, emoji, bestAlias || emoji.aliases[0], false), false);\n    } else {\n      // This doesn't appear to be an emoji or it doesn't have a markdown representation,\n      // just insert the text\n      tr.insertText(symbolCharacter.value);\n    }\n    return tr;\n  }\n\n  public symbolGroupNames(): string[] {\n    return [kCategoryAll, ...emojiCategories()];\n  }\n\n  public getSymbols(groupName: string | undefined) {\n    if (groupName === kCategoryAll || groupName === undefined) {\n      return emojis(this.skinTone()).map(emoji => symbolForEmoji(emoji));\n    } else {\n      return emojis(this.skinTone())\n        .filter(emoji => emoji.category === groupName)\n        .map(emoji => symbolForEmoji(emoji));\n    }\n  }\n\n  public filterSymbols(filterText: string, symbols: SymbolCharacter[]): SymbolCharacter[] {\n    const filteredSymbols = symbols.filter(symbol => {\n      // Search by name\n      if (symbol.name.includes(filterText)) {\n        return true;\n      }\n\n      // search each of the aliases\n      if (symbol.aliases && symbol.aliases.find(alias => alias.includes(filterText))) {\n        return true;\n      }\n\n      return false;\n    });\n    return filteredSymbols;\n  }\n\n  private skinTone(): SkinTone {\n    return this.ui.prefs.emojiSkinTone();\n  }\n}\n\nconst kCategoryAll = 'All';\nfunction symbolForEmoji(emoji: Emoji): SymbolCharacter {\n  return {\n    name: emoji.description,\n    value: emoji.emoji,\n    markdown: emoji.hasMarkdownRepresentation ? `:${emoji.aliases[0]}:` : undefined,\n    aliases: emoji.aliases,\n    description: emoji.description,\n  };\n}\n\nexport default extension;\n","/*\n * emoji.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport kEmojis from './emojis-all';\n\nexport const kEmojiAttr = 0;\nexport const kEmojiContent = 1;\n\n// A raw emoji which doesn't include skin tone information\nexport interface EmojiRaw {\n  emojiRaw: string;\n  aliases: string[];\n  category: string;\n  description: string;\n  supportsSkinTone?: boolean;\n  hasMarkdownRepresentation: boolean;\n}\n\n// A complete emoji that may additional render skintone\nexport interface Emoji extends EmojiRaw {\n  emoji: string;\n  skinTone: SkinTone;\n}\n\n// Skin tones that are permitted for emoji\n// None = user hasn't expressed a preference\n// Default = don't apply a skin tone (use yellow emoji)\nexport enum SkinTone {\n  None = -1,\n  Default = 0,\n  Light = 0x1f3fb,\n  MediumLight = 0x1f3fc,\n  Medium = 0x1f3fd,\n  MediumDark = 0x1f3fe,\n  Dark = 0x1f3ff,\n}\n\nfunction hasSkinTone(skinTone: SkinTone): boolean {\n  return skinTone !== SkinTone.None && skinTone !== SkinTone.Default;\n}\n\nexport function emojis(skinTone: SkinTone): Emoji[] {\n  return kEmojis.map(emoji => emojiWithSkinTone(emoji, skinTone));\n}\n\nexport function emojiCategories(): string[] {\n  return kEmojis\n    .map(emoji => emoji.category)\n    .filter((catgegory, index, categories) => categories.indexOf(catgegory) === index);\n}\n\nexport function emojiFromString(emojiString: string, skinTone: SkinTone): Emoji | undefined {\n  return emojis(skinTone).find(em => em.emoji === emojiString);\n}\n\nexport function emojiWithSkinTonePreference(emoji: EmojiRaw, skinTone: SkinTone): Emoji {\n  return emojiWithSkinTone(emoji, skinTone);\n}\n\n// Find a matching non skin toned emoji for a given string\nexport function emojiFromChar(emojiString: string): EmojiRaw | undefined {\n  return kEmojis.find(emoji => emoji.emojiRaw === emojiString);\n}\n\n// Returns a non skin tonned emoji for a given alias.\nexport function emojiFromAlias(emojiAlias: string): EmojiRaw | undefined {\n  for (const emoji of kEmojis) {\n    if (emoji.aliases.includes(emojiAlias)) {\n      return emoji;\n    }\n  }\n  return undefined;\n}\n\n// Returns an array of skin toned emoji including the unskintoned emoji. If the emoji\n// doesn't support skin tones, this returns the original emoji.\nexport function emojiForAllSkinTones(emoji: EmojiRaw): Emoji[] {\n  if (emoji.supportsSkinTone) {\n    return [\n      emojiWithSkinTone(emoji, SkinTone.Default),\n      emojiWithSkinTone(emoji, SkinTone.Light),\n      emojiWithSkinTone(emoji, SkinTone.MediumLight),\n      emojiWithSkinTone(emoji, SkinTone.Medium),\n      emojiWithSkinTone(emoji, SkinTone.MediumDark),\n      emojiWithSkinTone(emoji, SkinTone.Dark),\n    ];\n  } else {\n    return [emojiWithSkinTone(emoji, SkinTone.Default)];\n  }\n}\n\n// Returns a skin toned version of the emoji, or the original emoji if it\n// doesn't support skin tones\nfunction emojiWithSkinTone(emoji: EmojiRaw, skinTone: SkinTone): Emoji {\n  if (!emoji.supportsSkinTone) {\n    return { ...emoji, emoji: emoji.emojiRaw, skinTone: SkinTone.Default };\n  }\n\n  const skinToneEmoji: Emoji = {\n    emojiRaw: emoji.emojiRaw,\n    aliases: emoji.aliases,\n    category: emoji.category,\n    description: emoji.description,\n    supportsSkinTone: emoji.supportsSkinTone,\n    hasMarkdownRepresentation: emoji.hasMarkdownRepresentation,\n    emoji: emoji.emojiRaw + characterForSkinTone(skinTone), //\n    skinTone,\n  };\n  return skinToneEmoji;\n}\n\n// No skin tone returns an empty string, otherwise the skintone codepoint\n// is converted into a string\nfunction characterForSkinTone(skinTone: SkinTone): string {\n  return hasSkinTone(skinTone) ? String.fromCodePoint(skinTone) : '';\n}\n","import { EmojiRaw } from './emoji';\n\nconst emjois: EmojiRaw[] = [\n  {\n    \"emojiRaw\": \"😀\",\n    \"description\": \"grinning face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"grinning\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😃\",\n    \"description\": \"grinning face with big eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smiley\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😄\",\n    \"description\": \"grinning face with smiling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smile\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😁\",\n    \"description\": \"beaming face with smiling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"grin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😆\",\n    \"description\": \"grinning squinting face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"laughing\",\n      \"satisfied\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😅\",\n    \"description\": \"grinning face with sweat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sweat_smile\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤣\",\n    \"description\": \"rolling on the floor laughing\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"rofl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😂\",\n    \"description\": \"face with tears of joy\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"joy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙂\",\n    \"description\": \"slightly smiling face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"slightly_smiling_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙃\",\n    \"description\": \"upside-down face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"upside_down_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😉\",\n    \"description\": \"winking face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"wink\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😊\",\n    \"description\": \"smiling face with smiling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"blush\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😇\",\n    \"description\": \"smiling face with halo\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"innocent\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥰\",\n    \"description\": \"smiling face with hearts\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smiling_face_with_three_hearts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😍\",\n    \"description\": \"smiling face with heart-eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heart_eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤩\",\n    \"description\": \"star-struck\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"star_struck\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😘\",\n    \"description\": \"face blowing a kiss\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kissing_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😗\",\n    \"description\": \"kissing face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kissing\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😚\",\n    \"description\": \"kissing face with closed eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kissing_closed_eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😙\",\n    \"description\": \"kissing face with smiling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kissing_smiling_eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😋\",\n    \"description\": \"face savoring food\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"yum\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😛\",\n    \"description\": \"face with tongue\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"stuck_out_tongue\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😜\",\n    \"description\": \"winking face with tongue\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"stuck_out_tongue_winking_eye\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤪\",\n    \"description\": \"zany face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"zany_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😝\",\n    \"description\": \"squinting face with tongue\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"stuck_out_tongue_closed_eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤑\",\n    \"description\": \"money-mouth face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"money_mouth_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤗\",\n    \"description\": \"hugging face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hugs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤭\",\n    \"description\": \"face with hand over mouth\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hand_over_mouth\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤫\",\n    \"description\": \"shushing face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"shushing_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤔\",\n    \"description\": \"thinking face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"thinking\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤐\",\n    \"description\": \"zipper-mouth face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"zipper_mouth_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤨\",\n    \"description\": \"face with raised eyebrow\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"raised_eyebrow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😐\",\n    \"description\": \"neutral face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"neutral_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😑\",\n    \"description\": \"expressionless face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"expressionless\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😶\",\n    \"description\": \"face without mouth\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"no_mouth\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😏\",\n    \"description\": \"smirking face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smirk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😒\",\n    \"description\": \"unamused face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"unamused\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙄\",\n    \"description\": \"face with rolling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"roll_eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😬\",\n    \"description\": \"grimacing face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"grimacing\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤥\",\n    \"description\": \"lying face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"lying_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😌\",\n    \"description\": \"relieved face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"relieved\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😔\",\n    \"description\": \"pensive face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"pensive\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😪\",\n    \"description\": \"sleepy face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sleepy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤤\",\n    \"description\": \"drooling face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"drooling_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😴\",\n    \"description\": \"sleeping face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sleeping\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😷\",\n    \"description\": \"face with medical mask\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"mask\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤒\",\n    \"description\": \"face with thermometer\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"face_with_thermometer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤕\",\n    \"description\": \"face with head-bandage\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"face_with_head_bandage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤢\",\n    \"description\": \"nauseated face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"nauseated_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤮\",\n    \"description\": \"face vomiting\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"vomiting_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤧\",\n    \"description\": \"sneezing face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sneezing_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥵\",\n    \"description\": \"hot face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hot_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥶\",\n    \"description\": \"cold face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cold_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥴\",\n    \"description\": \"woozy face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"woozy_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😵\",\n    \"description\": \"dizzy face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"dizzy_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤯\",\n    \"description\": \"exploding head\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"exploding_head\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤠\",\n    \"description\": \"cowboy hat face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cowboy_hat_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥳\",\n    \"description\": \"partying face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"partying_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😎\",\n    \"description\": \"smiling face with sunglasses\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sunglasses\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤓\",\n    \"description\": \"nerd face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"nerd_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧐\",\n    \"description\": \"face with monocle\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"monocle_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😕\",\n    \"description\": \"confused face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"confused\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😟\",\n    \"description\": \"worried face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"worried\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙁\",\n    \"description\": \"slightly frowning face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"slightly_frowning_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😮\",\n    \"description\": \"face with open mouth\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"open_mouth\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😯\",\n    \"description\": \"hushed face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hushed\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😲\",\n    \"description\": \"astonished face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"astonished\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😳\",\n    \"description\": \"flushed face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"flushed\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥺\",\n    \"description\": \"pleading face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"pleading_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😦\",\n    \"description\": \"frowning face with open mouth\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"frowning\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😧\",\n    \"description\": \"anguished face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"anguished\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😨\",\n    \"description\": \"fearful face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"fearful\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😰\",\n    \"description\": \"anxious face with sweat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cold_sweat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😥\",\n    \"description\": \"sad but relieved face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"disappointed_relieved\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😢\",\n    \"description\": \"crying face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😭\",\n    \"description\": \"loudly crying face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sob\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😱\",\n    \"description\": \"face screaming in fear\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"scream\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😖\",\n    \"description\": \"confounded face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"confounded\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😣\",\n    \"description\": \"persevering face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"persevere\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😞\",\n    \"description\": \"disappointed face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"disappointed\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😓\",\n    \"description\": \"downcast face with sweat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sweat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😩\",\n    \"description\": \"weary face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"weary\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😫\",\n    \"description\": \"tired face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"tired_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥱\",\n    \"description\": \"yawning face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"yawning_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😤\",\n    \"description\": \"face with steam from nose\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"triumph\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😡\",\n    \"description\": \"pouting face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"rage\",\n      \"pout\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😠\",\n    \"description\": \"angry face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"angry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤬\",\n    \"description\": \"face with symbols on mouth\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cursing_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😈\",\n    \"description\": \"smiling face with horns\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smiling_imp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👿\",\n    \"description\": \"angry face with horns\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"imp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💀\",\n    \"description\": \"skull\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"skull\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☠️\",\n    \"description\": \"skull and crossbones\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"skull_and_crossbones\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💩\",\n    \"description\": \"pile of poo\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hankey\",\n      \"poop\",\n      \"shit\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤡\",\n    \"description\": \"clown face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"clown_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👹\",\n    \"description\": \"ogre\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"japanese_ogre\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👺\",\n    \"description\": \"goblin\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"japanese_goblin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👻\",\n    \"description\": \"ghost\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"ghost\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👽\",\n    \"description\": \"alien\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"alien\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👾\",\n    \"description\": \"alien monster\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"space_invader\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤖\",\n    \"description\": \"robot\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"robot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😺\",\n    \"description\": \"grinning cat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smiley_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😸\",\n    \"description\": \"grinning cat with smiling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smile_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😹\",\n    \"description\": \"cat with tears of joy\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"joy_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😻\",\n    \"description\": \"smiling cat with heart-eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heart_eyes_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😼\",\n    \"description\": \"cat with wry smile\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smirk_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😽\",\n    \"description\": \"kissing cat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kissing_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙀\",\n    \"description\": \"weary cat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"scream_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😿\",\n    \"description\": \"crying cat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"crying_cat_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😾\",\n    \"description\": \"pouting cat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"pouting_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙈\",\n    \"description\": \"see-no-evil monkey\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"see_no_evil\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙉\",\n    \"description\": \"hear-no-evil monkey\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hear_no_evil\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙊\",\n    \"description\": \"speak-no-evil monkey\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"speak_no_evil\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💋\",\n    \"description\": \"kiss mark\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kiss\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💌\",\n    \"description\": \"love letter\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"love_letter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💘\",\n    \"description\": \"heart with arrow\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cupid\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💝\",\n    \"description\": \"heart with ribbon\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"gift_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💖\",\n    \"description\": \"sparkling heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sparkling_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💗\",\n    \"description\": \"growing heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heartpulse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💓\",\n    \"description\": \"beating heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heartbeat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💞\",\n    \"description\": \"revolving hearts\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"revolving_hearts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💕\",\n    \"description\": \"two hearts\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"two_hearts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💟\",\n    \"description\": \"heart decoration\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heart_decoration\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❣️\",\n    \"description\": \"heart exclamation\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heavy_heart_exclamation\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💔\",\n    \"description\": \"broken heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"broken_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❤️\",\n    \"description\": \"red heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧡\",\n    \"description\": \"orange heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"orange_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💛\",\n    \"description\": \"yellow heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"yellow_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💚\",\n    \"description\": \"green heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"green_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💙\",\n    \"description\": \"blue heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"blue_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💜\",\n    \"description\": \"purple heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"purple_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤎\",\n    \"description\": \"brown heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"brown_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖤\",\n    \"description\": \"black heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"black_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤍\",\n    \"description\": \"white heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"white_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💯\",\n    \"description\": \"hundred points\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"100\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💢\",\n    \"description\": \"anger symbol\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"anger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💥\",\n    \"description\": \"collision\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"boom\",\n      \"collision\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💫\",\n    \"description\": \"dizzy\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"dizzy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💦\",\n    \"description\": \"sweat droplets\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sweat_drops\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💨\",\n    \"description\": \"dashing away\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"dash\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕳️\",\n    \"description\": \"hole\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hole\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💣\",\n    \"description\": \"bomb\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"bomb\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💬\",\n    \"description\": \"speech balloon\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"speech_balloon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👁️‍🗨️\",\n    \"description\": \"eye in speech bubble\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"eye_speech_bubble\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗨️\",\n    \"description\": \"left speech bubble\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"left_speech_bubble\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗯️\",\n    \"description\": \"right anger bubble\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"right_anger_bubble\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💭\",\n    \"description\": \"thought balloon\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"thought_balloon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💤\",\n    \"description\": \"zzz\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"zzz\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👋\",\n    \"description\": \"waving hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"wave\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤚\",\n    \"description\": \"raised back of hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raised_back_of_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖐️\",\n    \"description\": \"hand with fingers splayed\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raised_hand_with_fingers_splayed\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✋\",\n    \"description\": \"raised hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"hand\",\n      \"raised_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖖\",\n    \"description\": \"vulcan salute\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"vulcan_salute\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👌\",\n    \"description\": \"OK hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ok_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤏\",\n    \"description\": \"pinching hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pinching_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✌️\",\n    \"description\": \"victory hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"v\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤞\",\n    \"description\": \"crossed fingers\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"crossed_fingers\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤟\",\n    \"description\": \"love-you gesture\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"love_you_gesture\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤘\",\n    \"description\": \"sign of the horns\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"metal\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤙\",\n    \"description\": \"call me hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"call_me_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👈\",\n    \"description\": \"backhand index pointing left\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"point_left\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👉\",\n    \"description\": \"backhand index pointing right\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"point_right\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👆\",\n    \"description\": \"backhand index pointing up\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"point_up_2\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖕\",\n    \"description\": \"middle finger\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"middle_finger\",\n      \"fu\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👇\",\n    \"description\": \"backhand index pointing down\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"point_down\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☝️\",\n    \"description\": \"index pointing up\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"point_up\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👍\",\n    \"description\": \"thumbs up\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"+1\",\n      \"thumbsup\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👎\",\n    \"description\": \"thumbs down\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"-1\",\n      \"thumbsdown\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✊\",\n    \"description\": \"raised fist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fist_raised\",\n      \"fist\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👊\",\n    \"description\": \"oncoming fist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fist_oncoming\",\n      \"facepunch\",\n      \"punch\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤛\",\n    \"description\": \"left-facing fist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fist_left\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤜\",\n    \"description\": \"right-facing fist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fist_right\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👏\",\n    \"description\": \"clapping hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"clap\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙌\",\n    \"description\": \"raising hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raised_hands\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👐\",\n    \"description\": \"open hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"open_hands\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤲\",\n    \"description\": \"palms up together\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"palms_up_together\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤝\",\n    \"description\": \"handshake\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"handshake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙏\",\n    \"description\": \"folded hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pray\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✍️\",\n    \"description\": \"writing hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"writing_hand\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💅\",\n    \"description\": \"nail polish\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"nail_care\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤳\",\n    \"description\": \"selfie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"selfie\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💪\",\n    \"description\": \"flexed biceps\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"muscle\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦾\",\n    \"description\": \"mechanical arm\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mechanical_arm\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦿\",\n    \"description\": \"mechanical leg\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mechanical_leg\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦵\",\n    \"description\": \"leg\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"leg\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦶\",\n    \"description\": \"foot\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"foot\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👂\",\n    \"description\": \"ear\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ear\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦻\",\n    \"description\": \"ear with hearing aid\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ear_with_hearing_aid\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👃\",\n    \"description\": \"nose\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"nose\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧠\",\n    \"description\": \"brain\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"brain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦷\",\n    \"description\": \"tooth\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"tooth\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦴\",\n    \"description\": \"bone\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👀\",\n    \"description\": \"eyes\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👁️\",\n    \"description\": \"eye\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"eye\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👅\",\n    \"description\": \"tongue\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"tongue\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👄\",\n    \"description\": \"mouth\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"lips\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👶\",\n    \"description\": \"baby\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"baby\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧒\",\n    \"description\": \"child\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"child\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👦\",\n    \"description\": \"boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"boy\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👧\",\n    \"description\": \"girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"girl\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑\",\n    \"description\": \"person\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"adult\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👱\",\n    \"description\": \"person: blond hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"blond_haired_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨\",\n    \"description\": \"man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧔\",\n    \"description\": \"man: beard\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bearded_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦰\",\n    \"description\": \"man: red hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"red_haired_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦱\",\n    \"description\": \"man: curly hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"curly_haired_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦳\",\n    \"description\": \"man: white hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"white_haired_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦲\",\n    \"description\": \"man: bald\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bald_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩\",\n    \"description\": \"woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦰\",\n    \"description\": \"woman: red hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"red_haired_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦰\",\n    \"description\": \"person: red hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_red_hair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦱\",\n    \"description\": \"woman: curly hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"curly_haired_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦱\",\n    \"description\": \"person: curly hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_curly_hair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦳\",\n    \"description\": \"woman: white hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"white_haired_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦳\",\n    \"description\": \"person: white hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_white_hair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦲\",\n    \"description\": \"woman: bald\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bald_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦲\",\n    \"description\": \"person: bald\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_bald\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👱‍♀️\",\n    \"description\": \"woman: blond hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"blond_haired_woman\",\n      \"blonde_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👱‍♂️\",\n    \"description\": \"man: blond hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"blond_haired_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧓\",\n    \"description\": \"older person\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"older_adult\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👴\",\n    \"description\": \"old man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"older_man\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👵\",\n    \"description\": \"old woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"older_woman\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙍\",\n    \"description\": \"person frowning\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"frowning_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙍‍♂️\",\n    \"description\": \"man frowning\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"frowning_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙍‍♀️\",\n    \"description\": \"woman frowning\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"frowning_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙎\",\n    \"description\": \"person pouting\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pouting_face\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙎‍♂️\",\n    \"description\": \"man pouting\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pouting_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙎‍♀️\",\n    \"description\": \"woman pouting\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pouting_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙅\",\n    \"description\": \"person gesturing NO\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"no_good\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙅‍♂️\",\n    \"description\": \"man gesturing NO\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"no_good_man\",\n      \"ng_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙅‍♀️\",\n    \"description\": \"woman gesturing NO\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"no_good_woman\",\n      \"ng_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙆\",\n    \"description\": \"person gesturing OK\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ok_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙆‍♂️\",\n    \"description\": \"man gesturing OK\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ok_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙆‍♀️\",\n    \"description\": \"woman gesturing OK\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ok_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💁\",\n    \"description\": \"person tipping hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"tipping_hand_person\",\n      \"information_desk_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💁‍♂️\",\n    \"description\": \"man tipping hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"tipping_hand_man\",\n      \"sassy_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💁‍♀️\",\n    \"description\": \"woman tipping hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"tipping_hand_woman\",\n      \"sassy_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙋\",\n    \"description\": \"person raising hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raising_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙋‍♂️\",\n    \"description\": \"man raising hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raising_hand_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙋‍♀️\",\n    \"description\": \"woman raising hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raising_hand_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧏\",\n    \"description\": \"deaf person\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"deaf_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧏‍♂️\",\n    \"description\": \"deaf man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"deaf_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧏‍♀️\",\n    \"description\": \"deaf woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"deaf_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙇\",\n    \"description\": \"person bowing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bow\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙇‍♂️\",\n    \"description\": \"man bowing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bowing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙇‍♀️\",\n    \"description\": \"woman bowing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bowing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤦\",\n    \"description\": \"person facepalming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"facepalm\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤦‍♂️\",\n    \"description\": \"man facepalming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_facepalming\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤦‍♀️\",\n    \"description\": \"woman facepalming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_facepalming\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤷\",\n    \"description\": \"person shrugging\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"shrug\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤷‍♂️\",\n    \"description\": \"man shrugging\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_shrugging\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤷‍♀️\",\n    \"description\": \"woman shrugging\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_shrugging\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍⚕️\",\n    \"description\": \"health worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"health_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍⚕️\",\n    \"description\": \"man health worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_health_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍⚕️\",\n    \"description\": \"woman health worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_health_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🎓\",\n    \"description\": \"student\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"student\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🎓\",\n    \"description\": \"man student\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_student\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🎓\",\n    \"description\": \"woman student\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_student\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🏫\",\n    \"description\": \"teacher\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"teacher\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🏫\",\n    \"description\": \"man teacher\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_teacher\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🏫\",\n    \"description\": \"woman teacher\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_teacher\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍⚖️\",\n    \"description\": \"judge\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"judge\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍⚖️\",\n    \"description\": \"man judge\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_judge\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍⚖️\",\n    \"description\": \"woman judge\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_judge\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🌾\",\n    \"description\": \"farmer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"farmer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🌾\",\n    \"description\": \"man farmer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_farmer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🌾\",\n    \"description\": \"woman farmer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_farmer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🍳\",\n    \"description\": \"cook\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"cook\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🍳\",\n    \"description\": \"man cook\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_cook\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🍳\",\n    \"description\": \"woman cook\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_cook\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🔧\",\n    \"description\": \"mechanic\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mechanic\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🔧\",\n    \"description\": \"man mechanic\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_mechanic\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🔧\",\n    \"description\": \"woman mechanic\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_mechanic\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🏭\",\n    \"description\": \"factory worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"factory_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🏭\",\n    \"description\": \"man factory worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_factory_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🏭\",\n    \"description\": \"woman factory worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_factory_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍💼\",\n    \"description\": \"office worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"office_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍💼\",\n    \"description\": \"man office worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_office_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍💼\",\n    \"description\": \"woman office worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_office_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🔬\",\n    \"description\": \"scientist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"scientist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🔬\",\n    \"description\": \"man scientist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_scientist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🔬\",\n    \"description\": \"woman scientist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_scientist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍💻\",\n    \"description\": \"technologist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"technologist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍💻\",\n    \"description\": \"man technologist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_technologist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍💻\",\n    \"description\": \"woman technologist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_technologist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🎤\",\n    \"description\": \"singer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"singer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🎤\",\n    \"description\": \"man singer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_singer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🎤\",\n    \"description\": \"woman singer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_singer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🎨\",\n    \"description\": \"artist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"artist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🎨\",\n    \"description\": \"man artist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_artist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🎨\",\n    \"description\": \"woman artist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_artist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍✈️\",\n    \"description\": \"pilot\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pilot\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍✈️\",\n    \"description\": \"man pilot\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_pilot\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍✈️\",\n    \"description\": \"woman pilot\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_pilot\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🚀\",\n    \"description\": \"astronaut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"astronaut\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🚀\",\n    \"description\": \"man astronaut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_astronaut\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🚀\",\n    \"description\": \"woman astronaut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_astronaut\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🚒\",\n    \"description\": \"firefighter\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"firefighter\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🚒\",\n    \"description\": \"man firefighter\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_firefighter\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🚒\",\n    \"description\": \"woman firefighter\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_firefighter\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👮\",\n    \"description\": \"police officer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"police_officer\",\n      \"cop\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👮‍♂️\",\n    \"description\": \"man police officer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"policeman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👮‍♀️\",\n    \"description\": \"woman police officer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"policewoman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕵️\",\n    \"description\": \"detective\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"detective\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕵️‍♂️\",\n    \"description\": \"man detective\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"male_detective\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕵️‍♀️\",\n    \"description\": \"woman detective\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"female_detective\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💂\",\n    \"description\": \"guard\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"guard\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💂‍♂️\",\n    \"description\": \"man guard\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"guardsman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💂‍♀️\",\n    \"description\": \"woman guard\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"guardswoman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👷\",\n    \"description\": \"construction worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"construction_worker\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👷‍♂️\",\n    \"description\": \"man construction worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"construction_worker_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👷‍♀️\",\n    \"description\": \"woman construction worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"construction_worker_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤴\",\n    \"description\": \"prince\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"prince\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👸\",\n    \"description\": \"princess\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"princess\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👳\",\n    \"description\": \"person wearing turban\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_with_turban\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👳‍♂️\",\n    \"description\": \"man wearing turban\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_with_turban\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👳‍♀️\",\n    \"description\": \"woman wearing turban\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_with_turban\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👲\",\n    \"description\": \"person with skullcap\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_with_gua_pi_mao\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧕\",\n    \"description\": \"woman with headscarf\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_with_headscarf\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤵\",\n    \"description\": \"person in tuxedo\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_in_tuxedo\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👰\",\n    \"description\": \"person with veil\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_with_veil\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤰\",\n    \"description\": \"pregnant woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pregnant_woman\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤱\",\n    \"description\": \"breast-feeding\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"breast_feeding\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👼\",\n    \"description\": \"baby angel\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"angel\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎅\",\n    \"description\": \"Santa Claus\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"santa\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤶\",\n    \"description\": \"Mrs. Claus\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mrs_claus\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🎄\",\n    \"description\": \"mx claus\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mx_claus\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"🦸\",\n    \"description\": \"superhero\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"superhero\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦸‍♂️\",\n    \"description\": \"man superhero\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"superhero_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦸‍♀️\",\n    \"description\": \"woman superhero\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"superhero_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦹\",\n    \"description\": \"supervillain\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"supervillain\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦹‍♂️\",\n    \"description\": \"man supervillain\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"supervillain_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦹‍♀️\",\n    \"description\": \"woman supervillain\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"supervillain_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧙\",\n    \"description\": \"mage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mage\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧙‍♂️\",\n    \"description\": \"man mage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mage_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧙‍♀️\",\n    \"description\": \"woman mage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mage_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧚\",\n    \"description\": \"fairy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fairy\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧚‍♂️\",\n    \"description\": \"man fairy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fairy_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧚‍♀️\",\n    \"description\": \"woman fairy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fairy_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧛\",\n    \"description\": \"vampire\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"vampire\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧛‍♂️\",\n    \"description\": \"man vampire\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"vampire_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧛‍♀️\",\n    \"description\": \"woman vampire\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"vampire_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧜\",\n    \"description\": \"merperson\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"merperson\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧜‍♂️\",\n    \"description\": \"merman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"merman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧜‍♀️\",\n    \"description\": \"mermaid\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mermaid\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧝\",\n    \"description\": \"elf\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"elf\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧝‍♂️\",\n    \"description\": \"man elf\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"elf_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧝‍♀️\",\n    \"description\": \"woman elf\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"elf_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧞\",\n    \"description\": \"genie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"genie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧞‍♂️\",\n    \"description\": \"man genie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"genie_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧞‍♀️\",\n    \"description\": \"woman genie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"genie_woman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧟\",\n    \"description\": \"zombie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"zombie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧟‍♂️\",\n    \"description\": \"man zombie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"zombie_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧟‍♀️\",\n    \"description\": \"woman zombie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"zombie_woman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💆\",\n    \"description\": \"person getting massage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"massage\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💆‍♂️\",\n    \"description\": \"man getting massage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"massage_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💆‍♀️\",\n    \"description\": \"woman getting massage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"massage_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💇\",\n    \"description\": \"person getting haircut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"haircut\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💇‍♂️\",\n    \"description\": \"man getting haircut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"haircut_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💇‍♀️\",\n    \"description\": \"woman getting haircut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"haircut_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚶\",\n    \"description\": \"person walking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"walking\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚶‍♂️\",\n    \"description\": \"man walking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"walking_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚶‍♀️\",\n    \"description\": \"woman walking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"walking_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧍\",\n    \"description\": \"person standing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"standing_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧍‍♂️\",\n    \"description\": \"man standing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"standing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧍‍♀️\",\n    \"description\": \"woman standing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"standing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧎\",\n    \"description\": \"person kneeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"kneeling_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧎‍♂️\",\n    \"description\": \"man kneeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"kneeling_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧎‍♀️\",\n    \"description\": \"woman kneeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"kneeling_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦯\",\n    \"description\": \"person with white cane\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_with_probing_cane\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦯\",\n    \"description\": \"man with white cane\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_with_probing_cane\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦯\",\n    \"description\": \"woman with white cane\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_with_probing_cane\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦼\",\n    \"description\": \"person in motorized wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_in_motorized_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦼\",\n    \"description\": \"man in motorized wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_in_motorized_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦼\",\n    \"description\": \"woman in motorized wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_in_motorized_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦽\",\n    \"description\": \"person in manual wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_in_manual_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦽\",\n    \"description\": \"man in manual wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_in_manual_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦽\",\n    \"description\": \"woman in manual wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_in_manual_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏃\",\n    \"description\": \"person running\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"runner\",\n      \"running\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏃‍♂️\",\n    \"description\": \"man running\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"running_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏃‍♀️\",\n    \"description\": \"woman running\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"running_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💃\",\n    \"description\": \"woman dancing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_dancing\",\n      \"dancer\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕺\",\n    \"description\": \"man dancing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_dancing\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕴️\",\n    \"description\": \"person in suit levitating\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"business_suit_levitating\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👯\",\n    \"description\": \"people with bunny ears\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"dancers\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👯‍♂️\",\n    \"description\": \"men with bunny ears\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"dancing_men\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👯‍♀️\",\n    \"description\": \"women with bunny ears\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"dancing_women\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧖\",\n    \"description\": \"person in steamy room\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"sauna_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧖‍♂️\",\n    \"description\": \"man in steamy room\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"sauna_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧖‍♀️\",\n    \"description\": \"woman in steamy room\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"sauna_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧗\",\n    \"description\": \"person climbing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"climbing\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧗‍♂️\",\n    \"description\": \"man climbing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"climbing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧗‍♀️\",\n    \"description\": \"woman climbing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"climbing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤺\",\n    \"description\": \"person fencing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_fencing\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏇\",\n    \"description\": \"horse racing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"horse_racing\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛷️\",\n    \"description\": \"skier\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"skier\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏂\",\n    \"description\": \"snowboarder\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"snowboarder\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏌️\",\n    \"description\": \"person golfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"golfing\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏌️‍♂️\",\n    \"description\": \"man golfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"golfing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏌️‍♀️\",\n    \"description\": \"woman golfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"golfing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏄\",\n    \"description\": \"person surfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"surfer\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏄‍♂️\",\n    \"description\": \"man surfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"surfing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏄‍♀️\",\n    \"description\": \"woman surfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"surfing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚣\",\n    \"description\": \"person rowing boat\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"rowboat\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚣‍♂️\",\n    \"description\": \"man rowing boat\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"rowing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚣‍♀️\",\n    \"description\": \"woman rowing boat\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"rowing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏊\",\n    \"description\": \"person swimming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"swimmer\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏊‍♂️\",\n    \"description\": \"man swimming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"swimming_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏊‍♀️\",\n    \"description\": \"woman swimming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"swimming_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛹️\",\n    \"description\": \"person bouncing ball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bouncing_ball_person\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛹️‍♂️\",\n    \"description\": \"man bouncing ball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bouncing_ball_man\",\n      \"basketball_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛹️‍♀️\",\n    \"description\": \"woman bouncing ball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bouncing_ball_woman\",\n      \"basketball_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏋️\",\n    \"description\": \"person lifting weights\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"weight_lifting\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏋️‍♂️\",\n    \"description\": \"man lifting weights\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"weight_lifting_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏋️‍♀️\",\n    \"description\": \"woman lifting weights\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"weight_lifting_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚴\",\n    \"description\": \"person biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bicyclist\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚴‍♂️\",\n    \"description\": \"man biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"biking_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚴‍♀️\",\n    \"description\": \"woman biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"biking_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚵\",\n    \"description\": \"person mountain biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mountain_bicyclist\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚵‍♂️\",\n    \"description\": \"man mountain biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mountain_biking_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚵‍♀️\",\n    \"description\": \"woman mountain biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mountain_biking_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤸\",\n    \"description\": \"person cartwheeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"cartwheeling\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤸‍♂️\",\n    \"description\": \"man cartwheeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_cartwheeling\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤸‍♀️\",\n    \"description\": \"woman cartwheeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_cartwheeling\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤼\",\n    \"description\": \"people wrestling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"wrestling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤼‍♂️\",\n    \"description\": \"men wrestling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"men_wrestling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤼‍♀️\",\n    \"description\": \"women wrestling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"women_wrestling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤽\",\n    \"description\": \"person playing water polo\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"water_polo\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤽‍♂️\",\n    \"description\": \"man playing water polo\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_playing_water_polo\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤽‍♀️\",\n    \"description\": \"woman playing water polo\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_playing_water_polo\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤾\",\n    \"description\": \"person playing handball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"handball_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤾‍♂️\",\n    \"description\": \"man playing handball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_playing_handball\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤾‍♀️\",\n    \"description\": \"woman playing handball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_playing_handball\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤹\",\n    \"description\": \"person juggling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"juggling_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤹‍♂️\",\n    \"description\": \"man juggling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_juggling\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤹‍♀️\",\n    \"description\": \"woman juggling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_juggling\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧘\",\n    \"description\": \"person in lotus position\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"lotus_position\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧘‍♂️\",\n    \"description\": \"man in lotus position\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"lotus_position_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧘‍♀️\",\n    \"description\": \"woman in lotus position\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"lotus_position_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛀\",\n    \"description\": \"person taking bath\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bath\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛌\",\n    \"description\": \"person in bed\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"sleeping_bed\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🤝‍🧑\",\n    \"description\": \"people holding hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"people_holding_hands\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👭\",\n    \"description\": \"women holding hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"two_women_holding_hands\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👫\",\n    \"description\": \"woman and man holding hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couple\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👬\",\n    \"description\": \"men holding hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"two_men_holding_hands\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💏\",\n    \"description\": \"kiss\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couplekiss\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍❤️‍💋‍👨\",\n    \"description\": \"kiss: woman, man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couplekiss_man_woman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍❤️‍💋‍👨\",\n    \"description\": \"kiss: man, man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couplekiss_man_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍❤️‍💋‍👩\",\n    \"description\": \"kiss: woman, woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couplekiss_woman_woman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💑\",\n    \"description\": \"couple with heart\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couple_with_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍❤️‍👨\",\n    \"description\": \"couple with heart: woman, man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couple_with_heart_woman_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍❤️‍👨\",\n    \"description\": \"couple with heart: man, man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couple_with_heart_man_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍❤️‍👩\",\n    \"description\": \"couple with heart: woman, woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couple_with_heart_woman_woman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👪\",\n    \"description\": \"family\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👩‍👦\",\n    \"description\": \"family: man, woman, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_woman_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👩‍👧\",\n    \"description\": \"family: man, woman, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_woman_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👩‍👧‍👦\",\n    \"description\": \"family: man, woman, girl, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_woman_girl_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👩‍👦‍👦\",\n    \"description\": \"family: man, woman, boy, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_woman_boy_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👩‍👧‍👧\",\n    \"description\": \"family: man, woman, girl, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_woman_girl_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👨‍👦\",\n    \"description\": \"family: man, man, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_man_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👨‍👧\",\n    \"description\": \"family: man, man, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_man_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👨‍👧‍👦\",\n    \"description\": \"family: man, man, girl, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_man_girl_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👨‍👦‍👦\",\n    \"description\": \"family: man, man, boy, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_man_boy_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👨‍👧‍👧\",\n    \"description\": \"family: man, man, girl, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_man_girl_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👩‍👦\",\n    \"description\": \"family: woman, woman, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_woman_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👩‍👧\",\n    \"description\": \"family: woman, woman, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_woman_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👩‍👧‍👦\",\n    \"description\": \"family: woman, woman, girl, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_woman_girl_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👩‍👦‍👦\",\n    \"description\": \"family: woman, woman, boy, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_woman_boy_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👩‍👧‍👧\",\n    \"description\": \"family: woman, woman, girl, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_woman_girl_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👦\",\n    \"description\": \"family: man, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👦‍👦\",\n    \"description\": \"family: man, boy, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_boy_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👧\",\n    \"description\": \"family: man, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👧‍👦\",\n    \"description\": \"family: man, girl, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_girl_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👧‍👧\",\n    \"description\": \"family: man, girl, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_girl_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👦\",\n    \"description\": \"family: woman, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👦‍👦\",\n    \"description\": \"family: woman, boy, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_boy_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👧\",\n    \"description\": \"family: woman, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👧‍👦\",\n    \"description\": \"family: woman, girl, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_girl_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👧‍👧\",\n    \"description\": \"family: woman, girl, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_girl_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗣️\",\n    \"description\": \"speaking head\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"speaking_head\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👤\",\n    \"description\": \"bust in silhouette\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bust_in_silhouette\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👥\",\n    \"description\": \"busts in silhouette\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"busts_in_silhouette\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👣\",\n    \"description\": \"footprints\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"footprints\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐵\",\n    \"description\": \"monkey face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"monkey_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐒\",\n    \"description\": \"monkey\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"monkey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦍\",\n    \"description\": \"gorilla\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"gorilla\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦧\",\n    \"description\": \"orangutan\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"orangutan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐶\",\n    \"description\": \"dog face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐕\",\n    \"description\": \"dog\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dog2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦮\",\n    \"description\": \"guide dog\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"guide_dog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐕‍🦺\",\n    \"description\": \"service dog\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"service_dog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐩\",\n    \"description\": \"poodle\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"poodle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐺\",\n    \"description\": \"wolf\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"wolf\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦊\",\n    \"description\": \"fox\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"fox_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦝\",\n    \"description\": \"raccoon\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"raccoon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐱\",\n    \"description\": \"cat face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐈\",\n    \"description\": \"cat\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cat2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦁\",\n    \"description\": \"lion\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"lion\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐯\",\n    \"description\": \"tiger face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"tiger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐅\",\n    \"description\": \"tiger\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"tiger2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐆\",\n    \"description\": \"leopard\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"leopard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐴\",\n    \"description\": \"horse face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"horse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐎\",\n    \"description\": \"horse\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"racehorse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦄\",\n    \"description\": \"unicorn\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"unicorn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦓\",\n    \"description\": \"zebra\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"zebra\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦌\",\n    \"description\": \"deer\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"deer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐮\",\n    \"description\": \"cow face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐂\",\n    \"description\": \"ox\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"ox\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐃\",\n    \"description\": \"water buffalo\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"water_buffalo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐄\",\n    \"description\": \"cow\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cow2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐷\",\n    \"description\": \"pig face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"pig\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐖\",\n    \"description\": \"pig\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"pig2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐗\",\n    \"description\": \"boar\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"boar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐽\",\n    \"description\": \"pig nose\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"pig_nose\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐏\",\n    \"description\": \"ram\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"ram\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐑\",\n    \"description\": \"ewe\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"sheep\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐐\",\n    \"description\": \"goat\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"goat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐪\",\n    \"description\": \"camel\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dromedary_camel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐫\",\n    \"description\": \"two-hump camel\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"camel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦙\",\n    \"description\": \"llama\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"llama\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦒\",\n    \"description\": \"giraffe\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"giraffe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐘\",\n    \"description\": \"elephant\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"elephant\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦏\",\n    \"description\": \"rhinoceros\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rhinoceros\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦛\",\n    \"description\": \"hippopotamus\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hippopotamus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐭\",\n    \"description\": \"mouse face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"mouse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐁\",\n    \"description\": \"mouse\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"mouse2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐀\",\n    \"description\": \"rat\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐹\",\n    \"description\": \"hamster\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hamster\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐰\",\n    \"description\": \"rabbit face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rabbit\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐇\",\n    \"description\": \"rabbit\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rabbit2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐿️\",\n    \"description\": \"chipmunk\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"chipmunk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦔\",\n    \"description\": \"hedgehog\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hedgehog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦇\",\n    \"description\": \"bat\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐻\",\n    \"description\": \"bear\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bear\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐻‍❄️\",\n    \"description\": \"polar bear\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"polar_bear\"\n    ],\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"🐨\",\n    \"description\": \"koala\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"koala\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐼\",\n    \"description\": \"panda\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"panda_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦥\",\n    \"description\": \"sloth\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"sloth\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦦\",\n    \"description\": \"otter\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"otter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦨\",\n    \"description\": \"skunk\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"skunk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦘\",\n    \"description\": \"kangaroo\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"kangaroo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦡\",\n    \"description\": \"badger\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"badger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐾\",\n    \"description\": \"paw prints\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"feet\",\n      \"paw_prints\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦃\",\n    \"description\": \"turkey\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"turkey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐔\",\n    \"description\": \"chicken\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"chicken\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐓\",\n    \"description\": \"rooster\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rooster\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐣\",\n    \"description\": \"hatching chick\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hatching_chick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐤\",\n    \"description\": \"baby chick\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"baby_chick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐥\",\n    \"description\": \"front-facing baby chick\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hatched_chick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐦\",\n    \"description\": \"bird\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bird\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐧\",\n    \"description\": \"penguin\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"penguin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕊️\",\n    \"description\": \"dove\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dove\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦅\",\n    \"description\": \"eagle\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"eagle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦆\",\n    \"description\": \"duck\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"duck\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦢\",\n    \"description\": \"swan\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"swan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦉\",\n    \"description\": \"owl\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"owl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦩\",\n    \"description\": \"flamingo\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"flamingo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦚\",\n    \"description\": \"peacock\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"peacock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦜\",\n    \"description\": \"parrot\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"parrot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐸\",\n    \"description\": \"frog\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"frog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐊\",\n    \"description\": \"crocodile\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"crocodile\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐢\",\n    \"description\": \"turtle\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"turtle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦎\",\n    \"description\": \"lizard\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"lizard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐍\",\n    \"description\": \"snake\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"snake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐲\",\n    \"description\": \"dragon face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dragon_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐉\",\n    \"description\": \"dragon\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dragon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦕\",\n    \"description\": \"sauropod\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"sauropod\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦖\",\n    \"description\": \"T-Rex\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"t-rex\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐳\",\n    \"description\": \"spouting whale\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"whale\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐋\",\n    \"description\": \"whale\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"whale2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐬\",\n    \"description\": \"dolphin\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dolphin\",\n      \"flipper\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐟\",\n    \"description\": \"fish\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"fish\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐠\",\n    \"description\": \"tropical fish\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"tropical_fish\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐡\",\n    \"description\": \"blowfish\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"blowfish\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦈\",\n    \"description\": \"shark\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"shark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐙\",\n    \"description\": \"octopus\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"octopus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐚\",\n    \"description\": \"spiral shell\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"shell\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐌\",\n    \"description\": \"snail\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"snail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦋\",\n    \"description\": \"butterfly\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"butterfly\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐛\",\n    \"description\": \"bug\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bug\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐜\",\n    \"description\": \"ant\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"ant\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐝\",\n    \"description\": \"honeybee\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bee\",\n      \"honeybee\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐞\",\n    \"description\": \"lady beetle\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"lady_beetle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦗\",\n    \"description\": \"cricket\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cricket\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕷️\",\n    \"description\": \"spider\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"spider\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕸️\",\n    \"description\": \"spider web\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"spider_web\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦂\",\n    \"description\": \"scorpion\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"scorpion\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦟\",\n    \"description\": \"mosquito\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"mosquito\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦠\",\n    \"description\": \"microbe\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"microbe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💐\",\n    \"description\": \"bouquet\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bouquet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌸\",\n    \"description\": \"cherry blossom\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cherry_blossom\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💮\",\n    \"description\": \"white flower\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"white_flower\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏵️\",\n    \"description\": \"rosette\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rosette\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌹\",\n    \"description\": \"rose\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rose\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥀\",\n    \"description\": \"wilted flower\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"wilted_flower\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌺\",\n    \"description\": \"hibiscus\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hibiscus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌻\",\n    \"description\": \"sunflower\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"sunflower\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌼\",\n    \"description\": \"blossom\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"blossom\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌷\",\n    \"description\": \"tulip\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"tulip\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌱\",\n    \"description\": \"seedling\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"seedling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌲\",\n    \"description\": \"evergreen tree\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"evergreen_tree\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌳\",\n    \"description\": \"deciduous tree\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"deciduous_tree\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌴\",\n    \"description\": \"palm tree\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"palm_tree\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌵\",\n    \"description\": \"cactus\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cactus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌾\",\n    \"description\": \"sheaf of rice\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"ear_of_rice\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌿\",\n    \"description\": \"herb\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"herb\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☘️\",\n    \"description\": \"shamrock\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"shamrock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍀\",\n    \"description\": \"four leaf clover\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"four_leaf_clover\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍁\",\n    \"description\": \"maple leaf\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"maple_leaf\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍂\",\n    \"description\": \"fallen leaf\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"fallen_leaf\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍃\",\n    \"description\": \"leaf fluttering in wind\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"leaves\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍇\",\n    \"description\": \"grapes\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"grapes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍈\",\n    \"description\": \"melon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"melon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍉\",\n    \"description\": \"watermelon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"watermelon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍊\",\n    \"description\": \"tangerine\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"tangerine\",\n      \"orange\",\n      \"mandarin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍋\",\n    \"description\": \"lemon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"lemon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍌\",\n    \"description\": \"banana\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"banana\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍍\",\n    \"description\": \"pineapple\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pineapple\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥭\",\n    \"description\": \"mango\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"mango\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍎\",\n    \"description\": \"red apple\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"apple\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍏\",\n    \"description\": \"green apple\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"green_apple\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍐\",\n    \"description\": \"pear\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pear\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍑\",\n    \"description\": \"peach\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"peach\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍒\",\n    \"description\": \"cherries\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cherries\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍓\",\n    \"description\": \"strawberry\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"strawberry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥝\",\n    \"description\": \"kiwi fruit\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"kiwi_fruit\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍅\",\n    \"description\": \"tomato\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"tomato\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥥\",\n    \"description\": \"coconut\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"coconut\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥑\",\n    \"description\": \"avocado\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"avocado\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍆\",\n    \"description\": \"eggplant\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"eggplant\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥔\",\n    \"description\": \"potato\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"potato\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥕\",\n    \"description\": \"carrot\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"carrot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌽\",\n    \"description\": \"ear of corn\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"corn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌶️\",\n    \"description\": \"hot pepper\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"hot_pepper\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥒\",\n    \"description\": \"cucumber\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cucumber\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥬\",\n    \"description\": \"leafy green\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"leafy_green\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥦\",\n    \"description\": \"broccoli\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"broccoli\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧄\",\n    \"description\": \"garlic\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"garlic\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧅\",\n    \"description\": \"onion\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"onion\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍄\",\n    \"description\": \"mushroom\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"mushroom\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥜\",\n    \"description\": \"peanuts\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"peanuts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌰\",\n    \"description\": \"chestnut\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"chestnut\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍞\",\n    \"description\": \"bread\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"bread\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥐\",\n    \"description\": \"croissant\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"croissant\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥖\",\n    \"description\": \"baguette bread\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"baguette_bread\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥨\",\n    \"description\": \"pretzel\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pretzel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥯\",\n    \"description\": \"bagel\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"bagel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥞\",\n    \"description\": \"pancakes\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pancakes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧇\",\n    \"description\": \"waffle\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"waffle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧀\",\n    \"description\": \"cheese wedge\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cheese\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍖\",\n    \"description\": \"meat on bone\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"meat_on_bone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍗\",\n    \"description\": \"poultry leg\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"poultry_leg\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥩\",\n    \"description\": \"cut of meat\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cut_of_meat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥓\",\n    \"description\": \"bacon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"bacon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍔\",\n    \"description\": \"hamburger\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"hamburger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍟\",\n    \"description\": \"french fries\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fries\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍕\",\n    \"description\": \"pizza\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pizza\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌭\",\n    \"description\": \"hot dog\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"hotdog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥪\",\n    \"description\": \"sandwich\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"sandwich\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌮\",\n    \"description\": \"taco\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"taco\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌯\",\n    \"description\": \"burrito\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"burrito\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥙\",\n    \"description\": \"stuffed flatbread\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"stuffed_flatbread\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧆\",\n    \"description\": \"falafel\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"falafel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥚\",\n    \"description\": \"egg\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"egg\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍳\",\n    \"description\": \"cooking\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fried_egg\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥘\",\n    \"description\": \"shallow pan of food\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"shallow_pan_of_food\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍲\",\n    \"description\": \"pot of food\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"stew\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥣\",\n    \"description\": \"bowl with spoon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"bowl_with_spoon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥗\",\n    \"description\": \"green salad\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"green_salad\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍿\",\n    \"description\": \"popcorn\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"popcorn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧈\",\n    \"description\": \"butter\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"butter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧂\",\n    \"description\": \"salt\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"salt\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥫\",\n    \"description\": \"canned food\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"canned_food\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍱\",\n    \"description\": \"bento box\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"bento\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍘\",\n    \"description\": \"rice cracker\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"rice_cracker\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍙\",\n    \"description\": \"rice ball\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"rice_ball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍚\",\n    \"description\": \"cooked rice\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"rice\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍛\",\n    \"description\": \"curry rice\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"curry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍜\",\n    \"description\": \"steaming bowl\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"ramen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍝\",\n    \"description\": \"spaghetti\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"spaghetti\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍠\",\n    \"description\": \"roasted sweet potato\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"sweet_potato\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍢\",\n    \"description\": \"oden\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"oden\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍣\",\n    \"description\": \"sushi\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"sushi\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍤\",\n    \"description\": \"fried shrimp\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fried_shrimp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍥\",\n    \"description\": \"fish cake with swirl\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fish_cake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥮\",\n    \"description\": \"moon cake\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"moon_cake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍡\",\n    \"description\": \"dango\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"dango\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥟\",\n    \"description\": \"dumpling\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"dumpling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥠\",\n    \"description\": \"fortune cookie\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fortune_cookie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥡\",\n    \"description\": \"takeout box\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"takeout_box\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦀\",\n    \"description\": \"crab\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"crab\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦞\",\n    \"description\": \"lobster\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"lobster\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦐\",\n    \"description\": \"shrimp\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"shrimp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦑\",\n    \"description\": \"squid\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"squid\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦪\",\n    \"description\": \"oyster\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"oyster\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍦\",\n    \"description\": \"soft ice cream\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"icecream\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍧\",\n    \"description\": \"shaved ice\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"shaved_ice\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍨\",\n    \"description\": \"ice cream\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"ice_cream\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍩\",\n    \"description\": \"doughnut\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"doughnut\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍪\",\n    \"description\": \"cookie\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cookie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎂\",\n    \"description\": \"birthday cake\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"birthday\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍰\",\n    \"description\": \"shortcake\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧁\",\n    \"description\": \"cupcake\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cupcake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥧\",\n    \"description\": \"pie\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍫\",\n    \"description\": \"chocolate bar\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"chocolate_bar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍬\",\n    \"description\": \"candy\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"candy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍭\",\n    \"description\": \"lollipop\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"lollipop\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍮\",\n    \"description\": \"custard\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"custard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍯\",\n    \"description\": \"honey pot\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"honey_pot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍼\",\n    \"description\": \"baby bottle\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"baby_bottle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥛\",\n    \"description\": \"glass of milk\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"milk_glass\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☕\",\n    \"description\": \"hot beverage\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"coffee\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍵\",\n    \"description\": \"teacup without handle\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"tea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍶\",\n    \"description\": \"sake\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"sake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍾\",\n    \"description\": \"bottle with popping cork\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"champagne\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍷\",\n    \"description\": \"wine glass\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"wine_glass\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍸\",\n    \"description\": \"cocktail glass\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cocktail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍹\",\n    \"description\": \"tropical drink\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"tropical_drink\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍺\",\n    \"description\": \"beer mug\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"beer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍻\",\n    \"description\": \"clinking beer mugs\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"beers\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥂\",\n    \"description\": \"clinking glasses\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"clinking_glasses\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥃\",\n    \"description\": \"tumbler glass\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"tumbler_glass\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥤\",\n    \"description\": \"cup with straw\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cup_with_straw\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧃\",\n    \"description\": \"beverage box\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"beverage_box\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧉\",\n    \"description\": \"mate\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"mate\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧊\",\n    \"description\": \"ice\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"ice_cube\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥢\",\n    \"description\": \"chopsticks\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"chopsticks\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍽️\",\n    \"description\": \"fork and knife with plate\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"plate_with_cutlery\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍴\",\n    \"description\": \"fork and knife\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fork_and_knife\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥄\",\n    \"description\": \"spoon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"spoon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔪\",\n    \"description\": \"kitchen knife\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"hocho\",\n      \"knife\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏺\",\n    \"description\": \"amphora\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"amphora\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌍\",\n    \"description\": \"globe showing Europe-Africa\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"earth_africa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌎\",\n    \"description\": \"globe showing Americas\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"earth_americas\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌏\",\n    \"description\": \"globe showing Asia-Australia\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"earth_asia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌐\",\n    \"description\": \"globe with meridians\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"globe_with_meridians\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗺️\",\n    \"description\": \"world map\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"world_map\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗾\",\n    \"description\": \"map of Japan\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"japan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧭\",\n    \"description\": \"compass\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"compass\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏔️\",\n    \"description\": \"snow-capped mountain\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mountain_snow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛰️\",\n    \"description\": \"mountain\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mountain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌋\",\n    \"description\": \"volcano\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"volcano\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗻\",\n    \"description\": \"mount fuji\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mount_fuji\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏕️\",\n    \"description\": \"camping\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"camping\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏖️\",\n    \"description\": \"beach with umbrella\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"beach_umbrella\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏜️\",\n    \"description\": \"desert\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"desert\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏝️\",\n    \"description\": \"desert island\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"desert_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏞️\",\n    \"description\": \"national park\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"national_park\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏟️\",\n    \"description\": \"stadium\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"stadium\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏛️\",\n    \"description\": \"classical building\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"classical_building\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏗️\",\n    \"description\": \"building construction\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"building_construction\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧱\",\n    \"description\": \"brick\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bricks\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏘️\",\n    \"description\": \"houses\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"houses\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏚️\",\n    \"description\": \"derelict house\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"derelict_house\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏠\",\n    \"description\": \"house\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"house\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏡\",\n    \"description\": \"house with garden\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"house_with_garden\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏢\",\n    \"description\": \"office building\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"office\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏣\",\n    \"description\": \"Japanese post office\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"post_office\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏤\",\n    \"description\": \"post office\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"european_post_office\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏥\",\n    \"description\": \"hospital\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hospital\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏦\",\n    \"description\": \"bank\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bank\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏨\",\n    \"description\": \"hotel\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hotel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏩\",\n    \"description\": \"love hotel\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"love_hotel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏪\",\n    \"description\": \"convenience store\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"convenience_store\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏫\",\n    \"description\": \"school\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"school\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏬\",\n    \"description\": \"department store\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"department_store\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏭\",\n    \"description\": \"factory\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"factory\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏯\",\n    \"description\": \"Japanese castle\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"japanese_castle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏰\",\n    \"description\": \"castle\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"european_castle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💒\",\n    \"description\": \"wedding\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"wedding\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗼\",\n    \"description\": \"Tokyo tower\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"tokyo_tower\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗽\",\n    \"description\": \"Statue of Liberty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"statue_of_liberty\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛪\",\n    \"description\": \"church\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"church\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕌\",\n    \"description\": \"mosque\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mosque\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛕\",\n    \"description\": \"hindu temple\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hindu_temple\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕍\",\n    \"description\": \"synagogue\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"synagogue\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛩️\",\n    \"description\": \"shinto shrine\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"shinto_shrine\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕋\",\n    \"description\": \"kaaba\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"kaaba\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛲\",\n    \"description\": \"fountain\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"fountain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛺\",\n    \"description\": \"tent\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"tent\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌁\",\n    \"description\": \"foggy\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"foggy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌃\",\n    \"description\": \"night with stars\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"night_with_stars\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏙️\",\n    \"description\": \"cityscape\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cityscape\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌄\",\n    \"description\": \"sunrise over mountains\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sunrise_over_mountains\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌅\",\n    \"description\": \"sunrise\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sunrise\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌆\",\n    \"description\": \"cityscape at dusk\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"city_sunset\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌇\",\n    \"description\": \"sunset\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"city_sunrise\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌉\",\n    \"description\": \"bridge at night\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bridge_at_night\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♨️\",\n    \"description\": \"hot springs\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hotsprings\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎠\",\n    \"description\": \"carousel horse\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"carousel_horse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎡\",\n    \"description\": \"ferris wheel\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ferris_wheel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎢\",\n    \"description\": \"roller coaster\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"roller_coaster\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💈\",\n    \"description\": \"barber pole\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"barber\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎪\",\n    \"description\": \"circus tent\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"circus_tent\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚂\",\n    \"description\": \"locomotive\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"steam_locomotive\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚃\",\n    \"description\": \"railway car\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"railway_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚄\",\n    \"description\": \"high-speed train\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bullettrain_side\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚅\",\n    \"description\": \"bullet train\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bullettrain_front\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚆\",\n    \"description\": \"train\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"train2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚇\",\n    \"description\": \"metro\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"metro\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚈\",\n    \"description\": \"light rail\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"light_rail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚉\",\n    \"description\": \"station\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"station\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚊\",\n    \"description\": \"tram\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"tram\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚝\",\n    \"description\": \"monorail\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"monorail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚞\",\n    \"description\": \"mountain railway\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mountain_railway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚋\",\n    \"description\": \"tram car\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"train\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚌\",\n    \"description\": \"bus\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚍\",\n    \"description\": \"oncoming bus\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"oncoming_bus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚎\",\n    \"description\": \"trolleybus\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"trolleybus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚐\",\n    \"description\": \"minibus\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"minibus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚑\",\n    \"description\": \"ambulance\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ambulance\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚒\",\n    \"description\": \"fire engine\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"fire_engine\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚓\",\n    \"description\": \"police car\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"police_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚔\",\n    \"description\": \"oncoming police car\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"oncoming_police_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚕\",\n    \"description\": \"taxi\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"taxi\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚖\",\n    \"description\": \"oncoming taxi\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"oncoming_taxi\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚗\",\n    \"description\": \"automobile\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"car\",\n      \"red_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚘\",\n    \"description\": \"oncoming automobile\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"oncoming_automobile\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚙\",\n    \"description\": \"sport utility vehicle\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"blue_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚚\",\n    \"description\": \"delivery truck\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"truck\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚛\",\n    \"description\": \"articulated lorry\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"articulated_lorry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚜\",\n    \"description\": \"tractor\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"tractor\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏎️\",\n    \"description\": \"racing car\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"racing_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏍️\",\n    \"description\": \"motorcycle\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"motorcycle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛵\",\n    \"description\": \"motor scooter\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"motor_scooter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦽\",\n    \"description\": \"manual wheelchair\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"manual_wheelchair\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦼\",\n    \"description\": \"motorized wheelchair\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"motorized_wheelchair\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛺\",\n    \"description\": \"auto rickshaw\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"auto_rickshaw\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚲\",\n    \"description\": \"bicycle\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bike\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛴\",\n    \"description\": \"kick scooter\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"kick_scooter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛹\",\n    \"description\": \"skateboard\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"skateboard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚏\",\n    \"description\": \"bus stop\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"busstop\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛣️\",\n    \"description\": \"motorway\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"motorway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛤️\",\n    \"description\": \"railway track\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"railway_track\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛢️\",\n    \"description\": \"oil drum\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"oil_drum\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛽\",\n    \"description\": \"fuel pump\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"fuelpump\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚨\",\n    \"description\": \"police car light\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"rotating_light\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚥\",\n    \"description\": \"horizontal traffic light\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"traffic_light\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚦\",\n    \"description\": \"vertical traffic light\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"vertical_traffic_light\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛑\",\n    \"description\": \"stop sign\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"stop_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚧\",\n    \"description\": \"construction\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"construction\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚓\",\n    \"description\": \"anchor\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"anchor\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛵\",\n    \"description\": \"sailboat\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"boat\",\n      \"sailboat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛶\",\n    \"description\": \"canoe\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"canoe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚤\",\n    \"description\": \"speedboat\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"speedboat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛳️\",\n    \"description\": \"passenger ship\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"passenger_ship\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛴️\",\n    \"description\": \"ferry\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ferry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛥️\",\n    \"description\": \"motor boat\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"motor_boat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚢\",\n    \"description\": \"ship\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ship\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✈️\",\n    \"description\": \"airplane\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"airplane\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛩️\",\n    \"description\": \"small airplane\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"small_airplane\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛫\",\n    \"description\": \"airplane departure\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"flight_departure\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛬\",\n    \"description\": \"airplane arrival\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"flight_arrival\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪂\",\n    \"description\": \"parachute\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"parachute\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💺\",\n    \"description\": \"seat\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"seat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚁\",\n    \"description\": \"helicopter\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"helicopter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚟\",\n    \"description\": \"suspension railway\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"suspension_railway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚠\",\n    \"description\": \"mountain cableway\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mountain_cableway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚡\",\n    \"description\": \"aerial tramway\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"aerial_tramway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛰️\",\n    \"description\": \"satellite\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"artificial_satellite\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚀\",\n    \"description\": \"rocket\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"rocket\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛸\",\n    \"description\": \"flying saucer\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"flying_saucer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛎️\",\n    \"description\": \"bellhop bell\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bellhop_bell\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧳\",\n    \"description\": \"luggage\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"luggage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⌛\",\n    \"description\": \"hourglass done\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hourglass\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏳\",\n    \"description\": \"hourglass not done\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hourglass_flowing_sand\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⌚\",\n    \"description\": \"watch\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"watch\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏰\",\n    \"description\": \"alarm clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"alarm_clock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏱️\",\n    \"description\": \"stopwatch\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"stopwatch\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏲️\",\n    \"description\": \"timer clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"timer_clock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕰️\",\n    \"description\": \"mantelpiece clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mantelpiece_clock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕛\",\n    \"description\": \"twelve o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock12\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕧\",\n    \"description\": \"twelve-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock1230\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕐\",\n    \"description\": \"one o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock1\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕜\",\n    \"description\": \"one-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock130\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕑\",\n    \"description\": \"two o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕝\",\n    \"description\": \"two-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock230\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕒\",\n    \"description\": \"three o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock3\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕞\",\n    \"description\": \"three-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock330\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕓\",\n    \"description\": \"four o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock4\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕟\",\n    \"description\": \"four-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock430\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕔\",\n    \"description\": \"five o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock5\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕠\",\n    \"description\": \"five-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock530\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕕\",\n    \"description\": \"six o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock6\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕡\",\n    \"description\": \"six-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock630\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕖\",\n    \"description\": \"seven o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock7\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕢\",\n    \"description\": \"seven-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock730\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕗\",\n    \"description\": \"eight o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock8\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕣\",\n    \"description\": \"eight-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock830\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕘\",\n    \"description\": \"nine o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock9\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕤\",\n    \"description\": \"nine-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock930\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕙\",\n    \"description\": \"ten o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock10\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕥\",\n    \"description\": \"ten-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock1030\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕚\",\n    \"description\": \"eleven o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock11\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕦\",\n    \"description\": \"eleven-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock1130\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌑\",\n    \"description\": \"new moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"new_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌒\",\n    \"description\": \"waxing crescent moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"waxing_crescent_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌓\",\n    \"description\": \"first quarter moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"first_quarter_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌔\",\n    \"description\": \"waxing gibbous moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"moon\",\n      \"waxing_gibbous_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌕\",\n    \"description\": \"full moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"full_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌖\",\n    \"description\": \"waning gibbous moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"waning_gibbous_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌗\",\n    \"description\": \"last quarter moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"last_quarter_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌘\",\n    \"description\": \"waning crescent moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"waning_crescent_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌙\",\n    \"description\": \"crescent moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"crescent_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌚\",\n    \"description\": \"new moon face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"new_moon_with_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌛\",\n    \"description\": \"first quarter moon face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"first_quarter_moon_with_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌜\",\n    \"description\": \"last quarter moon face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"last_quarter_moon_with_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌡️\",\n    \"description\": \"thermometer\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"thermometer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☀️\",\n    \"description\": \"sun\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sunny\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌝\",\n    \"description\": \"full moon face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"full_moon_with_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌞\",\n    \"description\": \"sun with face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sun_with_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪐\",\n    \"description\": \"ringed planet\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ringed_planet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⭐\",\n    \"description\": \"star\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"star\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌟\",\n    \"description\": \"glowing star\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"star2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌠\",\n    \"description\": \"shooting star\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"stars\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌌\",\n    \"description\": \"milky way\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"milky_way\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☁️\",\n    \"description\": \"cloud\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cloud\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛅\",\n    \"description\": \"sun behind cloud\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"partly_sunny\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛈️\",\n    \"description\": \"cloud with lightning and rain\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cloud_with_lightning_and_rain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌤️\",\n    \"description\": \"sun behind small cloud\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sun_behind_small_cloud\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌥️\",\n    \"description\": \"sun behind large cloud\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sun_behind_large_cloud\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌦️\",\n    \"description\": \"sun behind rain cloud\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sun_behind_rain_cloud\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌧️\",\n    \"description\": \"cloud with rain\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cloud_with_rain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌨️\",\n    \"description\": \"cloud with snow\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cloud_with_snow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌩️\",\n    \"description\": \"cloud with lightning\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cloud_with_lightning\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌪️\",\n    \"description\": \"tornado\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"tornado\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌫️\",\n    \"description\": \"fog\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"fog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌬️\",\n    \"description\": \"wind face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"wind_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌀\",\n    \"description\": \"cyclone\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cyclone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌈\",\n    \"description\": \"rainbow\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"rainbow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌂\",\n    \"description\": \"closed umbrella\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"closed_umbrella\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☂️\",\n    \"description\": \"umbrella\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"open_umbrella\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☔\",\n    \"description\": \"umbrella with rain drops\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"umbrella\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛱️\",\n    \"description\": \"umbrella on ground\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"parasol_on_ground\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚡\",\n    \"description\": \"high voltage\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"zap\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❄️\",\n    \"description\": \"snowflake\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"snowflake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☃️\",\n    \"description\": \"snowman\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"snowman_with_snow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛄\",\n    \"description\": \"snowman without snow\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"snowman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☄️\",\n    \"description\": \"comet\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"comet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔥\",\n    \"description\": \"fire\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"fire\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💧\",\n    \"description\": \"droplet\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"droplet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌊\",\n    \"description\": \"water wave\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ocean\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎃\",\n    \"description\": \"jack-o-lantern\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"jack_o_lantern\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎄\",\n    \"description\": \"Christmas tree\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"christmas_tree\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎆\",\n    \"description\": \"fireworks\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"fireworks\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎇\",\n    \"description\": \"sparkler\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"sparkler\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧨\",\n    \"description\": \"firecracker\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"firecracker\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✨\",\n    \"description\": \"sparkles\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"sparkles\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎈\",\n    \"description\": \"balloon\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"balloon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎉\",\n    \"description\": \"party popper\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"tada\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎊\",\n    \"description\": \"confetti ball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"confetti_ball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎋\",\n    \"description\": \"tanabata tree\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"tanabata_tree\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎍\",\n    \"description\": \"pine decoration\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"bamboo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎎\",\n    \"description\": \"Japanese dolls\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"dolls\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎏\",\n    \"description\": \"carp streamer\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"flags\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎐\",\n    \"description\": \"wind chime\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"wind_chime\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎑\",\n    \"description\": \"moon viewing ceremony\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"rice_scene\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧧\",\n    \"description\": \"red envelope\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"red_envelope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎀\",\n    \"description\": \"ribbon\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ribbon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎁\",\n    \"description\": \"wrapped gift\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"gift\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎗️\",\n    \"description\": \"reminder ribbon\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"reminder_ribbon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎟️\",\n    \"description\": \"admission tickets\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"tickets\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎫\",\n    \"description\": \"ticket\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ticket\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎖️\",\n    \"description\": \"military medal\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"medal_military\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏆\",\n    \"description\": \"trophy\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"trophy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏅\",\n    \"description\": \"sports medal\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"medal_sports\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥇\",\n    \"description\": \"1st place medal\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"1st_place_medal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥈\",\n    \"description\": \"2nd place medal\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"2nd_place_medal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥉\",\n    \"description\": \"3rd place medal\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"3rd_place_medal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚽\",\n    \"description\": \"soccer ball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"soccer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚾\",\n    \"description\": \"baseball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"baseball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥎\",\n    \"description\": \"softball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"softball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏀\",\n    \"description\": \"basketball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"basketball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏐\",\n    \"description\": \"volleyball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"volleyball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏈\",\n    \"description\": \"american football\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"football\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏉\",\n    \"description\": \"rugby football\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"rugby_football\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎾\",\n    \"description\": \"tennis\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"tennis\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥏\",\n    \"description\": \"flying disc\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"flying_disc\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎳\",\n    \"description\": \"bowling\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"bowling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏏\",\n    \"description\": \"cricket game\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"cricket_game\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏑\",\n    \"description\": \"field hockey\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"field_hockey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏒\",\n    \"description\": \"ice hockey\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ice_hockey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥍\",\n    \"description\": \"lacrosse\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"lacrosse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏓\",\n    \"description\": \"ping pong\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ping_pong\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏸\",\n    \"description\": \"badminton\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"badminton\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥊\",\n    \"description\": \"boxing glove\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"boxing_glove\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥋\",\n    \"description\": \"martial arts uniform\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"martial_arts_uniform\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥅\",\n    \"description\": \"goal net\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"goal_net\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛳\",\n    \"description\": \"flag in hole\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"golf\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛸️\",\n    \"description\": \"ice skate\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ice_skate\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎣\",\n    \"description\": \"fishing pole\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"fishing_pole_and_fish\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤿\",\n    \"description\": \"diving mask\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"diving_mask\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎽\",\n    \"description\": \"running shirt\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"running_shirt_with_sash\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎿\",\n    \"description\": \"skis\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ski\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛷\",\n    \"description\": \"sled\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"sled\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥌\",\n    \"description\": \"curling stone\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"curling_stone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎯\",\n    \"description\": \"direct hit\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"dart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪀\",\n    \"description\": \"yo-yo\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"yo_yo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪁\",\n    \"description\": \"kite\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"kite\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎱\",\n    \"description\": \"pool 8 ball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"8ball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔮\",\n    \"description\": \"crystal ball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"crystal_ball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧿\",\n    \"description\": \"nazar amulet\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"nazar_amulet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎮\",\n    \"description\": \"video game\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"video_game\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕹️\",\n    \"description\": \"joystick\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"joystick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎰\",\n    \"description\": \"slot machine\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"slot_machine\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎲\",\n    \"description\": \"game die\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"game_die\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧩\",\n    \"description\": \"puzzle piece\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"jigsaw\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧸\",\n    \"description\": \"teddy bear\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"teddy_bear\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪅\",\n    \"description\": \"piñata\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"pinata\"\n    ],\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"♠️\",\n    \"description\": \"spade suit\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"spades\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♥️\",\n    \"description\": \"heart suit\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"hearts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♦️\",\n    \"description\": \"diamond suit\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"diamonds\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♣️\",\n    \"description\": \"club suit\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"clubs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♟️\",\n    \"description\": \"chess pawn\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"chess_pawn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🃏\",\n    \"description\": \"joker\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"black_joker\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🀄\",\n    \"description\": \"mahjong red dragon\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"mahjong\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎴\",\n    \"description\": \"flower playing cards\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"flower_playing_cards\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎭\",\n    \"description\": \"performing arts\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"performing_arts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖼️\",\n    \"description\": \"framed picture\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"framed_picture\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎨\",\n    \"description\": \"artist palette\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"art\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧵\",\n    \"description\": \"thread\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"thread\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧶\",\n    \"description\": \"yarn\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"yarn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👓\",\n    \"description\": \"glasses\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"eyeglasses\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕶️\",\n    \"description\": \"sunglasses\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dark_sunglasses\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥽\",\n    \"description\": \"goggles\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"goggles\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥼\",\n    \"description\": \"lab coat\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"lab_coat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦺\",\n    \"description\": \"safety vest\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"safety_vest\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👔\",\n    \"description\": \"necktie\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"necktie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👕\",\n    \"description\": \"t-shirt\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shirt\",\n      \"tshirt\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👖\",\n    \"description\": \"jeans\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"jeans\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧣\",\n    \"description\": \"scarf\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"scarf\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧤\",\n    \"description\": \"gloves\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"gloves\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧥\",\n    \"description\": \"coat\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"coat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧦\",\n    \"description\": \"socks\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"socks\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👗\",\n    \"description\": \"dress\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dress\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👘\",\n    \"description\": \"kimono\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"kimono\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥻\",\n    \"description\": \"sari\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"sari\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩱\",\n    \"description\": \"one-piece swimsuit\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"one_piece_swimsuit\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩲\",\n    \"description\": \"briefs\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"swim_brief\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩳\",\n    \"description\": \"shorts\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shorts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👙\",\n    \"description\": \"bikini\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bikini\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👚\",\n    \"description\": \"woman’s clothes\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"womans_clothes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👛\",\n    \"description\": \"purse\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"purse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👜\",\n    \"description\": \"handbag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"handbag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👝\",\n    \"description\": \"clutch bag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pouch\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛍️\",\n    \"description\": \"shopping bags\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shopping\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎒\",\n    \"description\": \"backpack\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"school_satchel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👞\",\n    \"description\": \"man’s shoe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mans_shoe\",\n      \"shoe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👟\",\n    \"description\": \"running shoe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"athletic_shoe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥾\",\n    \"description\": \"hiking boot\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"hiking_boot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥿\",\n    \"description\": \"flat shoe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"flat_shoe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👠\",\n    \"description\": \"high-heeled shoe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"high_heel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👡\",\n    \"description\": \"woman’s sandal\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"sandal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩰\",\n    \"description\": \"ballet shoes\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"ballet_shoes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👢\",\n    \"description\": \"woman’s boot\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"boot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👑\",\n    \"description\": \"crown\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"crown\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👒\",\n    \"description\": \"woman’s hat\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"womans_hat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎩\",\n    \"description\": \"top hat\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"tophat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎓\",\n    \"description\": \"graduation cap\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mortar_board\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧢\",\n    \"description\": \"billed cap\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"billed_cap\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛑️\",\n    \"description\": \"rescue worker’s helmet\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"rescue_worker_helmet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📿\",\n    \"description\": \"prayer beads\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"prayer_beads\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💄\",\n    \"description\": \"lipstick\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"lipstick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💍\",\n    \"description\": \"ring\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"ring\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💎\",\n    \"description\": \"gem stone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"gem\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔇\",\n    \"description\": \"muted speaker\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mute\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔈\",\n    \"description\": \"speaker low volume\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"speaker\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔉\",\n    \"description\": \"speaker medium volume\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"sound\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔊\",\n    \"description\": \"speaker high volume\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"loud_sound\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📢\",\n    \"description\": \"loudspeaker\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"loudspeaker\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📣\",\n    \"description\": \"megaphone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mega\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📯\",\n    \"description\": \"postal horn\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"postal_horn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔔\",\n    \"description\": \"bell\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bell\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔕\",\n    \"description\": \"bell with slash\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"no_bell\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎼\",\n    \"description\": \"musical score\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"musical_score\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎵\",\n    \"description\": \"musical note\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"musical_note\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎶\",\n    \"description\": \"musical notes\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"notes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎙️\",\n    \"description\": \"studio microphone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"studio_microphone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎚️\",\n    \"description\": \"level slider\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"level_slider\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎛️\",\n    \"description\": \"control knobs\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"control_knobs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎤\",\n    \"description\": \"microphone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"microphone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎧\",\n    \"description\": \"headphone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"headphones\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📻\",\n    \"description\": \"radio\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"radio\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎷\",\n    \"description\": \"saxophone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"saxophone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎸\",\n    \"description\": \"guitar\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"guitar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎹\",\n    \"description\": \"musical keyboard\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"musical_keyboard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎺\",\n    \"description\": \"trumpet\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"trumpet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎻\",\n    \"description\": \"violin\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"violin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪕\",\n    \"description\": \"banjo\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"banjo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥁\",\n    \"description\": \"drum\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"drum\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪘\",\n    \"description\": \"long drum\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"long_drum\"\n    ],\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"📱\",\n    \"description\": \"mobile phone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"iphone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📲\",\n    \"description\": \"mobile phone with arrow\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"calling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☎️\",\n    \"description\": \"telephone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"phone\",\n      \"telephone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📞\",\n    \"description\": \"telephone receiver\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"telephone_receiver\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📟\",\n    \"description\": \"pager\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pager\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📠\",\n    \"description\": \"fax machine\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"fax\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔋\",\n    \"description\": \"battery\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"battery\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔌\",\n    \"description\": \"electric plug\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"electric_plug\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💻\",\n    \"description\": \"laptop\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"computer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖥️\",\n    \"description\": \"desktop computer\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"desktop_computer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖨️\",\n    \"description\": \"printer\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"printer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⌨️\",\n    \"description\": \"keyboard\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"keyboard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖱️\",\n    \"description\": \"computer mouse\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"computer_mouse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖲️\",\n    \"description\": \"trackball\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"trackball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💽\",\n    \"description\": \"computer disk\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"minidisc\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💾\",\n    \"description\": \"floppy disk\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"floppy_disk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💿\",\n    \"description\": \"optical disk\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"cd\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📀\",\n    \"description\": \"dvd\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dvd\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧮\",\n    \"description\": \"abacus\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"abacus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎥\",\n    \"description\": \"movie camera\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"movie_camera\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎞️\",\n    \"description\": \"film frames\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"film_strip\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📽️\",\n    \"description\": \"film projector\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"film_projector\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎬\",\n    \"description\": \"clapper board\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"clapper\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📺\",\n    \"description\": \"television\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"tv\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📷\",\n    \"description\": \"camera\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"camera\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📸\",\n    \"description\": \"camera with flash\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"camera_flash\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📹\",\n    \"description\": \"video camera\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"video_camera\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📼\",\n    \"description\": \"videocassette\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"vhs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔍\",\n    \"description\": \"magnifying glass tilted left\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔎\",\n    \"description\": \"magnifying glass tilted right\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mag_right\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕯️\",\n    \"description\": \"candle\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"candle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💡\",\n    \"description\": \"light bulb\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bulb\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔦\",\n    \"description\": \"flashlight\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"flashlight\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏮\",\n    \"description\": \"red paper lantern\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"izakaya_lantern\",\n      \"lantern\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪔\",\n    \"description\": \"diya lamp\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"diya_lamp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📔\",\n    \"description\": \"notebook with decorative cover\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"notebook_with_decorative_cover\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📕\",\n    \"description\": \"closed book\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"closed_book\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📖\",\n    \"description\": \"open book\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"book\",\n      \"open_book\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📗\",\n    \"description\": \"green book\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"green_book\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📘\",\n    \"description\": \"blue book\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"blue_book\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📙\",\n    \"description\": \"orange book\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"orange_book\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📚\",\n    \"description\": \"books\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"books\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📓\",\n    \"description\": \"notebook\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"notebook\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📒\",\n    \"description\": \"ledger\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"ledger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📃\",\n    \"description\": \"page with curl\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"page_with_curl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📜\",\n    \"description\": \"scroll\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"scroll\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📄\",\n    \"description\": \"page facing up\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"page_facing_up\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📰\",\n    \"description\": \"newspaper\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"newspaper\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗞️\",\n    \"description\": \"rolled-up newspaper\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"newspaper_roll\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📑\",\n    \"description\": \"bookmark tabs\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bookmark_tabs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔖\",\n    \"description\": \"bookmark\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bookmark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏷️\",\n    \"description\": \"label\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"label\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💰\",\n    \"description\": \"money bag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"moneybag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💴\",\n    \"description\": \"yen banknote\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"yen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💵\",\n    \"description\": \"dollar banknote\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dollar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💶\",\n    \"description\": \"euro banknote\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"euro\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💷\",\n    \"description\": \"pound banknote\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pound\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💸\",\n    \"description\": \"money with wings\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"money_with_wings\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💳\",\n    \"description\": \"credit card\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"credit_card\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧾\",\n    \"description\": \"receipt\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"receipt\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💹\",\n    \"description\": \"chart increasing with yen\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"chart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✉️\",\n    \"description\": \"envelope\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"envelope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📧\",\n    \"description\": \"e-mail\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"email\",\n      \"e-mail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📨\",\n    \"description\": \"incoming envelope\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"incoming_envelope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📩\",\n    \"description\": \"envelope with arrow\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"envelope_with_arrow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📤\",\n    \"description\": \"outbox tray\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"outbox_tray\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📥\",\n    \"description\": \"inbox tray\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"inbox_tray\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📦\",\n    \"description\": \"package\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"package\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📫\",\n    \"description\": \"closed mailbox with raised flag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mailbox\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📪\",\n    \"description\": \"closed mailbox with lowered flag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mailbox_closed\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📬\",\n    \"description\": \"open mailbox with raised flag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mailbox_with_mail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📭\",\n    \"description\": \"open mailbox with lowered flag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mailbox_with_no_mail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📮\",\n    \"description\": \"postbox\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"postbox\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗳️\",\n    \"description\": \"ballot box with ballot\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"ballot_box\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✏️\",\n    \"description\": \"pencil\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pencil2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✒️\",\n    \"description\": \"black nib\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"black_nib\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖋️\",\n    \"description\": \"fountain pen\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"fountain_pen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖊️\",\n    \"description\": \"pen\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖌️\",\n    \"description\": \"paintbrush\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"paintbrush\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖍️\",\n    \"description\": \"crayon\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"crayon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📝\",\n    \"description\": \"memo\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"memo\",\n      \"pencil\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💼\",\n    \"description\": \"briefcase\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"briefcase\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📁\",\n    \"description\": \"file folder\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"file_folder\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📂\",\n    \"description\": \"open file folder\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"open_file_folder\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗂️\",\n    \"description\": \"card index dividers\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"card_index_dividers\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📅\",\n    \"description\": \"calendar\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"date\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📆\",\n    \"description\": \"tear-off calendar\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"calendar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗒️\",\n    \"description\": \"spiral notepad\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"spiral_notepad\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗓️\",\n    \"description\": \"spiral calendar\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"spiral_calendar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📇\",\n    \"description\": \"card index\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"card_index\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📈\",\n    \"description\": \"chart increasing\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"chart_with_upwards_trend\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📉\",\n    \"description\": \"chart decreasing\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"chart_with_downwards_trend\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📊\",\n    \"description\": \"bar chart\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bar_chart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📋\",\n    \"description\": \"clipboard\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"clipboard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📌\",\n    \"description\": \"pushpin\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pushpin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📍\",\n    \"description\": \"round pushpin\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"round_pushpin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📎\",\n    \"description\": \"paperclip\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"paperclip\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖇️\",\n    \"description\": \"linked paperclips\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"paperclips\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📏\",\n    \"description\": \"straight ruler\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"straight_ruler\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📐\",\n    \"description\": \"triangular ruler\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"triangular_ruler\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✂️\",\n    \"description\": \"scissors\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"scissors\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗃️\",\n    \"description\": \"card file box\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"card_file_box\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗄️\",\n    \"description\": \"file cabinet\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"file_cabinet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗑️\",\n    \"description\": \"wastebasket\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"wastebasket\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔒\",\n    \"description\": \"locked\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"lock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔓\",\n    \"description\": \"unlocked\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"unlock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔏\",\n    \"description\": \"locked with pen\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"lock_with_ink_pen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔐\",\n    \"description\": \"locked with key\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"closed_lock_with_key\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔑\",\n    \"description\": \"key\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"key\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗝️\",\n    \"description\": \"old key\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"old_key\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔨\",\n    \"description\": \"hammer\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"hammer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪓\",\n    \"description\": \"axe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"axe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛏️\",\n    \"description\": \"pick\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚒️\",\n    \"description\": \"hammer and pick\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"hammer_and_pick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛠️\",\n    \"description\": \"hammer and wrench\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"hammer_and_wrench\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗡️\",\n    \"description\": \"dagger\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dagger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚔️\",\n    \"description\": \"crossed swords\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"crossed_swords\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔫\",\n    \"description\": \"pistol\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"gun\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏹\",\n    \"description\": \"bow and arrow\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bow_and_arrow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛡️\",\n    \"description\": \"shield\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shield\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔧\",\n    \"description\": \"wrench\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"wrench\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔩\",\n    \"description\": \"nut and bolt\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"nut_and_bolt\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚙️\",\n    \"description\": \"gear\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"gear\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗜️\",\n    \"description\": \"clamp\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"clamp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚖️\",\n    \"description\": \"balance scale\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"balance_scale\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦯\",\n    \"description\": \"white cane\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"probing_cane\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔗\",\n    \"description\": \"link\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"link\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛓️\",\n    \"description\": \"chains\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"chains\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧰\",\n    \"description\": \"toolbox\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"toolbox\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧲\",\n    \"description\": \"magnet\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"magnet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚗️\",\n    \"description\": \"alembic\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"alembic\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧪\",\n    \"description\": \"test tube\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"test_tube\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧫\",\n    \"description\": \"petri dish\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"petri_dish\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧬\",\n    \"description\": \"dna\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dna\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔬\",\n    \"description\": \"microscope\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"microscope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔭\",\n    \"description\": \"telescope\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"telescope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📡\",\n    \"description\": \"satellite antenna\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"satellite\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💉\",\n    \"description\": \"syringe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"syringe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩸\",\n    \"description\": \"drop of blood\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"drop_of_blood\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💊\",\n    \"description\": \"pill\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pill\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩹\",\n    \"description\": \"adhesive bandage\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"adhesive_bandage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩺\",\n    \"description\": \"stethoscope\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"stethoscope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚪\",\n    \"description\": \"door\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"door\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛏️\",\n    \"description\": \"bed\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bed\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛋️\",\n    \"description\": \"couch and lamp\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"couch_and_lamp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪑\",\n    \"description\": \"chair\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"chair\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚽\",\n    \"description\": \"toilet\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"toilet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚿\",\n    \"description\": \"shower\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shower\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛁\",\n    \"description\": \"bathtub\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bathtub\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪒\",\n    \"description\": \"razor\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"razor\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧴\",\n    \"description\": \"lotion bottle\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"lotion_bottle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧷\",\n    \"description\": \"safety pin\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"safety_pin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧹\",\n    \"description\": \"broom\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"broom\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧺\",\n    \"description\": \"basket\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"basket\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧻\",\n    \"description\": \"roll of paper\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"roll_of_paper\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧼\",\n    \"description\": \"soap\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"soap\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧽\",\n    \"description\": \"sponge\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"sponge\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧯\",\n    \"description\": \"fire extinguisher\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"fire_extinguisher\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛒\",\n    \"description\": \"shopping cart\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shopping_cart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚬\",\n    \"description\": \"cigarette\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"smoking\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚰️\",\n    \"description\": \"coffin\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"coffin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚱️\",\n    \"description\": \"funeral urn\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"funeral_urn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗿\",\n    \"description\": \"moai\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"moyai\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏧\",\n    \"description\": \"ATM sign\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"atm\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚮\",\n    \"description\": \"litter in bin sign\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"put_litter_in_its_place\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚰\",\n    \"description\": \"potable water\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"potable_water\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♿\",\n    \"description\": \"wheelchair symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"wheelchair\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚹\",\n    \"description\": \"men’s room\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"mens\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚺\",\n    \"description\": \"women’s room\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"womens\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚻\",\n    \"description\": \"restroom\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"restroom\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚼\",\n    \"description\": \"baby symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"baby_symbol\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚾\",\n    \"description\": \"water closet\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"wc\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛂\",\n    \"description\": \"passport control\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"passport_control\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛃\",\n    \"description\": \"customs\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"customs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛄\",\n    \"description\": \"baggage claim\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"baggage_claim\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛅\",\n    \"description\": \"left luggage\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"left_luggage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚠️\",\n    \"description\": \"warning\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"warning\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚸\",\n    \"description\": \"children crossing\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"children_crossing\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛔\",\n    \"description\": \"no entry\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_entry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚫\",\n    \"description\": \"prohibited\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_entry_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚳\",\n    \"description\": \"no bicycles\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_bicycles\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚭\",\n    \"description\": \"no smoking\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_smoking\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚯\",\n    \"description\": \"no littering\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"do_not_litter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚱\",\n    \"description\": \"non-potable water\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"non-potable_water\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚷\",\n    \"description\": \"no pedestrians\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_pedestrians\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📵\",\n    \"description\": \"no mobile phones\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_mobile_phones\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔞\",\n    \"description\": \"no one under eighteen\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"underage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☢️\",\n    \"description\": \"radioactive\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"radioactive\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☣️\",\n    \"description\": \"biohazard\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"biohazard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⬆️\",\n    \"description\": \"up arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_up\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↗️\",\n    \"description\": \"up-right arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_upper_right\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➡️\",\n    \"description\": \"right arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_right\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↘️\",\n    \"description\": \"down-right arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_lower_right\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⬇️\",\n    \"description\": \"down arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_down\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↙️\",\n    \"description\": \"down-left arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_lower_left\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⬅️\",\n    \"description\": \"left arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_left\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↖️\",\n    \"description\": \"up-left arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_upper_left\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↕️\",\n    \"description\": \"up-down arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_up_down\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↔️\",\n    \"description\": \"left-right arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"left_right_arrow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↩️\",\n    \"description\": \"right arrow curving left\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"leftwards_arrow_with_hook\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↪️\",\n    \"description\": \"left arrow curving right\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_right_hook\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⤴️\",\n    \"description\": \"right arrow curving up\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_heading_up\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⤵️\",\n    \"description\": \"right arrow curving down\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_heading_down\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔃\",\n    \"description\": \"clockwise vertical arrows\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrows_clockwise\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔄\",\n    \"description\": \"counterclockwise arrows button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrows_counterclockwise\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔙\",\n    \"description\": \"BACK arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"back\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔚\",\n    \"description\": \"END arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"end\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔛\",\n    \"description\": \"ON! arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"on\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔜\",\n    \"description\": \"SOON arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"soon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔝\",\n    \"description\": \"TOP arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"top\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛐\",\n    \"description\": \"place of worship\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"place_of_worship\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚛️\",\n    \"description\": \"atom symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"atom_symbol\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕉️\",\n    \"description\": \"om\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"om\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✡️\",\n    \"description\": \"star of David\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"star_of_david\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☸️\",\n    \"description\": \"wheel of dharma\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"wheel_of_dharma\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☯️\",\n    \"description\": \"yin yang\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"yin_yang\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✝️\",\n    \"description\": \"latin cross\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"latin_cross\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☦️\",\n    \"description\": \"orthodox cross\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"orthodox_cross\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☪️\",\n    \"description\": \"star and crescent\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"star_and_crescent\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☮️\",\n    \"description\": \"peace symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"peace_symbol\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕎\",\n    \"description\": \"menorah\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"menorah\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔯\",\n    \"description\": \"dotted six-pointed star\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"six_pointed_star\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♈\",\n    \"description\": \"Aries\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"aries\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♉\",\n    \"description\": \"Taurus\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"taurus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♊\",\n    \"description\": \"Gemini\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"gemini\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♋\",\n    \"description\": \"Cancer\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"cancer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♌\",\n    \"description\": \"Leo\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"leo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♍\",\n    \"description\": \"Virgo\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"virgo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♎\",\n    \"description\": \"Libra\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"libra\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♏\",\n    \"description\": \"Scorpio\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"scorpius\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♐\",\n    \"description\": \"Sagittarius\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"sagittarius\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♑\",\n    \"description\": \"Capricorn\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"capricorn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♒\",\n    \"description\": \"Aquarius\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"aquarius\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♓\",\n    \"description\": \"Pisces\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"pisces\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛎\",\n    \"description\": \"Ophiuchus\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ophiuchus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔀\",\n    \"description\": \"shuffle tracks button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"twisted_rightwards_arrows\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔁\",\n    \"description\": \"repeat button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"repeat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔂\",\n    \"description\": \"repeat single button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"repeat_one\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"▶️\",\n    \"description\": \"play button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_forward\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏩\",\n    \"description\": \"fast-forward button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"fast_forward\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏭️\",\n    \"description\": \"next track button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"next_track_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏯️\",\n    \"description\": \"play or pause button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"play_or_pause_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"◀️\",\n    \"description\": \"reverse button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_backward\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏪\",\n    \"description\": \"fast reverse button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"rewind\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏮️\",\n    \"description\": \"last track button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"previous_track_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔼\",\n    \"description\": \"upwards button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_up_small\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏫\",\n    \"description\": \"fast up button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_double_up\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔽\",\n    \"description\": \"downwards button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_down_small\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏬\",\n    \"description\": \"fast down button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_double_down\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏸️\",\n    \"description\": \"pause button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"pause_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏹️\",\n    \"description\": \"stop button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"stop_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏺️\",\n    \"description\": \"record button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"record_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏏️\",\n    \"description\": \"eject button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"eject_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎦\",\n    \"description\": \"cinema\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"cinema\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔅\",\n    \"description\": \"dim button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"low_brightness\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔆\",\n    \"description\": \"bright button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"high_brightness\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📶\",\n    \"description\": \"antenna bars\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"signal_strength\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📳\",\n    \"description\": \"vibration mode\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"vibration_mode\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📴\",\n    \"description\": \"mobile phone off\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"mobile_phone_off\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♀️\",\n    \"description\": \"female sign\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"female_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♂️\",\n    \"description\": \"male sign\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"male_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚧️\",\n    \"description\": \"transgender symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"transgender_symbol\"\n    ],\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"✖️\",\n    \"description\": \"multiply\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_multiplication_x\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➕\",\n    \"description\": \"plus\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_plus_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➖\",\n    \"description\": \"minus\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_minus_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➗\",\n    \"description\": \"divide\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_division_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♾️\",\n    \"description\": \"infinity\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"infinity\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"‼️\",\n    \"description\": \"double exclamation mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"bangbang\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⁉️\",\n    \"description\": \"exclamation question mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"interrobang\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❓\",\n    \"description\": \"question mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"question\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❔\",\n    \"description\": \"white question mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"grey_question\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❕\",\n    \"description\": \"white exclamation mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"grey_exclamation\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❗\",\n    \"description\": \"exclamation mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"exclamation\",\n      \"heavy_exclamation_mark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"〰️\",\n    \"description\": \"wavy dash\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"wavy_dash\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💱\",\n    \"description\": \"currency exchange\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"currency_exchange\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💲\",\n    \"description\": \"heavy dollar sign\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_dollar_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚕️\",\n    \"description\": \"medical symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"medical_symbol\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♻️\",\n    \"description\": \"recycling symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"recycle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚜️\",\n    \"description\": \"fleur-de-lis\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"fleur_de_lis\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔱\",\n    \"description\": \"trident emblem\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"trident\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📛\",\n    \"description\": \"name badge\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"name_badge\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔰\",\n    \"description\": \"Japanese symbol for beginner\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"beginner\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⭕\",\n    \"description\": \"hollow red circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"o\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✅\",\n    \"description\": \"check mark button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_check_mark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☑️\",\n    \"description\": \"check box with check\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ballot_box_with_check\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✔️\",\n    \"description\": \"check mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_check_mark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❌\",\n    \"description\": \"cross mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"x\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❎\",\n    \"description\": \"cross mark button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"negative_squared_cross_mark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➰\",\n    \"description\": \"curly loop\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"curly_loop\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➿\",\n    \"description\": \"double curly loop\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"loop\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"〽️\",\n    \"description\": \"part alternation mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"part_alternation_mark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✳️\",\n    \"description\": \"eight-spoked asterisk\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"eight_spoked_asterisk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✴️\",\n    \"description\": \"eight-pointed star\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"eight_pointed_black_star\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❇️\",\n    \"description\": \"sparkle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"sparkle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"©️\",\n    \"description\": \"copyright\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"copyright\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"®️\",\n    \"description\": \"registered\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"registered\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"™️\",\n    \"description\": \"trade mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"tm\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"#️⃣\",\n    \"description\": \"keycap: #\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"hash\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"*️⃣\",\n    \"description\": \"keycap: *\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"asterisk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"0️⃣\",\n    \"description\": \"keycap: 0\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"zero\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"1️⃣\",\n    \"description\": \"keycap: 1\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"one\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"2️⃣\",\n    \"description\": \"keycap: 2\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"two\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"3️⃣\",\n    \"description\": \"keycap: 3\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"three\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"4️⃣\",\n    \"description\": \"keycap: 4\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"four\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"5️⃣\",\n    \"description\": \"keycap: 5\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"five\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"6️⃣\",\n    \"description\": \"keycap: 6\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"six\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"7️⃣\",\n    \"description\": \"keycap: 7\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"seven\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"8️⃣\",\n    \"description\": \"keycap: 8\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"eight\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"9️⃣\",\n    \"description\": \"keycap: 9\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"nine\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔟\",\n    \"description\": \"keycap: 10\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"keycap_ten\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔠\",\n    \"description\": \"input latin uppercase\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"capital_abcd\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔡\",\n    \"description\": \"input latin lowercase\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"abcd\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔢\",\n    \"description\": \"input numbers\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"1234\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔣\",\n    \"description\": \"input symbols\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"symbols\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔤\",\n    \"description\": \"input latin letters\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"abc\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🅰️\",\n    \"description\": \"A button (blood type)\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"a\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆎\",\n    \"description\": \"AB button (blood type)\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ab\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🅱️\",\n    \"description\": \"B button (blood type)\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"b\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆑\",\n    \"description\": \"CL button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"cl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆒\",\n    \"description\": \"COOL button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"cool\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆓\",\n    \"description\": \"FREE button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"free\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"ℹ️\",\n    \"description\": \"information\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"information_source\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆔\",\n    \"description\": \"ID button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"id\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"Ⓜ️\",\n    \"description\": \"circled M\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"m\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆕\",\n    \"description\": \"NEW button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"new\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆖\",\n    \"description\": \"NG button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ng\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🅾️\",\n    \"description\": \"O button (blood type)\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"o2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆗\",\n    \"description\": \"OK button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ok\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🅿️\",\n    \"description\": \"P button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"parking\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆘\",\n    \"description\": \"SOS button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"sos\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆙\",\n    \"description\": \"UP! button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"up\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆚\",\n    \"description\": \"VS button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"vs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈁\",\n    \"description\": \"Japanese “here” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"koko\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈂️\",\n    \"description\": \"Japanese “service charge” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"sa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈷️\",\n    \"description\": \"Japanese “monthly amount” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u6708\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈶\",\n    \"description\": \"Japanese “not free of charge” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u6709\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈯\",\n    \"description\": \"Japanese “reserved” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u6307\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🉐\",\n    \"description\": \"Japanese “bargain” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ideograph_advantage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈹\",\n    \"description\": \"Japanese “discount” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u5272\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈚\",\n    \"description\": \"Japanese “free of charge” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u7121\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈲\",\n    \"description\": \"Japanese “prohibited” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u7981\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🉑\",\n    \"description\": \"Japanese “acceptable” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"accept\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈸\",\n    \"description\": \"Japanese “application” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u7533\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈴\",\n    \"description\": \"Japanese “passing grade” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u5408\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈳\",\n    \"description\": \"Japanese “vacancy” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u7a7a\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"㊗️\",\n    \"description\": \"Japanese “congratulations” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"congratulations\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"㊙️\",\n    \"description\": \"Japanese “secret” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"secret\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈺\",\n    \"description\": \"Japanese “open for business” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u55b6\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈵\",\n    \"description\": \"Japanese “no vacancy” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u6e80\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔴\",\n    \"description\": \"red circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"red_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟠\",\n    \"description\": \"orange circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"orange_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟡\",\n    \"description\": \"yellow circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"yellow_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟢\",\n    \"description\": \"green circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"green_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔵\",\n    \"description\": \"blue circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"large_blue_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟣\",\n    \"description\": \"purple circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"purple_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟤\",\n    \"description\": \"brown circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"brown_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚫\",\n    \"description\": \"black circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚪\",\n    \"description\": \"white circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟥\",\n    \"description\": \"red square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"red_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟧\",\n    \"description\": \"orange square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"orange_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟨\",\n    \"description\": \"yellow square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"yellow_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟩\",\n    \"description\": \"green square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"green_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟦\",\n    \"description\": \"blue square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"blue_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟪\",\n    \"description\": \"purple square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"purple_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟫\",\n    \"description\": \"brown square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"brown_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⬛\",\n    \"description\": \"black large square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_large_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⬜\",\n    \"description\": \"white large square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_large_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"◼️\",\n    \"description\": \"black medium square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_medium_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"◻️\",\n    \"description\": \"white medium square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_medium_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"◾\",\n    \"description\": \"black medium-small square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_medium_small_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"◽\",\n    \"description\": \"white medium-small square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_medium_small_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"▪️\",\n    \"description\": \"black small square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_small_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"▫️\",\n    \"description\": \"white small square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_small_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔶\",\n    \"description\": \"large orange diamond\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"large_orange_diamond\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔷\",\n    \"description\": \"large blue diamond\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"large_blue_diamond\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔸\",\n    \"description\": \"small orange diamond\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"small_orange_diamond\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔹\",\n    \"description\": \"small blue diamond\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"small_blue_diamond\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔺\",\n    \"description\": \"red triangle pointed up\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"small_red_triangle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔻\",\n    \"description\": \"red triangle pointed down\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"small_red_triangle_down\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💠\",\n    \"description\": \"diamond with a dot\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"diamond_shape_with_a_dot_inside\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔘\",\n    \"description\": \"radio button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"radio_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔳\",\n    \"description\": \"white square button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_square_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔲\",\n    \"description\": \"black square button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_square_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏁\",\n    \"description\": \"chequered flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"checkered_flag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚩\",\n    \"description\": \"triangular flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"triangular_flag_on_post\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎌\",\n    \"description\": \"crossed flags\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"crossed_flags\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏴\",\n    \"description\": \"black flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"black_flag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏳️\",\n    \"description\": \"white flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"white_flag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏳️‍🌈\",\n    \"description\": \"rainbow flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"rainbow_flag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏳️‍⚧️\",\n    \"description\": \"transgender flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"transgender_flag\"\n    ],\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"🏴‍☠️\",\n    \"description\": \"pirate flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"pirate_flag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇨\",\n    \"description\": \"flag: Ascension Island\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ascension_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇩\",\n    \"description\": \"flag: Andorra\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"andorra\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇪\",\n    \"description\": \"flag: United Arab Emirates\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"united_arab_emirates\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇫\",\n    \"description\": \"flag: Afghanistan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"afghanistan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇬\",\n    \"description\": \"flag: Antigua & Barbuda\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"antigua_barbuda\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇮\",\n    \"description\": \"flag: Anguilla\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"anguilla\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇱\",\n    \"description\": \"flag: Albania\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"albania\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇲\",\n    \"description\": \"flag: Armenia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"armenia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇴\",\n    \"description\": \"flag: Angola\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"angola\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇶\",\n    \"description\": \"flag: Antarctica\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"antarctica\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇷\",\n    \"description\": \"flag: Argentina\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"argentina\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇸\",\n    \"description\": \"flag: American Samoa\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"american_samoa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇹\",\n    \"description\": \"flag: Austria\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"austria\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇺\",\n    \"description\": \"flag: Australia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"australia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇼\",\n    \"description\": \"flag: Aruba\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"aruba\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇽\",\n    \"description\": \"flag: Åland Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"aland_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇿\",\n    \"description\": \"flag: Azerbaijan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"azerbaijan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇦\",\n    \"description\": \"flag: Bosnia & Herzegovina\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bosnia_herzegovina\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇧\",\n    \"description\": \"flag: Barbados\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"barbados\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇩\",\n    \"description\": \"flag: Bangladesh\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bangladesh\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇪\",\n    \"description\": \"flag: Belgium\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"belgium\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇫\",\n    \"description\": \"flag: Burkina Faso\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"burkina_faso\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇬\",\n    \"description\": \"flag: Bulgaria\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bulgaria\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇭\",\n    \"description\": \"flag: Bahrain\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bahrain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇮\",\n    \"description\": \"flag: Burundi\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"burundi\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇯\",\n    \"description\": \"flag: Benin\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"benin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇱\",\n    \"description\": \"flag: St. Barthélemy\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_barthelemy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇲\",\n    \"description\": \"flag: Bermuda\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bermuda\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇳\",\n    \"description\": \"flag: Brunei\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"brunei\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇴\",\n    \"description\": \"flag: Bolivia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bolivia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇶\",\n    \"description\": \"flag: Caribbean Netherlands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"caribbean_netherlands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇷\",\n    \"description\": \"flag: Brazil\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"brazil\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇸\",\n    \"description\": \"flag: Bahamas\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bahamas\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇹\",\n    \"description\": \"flag: Bhutan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bhutan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇻\",\n    \"description\": \"flag: Bouvet Island\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bouvet_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇼\",\n    \"description\": \"flag: Botswana\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"botswana\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇾\",\n    \"description\": \"flag: Belarus\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"belarus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇿\",\n    \"description\": \"flag: Belize\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"belize\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇦\",\n    \"description\": \"flag: Canada\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"canada\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇨\",\n    \"description\": \"flag: Cocos (Keeling) Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cocos_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇩\",\n    \"description\": \"flag: Congo - Kinshasa\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"congo_kinshasa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇫\",\n    \"description\": \"flag: Central African Republic\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"central_african_republic\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇬\",\n    \"description\": \"flag: Congo - Brazzaville\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"congo_brazzaville\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇭\",\n    \"description\": \"flag: Switzerland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"switzerland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇮\",\n    \"description\": \"flag: Côte d’Ivoire\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cote_divoire\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇰\",\n    \"description\": \"flag: Cook Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cook_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇱\",\n    \"description\": \"flag: Chile\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"chile\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇲\",\n    \"description\": \"flag: Cameroon\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cameroon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇳\",\n    \"description\": \"flag: China\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇴\",\n    \"description\": \"flag: Colombia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"colombia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇵\",\n    \"description\": \"flag: Clipperton Island\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"clipperton_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇷\",\n    \"description\": \"flag: Costa Rica\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"costa_rica\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇺\",\n    \"description\": \"flag: Cuba\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cuba\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇻\",\n    \"description\": \"flag: Cape Verde\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cape_verde\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇼\",\n    \"description\": \"flag: Curaçao\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"curacao\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇽\",\n    \"description\": \"flag: Christmas Island\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"christmas_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇾\",\n    \"description\": \"flag: Cyprus\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cyprus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇿\",\n    \"description\": \"flag: Czechia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"czech_republic\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇪\",\n    \"description\": \"flag: Germany\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"de\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇬\",\n    \"description\": \"flag: Diego Garcia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"diego_garcia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇯\",\n    \"description\": \"flag: Djibouti\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"djibouti\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇰\",\n    \"description\": \"flag: Denmark\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"denmark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇲\",\n    \"description\": \"flag: Dominica\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"dominica\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇴\",\n    \"description\": \"flag: Dominican Republic\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"dominican_republic\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇿\",\n    \"description\": \"flag: Algeria\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"algeria\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇦\",\n    \"description\": \"flag: Ceuta & Melilla\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ceuta_melilla\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇨\",\n    \"description\": \"flag: Ecuador\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ecuador\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇪\",\n    \"description\": \"flag: Estonia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"estonia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇬\",\n    \"description\": \"flag: Egypt\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"egypt\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇭\",\n    \"description\": \"flag: Western Sahara\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"western_sahara\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇷\",\n    \"description\": \"flag: Eritrea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"eritrea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇸\",\n    \"description\": \"flag: Spain\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"es\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇹\",\n    \"description\": \"flag: Ethiopia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ethiopia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇺\",\n    \"description\": \"flag: European Union\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"eu\",\n      \"european_union\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇮\",\n    \"description\": \"flag: Finland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"finland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇯\",\n    \"description\": \"flag: Fiji\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"fiji\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇰\",\n    \"description\": \"flag: Falkland Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"falkland_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇲\",\n    \"description\": \"flag: Micronesia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"micronesia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇴\",\n    \"description\": \"flag: Faroe Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"faroe_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇷\",\n    \"description\": \"flag: France\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"fr\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇦\",\n    \"description\": \"flag: Gabon\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"gabon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇧\",\n    \"description\": \"flag: United Kingdom\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"gb\",\n      \"uk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇩\",\n    \"description\": \"flag: Grenada\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"grenada\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇪\",\n    \"description\": \"flag: Georgia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"georgia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇫\",\n    \"description\": \"flag: French Guiana\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"french_guiana\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇬\",\n    \"description\": \"flag: Guernsey\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guernsey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇭\",\n    \"description\": \"flag: Ghana\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ghana\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇮\",\n    \"description\": \"flag: Gibraltar\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"gibraltar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇱\",\n    \"description\": \"flag: Greenland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"greenland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇲\",\n    \"description\": \"flag: Gambia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"gambia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇳\",\n    \"description\": \"flag: Guinea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guinea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇵\",\n    \"description\": \"flag: Guadeloupe\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guadeloupe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇶\",\n    \"description\": \"flag: Equatorial Guinea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"equatorial_guinea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇷\",\n    \"description\": \"flag: Greece\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"greece\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇸\",\n    \"description\": \"flag: South Georgia & South Sandwich Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"south_georgia_south_sandwich_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇹\",\n    \"description\": \"flag: Guatemala\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guatemala\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇺\",\n    \"description\": \"flag: Guam\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guam\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇼\",\n    \"description\": \"flag: Guinea-Bissau\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guinea_bissau\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇾\",\n    \"description\": \"flag: Guyana\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guyana\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇰\",\n    \"description\": \"flag: Hong Kong SAR China\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"hong_kong\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇲\",\n    \"description\": \"flag: Heard & McDonald Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"heard_mcdonald_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇳\",\n    \"description\": \"flag: Honduras\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"honduras\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇷\",\n    \"description\": \"flag: Croatia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"croatia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇹\",\n    \"description\": \"flag: Haiti\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"haiti\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇺\",\n    \"description\": \"flag: Hungary\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"hungary\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇨\",\n    \"description\": \"flag: Canary Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"canary_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇩\",\n    \"description\": \"flag: Indonesia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"indonesia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇪\",\n    \"description\": \"flag: Ireland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ireland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇱\",\n    \"description\": \"flag: Israel\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"israel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇲\",\n    \"description\": \"flag: Isle of Man\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"isle_of_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇳\",\n    \"description\": \"flag: India\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"india\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇴\",\n    \"description\": \"flag: British Indian Ocean Territory\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"british_indian_ocean_territory\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇶\",\n    \"description\": \"flag: Iraq\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"iraq\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇷\",\n    \"description\": \"flag: Iran\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"iran\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇸\",\n    \"description\": \"flag: Iceland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"iceland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇹\",\n    \"description\": \"flag: Italy\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"it\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇯🇪\",\n    \"description\": \"flag: Jersey\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"jersey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇯🇲\",\n    \"description\": \"flag: Jamaica\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"jamaica\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇯🇴\",\n    \"description\": \"flag: Jordan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"jordan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇯🇵\",\n    \"description\": \"flag: Japan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"jp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇪\",\n    \"description\": \"flag: Kenya\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kenya\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇬\",\n    \"description\": \"flag: Kyrgyzstan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kyrgyzstan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇭\",\n    \"description\": \"flag: Cambodia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cambodia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇮\",\n    \"description\": \"flag: Kiribati\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kiribati\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇲\",\n    \"description\": \"flag: Comoros\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"comoros\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇳\",\n    \"description\": \"flag: St. Kitts & Nevis\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_kitts_nevis\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇵\",\n    \"description\": \"flag: North Korea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"north_korea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇷\",\n    \"description\": \"flag: South Korea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kr\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇼\",\n    \"description\": \"flag: Kuwait\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kuwait\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇾\",\n    \"description\": \"flag: Cayman Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cayman_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇿\",\n    \"description\": \"flag: Kazakhstan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kazakhstan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇦\",\n    \"description\": \"flag: Laos\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"laos\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇧\",\n    \"description\": \"flag: Lebanon\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"lebanon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇨\",\n    \"description\": \"flag: St. Lucia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_lucia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇮\",\n    \"description\": \"flag: Liechtenstein\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"liechtenstein\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇰\",\n    \"description\": \"flag: Sri Lanka\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sri_lanka\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇷\",\n    \"description\": \"flag: Liberia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"liberia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇸\",\n    \"description\": \"flag: Lesotho\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"lesotho\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇹\",\n    \"description\": \"flag: Lithuania\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"lithuania\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇺\",\n    \"description\": \"flag: Luxembourg\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"luxembourg\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇻\",\n    \"description\": \"flag: Latvia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"latvia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇾\",\n    \"description\": \"flag: Libya\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"libya\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇦\",\n    \"description\": \"flag: Morocco\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"morocco\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇨\",\n    \"description\": \"flag: Monaco\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"monaco\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇩\",\n    \"description\": \"flag: Moldova\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"moldova\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇪\",\n    \"description\": \"flag: Montenegro\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"montenegro\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇫\",\n    \"description\": \"flag: St. Martin\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_martin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇬\",\n    \"description\": \"flag: Madagascar\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"madagascar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇭\",\n    \"description\": \"flag: Marshall Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"marshall_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇰\",\n    \"description\": \"flag: North Macedonia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"macedonia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇱\",\n    \"description\": \"flag: Mali\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mali\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇲\",\n    \"description\": \"flag: Myanmar (Burma)\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"myanmar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇳\",\n    \"description\": \"flag: Mongolia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mongolia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇴\",\n    \"description\": \"flag: Macao SAR China\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"macau\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇵\",\n    \"description\": \"flag: Northern Mariana Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"northern_mariana_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇶\",\n    \"description\": \"flag: Martinique\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"martinique\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇷\",\n    \"description\": \"flag: Mauritania\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mauritania\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇸\",\n    \"description\": \"flag: Montserrat\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"montserrat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇹\",\n    \"description\": \"flag: Malta\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"malta\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇺\",\n    \"description\": \"flag: Mauritius\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mauritius\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇻\",\n    \"description\": \"flag: Maldives\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"maldives\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇼\",\n    \"description\": \"flag: Malawi\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"malawi\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇽\",\n    \"description\": \"flag: Mexico\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mexico\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇾\",\n    \"description\": \"flag: Malaysia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"malaysia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇿\",\n    \"description\": \"flag: Mozambique\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mozambique\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇦\",\n    \"description\": \"flag: Namibia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"namibia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇨\",\n    \"description\": \"flag: New Caledonia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"new_caledonia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇪\",\n    \"description\": \"flag: Niger\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"niger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇫\",\n    \"description\": \"flag: Norfolk Island\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"norfolk_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇬\",\n    \"description\": \"flag: Nigeria\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"nigeria\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇮\",\n    \"description\": \"flag: Nicaragua\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"nicaragua\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇱\",\n    \"description\": \"flag: Netherlands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"netherlands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇴\",\n    \"description\": \"flag: Norway\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"norway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇵\",\n    \"description\": \"flag: Nepal\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"nepal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇷\",\n    \"description\": \"flag: Nauru\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"nauru\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇺\",\n    \"description\": \"flag: Niue\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"niue\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇿\",\n    \"description\": \"flag: New Zealand\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"new_zealand\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇴🇲\",\n    \"description\": \"flag: Oman\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"oman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇦\",\n    \"description\": \"flag: Panama\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"panama\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇪\",\n    \"description\": \"flag: Peru\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"peru\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇫\",\n    \"description\": \"flag: French Polynesia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"french_polynesia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇬\",\n    \"description\": \"flag: Papua New Guinea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"papua_new_guinea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇭\",\n    \"description\": \"flag: Philippines\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"philippines\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇰\",\n    \"description\": \"flag: Pakistan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"pakistan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇱\",\n    \"description\": \"flag: Poland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"poland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇲\",\n    \"description\": \"flag: St. Pierre & Miquelon\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_pierre_miquelon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇳\",\n    \"description\": \"flag: Pitcairn Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"pitcairn_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇷\",\n    \"description\": \"flag: Puerto Rico\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"puerto_rico\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇸\",\n    \"description\": \"flag: Palestinian Territories\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"palestinian_territories\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇹\",\n    \"description\": \"flag: Portugal\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"portugal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇼\",\n    \"description\": \"flag: Palau\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"palau\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇾\",\n    \"description\": \"flag: Paraguay\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"paraguay\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇶🇦\",\n    \"description\": \"flag: Qatar\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"qatar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇷🇪\",\n    \"description\": \"flag: Réunion\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"reunion\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇷🇴\",\n    \"description\": \"flag: Romania\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"romania\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇷🇸\",\n    \"description\": \"flag: Serbia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"serbia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇷🇺\",\n    \"description\": \"flag: Russia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ru\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇷🇼\",\n    \"description\": \"flag: Rwanda\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"rwanda\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇦\",\n    \"description\": \"flag: Saudi Arabia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"saudi_arabia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇧\",\n    \"description\": \"flag: Solomon Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"solomon_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇨\",\n    \"description\": \"flag: Seychelles\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"seychelles\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇩\",\n    \"description\": \"flag: Sudan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sudan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇪\",\n    \"description\": \"flag: Sweden\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sweden\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇬\",\n    \"description\": \"flag: Singapore\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"singapore\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇭\",\n    \"description\": \"flag: St. Helena\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_helena\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇮\",\n    \"description\": \"flag: Slovenia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"slovenia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇯\",\n    \"description\": \"flag: Svalbard & Jan Mayen\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"svalbard_jan_mayen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇰\",\n    \"description\": \"flag: Slovakia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"slovakia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇱\",\n    \"description\": \"flag: Sierra Leone\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sierra_leone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇲\",\n    \"description\": \"flag: San Marino\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"san_marino\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇳\",\n    \"description\": \"flag: Senegal\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"senegal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇴\",\n    \"description\": \"flag: Somalia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"somalia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇷\",\n    \"description\": \"flag: Suriname\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"suriname\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇸\",\n    \"description\": \"flag: South Sudan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"south_sudan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇹\",\n    \"description\": \"flag: São Tomé & Príncipe\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sao_tome_principe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇻\",\n    \"description\": \"flag: El Salvador\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"el_salvador\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇽\",\n    \"description\": \"flag: Sint Maarten\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sint_maarten\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇾\",\n    \"description\": \"flag: Syria\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"syria\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇿\",\n    \"description\": \"flag: Eswatini\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"swaziland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇦\",\n    \"description\": \"flag: Tristan da Cunha\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tristan_da_cunha\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇨\",\n    \"description\": \"flag: Turks & Caicos Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"turks_caicos_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇩\",\n    \"description\": \"flag: Chad\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"chad\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇫\",\n    \"description\": \"flag: French Southern Territories\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"french_southern_territories\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇬\",\n    \"description\": \"flag: Togo\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"togo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇭\",\n    \"description\": \"flag: Thailand\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"thailand\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇯\",\n    \"description\": \"flag: Tajikistan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tajikistan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇰\",\n    \"description\": \"flag: Tokelau\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tokelau\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇱\",\n    \"description\": \"flag: Timor-Leste\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"timor_leste\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇲\",\n    \"description\": \"flag: Turkmenistan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"turkmenistan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇳\",\n    \"description\": \"flag: Tunisia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tunisia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇴\",\n    \"description\": \"flag: Tonga\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tonga\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇷\",\n    \"description\": \"flag: Turkey\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tr\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇹\",\n    \"description\": \"flag: Trinidad & Tobago\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"trinidad_tobago\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇻\",\n    \"description\": \"flag: Tuvalu\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tuvalu\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇼\",\n    \"description\": \"flag: Taiwan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"taiwan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇿\",\n    \"description\": \"flag: Tanzania\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tanzania\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇦\",\n    \"description\": \"flag: Ukraine\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ukraine\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇬\",\n    \"description\": \"flag: Uganda\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"uganda\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇲\",\n    \"description\": \"flag: U.S. Outlying Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"us_outlying_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇳\",\n    \"description\": \"flag: United Nations\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"united_nations\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇸\",\n    \"description\": \"flag: United States\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"us\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇾\",\n    \"description\": \"flag: Uruguay\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"uruguay\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇿\",\n    \"description\": \"flag: Uzbekistan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"uzbekistan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇦\",\n    \"description\": \"flag: Vatican City\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"vatican_city\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇨\",\n    \"description\": \"flag: St. Vincent & Grenadines\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_vincent_grenadines\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇪\",\n    \"description\": \"flag: Venezuela\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"venezuela\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇬\",\n    \"description\": \"flag: British Virgin Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"british_virgin_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇮\",\n    \"description\": \"flag: U.S. Virgin Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"us_virgin_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇳\",\n    \"description\": \"flag: Vietnam\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"vietnam\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇺\",\n    \"description\": \"flag: Vanuatu\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"vanuatu\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇼🇫\",\n    \"description\": \"flag: Wallis & Futuna\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"wallis_futuna\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇼🇸\",\n    \"description\": \"flag: Samoa\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"samoa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇽🇰\",\n    \"description\": \"flag: Kosovo\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kosovo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇾🇪\",\n    \"description\": \"flag: Yemen\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"yemen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇾🇹\",\n    \"description\": \"flag: Mayotte\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mayotte\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇿🇦\",\n    \"description\": \"flag: South Africa\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"south_africa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇿🇲\",\n    \"description\": \"flag: Zambia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"zambia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇿🇼\",\n    \"description\": \"flag: Zimbabwe\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"zimbabwe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏴󠁧󠁢󠁥󠁮󠁧󠁿\",\n    \"description\": \"flag: England\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"england\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏴󠁧󠁢󠁳󠁣󠁴󠁿\",\n    \"description\": \"flag: Scotland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"scotland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏴󠁧󠁢󠁷󠁬󠁳󠁿\",\n    \"description\": \"flag: Wales\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"wales\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  }\n];\n\nexport default emjois;\n","/*\n * emoji.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocOutput, PandocToken, PandocTokenType, ProsemirrorWriter, PandocExtensions } from '../../api/pandoc';\nimport { pandocAttrReadAST } from '../../api/pandoc_attr';\nimport { fragmentText } from '../../api/fragment';\n\nimport { FixupContext } from '../../api/fixup';\nimport { MarkTransaction } from '../../api/transaction';\nimport { mergedTextNodes } from '../../api/text';\nimport {\n  emojis,\n  emojiFromAlias,\n  emojiFromChar,\n  emojiForAllSkinTones,\n  Emoji,\n  emojiWithSkinTonePreference,\n  kEmojiAttr,\n  kEmojiContent,\n} from '../../api/emoji';\nimport { emojiCompletionHandler, emojiSkintonePreferenceCompletionHandler } from './emoji-completion';\nimport { getMarkAttrs } from '../../api/mark';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { ui } = context;\n\n  return {\n    marks: [\n      {\n        name: 'emoji',\n        noSpelling: true,\n        spec: {\n          inclusive: false,\n          noInputRules: true,\n          attrs: {\n            emojihint: {},\n            prompt: { default: true },\n          },\n          parseDOM: [\n            {\n              tag: \"span[class*='emoji']\",\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                return {\n                  emojihint: el.getAttribute('data-emojihint'),\n                  prompt: el.getAttribute('data-emojiprompt') || false,\n                };\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            return [\n              'span',\n              {\n                class: 'emoji pm-emoji-font',\n                title: ':' + mark.attrs.emojihint + ':',\n                'data-emojihint': mark.attrs.emojihint,\n                'data-emojiprompt': mark.attrs.prompt,\n              },\n            ];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Span,\n              match: (tok: PandocToken) => {\n                const attrs = pandocAttrReadAST(tok, kEmojiAttr);\n                return attrs.keyvalue.length > 0 && attrs.keyvalue[0][0] === 'data-emoji';\n              },\n              handler: (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => {\n                const attrs = pandocAttrReadAST(tok, kEmojiAttr);\n                const emojihint = attrs.keyvalue[0][1];\n                const emojiMark = schema.marks.emoji.create({ emojihint });\n                writer.openMark(emojiMark);\n                const emojiChar = tok.c[kEmojiContent][0].c;\n                writer.writeText(emojiChar);\n                writer.closeMark(emojiMark);\n              },\n            },\n          ],\n          writer: {\n            priority: 2,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              // look for a matching emoji\n              const char = fragmentText(parent);\n              const emoji = emojiFromChar(char);\n              if (emoji) {\n                output.writeToken(PandocTokenType.Span, () => {\n                  // resolve which alias to use\n                  let alias = emoji.aliases[0];\n                  if (emoji.aliases.length > 1) {\n                    if (emoji.aliases.includes(mark.attrs.emojihint)) {\n                      alias = mark.attrs.emojihint;\n                    }\n                  }\n                  output.writeAttr('', ['emoji'], [['data-emoji', alias]]);\n                  output.writeArray(() => {\n                    output.writeText(emoji.emojiRaw);\n                  });\n                });\n              } else {\n                output.writeInlines(parent);\n              }\n            },\n          },\n        },\n      },\n    ],\n\n    inputRules: () => {\n      return [\n        new InputRule(/(^|[^`]):(\\w+):$/, (state: EditorState, match: string[], start: number, end: number) => {\n          const emojiName = match[2];\n          const emoji = emojiFromAlias(emojiName.toLowerCase());\n          if (emoji) {\n            const emojiWithSkinTone = emojiWithSkinTonePreference(emoji, ui.prefs.emojiSkinTone());\n            const schema = state.schema;\n            const tr = state.tr;\n            tr.delete(start + match[1].length, end);\n            tr.replaceSelectionWith(nodeForEmoji(schema, emojiWithSkinTone, emojiName), false);\n            return tr;\n          } else {\n            return null;\n          }\n        }),\n      ];\n    },\n\n    completionHandlers: () => [emojiCompletionHandler(ui), emojiSkintonePreferenceCompletionHandler(ui)],\n\n    fixups: (schema: Schema) => {\n      return [\n        (tr: Transaction, fixupContext: FixupContext) => {\n          // only apply on save and load\n          if (![FixupContext.Save, FixupContext.Load].includes(fixupContext)) {\n            return tr;\n          }\n\n          // create mark transation wrapper\n          const markTr = new MarkTransaction(tr);\n\n          const textNodes = mergedTextNodes(\n            markTr.doc,\n            (_node: ProsemirrorNode, _pos: number, parentNode: ProsemirrorNode) =>\n              parentNode.type.allowsMarkType(schema.marks.emoji),\n          );\n\n          textNodes.forEach(textNode => {\n            // Since emoji can be composed of multiple characters (including\n            // other emoji), we always need to prefer the longest match when inserting\n            // a mark for any given starting position.\n\n            // Find the possible emoji at each position in this text node\n            const possibleMarks = new Map<number, Array<{ to: number; emoji: Emoji }>>();\n            for (const emoji of emojis(ui.prefs.emojiSkinTone())) {\n              emojiForAllSkinTones(emoji).forEach(skinToneEmoji => {\n                let charLoc = textNode.text.indexOf(skinToneEmoji.emoji);\n                while (charLoc !== -1) {\n                  const from = textNode.pos + charLoc;\n                  const to = from + skinToneEmoji.emoji.length;\n                  possibleMarks.set(from, (possibleMarks.get(from) || []).concat({ to, emoji: skinToneEmoji }));\n                  charLoc = textNode.text.indexOf(skinToneEmoji.emoji, charLoc + 1);\n                }\n              });\n            }\n\n            // For each position that has emoji, use the longest emoji match as the\n            // emoji to be marked.\n            possibleMarks.forEach((possibleEmojis, markFrom) => {\n              const orderedEmojis = possibleEmojis.sort((a, b) => b.to - a.to);\n              const to = orderedEmojis[0].to;\n              const emoji = orderedEmojis[0].emoji;\n\n              // remove any existing mark (preserving attribues if we do )\n              let existingAttrs: { [key: string]: any } | null = null;\n              if (markTr.doc.rangeHasMark(markFrom, to, schema.marks.emoji)) {\n                existingAttrs = getMarkAttrs(markTr.doc, { from: markFrom, to }, schema.marks.emoji);\n                markTr.removeMark(markFrom, to, schema.marks.emoji);\n              }\n\n              // create a new mark\n              const mark = schema.marks.emoji.create({\n                emojihint: emoji.aliases[0],\n                ...existingAttrs,\n              });\n\n              // on load we want to cover the entire span\n              if (fixupContext === FixupContext.Load) {\n                markTr.addMark(markFrom, to, mark);\n                // on save we just want the raw emjoi character(s)\n              } else if (fixupContext === FixupContext.Save) {\n                markTr.addMark(markFrom, markFrom + emoji.emoji.length, mark);\n              }\n            });\n          });\n\n          return tr;\n        },\n      ];\n    },\n  };\n};\n\nexport function nodeForEmoji(schema: Schema, emoji: Emoji, hint: string, prompt?: boolean): ProsemirrorNode {\n  const mark = schema.marks.emoji.create({ emojihint: hint, prompt });\n  return schema.text(emoji.emoji, [mark]);\n}\n\nexport default extension;\n","/*\n * emoji-completion.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\n\nimport { CompletionHandler, CompletionResult, CompletionHeaderProps } from '../../api/completion';\nimport { emojis, Emoji, SkinTone, emojiFromChar, emojiForAllSkinTones } from '../../api/emoji';\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { nodeForEmoji } from './emoji';\n\nimport './emoji-completion.css';\n\nexport function emojiCompletionHandler(ui: EditorUI): CompletionHandler<Emoji> {\n  return {\n    id: '95A133E1-968B-4D96-8849-4A325FF02C11',\n\n    completions: emojiCompletions(ui),\n\n    replacement(schema: Schema, emoji: Emoji | null): string | ProsemirrorNode | null {\n      if (emoji) {\n        return nodeForEmoji(schema, emoji, emoji.aliases[0]);\n      } else {\n        return null;\n      }\n    },\n\n    view: {\n      component: EmojiView,\n      key: emoji => emoji.emoji,\n      width: 200,\n      hideNoResults: true,\n    },\n  };\n}\n\nconst kMaxEmojiCompletions = 20;\nconst kEmojiCompletionRegEx = /(^|[^`\\:]):(\\w{2,})$/;\n\nfunction emojiCompletions(ui: EditorUI) {\n  return (text: string, context: EditorState | Transaction): CompletionResult<Emoji> | null => {\n    // look for requisite text sequence\n    const match = text.match(kEmojiCompletionRegEx);\n    if (match) {\n      // determine insert position and prefix to search for\n      const prefix = match[2].toLowerCase();\n      const pos = context.selection.head - prefix.length - 1; // -1 for the leading :\n\n      // scan for completions that match the prefix (truncate as necessary)\n      const completions: Emoji[] = [];\n      for (const emoji of emojis(ui.prefs.emojiSkinTone())) {\n        const alias = emoji.aliases.find(a => a.startsWith(prefix));\n        if (alias) {\n          completions.push({\n            ...emoji,\n            aliases: [alias],\n          });\n        }\n        if (completions.length >= kMaxEmojiCompletions) {\n          break;\n        }\n      }\n\n      // return result\n      return {\n        pos,\n        token: prefix,\n        completions: () => Promise.resolve(completions),\n      };\n\n      // no match\n    } else {\n      return null;\n    }\n  };\n}\n\nconst EmojiView: React.FC<Emoji> = emoji => {\n  return (\n    <div className={'pm-completion-list-item-text pm-emoji-font'}>\n      {emoji.emoji}&nbsp;:{emoji.aliases[0]}:\n    </div>\n  );\n};\n\nexport function emojiSkintonePreferenceCompletionHandler(ui: EditorUI): CompletionHandler<Emoji> {\n  return {\n    id: '15E92D42-8006-40F4-8FFD-6526F6A8A7FD',\n\n    completions: emojiSkintonePreferenceCompletions(ui),\n\n    replacement(schema: Schema, emoji: Emoji | null): string | ProsemirrorNode | null {\n      if (emoji) {\n        // Save this preference and use it in the future\n        ui.prefs.setEmojiSkinTone(emoji.skinTone);\n\n        // Emit the emoji of the correct skin tone\n        return nodeForEmoji(schema, emoji, emoji.aliases[0]);\n      } else {\n        // The user didn't select a skintoned emoji (e.g. pressed 'ESC'), so\n        // just store Default and use that in the future\n        ui.prefs.setEmojiSkinTone(SkinTone.Default);\n\n        return null;\n      }\n    },\n\n    view: {\n      header: () => ({\n        component: EmojiSkintonePreferenceHeaderView,\n        height: kHeaderHeight,\n      }),\n      component: EmojiSkintonePreferenceView,\n      key: pref => pref.skinTone,\n      width: kCellWidth,\n      height: kCellWidth,\n      horizontal: true,\n      horizontalItemWidths: [55],\n    },\n  };\n}\n\nconst kCellWidth = 40;\nconst kHeaderHeight = 20;\n\nfunction emojiSkintonePreferenceCompletions(ui: EditorUI) {\n  return (text: string, context: EditorState | Transaction): CompletionResult<Emoji> | null => {\n    // The user has set a preference for skin tone\n    if (ui.prefs.emojiSkinTone() !== SkinTone.None) {\n      return null;\n    }\n\n    const range = getMarkRange(context.doc.resolve(context.selection.head - 1), context.doc.type.schema.marks.emoji);\n    if (!range) {\n      return null;\n    }\n\n    const emojiText = context.doc.textBetween(range.from, range.to);\n\n    // If an attribute to suppress the prompt was explicitly set, don't prompt\n    // the user for a skin tone\n    const emojiAttrs = getMarkAttrs(context.doc, range, context.doc.type.schema.marks.emoji);\n    if (!emojiAttrs.prompt) {\n      return null;\n    }\n    const emoji = emojiFromChar(emojiText);\n\n    // If this is an emoji that doesn't support skin tones just return\n    if (!emoji?.supportsSkinTone) {\n      return null;\n    }\n\n    return {\n      pos: range.from,\n      token: emojiText,\n      completions: () => Promise.resolve(emojiForAllSkinTones(emoji)),\n    };\n  };\n}\n\nconst EmojiSkintonePreferenceHeaderView: React.FC<CompletionHeaderProps> = props => {\n  return (\n    <div className={'pm-completion-emoji-cell-header pm-light-text-color'}>\n      {props.ui.context.translateText('Choose preferred skin tone:')}\n    </div>\n  );\n};\n\n// use outline to apply border as a separator\nconst EmojiSkintonePreferenceView: React.FC<Emoji> = emoji => {\n  return <div className=\"pm-completion-list-item-text pm-completion-emoji-cell\">{emoji.emoji}</div>;\n};\n","/*\n * insert_symbol-emoji-skintone.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { TextButton } from '../../api/widgets/button';\n\nimport { SkinTone, emojiFromAlias, emojiWithSkinTonePreference, emojiForAllSkinTones, Emoji } from '../../api/emoji';\nimport { SymbolPreferencesProps } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-emoji-skintone.css';\n\nexport const SymbolEmojiPreferencesPanel = React.forwardRef<any, SymbolPreferencesProps>((props, ref) => {\n  // The currently selected skin tone\n  const [selectedSkinTone, setSelectedSkinTone] = React.useState<SkinTone>(props.prefs.emojiSkinTone());\n\n  // Shows and hides the selection UI\n  const [selectSkinTone, setSelectSkinTone] = React.useState<boolean>(false);\n\n  const previewEmoji = React.useMemo(() => {\n    const emojiRaw = emojiFromAlias('hand');\n    return emojiWithSkinTonePreference(emojiRaw!, selectedSkinTone);\n  }, [selectedSkinTone]);\n\n  const previewEmojiWithSkinTones = React.useMemo(() => {\n    return emojiForAllSkinTones(previewEmoji);\n  }, [previewEmoji]);\n\n  // If the user navigates or changes the symbol, close the picker\n  React.useEffect(() => {\n    setSelectSkinTone(false);\n  }, [props.selectedSymbolIndex]);\n\n  // Support navigation within the panel\n  const handleKeyDown = (event: React.KeyboardEvent) => {\n    switch (event.key) {\n      case 'ArrowRight':\n        if (selectSkinTone) {\n          setSelectedSkinTone(nextSkinTone());\n        }\n        break;\n\n      case 'ArrowLeft':\n        if (selectSkinTone) {\n          setSelectedSkinTone(previousSkinTone());\n        }\n        break;\n\n      case 'Enter':\n      case ' ':\n        commitSkinTonePreference(selectedSkinTone);\n        setSelectSkinTone(!selectSkinTone);\n        event.preventDefault();\n        break;\n    }\n  };\n\n  const handleClick = (skinTone: SkinTone) => {\n    return (event: React.MouseEvent<HTMLElement>) => {\n      commitSkinTonePreference(skinTone);\n      setSelectSkinTone(false);\n    };\n  };\n\n  const handleButtonClick = () => {\n    setSelectSkinTone(true);\n  };\n\n  function nextSkinTone(): SkinTone {\n    const index = getCurrentSkinToneIndex();\n    if (index + 1 < previewEmojiWithSkinTones.length) {\n      return previewEmojiWithSkinTones[index + 1].skinTone;\n    }\n    return selectedSkinTone;\n  }\n\n  function previousSkinTone(): SkinTone {\n    const index = getCurrentSkinToneIndex();\n    if (index - 1 >= 0) {\n      return previewEmojiWithSkinTones[index - 1].skinTone;\n    }\n    return selectedSkinTone;\n  }\n\n  function getCurrentSkinToneIndex(): number {\n    const index = previewEmojiWithSkinTones.findIndex(emoji => emoji.skinTone === selectedSkinTone);\n    return Math.max(Math.min(index, previewEmojiWithSkinTones.length), 0);\n  }\n\n  function skinToneSelectedClass(emoji: Emoji): string {\n    if (\n      selectedSkinTone === emoji.skinTone ||\n      (selectedSkinTone === SkinTone.None && emoji.skinTone === SkinTone.Default)\n    ) {\n      return 'pm-emoji-skintone-picker-item-selected pm-input-button';\n    }\n    return '';\n  }\n\n  function commitSkinTonePreference(skinTone: SkinTone) {\n    setSelectedSkinTone(skinTone);\n    props.prefs.setEmojiSkinTone(skinTone);\n    props.onPreferencesChanged();\n  }\n\n  const skinTonePicker = () => {\n    return (\n      <div>\n        <div className=\"pm-emoji-skintone-picker pm-input-button\">\n          {previewEmojiWithSkinTones.map(emoji => {\n            return (\n              <div\n                key={emoji.emoji}\n                className={`pm-emoji-skintone-picker-item ${skinToneSelectedClass(emoji)}`}\n                onClick={handleClick(emoji.skinTone)}\n              >\n                {emoji.emoji}\n              </div>\n            );\n          })}\n        </div>\n        <div className=\"pm-emoji-skintone-picker-label pm-light-text-color\">\n          {props.context.translateText('Preferred skin tone')}\n        </div>\n      </div>\n    );\n  };\n\n  const currentSkinToneButton = () => {\n    return (\n      <TextButton\n        classes={['pm-emoji-skintone-picker-button', 'pm-light-text-color']}\n        title={\n          selectedSkinTone === SkinTone.None\n            ? props.context.translateText(`${previewEmoji.emoji} Skin tone`)\n            : previewEmoji.emoji\n        }\n        onClick={handleButtonClick}\n        tabIndex={-1}\n      />\n    );\n  };\n\n  return (\n    <div className=\"pm-emoji-skintone-picker-container pm-emoji-font\" onKeyDown={handleKeyDown} tabIndex={0} ref={ref}>\n      {selectSkinTone ? skinTonePicker() : currentSkinToneButton()}\n    </div>\n  );\n});\n","/*\n * insert_special_characters.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorCommandId, InsertCharacterCommand } from '../../api/command';\n\nconst extension = {\n  commands: () => {\n    return [\n      new InsertCharacterCommand(EditorCommandId.EmDash, '—', []),\n      new InsertCharacterCommand(EditorCommandId.EnDash, '–', []),\n      new InsertCharacterCommand(EditorCommandId.HardLineBreak, '\\n', ['Shift-Enter']),\n    ];\n  },\n};\n\nexport default extension;\n","/*\n * nbsp.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { EditorCommandId, InsertCharacterCommand } from '../api/command';\nimport { forChangedNodes } from '../api/transaction';\nimport { mergedTextNodes } from '../api/text';\n\nconst kNbsp = '\\u00A0';\nconst kNbspRegEx = /\\xA0/g;\n\nconst extension = {\n  commands: () => {\n    return [new InsertCharacterCommand(EditorCommandId.NonBreakingSpace, kNbsp, ['Ctrl-Space', 'Ctrl-Shift-Space'])];\n  },\n\n  plugins: () => {\n    return [nonBreakingSpacePastePlugin(), nonBreakingSpaceHighlightPlugin()];\n  },\n};\n\nconst pastePluginKey = new PluginKey('nbsp-paste');\n\nfunction nonBreakingSpacePastePlugin() {\n  return new Plugin({\n    key: pastePluginKey,\n    props: {\n      transformPastedHTML: (html: string) => {\n        // strips spans that contain a single non-breaking space (chrome/webkit seem to\n        // do this for spaces surrounding marked html)\n        return html.replace(/<span> <\\/span>/g, ' ');\n      },\n    },\n  });\n}\n\nconst highlightPluginKey = new PluginKey('nbsp-highlight');\n\nfunction nonBreakingSpaceHighlightPlugin() {\n  return new Plugin<DecorationSet>({\n    key: highlightPluginKey,\n    state: {\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return DecorationSet.create(instance.doc, highlightNode(instance.doc));\n      },\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        // map\n        set = set.map(tr.mapping, tr.doc);\n\n        // find new\n        if (tr.docChanged) {\n          const decorations: Decoration[] = [];\n          forChangedNodes(\n            oldState,\n            newState,\n            node => node.isTextblock && node.textContent.includes(kNbsp),\n            (node, pos) => {\n              decorations.push(...highlightNode(node, pos + 1));\n            },\n          );\n          set = set.add(tr.doc, decorations);\n        }\n\n        // return the set\n        return set;\n      },\n    },\n    props: {\n      decorations(state: EditorState) {\n        return highlightPluginKey.getState(state);\n      },\n    },\n  });\n}\n\nfunction highlightNode(node: ProsemirrorNode, nodePos = 0) {\n  const decorations: Decoration[] = [];\n  const textNodes = mergedTextNodes(node);\n  textNodes.forEach(textNode => {\n    const text = textNode.text;\n    let m;\n    kNbspRegEx.lastIndex = 0;\n    // tslint:disable-next-line no-conditional-assignment\n    while ((m = kNbspRegEx.exec(text))) {\n      if (m[0] === '') {\n        break;\n      }\n      const from = nodePos + textNode.pos + m.index;\n      const to = nodePos + textNode.pos + m.index + m[0].length;\n      const classes = ['pm-nbsp', 'pm-invisible-text-color'];\n      decorations.push(Decoration.inline(from, to, { class: classes.join(' ') }));\n    }\n    kNbspRegEx.lastIndex = 0;\n  });\n  return decorations;\n}\n\nexport default extension;\n","/*\n * remove_section.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { Transaction, EditorState, Selection, Plugin, PluginKey } from 'prosemirror-state';\nimport { ReplaceStep, ReplaceAroundStep } from 'prosemirror-transform';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { isList } from '../api/list';\nimport { transactionsDocChanged } from '../api/transaction';\n\nconst extension: Extension = {\n\n  plugins: (schema: Schema) => {\n    return [\n      new Plugin({\n        key: new PluginKey('remove-section'),\n        appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n          \n          // skip for selection-only changes\n          if (!transactionsDocChanged(transactions)) {\n            return;\n          }\n\n          if (isSectionRemoval(transactions, oldState)) {\n\n            // if we had selected the entire contents of a div then prosemirror will remove\n            // the div entirely -- we actually want to leave an empty div in place\n            const fullySelectedDiv = fullySelectedDivSection(oldState); \n            if (fullySelectedDiv) {\n              const tr = newState.tr;\n              tr.replaceSelectionWith(\n                schema.nodes.div.create(fullySelectedDiv.node.attrs,\n                                        schema.nodes.paragraph.create()));\n              return tr;\n            }\n      \n      \n            // if we are left with an empty selection in an empty heading block this may\n            // have been the removal of a section (more than 1 textBlock). in that case\n            // remove the empty heading node\n            else if (isEmptyHeadingSelection(newState.selection)) {\n              const tr = newState.tr;\n              const $head = tr.selection.$head;\n              const start = $head.start();\n              const end = start + 2;\n              tr.deleteRange(start, end);\n              return tr;\n            }\n          }\n\n\n        }\n      })\n    ];\n  },\n};\n\n\nfunction isSectionRemoval(transactions: Transaction[], oldState: EditorState) {\n  // was this the removal of a section?\n  let isRemoval = false;\n  if (transactions.length === 1 && transactions[0].steps.length === 1) {\n    // see if this is a delete step\n    let isDeleteStep = false;\n    const step = transactions[0].steps[0];\n    if (step instanceof ReplaceStep) {\n      isDeleteStep = (step as any).slice.content.size === 0;\n    } else if (step instanceof ReplaceAroundStep) {\n      const { gapFrom, gapTo } = step as any;\n      isDeleteStep = gapFrom === gapTo;\n    }\n\n    // if it's a delete step then see if we removed multiple text blocks\n    let numBlocks = 0;\n    const { from, to } = step as any;\n    oldState.doc.nodesBetween(from, to, node => {\n      if (isRemoval) {\n        return false;\n      }\n      if (isList(node)) {\n        isRemoval = true;\n        return false;\n      } else if (node.isTextblock) {\n        if (numBlocks++ >= 1) {\n          isRemoval = true;\n          return false;\n        }\n      }\n    });\n  }\n\n  return isRemoval;\n}\n\n\nfunction fullySelectedDivSection(state: EditorState) {\n\n  if (!state.selection.empty && state.schema.nodes.div) {\n\n    const div = findParentNodeOfType(state.schema.nodes.div)(state.selection);\n    if (div) {\n     \n      // calculate the inner selection of the div (accounting for container position offsets)\n      let divSelFrom = div.start + 1; // offset to get to beginning first block text\n      let divSelTo = div.pos + div.node.nodeSize - 2; // offset to end of last block text\n     \n      // if the div's first child is a list we need to push in 2 more\n      if (isList(div.node.firstChild)) {\n        divSelFrom += 2;\n      }\n      // if the div's last child is a list we need to push in 2 more\n      if (isList(div.node.lastChild)) {\n        divSelTo -=2;\n      }\n\n      // does the selection span the entire div?\n      if (state.selection.from === divSelFrom && state.selection.to === divSelTo) {\n        return div;\n      } else {\n        return false;\n      }\n    }\n  }\n\n  return false;\n}\n\n\nfunction isEmptyHeadingSelection(selection: Selection) {\n  const parent = selection.$head.parent;\n  const schema = parent.type.schema;\n  return selection.empty && parent.type === schema.nodes.heading && parent.content.size === 0;\n}\n\n\nexport default extension;\n","/*\n * strikeout.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'strikeout',\n      spec: {\n        group: 'formatting',\n        parseDOM: [\n          { tag: 'del' },\n          { tag: 's' },\n          {\n            style: 'text-decoration',\n            getAttrs: (value: string | Node) => (value as string) === 'line-through' && null,\n          },\n        ],\n        toDOM() {\n          return ['del'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Strikeout,\n            mark: 'strikeout',\n          },\n        ],\n        writer: {\n          priority: 6,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Strikeout, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Strikeout, [], schema.marks.strikeout)];\n  },\n\n  inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n    return [delimiterMarkInputRule('~~', schema.marks.strikeout, filter, '`', true)];\n  },\n};\n\nexport default extensionIfEnabled(extension, 'strikeout');\n","/*\n * superscript.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'superscript',\n      spec: {\n        group: 'formatting',\n        parseDOM: [{ tag: 'sup' }],\n        toDOM() {\n          return ['sup'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Superscript,\n            mark: 'superscript',\n          },\n        ],\n        writer: {\n          priority: 15,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Superscript, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Superscript, [], schema.marks.superscript)];\n  },\n\n  inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n    return [delimiterMarkInputRule('\\\\^', schema.marks.superscript, filter, '`', true)];\n  },\n};\n\nexport default extensionIfEnabled(extension, 'superscript');\n","/*\n * subscript.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'subscript',\n      spec: {\n        group: 'formatting',\n        parseDOM: [{ tag: 'sub' }],\n        toDOM() {\n          return ['sub'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Subscript,\n            mark: 'subscript',\n          },\n        ],\n        writer: {\n          priority: 15,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Subscript, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Subscript, [], schema.marks.subscript)];\n  },\n\n  inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n    return [delimiterMarkInputRule('\\\\~', schema.marks.subscript, filter, '`\\\\~-', true)];\n  },\n};\n\nexport default extensionIfEnabled(extension, 'subscript');\n","/*\n * smallcaps.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './smallcaps-styles.css';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'smallcaps',\n      spec: {\n        group: 'formatting',\n        parseDOM: [\n          { tag: \"span[class*='smallcaps']\" },\n          { style: 'font-variant', getAttrs: (value: string | Node) => (value as string) === 'small-caps' && null },\n        ],\n        toDOM() {\n          return ['span', { class: 'smallcaps' }];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.SmallCaps,\n            mark: 'smallcaps',\n          },\n        ],\n        writer: {\n          priority: 8,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.SmallCaps, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Smallcaps, [], schema.marks.smallcaps)];\n  },\n};\n\nexport default extensionIfEnabled(extension, ['bracketed_spans', 'native_spans']);\n","/*\n * underline.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './underline-styles.css';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'underline',\n      spec: {\n        parseDOM: [\n          { tag: \"span[class*='underline']\" },\n          { tag: \"span[class*='ul']\" },\n          { tag: \"u\" },\n          { tag: \"ins\" }\n        ],\n        toDOM() {\n          return ['span', { class: 'underline' }];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Underline,\n            mark: 'underline',\n          },\n        ],\n        writer: {\n          priority: 7,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Underline, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Underline, [], schema.marks.underline)];\n  },\n};\n\nexport default extensionIfEnabled(extension, ['bracketed_spans', 'native_spans']);\n","/*\n * raw_inline.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, MarkType } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { PandocOutput, PandocToken, PandocTokenType } from '../../api/pandoc';\nimport { getMarkRange, markIsActive, getMarkAttrs } from '../../api/mark';\nimport { EditorUI } from '../../api/ui';\nimport { RawFormatProps } from '../../api/ui-dialogs';\nimport { canInsertNode } from '../../api/node';\nimport { fragmentText } from '../../api/fragment';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport const kRawInlineFormat = 0;\nexport const kRawInlineContent = 1;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, pandocCapabilities, ui } = context;\n\n  // always enabled so that extensions can make use of preprocessors + raw_attribute\n  // to hoist content out of pandoc for further processing by our token handlers.\n  // that means that users can always use the raw attribute in their markdown even\n  // if the editing format doesn't support it (in which case it will just get echoed\n  // back to the markdown just the way it was written).\n\n  // return the extension\n  return {\n    marks: [\n      {\n        name: 'raw_inline',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          inclusive: false,\n          excludes: 'formatting',\n          attrs: {\n            format: {},\n          },\n          parseDOM: [\n            {\n              tag: \"span[class*='raw-inline']\",\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                return {\n                  format: el.getAttribute('data-format'),\n                };\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            const attr: any = {\n              class: 'raw-inline pm-fixedwidth-font pm-markup-text-color',\n              'data-format': mark.attrs.format,\n            };\n            return ['span', attr];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.RawInline,\n              mark: 'raw_inline',\n              getAttrs: (tok: PandocToken) => {\n                return {\n                  format: tok.c[kRawInlineFormat],\n                };\n              },\n              getText: (tok: PandocToken) => {\n                return tok.c[kRawInlineContent];\n              },\n            },\n          ],\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              // get raw content\n              const raw = fragmentText(parent);\n\n              // write it\n              output.writeToken(PandocTokenType.RawInline, () => {\n                output.write(mark.attrs.format);\n                output.write(raw);\n              });\n            },\n          },\n        },\n      },\n    ],\n\n    // insert command\n    commands: (_schema: Schema) => {\n      if (pandocExtensions.raw_attribute) {\n        return [new RawInlineCommand(EditorCommandId.RawInline, '', ui, pandocCapabilities.output_formats)];\n      } else {\n        return [];\n      }\n    },\n  };\n};\n\n// base class for inline commands that auto-insert content\nexport class RawInlineInsertCommand extends ProsemirrorCommand {\n  private markType: MarkType;\n  constructor(id: EditorCommandId, keymap: readonly string[], markType: MarkType, insert: (tr: Transaction) => void) {\n    super(id, keymap, (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n      // if we aren't active then make sure we can insert a text node here\n      if (!this.isActive(state) && !canInsertNode(state, markType.schema.nodes.text)) {\n        return false;\n      }\n\n      // ensure we can apply this mark here\n      if (!toggleMarkType(this.markType)(state)) {\n        return false;\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n\n        if (this.isActive(state)) {\n          const range = getMarkRange(state.selection.$head, this.markType);\n          if (range) {\n            tr.removeMark(range.from, range.to, this.markType);\n          }\n        } else if (!tr.selection.empty) {\n          const mark = markType.create();\n          tr.addMark(tr.selection.from, tr.selection.to, mark);\n        } else {\n          insert(tr);\n        }\n\n        dispatch(tr);\n      }\n\n      return true;\n    });\n    this.markType = markType;\n  }\n\n  public isActive(state: EditorState) {\n    return markIsActive(state, this.markType);\n  }\n}\n\n// generic raw inline command (opens dialog that allows picking from among formats)\nexport class RawInlineCommand extends ProsemirrorCommand {\n  constructor(id: EditorCommandId, defaultFormat: string, ui: EditorUI, outputFormats: string[]) {\n    super(\n      id,\n      [],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        const schema = state.schema;\n\n        if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.raw_inline)(state)) {\n          return false;\n        }\n\n        async function asyncInlineRaw() {\n          if (dispatch) {\n            // check if mark is active\n            const isActive = markIsActive(state, schema.marks.raw_inline);\n\n            // get the range of the mark\n            let range = { from: state.selection.from, to: state.selection.to };\n            if (isActive) {\n              range = getMarkRange(state.selection.$from, schema.marks.raw_inline) as { from: number; to: number };\n            }\n\n            // get raw attributes if we have them\n            let raw: RawFormatProps = { content: '', format: defaultFormat };\n            raw.content = state.doc.textBetween(range.from, range.to);\n            if (isActive) {\n              raw = {\n                ...raw,\n                ...getMarkAttrs(state.doc, state.selection, schema.marks.raw_inline),\n              };\n            }\n\n            const result = await ui.dialogs.editRawInline(raw, outputFormats);\n            if (result) {\n              const tr = state.tr;\n              tr.removeMark(range.from, range.to, schema.marks.raw_inline);\n              if (result.action === 'edit') {\n                const mark = schema.marks.raw_inline.create({ format: result.raw.format });\n                const node = schema.text(result.raw.content, [mark]);\n                // if we are editing a selection then replace it, otherwise insert\n                if (raw.content) {\n                  tr.replaceRangeWith(range.from, range.to, node);\n                } else {\n                  tr.replaceSelectionWith(node, false);\n                }\n              }\n              dispatch(tr);\n            }\n\n            if (view) {\n              view.focus();\n            }\n          }\n        }\n        asyncInlineRaw();\n\n        return true;\n      },\n      {\n        name: ui.context.translateText('Raw Inline...'),\n        description: ui.context.translateText('Raw inline content'),\n        group: OmniInsertGroup.Content,\n        priority: 0,\n        image: () =>\n          ui.prefs.darkMode() ? ui.images.omni_insert?.raw_inline_dark! : ui.images.omni_insert?.raw_inline!,\n      },\n    );\n  }\n}\n\nexport default extension;\n","/*\n * raw_tex.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Mark, Fragment, Schema } from 'prosemirror-model';\nimport { DecorationSet } from 'prosemirror-view';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { InputRule, inputRules } from 'prosemirror-inputrules';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocToken, PandocTokenType, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { kTexFormat } from '../../api/raw';\nimport { markHighlightPlugin, markHighlightDecorations } from '../../api/mark-highlight';\nimport { MarkTransaction } from '../../api/transaction';\nimport { markIsActive, splitInvalidatedMarks } from '../../api/mark';\nimport { EditorCommandId, toggleMarkType } from '../../api/command';\nimport { texLength } from '../../api/tex';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { kRawInlineFormat, kRawInlineContent, RawInlineInsertCommand } from './raw_inline';\n\nconst kTexPlaceholder = 'tex';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions } = context;\n\n  if (!pandocExtensions.raw_tex) {\n    return null;\n  }\n\n  return {\n    marks: [\n      {\n        name: 'raw_tex',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          inclusive: true,\n          excludes: 'formatting',\n          attrs: {},\n          parseDOM: [\n            {\n              tag: \"span[class*='raw-tex']\",\n            },\n          ],\n          toDOM(_mark: Mark) {\n            const attr: any = {\n              class: 'raw-tex pm-fixedwidth-font',\n            };\n            return ['span', attr];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.RawInline,\n              mark: 'raw_tex',\n              match: (tok: PandocToken) => {\n                const format = tok.c[kRawInlineFormat];\n                return format === kTexFormat;\n              },\n              getText: (tok: PandocToken) => {\n                return tok.c[kRawInlineContent];\n              },\n            },\n          ],\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              output.writeRawMarkdown(parent);\n            },\n          },\n        },\n      },\n    ],\n\n    // insert command\n    commands: (schema: Schema) => {\n      return [new InsertInlineLatexCommand(schema)];\n    },\n\n    appendMarkTransaction: (schema: Schema) => {\n      return [\n        {\n          name: 'remove-raw-tex-marks',\n          filter: node => node.isTextblock && node.type.allowsMarkType(schema.marks.raw_tex),\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            splitInvalidatedMarks(tr, node, pos, texLength, schema.marks.raw_tex);\n          },\n        },\n      ];\n    },\n\n    inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n      return [texInputRule(schema, filter)];\n    },\n\n    // plugin to add highlighting decorations\n    plugins: (schema: Schema) => {\n      // plugins to return\n      const plugins: Plugin[] = [];\n\n      // latex equation highlighting\n      plugins.push(latexHighlightingPlugin(schema));\n\n      // latex brace matching\n      const braces = new Map([\n        ['{', '}'],\n        ['[', ']'],\n      ]);\n      plugins.push(\n        inputRules({\n          rules: [\n            new InputRule(/(^|[^^\\\\])([{[])$/, (state: EditorState, match: string[], start: number, end: number) => {\n              if (markIsActive(state, schema.marks.raw_tex)) {\n                const tr = state.tr;\n                tr.insertText(match[2] + braces.get(match[2]));\n                setTextSelection(start + match[1].length + 1)(tr);\n                return tr;\n              } else {\n                return null;\n              }\n            }),\n          ],\n        }),\n      );\n\n      // return\n      return plugins;\n    },\n  };\n};\n\nfunction texInputRule(schema: Schema, filter: MarkInputRuleFilter) {\n  return new InputRule(/(^| )\\\\$/, (state: EditorState, match: string[], start: number, end: number) => {\n    const rawTexMark = schema.marks.raw_tex;\n\n    if (state.selection.empty && toggleMarkType(rawTexMark)(state)) {\n      // if there is no tex ahead of us or we don't pass the fitler (b/c marks that don't allow\n      // input rules are active) then bail\n      const $head = state.selection.$head;\n      const texText = '\\\\' + $head.parent.textContent.slice($head.parentOffset);\n      if (!texText.startsWith('\\\\ ')) {\n        const texMatchLength = texLength(texText);\n        if (texMatchLength === 0 || !filter(state, state.selection.from, state.selection.from + texMatchLength)) {\n          return null;\n        }\n      }\n\n      // create transaction\n      const tr = state.tr;\n\n      // insert tex backslash\n      const mark = schema.marks.raw_tex.create();\n      tr.addStoredMark(mark);\n      tr.insertText('\\\\');\n\n      // extend the mark to cover any valid tex that immediately follows the \\\n      const { parent, parentOffset } = tr.selection.$head;\n      const text = parent.textContent.slice(parentOffset - 1);\n      if (text.length > 0) {\n        const length = texLength(text);\n        if (length > 1) {\n          const startTex = tr.selection.from - 1;\n          tr.addMark(startTex, startTex + length, mark);\n          return tr;\n        }\n      }\n\n      // insert placeholder if it's a standalone \\\n      if (text === '\\\\' || text.startsWith('\\\\ ')) {\n        tr.insertText(kTexPlaceholder);\n        setTexSelectionAfterInsert(tr);\n        return tr;\n      }\n    }\n\n    // didn't find a valid context for a tex comand\n    return null;\n  });\n}\n\nclass InsertInlineLatexCommand extends RawInlineInsertCommand {\n  constructor(schema: Schema) {\n    super(EditorCommandId.TexInline, [], schema.marks.raw_tex, (tr: Transaction) => {\n      const mark = schema.marks.raw_tex.create();\n      const tex = '\\\\' + kTexPlaceholder;\n      const node = schema.text(tex, [mark]);\n      tr.replaceSelectionWith(node, false);\n      setTexSelectionAfterInsert(tr);\n    });\n  }\n}\n\nfunction setTexSelectionAfterInsert(tr: Transaction) {\n  tr.setSelection(\n    new TextSelection(tr.doc.resolve(tr.selection.from - kTexPlaceholder.length), tr.doc.resolve(tr.selection.from)),\n  );\n}\n\nconst key = new PluginKey<DecorationSet>('latex-highlight');\n\nexport function latexHighlightingPlugin(schema: Schema) {\n  const kLightTextClass = 'pm-light-text-color';\n  return markHighlightPlugin(key, schema.marks.raw_tex, (text, _attrs, markRange) => {\n    const kIdClass = 'pm-markup-text-color';\n    let decorations = markHighlightDecorations(markRange, text, /\\\\[A-Za-z]+/g, kIdClass);\n    decorations = decorations.concat(markHighlightDecorations(markRange, text, /[{}[\\]]/g, kLightTextClass));\n    return decorations;\n  });\n}\n\nexport default extension;\n","/*\n * mark-highlight.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey, Plugin, EditorState, Transaction } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Node as ProsemirrorNode, MarkType } from 'prosemirror-model';\nimport { findChildrenByMark } from 'prosemirror-utils';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\n\nimport { getMarkRange, getMarkAttrs } from './mark';\nimport { forChangedNodes } from './transaction';\n\nexport type MarkHighligher = (\n  text: string,\n  attrs: { [key: string]: any },\n  range: { from: number; to: number },\n) => Decoration[];\n\nexport function markHighlightDecorations(\n  markRange: { from: number; to: number },\n  text: string,\n  re: RegExp,\n  className: string,\n) {\n  const decorations: Decoration[] = [];\n  re.lastIndex = 0;\n  let match = re.exec(text);\n  while (match) {\n    decorations.push(\n      Decoration.inline(markRange.from + match.index, markRange.from + re.lastIndex, { class: className }),\n    );\n    match = re.exec(text);\n  }\n  re.lastIndex = 0;\n  return decorations;\n}\n\nexport function markHighlightPlugin(key: PluginKey<DecorationSet>, markType: MarkType, highlighter: MarkHighligher) {\n  function decorationsForDoc(doc: ProsemirrorNode) {\n    let decorations: Decoration[] = [];\n    findChildrenByMark(doc, markType, true).forEach(markedNode => {\n      decorations = decorations.concat(markDecorations(doc, markType, markedNode.pos, highlighter));\n    });\n    return DecorationSet.create(doc, decorations);\n  }\n\n  return new Plugin<DecorationSet>({\n    key,\n    state: {\n      // initialize by highlighting the entire document\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return decorationsForDoc(instance.doc);\n      },\n\n      // whenever an edit affecting this mark type occurs then update the decorations\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        // ignore selection changes\n        if (!tr.docChanged) {\n          return set.map(tr.mapping, tr.doc);\n        }\n\n        // if one of the steps added or removed a mark of our type then rescan the doc.\n        if (\n          tr.steps.some(\n            step =>\n              (step instanceof AddMarkStep && (step as any).mark.type === markType) ||\n              (step instanceof RemoveMarkStep && (step as any).mark.type === markType),\n          )\n        ) {\n          // rehighlight entire doc\n          return decorationsForDoc(newState.doc);\n\n          // incremental rehighlighting based on presence of mark in changed regions\n        } else {\n          // adjust decoration positions to changes made by the transaction (decorations that apply\n          // to removed chunks of content will be removed by this)\n          set = set.map(tr.mapping, tr.doc);\n\n          // function to rehighlight parent of specified pos\n          const rehighlightParent = (pos: number) => {\n            const resolvedPos = tr.doc.resolve(pos);\n            const parent = resolvedPos.node();\n            const from = resolvedPos.start();\n            const marks = findChildrenByMark(parent, markType);\n            marks.forEach(mark => {\n              const markRange = getMarkRange(tr.doc.resolve(from + mark.pos), markType) as { from: number; to: number };\n              const removeDecorations = set.find(markRange.from, markRange.to);\n              set = set.remove(removeDecorations);\n              const addDecorations = markDecorations(tr.doc, markType, markRange.from, highlighter);\n              set = set.add(tr.doc, addDecorations);\n            });\n          };\n\n          // rehighlight nodes that changed and have our mark type\n          forChangedNodes(\n            oldState,\n            newState,\n            node => node.type.allowsMarkType(markType),\n            (node, pos) => {\n              if (newState.doc.rangeHasMark(pos, pos + node.nodeSize, markType)) {\n                rehighlightParent(pos);\n              }\n            },\n          );\n\n          return set;\n        }\n      },\n    },\n    props: {\n      decorations(state: EditorState) {\n        return key.getState(state);\n      },\n    },\n  });\n}\n\nfunction markDecorations(doc: ProsemirrorNode, markType: MarkType, pos: number, highlighter: MarkHighligher) {\n  const markRange = getMarkRange(doc.resolve(pos), markType);\n  if (markRange) {\n    const attrs = getMarkAttrs(doc, markRange, markType);\n    const text = doc.textBetween(markRange.from, markRange.to);\n    return highlighter(text, attrs, markRange);\n  } else {\n    return [];\n  }\n}\n","/*\n * tex.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Get the length of valid tex content for the passed text. return values include:\n//  -1: Invalid tex content (starts with \\ but doesn't close braces/brackets properly)\n//   0: Not tex content\n//  >1: Length of valid tex string\nexport function texLength(text: string) {\n  let braceLevel = 0;\n  let bracketLevel = 0;\n\n  let i;\n  for (i = 0; i < text.length; i++) {\n    // next character\n    const ch = text[i];\n\n    // must start with \\{ltr}\n    if (i === 0 && ch !== '\\\\') {\n      return 0;\n    }\n    if (i === 1 && !isLetter(ch)) {\n      return 0;\n    }\n\n    // only letters, backslashes, and open brace/bracket allowed (unless we are in braces or brackets)\n    const inBraces = braceLevel >= 1;\n    const inBrackets = bracketLevel >= 1;\n    if (i > 0 && !isLetter(ch) && ch !== '\\\\' && ch !== '{' && ch !== '[' && !inBraces && !inBrackets) {\n      return i;\n    }\n\n    // manage brace and bracket levels\n    if (ch === '{') {\n      braceLevel++;\n    } else if (ch === '}') {\n      braceLevel--;\n    } else if (ch === '[') {\n      bracketLevel++;\n    } else if (ch === ']') {\n      bracketLevel--;\n    }\n  }\n\n  if (braceLevel === 0 && bracketLevel === 0) {\n    return i;\n  } else {\n    return -1; // invalid tex\n  }\n}\n\nexport function isSingleLineTex(tex: string) {\n  return tex.trimRight().split('\\n').length === 1;\n}\n\nconst LetterRegex = /[A-Za-z]/;\nfunction isLetter(ch: string) {\n  return LetterRegex.test(ch);\n}\n","/*\n * raw_html.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Schema, Fragment } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocTokenType, PandocToken, ProsemirrorWriter, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { isRawHTMLFormat } from '../../api/raw';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { kRawInlineFormat, kRawInlineContent } from './raw_inline';\nimport { toggleMarkType } from '../../api/command';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions } = context;\n  return {\n    marks: [\n      {\n        name: 'raw_html',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          inclusive: false,\n          excludes: 'formatting',\n          parseDOM: [\n            {\n              tag: \"span[class*='raw-html']\",\n              getAttrs(dom: Node | string) {\n                return {};\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            const attr: any = {\n              class: 'raw-html pm-fixedwidth-font pm-markup-text-color',\n            };\n            return ['span', attr];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.RawInline,\n              match: (tok: PandocToken) => {\n                const format = tok.c[kRawInlineFormat];\n                return isRawHTMLFormat(format);\n              },\n              handler: (schema: Schema) => {\n                return (writer: ProsemirrorWriter, tok: PandocToken) => {\n                  const html = tok.c[kRawInlineContent];\n                  if (writer.hasInlineHTMLWriter(html)) {\n                    writer.writeInlineHTML(html);\n                  } else {\n                    writeInlneHTML(schema, html, writer);\n                  }\n                };\n              },\n            },\n          ],\n\n          inlineHTMLReader: (schema: Schema, html: string, writer?: ProsemirrorWriter) => {\n            // read single tags as inline html\n            const isSingleTag = tagStartLoc(html, html.length - 2) === 0;\n            if (isSingleTag && writer) {\n              writeInlneHTML(schema, html, writer);\n            }\n            return isSingleTag;\n          },\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              output.writeRawMarkdown(parent);\n            },\n          },\n        },\n      },\n    ],\n\n    // input rules\n    inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n      if (pandocExtensions.raw_html) {\n        return [rawHtmlInputRule(schema, filter)];\n      } else {\n        return [];\n      }\n    },\n  };\n};\n\nfunction writeInlneHTML(schema: Schema, html: string, writer: ProsemirrorWriter) {\n  const mark = schema.marks.raw_html.create();\n  writer.openMark(mark);\n  writer.writeText(html);\n  writer.closeMark(mark);\n}\n\nexport function rawHtmlInputRule(schema: Schema, filter: MarkInputRuleFilter) {\n  return new InputRule(/>$/, (state: EditorState, match: string[], start: number, end: number) => {\n    const rawhtmlMark = state.schema.marks.raw_html;\n\n    // ensure we pass all conditions for html input\n    if (state.selection.empty && toggleMarkType(rawhtmlMark)(state) && filter(state, start, end)) {\n      // get tag info\n      const { parent, parentOffset } = state.selection.$head;\n      const text = parent.textContent;\n      const endLoc = parentOffset - 1;\n      const tag = tagInfo(text, endLoc);\n      if (tag) {\n        // create transaction\n        const tr = state.tr;\n\n        // insert >\n        tr.insertText('>');\n\n        // add mark\n        start = tr.selection.from - (tag.end - tag.start + 1);\n        tr.addMark(start, end + 1, rawhtmlMark.create());\n        tr.removeStoredMark(rawhtmlMark);\n\n        // if it wasn't an end tag and it isn't a void tag then also\n        // insert an end tag (and leave the cursor in the middle)\n        if (!tag.close && !tag.void) {\n          const endTag = schema.text(`</${tag.name}>`);\n          tr.replaceSelectionWith(endTag, false);\n          setTextSelection(tr.selection.from - endTag.textContent.length)(tr);\n          tr.addMark(tr.selection.from, tr.selection.from + endTag.textContent.length, rawhtmlMark.create());\n          tr.removeStoredMark(rawhtmlMark);\n        }\n\n        // return transaction\n        return tr;\n      }\n    }\n\n    return null;\n  });\n}\n\nfunction tagInfo(text: string, endLoc: number) {\n  const startLoc = tagStartLoc(text, endLoc);\n  if (startLoc !== -1) {\n    // don't match if preceding character is a backtick\n    // (user is attempting to write an html tag in code)\n    if (text.charAt(startLoc - 1) === '`') {\n      return null;\n    }\n    const tagText = text.substring(startLoc, endLoc + 1);\n    const match = tagText.match(/<(\\/?)(\\w+)/);\n    if (match) {\n      const name = match[2];\n      if (isHTMLTag(name)) {\n        return {\n          name: match[2],\n          close: match[1].length > 0,\n          void: isVoidTag(name),\n          start: startLoc,\n          end: endLoc + 1,\n        };\n      }\n    }\n  }\n  return null;\n}\n\nfunction tagStartLoc(text: string, endLoc: number) {\n  let inSingleQuote = false;\n  let inDoubleQuote = false;\n  let i;\n  for (i = endLoc; i >= 0; i--) {\n    // next character\n    const ch = text[i];\n\n    // invalid if we see another > when not in quotes\n    if (ch === '>' && !inSingleQuote && !inDoubleQuote) {\n      return -1;\n    }\n\n    // > terminate on < if we aren't in quotes\n    if (ch === '<' && !inSingleQuote && !inDoubleQuote) {\n      return i;\n    }\n\n    // handle single quote\n    if (ch === \"'\") {\n      if (inSingleQuote) {\n        inSingleQuote = false;\n      } else if (!inDoubleQuote) {\n        inSingleQuote = true;\n      }\n\n      // handle double quote\n    } else if (ch === '\"') {\n      if (inDoubleQuote) {\n        inDoubleQuote = false;\n      } else if (!inSingleQuote) {\n        inDoubleQuote = true;\n      }\n    }\n  }\n\n  return -1;\n}\n\nfunction isHTMLTag(tag: string) {\n  return [\n    // structural\n    'a',\n    'article',\n    'aside',\n    'body',\n    'br',\n    'details',\n    'div',\n    'h1',\n    'h2',\n    'h3',\n    'h4',\n    'h5',\n    'h6',\n    'head',\n    'header',\n    'hgroup',\n    'hr',\n    'html',\n    'footer',\n    'nav',\n    'p',\n    'section',\n    'span',\n    'summary',\n\n    // metadata\n    'base',\n    'basefont',\n    'link',\n    'meta',\n    'style',\n    'title',\n\n    // form\n    'button',\n    'datalist',\n    'fieldset',\n    'form',\n    'input',\n    'keygen',\n    'label',\n    'legend',\n    'meter',\n    'optgroup',\n    'option',\n    'select',\n    'textarea',\n\n    // formatting\n    'abbr',\n    'acronym',\n    'address',\n    'b',\n    'bdi',\n    'bdo',\n    'big',\n    'blockquote',\n    'center',\n    'cite',\n    'code',\n    'del',\n    'dfn',\n    'em',\n    'font',\n    'i',\n    'ins',\n    'kbd',\n    'mark',\n    'output',\n    'pre',\n    'progress',\n    'q',\n    'rp',\n    'rt',\n    'ruby',\n    's',\n    'samp',\n    'small',\n    'strike',\n    'strong',\n    'sub',\n    'sup',\n    'tt',\n    'u',\n    'var',\n    'wbr',\n\n    // list\n    'dd',\n    'dir',\n    'dl',\n    'dt',\n    'li',\n    'ol',\n    'menu',\n    'ul',\n\n    // table\n    'caption',\n    'col',\n    'colgroup',\n    'table',\n    'tbody',\n    'td',\n    'tfoot',\n    'thead',\n    'th',\n    'tr',\n\n    // scripting\n    'script',\n    'noscript',\n\n    // embedded content\n    'applet',\n    'area',\n    'audio',\n    'canvas',\n    'embed',\n    'figcaption',\n    'figure',\n    'frame',\n    'frameset',\n    'iframe',\n    'img',\n    'map',\n    'noframes',\n    'object',\n    'param',\n    'source',\n    'time',\n    'video',\n  ].includes(tag.toLowerCase());\n}\n\nfunction isVoidTag(tag: string) {\n  return [\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr',\n  ].includes(tag.toLowerCase());\n}\n\nexport default extension;\n","/*\n * math.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Mark, Fragment, Slice } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { InputRule } from 'prosemirror-inputrules';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocTokenType, PandocToken, PandocOutput } from '../../api/pandoc';\nimport { BaseKey } from '../../api/basekeys';\nimport { markIsActive, getMarkAttrs } from '../../api/mark';\nimport { kCodeText } from '../../api/code';\nimport { kMathContent, kMathType, delimiterForType, MathType } from '../../api/math';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { InsertInlineMathCommand, InsertDisplayMathCommand, insertMath } from './math-commands';\nimport { mathAppendMarkTransaction } from './math-transaction';\nimport { mathHighlightPlugin } from './math-highlight';\nimport { MathPopupPlugin } from './math-popup';\nimport { mathViewPlugins } from './math-view';\n\nimport './math-styles.css';\nimport { kPasteTransaction } from '../../api/transaction';\n\nconst kInlineMathPattern = '\\\\$[^ ].*?[^\\\\ ]?\\\\$';\nconst kInlineMathRegex = new RegExp(kInlineMathPattern);\n\nconst kSingleLineDisplayMathPattern = '\\\\$\\\\$[^\\n]*?\\\\$\\\\$';\nconst kSingleLineDisplayMathRegex = new RegExp(kSingleLineDisplayMathPattern);\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, ui, format, math, events } = context;\n\n  if (!pandocExtensions.tex_math_dollars) {\n    return null;\n  }\n\n  // special blogdown handling for markdown renderers that don't support math\n  const blogdownMathInCode = format.rmdExtensions.blogdownMathInCode;\n  const singleLineDisplayMath = blogdownMathInCode;\n\n  return {\n    marks: [\n      {\n        name: 'math',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          attrs: {\n            type: {},\n          },\n          inclusive: false,\n          excludes: 'formatting',\n          parseDOM: [\n            {\n              tag: \"span[class*='math']\",\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                return {\n                  type: el.getAttribute('data-type'),\n                };\n              },\n              preserveWhitespace: 'full',\n            },\n          ],\n\n          toDOM(mark: Mark) {\n            return [\n              'span',\n              {\n                class: 'math pm-fixedwidth-font pm-light-text-color',\n                'data-type': mark.attrs.type,\n                spellcheck: 'false',\n              },\n            ];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Math,\n              mark: 'math',\n              getAttrs: (tok: PandocToken) => {\n                return {\n                  type: tok.c[kMathType].t,\n                };\n              },\n              getText: (tok: PandocToken) => {\n                const delimter = delimiterForType(tok.c[kMathType].t);\n                return delimter + tok.c[kMathContent] + delimter;\n              },\n            },\n            // extract math from backtick code for blogdown\n            ...(blogdownMathInCode\n              ? [\n                  {\n                    token: PandocTokenType.Code,\n                    mark: 'math',\n                    match: (tok: PandocToken) => {\n                      const text = tok.c[kCodeText];\n                      return kSingleLineDisplayMathRegex.test(text) || kInlineMathRegex.test(text);\n                    },\n                    getAttrs: (tok: PandocToken) => {\n                      const text = tok.c[kCodeText];\n                      return {\n                        type: kSingleLineDisplayMathRegex.test(text) ? MathType.Display : MathType.Inline,\n                      };\n                    },\n                    getText: (tok: PandocToken) => {\n                      return tok.c[kCodeText];\n                    },\n                  },\n                ]\n              : []),\n          ],\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              // collect math content\n              let mathText = '';\n              parent.forEach((node: ProsemirrorNode) => (mathText = mathText + node.textContent));\n\n              // if this is blogdownMathInCode just write the content in a code mark\n              if (blogdownMathInCode) {\n                output.writeToken(PandocTokenType.Code, () => {\n                  output.writeAttr();\n                  output.write(mathText);\n                });\n              } else {\n                // check for delimeter (if it's gone then write this w/o them math mark)\n                const delimiter = delimiterForType(mark.attrs.type);\n                if (mathText.startsWith(delimiter) && mathText.endsWith(delimiter)) {\n                  // remove delimiter\n                  mathText = mathText.substr(delimiter.length, mathText.length - 2 * delimiter.length);\n\n                  // trim inline math\n                  if (mark.attrs.type === MathType.Inline) {\n                    mathText = mathText.trim();\n                  }\n\n                  // if it's just whitespace then it's not actually math (we allow this state\n                  // in the editor because it's the natural starting place for new equations)\n                  if (mathText.length === 0) {\n                    output.writeText(delimiter + mathText + delimiter);\n                  } else {\n                    output.writeToken(PandocTokenType.Math, () => {\n                      // write type\n                      output.writeToken(\n                        mark.attrs.type === MathType.Inline ? PandocTokenType.InlineMath : PandocTokenType.DisplayMath,\n                      );\n                      output.write(mathText);\n                    });\n                  }\n                } else {\n                  // user removed the delimiter so write the content literally. when it round trips\n                  // back into editor it will no longer be parsed by pandoc as math\n                  output.writeRawMarkdown(mathText);\n                }\n              }\n            },\n          },\n        },\n      },\n    ],\n\n    baseKeys: (_schema: Schema) => {\n      if (!singleLineDisplayMath) {\n        return [{ key: BaseKey.Enter, command: displayMathNewline() }];\n      } else {\n        return [];\n      }\n    },\n\n    inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n      const kInlineMathInputRulePattern = '\\\\$[^ ][^\\\\$]*?[^\\\\ ]?\\\\$';\n      return [\n        // inline math\n        new InputRule(\n          new RegExp('(^|[^`])' + kInlineMathInputRulePattern + '$'),\n          (state: EditorState, match: string[], start: number, end: number) => {\n            if (!markIsActive(state, schema.marks.math) && filter(state, start, end)) {\n              const tr = state.tr;\n              tr.insertText('$');\n              const mark = schema.marks.math.create({ type: MathType.Inline });\n              tr.addMark(start + match[1].length, end + 1, mark);\n              return tr;\n            } else {\n              return null;\n            }\n          },\n        ),\n        new InputRule(/(?:^|[^`])\\$$/, (state: EditorState, match: string[], start: number, end: number) => {\n          if (!markIsActive(state, schema.marks.math)) {\n            const { parent, parentOffset } = state.selection.$head;\n            const text = '$' + parent.textContent.slice(parentOffset);\n            if (text.length > 0) {\n              const length = mathLength(text);\n              if (length > 1) {\n                if (filter(state, start, start + length)) {\n                  const tr = state.tr;\n                  tr.insertText('$');\n                  const startMath = tr.selection.from - 1;\n                  const mark = schema.marks.math.create({ type: MathType.Inline });\n                  tr.addMark(startMath, startMath + length, mark);\n                  return tr;\n                }\n              }\n            }\n          }\n          return null;\n        }),\n        // display math\n        new InputRule(/^\\$\\$$/, (state: EditorState, match: string[], start: number, end: number) => {\n          if (filter(state, start, end)) {\n            const tr = state.tr;\n            tr.delete(start, end);\n            insertMath(tr.selection, MathType.Display, !singleLineDisplayMath, tr);\n            return tr;\n          } else {\n            return null;\n          }\n        }),\n      ];\n    },\n\n    commands: (_schema: Schema) => {\n      return [new InsertInlineMathCommand(ui), new InsertDisplayMathCommand(ui, !singleLineDisplayMath)];\n    },\n\n    appendMarkTransaction: (_schema: Schema) => {\n      return [mathAppendMarkTransaction()];\n    },\n\n    plugins: (schema: Schema) => {\n      const plugins = [\n        new Plugin({\n          key: new PluginKey('math'),\n          props: {\n            // paste plain text into math blocks\n            handlePaste: handlePasteIntoMath(),\n          },\n        }),\n        mathHighlightPlugin(schema),\n      ];\n      if (math) {\n        plugins.push(new MathPopupPlugin(ui, math, events, false));\n        plugins.push(...mathViewPlugins(schema, ui, math));\n      }\n      return plugins;\n    },\n  };\n};\n\nfunction mathLength(text: string) {\n  const match = text.match(kInlineMathRegex);\n  if (match) {\n    return match[0].length;\n  } else {\n    return 0;\n  }\n}\n\nfunction handlePasteIntoMath() {\n  return (view: EditorView, _event: Event, slice: Slice) => {\n    const schema = view.state.schema;\n    if (markIsActive(view.state, schema.marks.math)) {\n      const tr = view.state.tr;\n      tr.setMeta(kPasteTransaction, true);\n      tr.setMeta('uiEvent', 'paste');\n      let math = '';\n      slice.content.forEach((node: ProsemirrorNode) => (math = math + node.textContent));\n      tr.replaceSelectionWith(schema.text(math));\n      view.dispatch(tr);\n      return true;\n    } else {\n      return false;\n    }\n  };\n}\n\n// enable insertion of newlines\nfunction displayMathNewline() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // display math mark must be active\n\n    if (!displayMathIsActive(state)) {\n      return false;\n    }\n\n    // insert a newline\n    if (dispatch) {\n      const tr = state.tr;\n      tr.insertText('\\n');\n      dispatch(tr);\n    }\n    return true;\n  };\n}\n\nfunction displayMathIsActive(state: EditorState) {\n  const schema = state.schema;\n  return (\n    markIsActive(state, schema.marks.math) &&\n    getMarkAttrs(state.doc, state.selection, schema.marks.math).type === MathType.Display\n  );\n}\n\nexport default extension;\n","/*\n * math-commands.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { setTextSelection, findParentNodeOfType } from 'prosemirror-utils';\n\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsert, OmniInsertGroup } from '../../api/omni_insert';\nimport { MathType, delimiterForType } from '../../api/math';\n\nexport class InsertInlineMathCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI) {\n    super(EditorCommandId.InlineMath, [], insertMathCommand(MathType.Inline, false), inlineMathOmniInsert(ui));\n  }\n}\n\nexport class InsertDisplayMathCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI, allowNewline: boolean) {\n    super(\n      EditorCommandId.DisplayMath,\n      [],\n      insertMathCommand(MathType.Display, allowNewline),\n      displayMathOmniInsert(ui),\n    );\n  }\n}\n\nfunction insertMathCommand(type: MathType, allowNewline: boolean) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // enable/disable command\n    const schema = state.schema;\n    if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.math)(state)) {\n      return false;\n    }\n\n    if (dispatch) {\n      const tr = state.tr;\n      insertMath(state.selection, type, allowNewline, tr);\n      dispatch(tr);\n    }\n    return true;\n  };\n}\n\nfunction inlineMathOmniInsert(ui: EditorUI): OmniInsert {\n  return {\n    name: ui.context.translateText('Inline Math'),\n    keywords: [ui.context.translateText('equation')],\n    description: ui.context.translateText('Math within a line or paragraph'),\n    group: OmniInsertGroup.Math,\n    priority: 2,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.math_inline_dark! : ui.images.omni_insert?.math_inline!),\n  };\n}\n\nfunction displayMathOmniInsert(ui: EditorUI): OmniInsert {\n  return {\n    name: ui.context.translateText('Display Math'),\n    keywords: [ui.context.translateText('equation')],\n    description: ui.context.translateText('Math set apart from the main text'),\n    group: OmniInsertGroup.Math,\n    priority: 1,\n    image: () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.math_display_dark! : ui.images.omni_insert?.math_display!,\n  };\n}\n\nexport function insertMath(selection: Selection, type: MathType, allowNewline: boolean, tr: Transaction) {\n  // include a newline for display math in an empty paragraph\n  const schema = tr.doc.type.schema;\n  let content = '';\n  if (type === MathType.Display) {\n    const para = findParentNodeOfType(schema.nodes.paragraph)(selection);\n    if (allowNewline && para && !para.node.textContent.length) {\n      content = '\\n\\n';\n    }\n  }\n  const delim = delimiterForType(type);\n  const mathText = schema.text(delim + content + delim);\n  tr.replaceSelectionWith(mathText, false);\n  const mathMark = schema.marks.math.create({ type });\n  const from = tr.selection.head - content.length - delim.length * 2;\n  const to = from + delim.length * 2 + content.length;\n  tr.addMark(from, to, mathMark);\n  const pos = tr.mapping.map(selection.head) - delim.length - (content ? 1 : 0);\n  return setTextSelection(pos)(tr).scrollIntoView();\n}\n","/*\n * math-transaction.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildrenByMark } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { AppendMarkTransactionHandler, MarkTransaction } from '../../api/transaction';\nimport { delimiterForType, MathType } from '../../api/math';\nimport { selectionIsWithinRange } from '../../api/selection';\n\nexport function mathAppendMarkTransaction(): AppendMarkTransactionHandler {\n  return {\n    name: 'math-marks',\n\n    filter: node => node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.math),\n\n    append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n      // find all math blocks and convert them to text if they no longer conform\n      const schema = node.type.schema;\n      const maths = findChildrenByMark(node, schema.marks.math, true);\n      for (const math of maths) {\n        const from = pos + 1 + math.pos;\n        const mathRange = getMarkRange(tr.doc.resolve(from), schema.marks.math);\n        if (mathRange) {\n          const mathAttr = getMarkAttrs(tr.doc, mathRange, schema.marks.math);\n          if (mathAttr.type === MathType.Inline) {\n            const mathDelim = delimiterForType(mathAttr.type);\n            const mathText = tr.doc.textBetween(mathRange.from, mathRange.to);\n            const charAfter = tr.doc.textBetween(mathRange.to, mathRange.to + 1);\n            const noDelims = !mathText.startsWith(mathDelim) || !mathText.endsWith(mathDelim);\n            const selectionIsWithin = selectionIsWithinRange(tr.selection, mathRange);\n            const spaceAtLeft =\n              !selectionIsWithin && mathAttr.type === MathType.Inline && mathText.startsWith(mathDelim + ' ');\n            const spaceAtRight =\n              !selectionIsWithin && mathAttr.type === MathType.Inline && mathText.endsWith(' ' + mathDelim);\n            const numberAfter = mathAttr.type === MathType.Inline && /\\d/.test(charAfter);\n            if (noDelims || spaceAtLeft || spaceAtRight || numberAfter) {\n              tr.removeMark(mathRange.from, mathRange.to, schema.marks.math);\n              tr.removeStoredMark(schema.marks.math);\n            }\n          }\n        }\n      }\n    },\n  };\n}\n","/*\n * math-highlight.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\n\nimport { markHighlightPlugin } from '../../api/mark-highlight';\nimport { delimiterForType } from '../../api/math';\n\nconst key = new PluginKey<DecorationSet>('math-highlight');\n\nexport function mathHighlightPlugin(schema: Schema) {\n  return markHighlightPlugin(key, schema.marks.math, (_text, attrs, markRange) => {\n    const kDelimClass = 'pm-markup-text-color';\n    const delim = delimiterForType(attrs.type);\n    if (markRange.to - markRange.from === delim.length * 2) {\n      return [Decoration.inline(markRange.from, markRange.to, { class: kDelimClass })];\n    } else {\n      return [\n        Decoration.inline(markRange.from, markRange.from + delim.length, { class: kDelimClass }),\n        Decoration.inline(markRange.to - delim.length, markRange.to, { class: kDelimClass }),\n      ];\n    }\n  });\n}\n","/*\n * math-preview.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { ResolvedPos } from 'prosemirror-model';\n\nimport debounce from 'lodash.debounce';\nimport zenscroll from 'zenscroll';\n\nimport { EditorUI } from '../../api/ui';\nimport { getMarkRange } from '../../api/mark';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent, ResizeEvent } from '../../api/event-types';\nimport { applyStyles } from '../../api/css';\nimport { editingRootNodeClosestToPos, editingRootNode } from '../../api/node';\nimport { createPopup } from '../../api/widgets/widgets';\nimport { EditorMath } from '../../api/math';\n\nconst kMathPopupVerticalOffset = 10;\nconst kMathPopupInputDebuounceMs = 250;\n\nconst key = new PluginKey('math-preview');\n\nexport class MathPopupPlugin extends Plugin {\n  private readonly ui: EditorUI;\n  private readonly math: EditorMath;\n\n  private view: EditorView | null = null;\n\n  private popup: HTMLElement | null = null;\n  private lastRenderedMath: string | null = null;\n\n  private readonly updatePopupTimer: number;\n\n  private scrollUnsubscribe: VoidFunction;\n  private resizeUnsubscribe: VoidFunction;\n\n  constructor(ui: EditorUI, math: EditorMath, events: EditorEvents, onHover: boolean) {\n    super({\n      key,\n      view: () => {\n        return {\n          update: debounce(\n            (view: EditorView) => {\n              this.view = view;\n              this.updatePopup();\n            },\n            kMathPopupInputDebuounceMs,\n            { leading: true, trailing: true },\n          ),\n          destroy: () => {\n            clearInterval(this.updatePopupTimer);\n            this.scrollUnsubscribe();\n            this.resizeUnsubscribe();\n            this.closePopup();\n          },\n        };\n      },\n      props: {\n        handleDOMEvents: {\n          ...(onHover\n            ? {\n                mousemove: debounce((view: EditorView, event: Event) => {\n                  const ev = event as MouseEvent;\n                  const pos = view.posAtCoords({ top: ev.clientY, left: ev.clientX });\n                  if (pos && pos.inside !== -1) {\n                    this.updatePopup(view.state.doc.resolve(pos.pos));\n                  }\n                  return false;\n                }, kMathPopupInputDebuounceMs),\n              }\n            : {}),\n        },\n      },\n    });\n\n    // save reference to ui and math\n    this.ui = ui;\n    this.math = math;\n\n    // update popup for resize, scrolling, as well as every 100ms to cover reflowing\n    // of the document as a result of latex math being shown/hidden (will effectively\n    // be a no-op if the math text and  document layout / scroll position hasn't changed)\n    this.updatePopup = this.updatePopup.bind(this);\n    this.updatePopupTimer = setInterval(this.updatePopup, 100);\n    this.scrollUnsubscribe = events.subscribe(ScrollEvent, () => this.updatePopup());\n    this.resizeUnsubscribe = events.subscribe(ResizeEvent, () => this.updatePopup());\n  }\n\n  private updatePopup($mousePos?: ResolvedPos) {\n    // bail if we don't have a view\n    if (!this.view) {\n      return;\n    }\n\n    // capture state, etc.\n    const state = this.view.state;\n    const schema = state.schema;\n\n    // determine math range\n    let range: false | { from: number; to: number } = false;\n\n    // if a $pos was passed (e.g. for a mouse hover) then check that first\n    if ($mousePos) {\n      range = getMarkRange($mousePos, schema.marks.math);\n    }\n\n    // if that didn't work try the selection\n    if (!range) {\n      range = getMarkRange(state.selection.$from, schema.marks.math);\n    }\n\n    // bail if we don't have a target\n    if (!range) {\n      this.closePopup();\n      return;\n    }\n\n    // bail if the user has this disabled\n    if (!this.ui.prefs.equationPreview()) {\n      this.closePopup();\n      return;\n    }\n\n    // get the math text. bail if it's empty\n    const inlineMath = state.doc.textBetween(range.from, range.to);\n    if (inlineMath.match(/^\\${1,2}\\s*\\${1,2}$/)) {\n      this.closePopup();\n      return;\n    }\n\n    // get the position for the range\n    const styles = popupPositionStyles(this.view, range);\n\n    // if the popup already exists just move it\n    if (this.popup) {\n      applyStyles(this.popup, [], styles);\n    } else {\n      this.popup = createPopup(this.view, ['pm-math-preview'], undefined, {\n        ...styles,\n        visibility: 'hidden',\n      });\n      this.view.dom.parentNode?.appendChild(this.popup);\n    }\n\n    // typeset the math if we haven't already\n    if (inlineMath !== this.lastRenderedMath && this.popup) {\n      this.math.typeset!(this.popup, inlineMath, true).then(error => {\n        if (!error) {\n          this.popup!.style.visibility = 'visible';\n          this.lastRenderedMath = inlineMath;\n          // autoscroll for non-mouse triggers\n          if (!$mousePos && range) {\n            this.autoscollPopup(range);\n          }\n        }\n      });\n    }\n  }\n\n  private closePopup() {\n    this.lastRenderedMath = null;\n    if (this.popup) {\n      this.popup.remove();\n      this.popup = null;\n    }\n  }\n\n  private autoscollPopup(mathRange: { from: number; to: number }) {\n    const editingRoot = editingRootNode(this.view!.state.selection);\n    if (editingRoot) {\n      const editorEl = this.view!.nodeDOM(editingRoot.pos) as HTMLElement;\n      const editorBox = editorEl.getBoundingClientRect();\n      const popupBox = this.popup!.getBoundingClientRect();\n      if (popupBox.top + popupBox.height + kMathPopupVerticalOffset > editorBox.bottom) {\n        const mathBottom = this.view!.coordsAtPos(mathRange.to);\n        const mathScrollBottom = editorEl.scrollTop + mathBottom.bottom;\n        const mathPopupScrollBottom = mathScrollBottom + kMathPopupVerticalOffset + popupBox.height;\n        const scrollTop = mathPopupScrollBottom + kMathPopupVerticalOffset - editorBox.top - editorBox.height;\n        const scroller = zenscroll.createScroller(editorEl);\n        scroller.toY(scrollTop, 100);\n      }\n    }\n  }\n}\n\nfunction popupPositionStyles(view: EditorView, range: { from: number; to: number }) {\n  // get coordinates for editor view (use to offset)\n  const editorBox = (view.dom.parentNode! as HTMLElement).getBoundingClientRect();\n\n  // +1 to ensure beginning of line doesn't resolve as line before\n  // (will subtract it back out below)\n  const rangeStartCoords = view.coordsAtPos(range.from + 1);\n  const rangeEndCoords = view.coordsAtPos(range.to);\n\n  // default positions\n  const top = Math.round(rangeEndCoords.bottom - editorBox.top) + kMathPopupVerticalOffset + 'px';\n  let left = `calc(${Math.round(rangeStartCoords.left - editorBox.left)}px - 1ch)`;\n\n  // if it flow across two lines then position at far left of editing root\n  // (we give it the 5 pixels of wiggle room so that detection still works\n  // when a mathjax preview is shown in place of math text)\n  if (Math.abs(rangeStartCoords.bottom - rangeEndCoords.bottom) > 5) {\n    const editingRoot = editingRootNodeClosestToPos(view.state.doc.resolve(range.from));\n    if (editingRoot) {\n      const editingEl = view.nodeDOM(editingRoot.pos) as HTMLElement;\n      if (editingEl) {\n        const editingElStyle = window.getComputedStyle(editingEl);\n        left = `calc(${editingEl.getBoundingClientRect().left}px + ${editingElStyle.paddingLeft} - 1ch - 2px)`;\n      }\n    }\n  }\n\n  // return position\n  return { top, left };\n}\n","/*\n * math-viewts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { DecorationSet, EditorView, Decoration } from 'prosemirror-view';\nimport { keymap } from 'prosemirror-keymap';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\n\nimport { findChildrenByMark, setTextSelection } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\n\nimport { EditorMath, MathType } from '../../api/math';\nimport { EditorUI } from '../../api/ui';\nimport { kSetMarkdownTransaction } from '../../api/transaction';\n\n// NOTE: rendered equations don't curently show selection background color when part\n// of a larger selection (in spite of a few failed attempts to get this to work)\n// it would be nice to figure out how to do this\n\nexport function mathViewPlugins(schema: Schema, ui: EditorUI, math: EditorMath): Plugin[] {\n  return [\n    mathViewPlugin(schema, ui, math),\n    keymap({\n      ArrowUp: verticalArrowHandler('up'),\n      ArrowDown: verticalArrowHandler('down'),\n    }),\n  ];\n}\n\nfunction mathViewPlugin(schema: Schema, ui: EditorUI, math: EditorMath) {\n  const key = new PluginKey<DecorationSet>('math-view');\n\n  function decorationsForDoc(state: EditorState) {\n    const decorations: Decoration[] = [];\n    findChildrenByMark(state.doc, schema.marks.math, true).forEach(markedNode => {\n      // get mark range and attributes\n      const range = getMarkRange(state.doc.resolve(markedNode.pos), schema.marks.math) as { from: number; to: number };\n      const attrs = getMarkAttrs(state.doc, range, schema.marks.math);\n\n      // if the selection isn't in the mark, then show the preview\n      if (state.selection.from < range.from || state.selection.from > range.to) {\n        // get the math text\n        const mathText = state.doc.textBetween(range.from, range.to);\n\n        // hide the code\n        decorations.push(Decoration.inline(range.from, range.to, { style: 'display: none;' }));\n\n        // show a math preview\n        decorations.push(\n          Decoration.widget(\n            range.from,\n            (view: EditorView, getPos: () => number) => {\n              const mathjaxDiv = window.document.createElement('div');\n              mathjaxDiv.classList.add('pm-math-mathjax');\n              // text selection 'within' code for clicks on the preview image\n              mathjaxDiv.onclick = () => {\n                const tr = view.state.tr;\n                let pos = getPos();\n                if (attrs.type === MathType.Display) {\n                  // set position to first non $, non whitespace character\n                  const match = mathText.match(/^[$\\s]+/);\n                  if (match) {\n                    pos += match[0].length;\n                  }\n                } else {\n                  // set position to the middle of the equation\n                  pos = pos + mathText.length / 2;\n                }\n                setTextSelection(pos)(tr);\n                view.dispatch(tr);\n                view.focus();\n              };\n              math.typeset(mathjaxDiv, mathText, ui.context.isActiveTab());\n              return mathjaxDiv;\n            },\n            { key: mathText },\n          ),\n        );\n      }\n    });\n\n    return DecorationSet.create(state.doc, decorations);\n  }\n\n  return new Plugin<DecorationSet>({\n    key,\n\n    state: {\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return decorationsForDoc(instance);\n      },\n\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        // replacing the entire editor triggers decorations\n        if (tr.getMeta(kSetMarkdownTransaction)) {\n          return decorationsForDoc(newState);\n\n          // if one of the steps added or removed a mark of our type then rescan the doc.\n        } else if (\n          tr.steps.some(\n            step =>\n              (step instanceof AddMarkStep && (step as any).mark.type === schema.marks.math) ||\n              (step instanceof RemoveMarkStep && (step as any).mark.type === schema.marks.math),\n          )\n        ) {\n          return decorationsForDoc(newState);\n\n          // if the previous or current state is in or at the border of a math mark, then rescan\n        } else if (\n          oldState.doc.rangeHasMark(oldState.selection.from - 2, oldState.selection.from + 1, schema.marks.math) ||\n          getMarkRange(newState.selection.$from, schema.marks.math)\n        ) {\n          return decorationsForDoc(newState);\n\n          // incremental scanning based on presence of mark in changed regions\n        } else {\n          // adjust decoration positions to changes made by the transaction (decorations that apply\n          // to removed chunks of content will be removed by this)\n          return set.map(tr.mapping, tr.doc);\n        }\n      },\n    },\n\n    appendTransaction: (_transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n      // not currently in math\n      if (!getMarkRange(newState.selection.$from, schema.marks.math) && newState.selection.from > 0) {\n        // did we end up just to the right of math? if so check for navigation from a distance\n        // (would imply an up/down arrow)\n        const prevMathRange = getMarkRange(newState.doc.resolve(newState.selection.from - 1), schema.marks.math);\n        if (prevMathRange) {\n          // if the selection came from afar then treat it as an actual selection\n          const delta = oldState.selection.from - newState.selection.from;\n          if (Math.abs(delta) > 3) {\n            const tr = newState.tr;\n            const mathText = newState.doc.textBetween(prevMathRange.from, prevMathRange.to);\n            const attrs = getMarkAttrs(newState.doc, prevMathRange, schema.marks.math);\n            if (attrs.type === MathType.Inline) {\n              setTextSelection(prevMathRange.from + mathText.length / 2)(tr);\n            }\n            return tr;\n          }\n        }\n      }\n\n      return null;\n    },\n\n    props: {\n      decorations(state: EditorState) {\n        return key.getState(state);\n      },\n    },\n  });\n}\n\nfunction verticalArrowHandler(dir: 'up' | 'down') {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    if (!view) {\n      return false;\n    }\n\n    const schema = state.schema;\n\n    // see if we need to provide up/down for inline math (it doesn't work by default, likely because\n    // of the display: none decorator). This implementation just moves the selection before or\n    // after the mark (better than the cursor doing nothing which is what we saw w/o this) however\n    // it would be cool if we could fully emulate up/down\n    const range = getMarkRange(state.selection.$head, schema.marks.math);\n    if (range) {\n      const attrs = getMarkAttrs(state.doc, range, schema.marks.math);\n      if (attrs.type === MathType.Inline) {\n        if (dispatch) {\n          const side = dir === 'up' ? -1 : 1;\n          const $head = state.selection.$head;\n          const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n          const tr = state.tr;\n          tr.setSelection(nextPos);\n          dispatch(tr);\n        }\n        return true;\n      }\n    }\n\n    if (view.endOfTextblock(dir)) {\n      const side = dir === 'up' ? -1 : 1;\n      const $head = state.selection.$head;\n      const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n      if (\n        nextPos.$head &&\n        nextPos.$head.parent.childCount === 1 &&\n        schema.marks.math.isInSet(nextPos.$head.parent.firstChild!.marks)\n      ) {\n        if (dispatch) {\n          const mathText = nextPos.$head.parent.textContent;\n          const match = mathText.match(/^[$\\s]+/);\n          if (match) {\n            const tr = state.tr;\n            const mathPos = nextPos.$head.start($head.depth);\n            setTextSelection(mathPos + match[0].length)(tr);\n            dispatch(tr);\n          }\n        }\n        return true;\n      }\n    }\n    return false;\n  };\n}\n","/*\n * cite.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Schema, Fragment, Node as ProsemirrorNode, Slice, ResolvedPos } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState, Transaction, Plugin, PluginKey, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport uniqby from 'lodash.uniqby';\n\nimport { FocusEvent } from '../../api/event-types';\nimport { PandocTokenType, PandocToken, PandocOutput, ProsemirrorWriter, PandocServer } from '../../api/pandoc';\nimport { fragmentText } from '../../api/fragment';\nimport { markIsActive, splitInvalidatedMarks, getMarkRange, detectAndApplyMarks } from '../../api/mark';\nimport { MarkTransaction, kPasteTransaction } from '../../api/transaction';\nimport { BibliographyManager, BibliographyFile, BibliographySource } from '../../api/bibliography/bibliography';\nimport { EditorUI } from '../../api/ui';\nimport { joinPaths, getExtension } from '../../api/path';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { InsertCiteProps, kAlertTypeError, kAlertTypeWarning } from '../../api/ui-dialogs';\nimport { CSL, sanitizeForCiteproc } from '../../api/csl';\nimport { suggestCiteId, formatForPreview } from '../../api/cite';\nimport { performCompletionReplacement } from '../../api/completion';\nimport { ensureBibliographyFileForDoc } from '../../api/bibliography/bibliography-provider_local';\n\nimport { citationCompletionHandler } from './cite-completion';\nimport { citeHighlightPlugin } from './cite-highlight';\nimport { citationDoiCompletionHandler } from './cite-completion_doi';\nimport { doiFromSlice } from './cite-doi';\nimport { citePopupPlugin } from './cite-popup';\nimport { InsertCitationCommand } from './cite-commands';\nimport { setTextSelection } from 'prosemirror-utils';\nimport { AddMarkStep } from 'prosemirror-transform';\n\nconst kCiteCitationsIndex = 0;\n\n\n// Follow the pandoc rules for citations\n// Each citation must have a key, composed of ‘@’ + the citation identifier from the database, \n// and may optionally have a prefix, a locator, and a suffix. The citation key must begin with a letter, \n// digit, or _, and may contain alphanumerics (UNICODE), _, and internal punctuation characters (:.#$%&-+?<>~/).\n// In addition, we don't permit the citation to include a . or ? character (which are allowed in the cite identifier)\n// This is only because when writing in text citations, it will be common to follow a citation with \n// punctuation, and we should be smart enough to filter that punctuation out of the citation itself.\nconst kCiteIdPrefixPattern = '-?@';\nconst kCiteIdCharsPattern = '[^@;\\\\[\\\\]\\\\s\\\\!\\\\,]*';\nconst kCiteIdBasePattern = `${kCiteIdPrefixPattern}${kCiteIdCharsPattern}`;\n\n// Completions examine all the text inside the citation mark, so they need to only be interested\n// in a citeId that terminates at the cursor (at the end of the text)\nconst kCompletionCiteIdRegEx = new RegExp(`(${kCiteIdPrefixPattern})(${kCiteIdCharsPattern})$`);\n\n// Note that since Cite Ids can appear inline as in-text representations or can appear inside of brackets \n// in a Note style. Consequently, this is used in various places to identify them interchangeably (e.g. we use)\n// this to identify a citeId inline in text, but also to identify a citedId in a bracketed citation.\nconst kCiteId = new RegExp(`^${kCiteIdBasePattern}`);\n\n// Plain In Text: @foo2019 (this is intentionally a duplicate of the above)\n// just to make the meaning more clear (this is used to detect an in text citation)\nconst kInTextCiteRegex = new RegExp(`${kCiteIdBasePattern}$`);\n\n// Note Style: [@foo2019]\nconst kBeginCitePattern = `(.* ${kCiteIdPrefixPattern}|${kCiteIdPrefixPattern})`;\nconst kNoteCiteRegex = new RegExp(`\\\\[${kBeginCitePattern}${kCiteIdCharsPattern}.*\\\\]`);\n\n// In Text with Suffix: @foo2019 [p 35]\nconst kInTextCiteWithSuffixPattern = `${kCiteIdPrefixPattern}${kCiteIdCharsPattern}.*?\\\\[.*?\\\\]`;\nconst kInTextCiteWithSuffixRegEx = new RegExp(`^${kInTextCiteWithSuffixPattern}$`);\n\nenum CitationMode {\n  NormalCitation = 'NormalCitation',\n  AuthorInText = 'AuthorInText',\n  SuppressAuthor = 'SuppressAuthor',\n}\n\ninterface Citation {\n  citationHash: number;\n  citationId: string;\n  citationMode: {\n    t: CitationMode;\n  };\n  citationNoteNum: number;\n  citationPrefix: PandocToken[];\n  citationSuffix: PandocToken[];\n}\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, ui } = context;\n\n  // prime bibliography on initial focus\n  const bibliographyManager = new BibliographyManager(context.server.pandoc, context.server.zotero);\n  const focusUnsubscribe = context.events.subscribe(FocusEvent, doc => {\n    bibliographyManager.prime(ui, doc!);\n    focusUnsubscribe();\n  });\n\n  if (!pandocExtensions.citations) {\n    return null;\n  }\n\n  return {\n    marks: [\n      {\n        name: 'cite_id',\n        noSpelling: true,\n        spec: {\n          attrs: {},\n          inclusive: true,\n          parseDOM: [\n            {\n              tag: \"span[class*='cite-id']\",\n            },\n          ],\n          toDOM(mark: Mark) {\n            return ['span', { class: 'cite-id pm-link-text-color pm-fixedwidth-font' }];\n          },\n        },\n        pandoc: {\n          readers: [],\n          writer: {\n            priority: 13,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              const idText = fragmentText(parent);\n              // only write as a citation id (i.e. don't escape @) if it is still\n              // a valid citation id. note that this in principle is also taken care\n              // of by the application of splitInvalidatedMarks below (as the\n              // mark would have been broken by this if it wasn't valid). this\n              // code predates that, and we leave it in for good measure in case that\n              // code is removed or changes in another unexpected way.\n              if (idText.match(kInTextCiteRegex)) {\n                const prefixMatch = idText.match(/^-?@/);\n                if (prefixMatch) {\n                  output.writeRawMarkdown(prefixMatch.input!);\n                  output.writeInlines(parent.cut(prefixMatch.input!.length));\n                } else {\n                  output.writeInlines(parent);\n                }\n              } else {\n                output.writeInlines(parent);\n              }\n            },\n          },\n        },\n      },\n      {\n        name: 'cite',\n        spec: {\n          attrs: {},\n          inclusive: false,\n          parseDOM: [\n            {\n              tag: \"span[class*='cite']\",\n            },\n          ],\n          toDOM(mark: Mark) {\n            return { '0': 'span', '1': { class: 'cite' } };\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Cite,\n              handler: readPandocCite,\n            },\n          ],\n\n          writer: {\n            priority: 14,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n\n              // extract parentText for inspection\n              const parentText = fragmentText(parent);\n\n              // if it's just a cite id then write it straight up\n              if (fragmentText(parent).match(kInTextCiteRegex)) {\n\n                output.writeInlines(parent);\n\n              } else {\n\n                // divide out delimiters from body\n                const openCite = parent.cut(0, 1);\n                const cite = parent.cut(1, parent.size - 1);\n                const closeCite = parent.cut(parent.size - 1, parent.size);\n\n                // check for fully enclosed in brackets\n                if (\n                  fragmentText(openCite) === '[' &&\n                  fragmentText(closeCite) === ']' &&\n                  fragmentText(cite).match(kInTextCiteRegex)\n                ) {\n                  output.writeRawMarkdown('[');\n                  output.writeInlines(cite);\n                  output.writeRawMarkdown(']');\n                \n                \n                // if it starts with a valid cite id prefix and ends with a close\n                // bracket then it might be an in-text citation with a suffix\n                } else if (parentText.match(kInTextCiteWithSuffixRegEx)) {\n\n                  // find the position of the begin bracket that matches the end bracket\n                  let beginBracketPos = -1;\n                  let bracketLevel = 0;\n                  for (let i = parentText.length - 2; i >= 0; i--) {\n                    const char = parentText.charAt(i);\n                    if (char === ']') {\n                      bracketLevel++;\n                    } else if (char === '[') {\n                      if (bracketLevel > 0) {\n                        bracketLevel--;\n                      } else {\n                        beginBracketPos = i;\n                        break;\n                      }\n                    }\n                  }\n\n                  // if we found one then cut as approrpriate\n                  if (beginBracketPos) {\n                    output.writeInlines(parent.cut(0, beginBracketPos));\n                    output.writeRawMarkdown('[');\n                    output.writeInlines(parent.cut(beginBracketPos + 1, parentText.length - 1));\n                    output.writeRawMarkdown(']');\n\n                  } else {\n                    output.writeInlines(parent);\n                  }\n                } else {\n                  output.writeInlines(parent);\n                }\n              }\n            },\n          },\n        },\n      },\n    ],\n\n    commands: (_schema: Schema) => {\n      return [new InsertCitationCommand(ui, context.events, bibliographyManager, context.server)];\n    },\n\n    appendTransaction: (schema: Schema) => {\n      return [{\n        name: 'cite-id-join',\n        append: (tr: Transaction) => {\n          const range = getMarkRange(tr.doc.resolve(tr.selection.head-1), schema.marks.cite_id);\n          if (range) {\n            const text = tr.doc.textBetween(range.from, tr.selection.$head.after());\n            const citeIdLen = citeIdLength(text);\n            const markLength = range.to - range.from;\n            if (citeIdLen > markLength) {\n              tr.addMark(range.from, range.from + citeIdLen, schema.marks.cite_id.create());\n            }\n          }\n          return tr;\n        },\n      }];\n    },\n\n    appendMarkTransaction: (schema: Schema) => {\n\n      const kFindInTextCiteRegex = new RegExp(kCiteIdBasePattern, 'g');\n      const kFindInTextCiteWithSuffixRegex = new RegExp(kInTextCiteWithSuffixPattern, 'g');\n      const kFindFullCiteRegex = new RegExp(kNoteCiteRegex.source, 'g');\n      \n      return [\n        {\n          // 'break' cite marks if they are no longer valid. note that this will still preserve\n          // the mark up to the length that it is valid. \n          name: 'cite-marks',\n          filter: (node: ProsemirrorNode, transactions: Transaction[]) =>  {\n\n            // if the transaction added any cite id marks then we need to lay off\n            // (mostly so that input rules can be reversed)\n            if (transactions.some(trans => trans.steps.some(step => {\n              if (step instanceof AddMarkStep) {\n                return (step as any).mark.type === schema.marks.cite_id;\n              }\n            }))) {\n              return false;\n\n            /// otherwise proceed if this node is a textblock that allows cites\n            } else {\n          \n              return node.isTextblock && node.type.allowsMarkType(schema.marks.cite);\n            }\n          },\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            splitInvalidatedMarks(tr, node, pos, citeLength, schema.marks.cite, (from: number, to: number) => {\n              tr.removeMark(from, to, schema.marks.cite);\n            });\n            // match all valid forms of mark\n            if (node.textContent.indexOf('@') !== -1) {\n              [kFindInTextCiteRegex, kFindFullCiteRegex, kFindInTextCiteWithSuffixRegex].forEach(re => {\n                detectAndApplyMarks(\n                  tr,\n                  tr.doc.nodeAt(pos)!,\n                  pos,\n                  re,\n                  schema.marks.cite,\n                  () => ({}),\n                  (from: number, to: number) => {\n                    return tr.doc.rangeHasMark(from, to, schema.marks.cite_id);\n                  }\n                );\n              });\n            }\n           \n            \n          },\n        },\n        {\n          // 'break' cite_id marks if they are no longer valid. note that this will still preserve\n          // the mark up to the length that it is valid (so e.g. if a space is inserted within a\n          // cite_id this will keep the mark on the part before the space and remove it from the\n          // part after the space)\n          name: 'remove-cite-id-marks',\n          filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(schema.marks.cite_id),\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            splitInvalidatedMarks(tr, node, pos, citeIdLength, schema.marks.cite_id);\n          },\n        },\n      ];\n    },\n\n    inputRules: (schema: Schema) => {\n      return [\n        citeIdInputRule(schema),\n        citeIdDashInputRule(schema),\n      ];\n    },\n\n    completionHandlers: () => [\n      citationDoiCompletionHandler(context.ui, bibliographyManager, context.server),\n      citationCompletionHandler(context.ui, context.events, bibliographyManager, context.server.pandoc),\n    ],\n\n    plugins: (schema: Schema) => {\n      return [\n        new Plugin({\n          key: new PluginKey('paste_cite_doi'),\n          props: {\n            handlePaste: handlePaste(ui, bibliographyManager, context.server.pandoc),\n          },\n        }),\n        citeHighlightPlugin(schema),\n        citePopupPlugin(schema, ui, bibliographyManager, context.server.pandoc),\n      ];\n    },\n  };\n};\n\nfunction handlePaste(ui: EditorUI, bibManager: BibliographyManager, server: PandocServer) {\n  return (view: EditorView, _event: Event, slice: Slice) => {\n    const schema = view.state.schema;\n    if (markIsActive(view.state, schema.marks.cite_id)) {\n      // This is a DOI\n      const parsedDOI = doiFromSlice(view.state, slice);\n      if (parsedDOI) {\n        // Insert the DOI text as a placeholder\n        const tr = view.state.tr;\n        tr.setMeta(kPasteTransaction, true);\n        tr.setMeta('uiEvent', 'paste');\n\n        const doiText = schema.text(parsedDOI.token);\n        tr.replaceSelectionWith(doiText, true);\n        view.dispatch(tr);\n\n        // First check the local bibliography- if we already have this DOI\n        // we can just paste the DOI\n        const source = bibManager.findDoiInLocalBibliography(parsedDOI.token);\n        if (!source && bibManager.allowsWrites()) {\n          insertCitation(view, parsedDOI.token, bibManager, parsedDOI.pos, ui, server);\n        } \n        return true;\n      } else {\n        // This is just content, accept any text and try pasting that\n        let text = '';\n        slice.content.forEach((node: ProsemirrorNode) => (text = text + node.textContent));\n        if (text.length > 0) {\n          const tr = view.state.tr;\n          tr.setMeta(kPasteTransaction, true);\n          tr.setMeta('uiEvent', 'paste');\n          tr.replaceSelectionWith(schema.text(text));\n          view.dispatch(tr);\n          return true;\n        } else {\n          // There wasn't any text, just allow the paste to be handled by anyone else\n          return false;\n        }\n      }\n    } else {\n      // We aren't in a citation so let someone else handle the paste\n      return false;\n    }\n  };\n}\n\n\n// create a cite_id within a citation when the @ sign is typed\nfunction citeIdInputRule(schema: Schema) {\n  return new InputRule(/@$/, (state: EditorState, match: string[], start: number, end: number) => {\n    if (!markIsActive(state, schema.marks.cite_id)) {\n      const { parent, parentOffset } = state.selection.$head;\n      const text = match[0] + parent.textContent.slice(parentOffset);\n      const textBefore = parent.textContent.slice(0, parentOffset);\n      \n      // reject unless the right prefix is there\n      if (textBefore.length && !textBefore.match(/[\\xA0 \\t\\-\\[]$/)) {\n        return null;\n      }\n\n      // get cite id length\n      const citeIdLen = citeIdLength(text);\n\n      // insert the @\n      const tr = state.tr;\n      tr.insertText(match[0]); \n\n      // insert a pairing end bracket if we started with [\n      if (citeIdLen === 1 && textBefore.match(/\\[-?$/) && text[1] !== ']') {\n        tr.insertText(']');\n        setTextSelection(tr.selection.head - 1)(tr);\n      }\n     \n      if (citeIdLen) {\n        // offset mark for incidence of '-' prefix\n        const offset = textBefore.endsWith('-') ? 1 : 0;\n        const citeStart = start - offset;\n        const citeEnd = citeStart + citeIdLen + offset ;\n        tr.addMark(citeStart, citeEnd, schema.marks.cite_id.create());\n      }\n\n      return tr;\n    } \n    return null;\n  });\n}\n\n\nfunction citeIdDashInputRule(schema: Schema) {\n  return new InputRule(new RegExp(`-$`), (state: EditorState, match: string[], start: number, end: number) => {\n    if (state.doc.rangeHasMark(start + 1, end + 2, schema.marks.cite_id)) {\n      const tr = state.tr;\n      tr.insertText(match[0]);\n      tr.addMark(start, start + 1, schema.marks.cite_id.create());\n      return tr;\n    }\n    return null;\n  });\n}\n\n\n// read pandoc citation, creating requisite cite and cite_id marks as we go\nfunction readPandocCite(schema: Schema) {\n  return (writer: ProsemirrorWriter, tok: PandocToken) => {\n    \n    // create and open the mark\n    const citeMark = schema.marks.cite.create();\n    writer.openMark(citeMark);\n\n    // helper to write a citation\n    const writeCitation = (citation: Citation) => {\n      // prefix\n      writer.writeTokens(citation.citationPrefix);\n      if (citation.citationPrefix.length) {\n        writer.writeText(' ');\n      }\n\n      // id\n      const suppress = citation.citationMode.t === CitationMode.SuppressAuthor ? '-' : '';\n      const citeIdMark = schema.marks.cite_id.create();\n      writer.openMark(citeIdMark);\n      writer.writeText(suppress + '@' + citation.citationId);\n      writer.closeMark(citeIdMark);\n\n      // suffix\n      const inTextSuffix = citation.citationMode.t === CitationMode.AuthorInText && citation.citationSuffix.length;\n      if (inTextSuffix) {\n        writer.writeText(' [');\n      }\n      writer.writeTokens(citation.citationSuffix);\n      if (inTextSuffix) {\n        writer.writeText(']');\n      }\n    };\n\n    // get all of the citations\n    const citations: Citation[] = tok.c[kCiteCitationsIndex];\n\n    // look for a single in-text citation\n    if (citations.length === 1 && citations[0].citationMode.t === CitationMode.AuthorInText) {\n      writeCitation(citations[0]);\n    // non-in text and/or multiple citations\n    } else {\n      writer.writeText('[');\n      citations.forEach((citation: Citation, index: number) => {\n        // add delimiter\n        if (index !== 0) {\n          writer.writeText('; ');\n        }\n        writeCitation(citation);\n      });\n      writer.writeText(']');\n    }\n\n    writer.closeMark(citeMark);\n  };\n}\n\nconst kCitationIdRegex = new RegExp(`(^\\\\[| )(${kCiteIdBasePattern})`, 'g');\n\nfunction encloseInCiteMark(tr: Transaction, start: number, end: number) {\n  const schema = tr.doc.type.schema;\n  const mark = schema.marks.cite.create();\n\n  tr.addMark(start, end, mark);\n\n  // look for valid citation ids inside and mark them\n  const citeText = tr.doc.textBetween(start, end);\n\n  kCitationIdRegex.lastIndex = 0;\n  let match = kCitationIdRegex.exec(citeText);\n  while (match !== null) {\n    const pos = start + match.index + match[1].length;\n    const idMark = schema.marks.cite_id.create();\n\n    tr.addMark(pos, pos + match[2].length, idMark);\n    match = kCitationIdRegex.exec(citeText);\n  }\n  kCitationIdRegex.lastIndex = 0;\n  return tr;\n}\n\nfunction citeLength(text: string) {\n  if (text.match(kNoteCiteRegex) ||\n      text.match(kInTextCiteRegex) ||\n      text.match(kInTextCiteWithSuffixRegEx)) {\n    return text.length;\n  } else {\n    return 0;\n  }\n}\n\n// up to how many characters of the passed text constitute a valid cite_id in the editor\n// (note that the editor tolerates citations ids with just an '@')\nfunction citeIdLength(text: string) {\n  const match = text.match(kCiteId);\n  if (match) {\n    return match[0].length;\n  } else {\n    return 0;\n  }\n}\n\nexport interface ParsedCitation {\n  token: string;\n  pos: number;\n  offset: number;\n}\n\nexport function parseCitation(context: EditorState | Transaction): ParsedCitation | null {\n  // return completions only if we are inside a cite_id . This way\n  // if the user dismisses the cite_id (e.g. decides to type @ as literal string)\n  // we won't offer completions\n  const markType = context.doc.type.schema.marks.cite_id;\n  const range = getMarkRange(context.doc.resolve(context.selection.head - 1), markType);\n  if (range) {\n    // examine text up to the cursor\n    const citeText = context.doc.textBetween(range.from, context.selection.head);\n\n    // make sure there is no text directly ahead (except bracket, space, semicolon)\n    const nextChar = context.doc.textBetween(context.selection.head, context.selection.head + 1);\n    if (!nextChar || [';', ' ', ']'].includes(nextChar) ) {\n      // look for a cite id that terminates at the cursor (including spaces/text after the id,\n      // but before any semicolon delimiter)\n      const match = citeText.match(kCompletionCiteIdRegEx);\n      if (match) {\n        const token = match[2];\n        const pos = range.from + match.index! + match[1].length;\n        return { token, pos, offset: -match[1].length };\n      }\n    }   \n  }\n  return null;\n}\n\n// Replaces the current selection with a resolved citation id\nexport async function insertCitation(\n  view: EditorView,\n  doi: string,\n  bibManager: BibliographyManager,\n  pos: number,\n  ui: EditorUI,\n  server: PandocServer,\n  csl?: CSL,\n  provider?: string,\n) {\n  // ensure the bib manager is loaded before proceeding\n  await bibManager.load(ui, view.state.doc);\n\n  // We try not call this function if the entry for this DOI is already in the bibliography,\n  // but it can happen. So we need to check here if it is already in the bibliography and\n  // if it is, deal with it appropriately.\n  const existingEntry = bibManager.findDoiInLocalBibliography(doi);\n  if (existingEntry) {\n    // Now that we have loaded the bibliography, there is an entry\n    // Just write it. Not an ideal experience, but something that\n    // should happen only in unusual experiences\n    const tr = view.state.tr;\n\n    // This could be called by paste handler, so stop completions\n    performCiteCompletionReplacement(tr, tr.mapping.map(pos), existingEntry.id);\n    view.dispatch(tr);\n  } else {\n    // There isn't an entry in the existing bibliography\n    // Show the user UI to and ultimately create an entry in the biblography\n    // (even creating a bibliography if necessary)\n\n    // Read bibliographies out of the document and pass those alone\n    const existingIds = bibManager.localSources().map(source => source.id);\n\n    const citeProps: InsertCiteProps = {\n      doi,\n      existingIds,\n      bibliographyFiles: bibManager\n        .writableBibliographyFiles(view.state.doc, ui)\n        .map(writableFile => writableFile.displayPath),\n      provider,\n      csl,\n      citeUI: csl\n        ? {\n            suggestedId: csl.id || suggestCiteId(existingIds, csl),\n            previewFields: formatForPreview(csl),\n          }\n        : undefined,\n    };\n\n    const result = await ui.dialogs.insertCite(citeProps);\n    if (result && result.id.length) {\n      if (!result?.csl.title) {\n        await ui.dialogs.alert(\n          ui.context.translateText(\n            \"This citation can't be added to the bibliography because it is missing required fields.\",\n          ),\n          ui.context.translateText('Invalid Citation'),\n          kAlertTypeError,\n        );\n      } else {\n        // Figure out whether this is a project or document level bibliography\n        const writableBiblios = bibManager.writableBibliographyFiles(view.state.doc, ui);\n\n        // Sort out the bibliography file into which we should write the entry\n        const thisWritableBiblio = writableBiblios.find(writable => writable.displayPath === result.bibliographyFile);\n        const project = thisWritableBiblio?.isProject || false;\n        const writableBiblioPath = thisWritableBiblio\n          ? thisWritableBiblio.fullPath\n          : joinPaths(ui.context.getDefaultResourceDir(), result.bibliographyFile);\n        const bibliographyFile: BibliographyFile = {\n          displayPath: result.bibliographyFile,\n          fullPath: writableBiblioPath,\n          isProject: project,\n          writable: true,\n        };\n\n        // Create the source that holds the id, provider, etc...\n        const source: BibliographySource = {\n          ...result.csl,\n          id: result.id,\n          providerKey: provider || '',\n        };\n\n        // Start the transaction\n        const tr = view.state.tr;\n\n        // Write the source to the bibliography if needed\n        const writeCiteId = await ensureSourcesInBibliography(\n          tr,\n          [source],\n          bibliographyFile,\n          bibManager,\n          view,\n          ui,\n          server,\n        );\n\n        if (writeCiteId) {\n          // Write the citeId\n          const schema = view.state.schema;\n          const idText = schema.text(source.id, [schema.marks.cite_id.create()]);\n          performCiteCompletionReplacement(tr, tr.mapping.map(pos), idText);\n        }\n\n        // Dispath the transaction\n        view.dispatch(tr);\n      }\n    }\n    view.focus();\n  }\n}\n\n// Ensures that the sources are in the specified bibliography file\n// and ensures that the bibliography file is properly referenced (either)\n// as a project bibliography or inline in the document YAML\nexport async function ensureSourcesInBibliography(\n  tr: Transaction,\n  sources: BibliographySource[],\n  bibliographyFile: BibliographyFile,\n  bibManager: BibliographyManager,\n  view: EditorView,\n  ui: EditorUI,\n  server: PandocServer,\n): Promise<boolean> {\n  // Write entry to a bibliography file if it isn't already present\n  await bibManager.load(ui, view.state.doc);\n\n  // See if there is a warning for the selected provider. If there is, we may need to surface\n  // that to the user. If there is no provider specified, no need to care about warnings.\n  const providers = uniqby(sources, (source: BibliographySource) => source.providerKey).map(\n    source => source.providerKey,\n  );\n\n  // Find any providers that have warnings\n  const providersWithWarnings = providers.filter(prov => bibManager.warningForProvider(prov));\n\n  // Is this a bibtex bibliography?\n  const bibliographyFileExtension = getExtension(bibliographyFile.fullPath);\n  const isBibTexBibliography = bibliographyFileExtension === 'bib' || bibliographyFileExtension === 'bibtex';\n\n  // If there is a warning message and we're exporting to BibTeX, show the warning\n  // message to the user and confirm that they'd like to proceed. This would ideally\n  // know more about the warning type and not have this filter here (e.g. it would just\n  // always show the warning)\n  let proceedWithInsert = true;\n  if (providersWithWarnings.length > 0 && ui.prefs.zoteroUseBetterBibtex() && isBibTexBibliography) {\n    const results = await Promise.all<boolean>(\n      providersWithWarnings.map(async withWarning => {\n        const warning = bibManager.warningForProvider(withWarning);\n        if (warning) {\n          return await ui.dialogs.yesNoMessage(\n            warning,\n            'Warning',\n            kAlertTypeWarning,\n            ui.context.translateText('Insert Citation Anyway'),\n            ui.context.translateText('Cancel'),\n          );\n        } else {\n          return true;\n        }\n      }),\n    );\n    proceedWithInsert = results.every(result => result);\n  }\n\n  if (proceedWithInsert) {\n    await Promise.all(\n      sources.map(async (source, i) => {\n        if (source.id) {\n          // Crossref sometimes provides invalid json for some entries. Sanitize it for citeproc\n          const cslToWrite = sanitizeForCiteproc(source);\n\n          if (!bibManager.findIdInLocalBibliography(source.id)) {\n            const sourceAsBibTex = isBibTexBibliography\n              ? await bibManager.generateBibTeX(ui, source.id, cslToWrite, source.providerKey)\n              : undefined;\n            await server.addToBibliography(\n              bibliographyFile.fullPath,\n              bibliographyFile.isProject,\n              source.id,\n              JSON.stringify([cslToWrite]),\n              sourceAsBibTex || '',\n            );\n          }\n\n          if (!bibliographyFile.isProject) {\n            ensureBibliographyFileForDoc(tr, bibliographyFile.displayPath, ui);\n          }\n        }\n      }),\n    );\n  }\n  return proceedWithInsert;\n}\n\nexport function performCiteCompletionReplacement(tr: Transaction, pos: number, replacement: ProsemirrorNode | string) {\n  // perform replacement\n  performCompletionReplacement(tr, pos, replacement);\n\n  // find the range of the cite and fixup marks\n  const range = getMarkRange(tr.selection.$head, tr.doc.type.schema.marks.cite);\n  if (range) {\n    encloseInCiteMark(tr, range.from, range.to);\n  }\n}\n\nexport default extension;\n","/*\n * bibliography.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport Fuse from 'fuse.js';\nimport { PandocServer } from '../pandoc';\n\nimport { EditorUI } from '../ui';\nimport { ParsedYaml, parseYamlNodes } from '../yaml';\nimport { CSL } from '../csl';\nimport { ZoteroServer } from '../zotero';\nimport { BibliographyDataProviderLocal, kLocalBiliographyProviderKey } from './bibliography-provider_local';\nimport { BibliographyDataProviderZotero } from './bibliography-provider_zotero';\nimport { toBibLaTeX, toBibTeX } from './bibDB';\nimport { joinPaths } from '../path';\n\nexport interface BibliographyFile {\n  displayPath: string;\n  fullPath: string;\n  isProject: boolean;\n  writable: boolean;\n}\n\nexport function bibliographyFileForPath(path: string, ui: EditorUI): BibliographyFile {\n  return {\n    displayPath: path,\n    fullPath: joinPaths(ui.context.getDefaultResourceDir(), path),\n    isProject: false,\n    writable: true,\n  };\n}\n\nexport interface BibliographyType {\n  extension: string;\n  displayName: string;\n  default: boolean;\n}\n\n// The types of bibliography files and the default value\nexport function bibliographyTypes(ui: EditorUI): BibliographyType[] {\n  const defaultBiblioType = ui.prefs.bibliographyDefaultType();\n  return [\n    {\n      displayName: ui.context.translateText('BibTeX'),\n      extension: 'bib',\n      default: defaultBiblioType === 'bib',\n    },\n    {\n      displayName: ui.context.translateText('CSL-YAML'),\n      extension: 'yaml',\n      default: defaultBiblioType === 'yaml',\n    },\n    {\n      displayName: ui.context.translateText('CSL-JSON'),\n      extension: 'json',\n      default: defaultBiblioType === 'json',\n    },\n  ];\n}\n\nexport interface BibliographyDataProvider {\n  key: string;\n  name: string;\n  requiresWritable: boolean;\n\n  isEnabled(): boolean;\n  load(\n    docPath: string | null,\n    resourcePath: string,\n    yamlBlocks: ParsedYaml[],\n    refreshCollectionData?: boolean,\n  ): Promise<boolean>;\n  collections(): BibliographyCollection[];\n  items(): BibliographySourceWithCollections[];\n  itemsForCollection(collectionKey: string): BibliographySourceWithCollections[];\n  bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[];\n  generateBibTeX(ui: EditorUI, id: string, csl: CSL): Promise<string | undefined>;\n  warningMessage(): string | undefined;\n}\n\nexport interface BibliographyCollection {\n  name: string;\n  key: string;\n  provider: string;\n  parentKey?: string;\n}\n\nexport interface Bibliography {\n  sources: CSL[];\n  project_biblios: string[];\n}\n\n// The individual bibliographic source\nexport interface BibliographySource extends CSL {\n  id: string;\n  providerKey: string;\n}\n\nexport interface BibliographySourceWithCollections extends BibliographySource {\n  collectionKeys: string[];\n}\n\n// The fields and weights that will indexed and searched\n// when searching bibliographic sources\nconst kFields: Fuse.FuseOptionKeyObject[] = [\n  { name: 'id', weight: 30 },\n  { name: 'author.family', weight: 15 },\n  { name: 'author.literal', weight: 15 },\n  { name: 'issued', weight: 15 },\n  { name: 'title', weight: 15 },\n  { name: 'author.given', weight: 10 },\n  { name: 'providerKey', weight: 0.01 },\n  { name: 'collectionKeys', weight: 0.01 },\n];\n\nconst kSearchOptions = {\n  isCaseSensitive: false,\n  shouldSort: true,\n  includeMatches: false,\n  includeScore: false,\n  keys: kFields,\n};\n\nexport class BibliographyManager {\n  private providers: BibliographyDataProvider[];\n  private sources?: BibliographySourceWithCollections[];\n  private writable?: boolean;\n  private searchIndex?: Fuse<BibliographySourceWithCollections, Fuse.IFuseOptions<BibliographySourceWithCollections>>;\n\n  public constructor(server: PandocServer, zoteroServer: ZoteroServer) {\n    this.providers = [new BibliographyDataProviderLocal(server), new BibliographyDataProviderZotero(zoteroServer)];\n  }\n\n  public async prime(ui: EditorUI, doc: ProsemirrorNode) {\n    // Load the bibliography\n    await this.load(ui, doc, true);\n  }\n\n  public async load(ui: EditorUI, doc: ProsemirrorNode, refreshCollectionData?: boolean): Promise<void> {\n    // read the Yaml blocks from the document\n    const parsedYamlNodes = parseYamlNodes(doc);\n\n    // Currently edited doc\n    const docPath = ui.context.getDocumentPath();\n\n    // Load each provider\n    const providersNeedUpdate = await Promise.all(\n      this.providers.map(provider =>\n        provider.load(docPath, ui.context.getDefaultResourceDir(), parsedYamlNodes, refreshCollectionData),\n      ),\n    );\n\n    // Once loaded, see if any of the providers required an index update\n    const needsIndexUpdate = providersNeedUpdate.reduce((prev, curr) => prev || curr);\n\n    // Update the index if anything requires that we do so\n    if (needsIndexUpdate) {\n      // Get the entries\n      const providersEntries = this.providers.map(provider => provider.items());\n\n      // These are in arbitrary order, so sort them alphabetically\n      const idSort = (a: BibliographySource, b: BibliographySource) => {\n        return a.id.localeCompare(b.id);\n      };\n      this.sources = ([] as BibliographySourceWithCollections[]).concat(...providersEntries).sort(idSort);\n\n      this.searchIndex = this.getFuse(this.sources);\n    }\n\n    // Is this a writable bibliography\n    this.writable = this.isWritable(doc, ui);\n  }\n\n  public hasSources() {\n    return this.allSources().length > 0;\n  }\n\n  public allSources(): BibliographySourceWithCollections[] {\n    if (this.sources && this.allowsWrites()) {\n      return this.sources;\n    } else {\n      return this.sources?.filter(source => source.providerKey === kLocalBiliographyProviderKey) || [];\n    }\n    return [];\n  }\n\n  public sourcesForProvider(providerKey: string): BibliographySourceWithCollections[] {\n    return this.allSources().filter(item => item.providerKey === providerKey);\n  }\n\n  public sourcesForProviderCollection(provider: string, collectionKey: string): BibliographySourceWithCollections[] {\n    return this.sourcesForProvider(provider).filter(item => item.collectionKeys.includes(collectionKey));\n  }\n\n  public localSources(): BibliographySourceWithCollections[] {\n    return this.allSources().filter(source => source.providerKey === kLocalBiliographyProviderKey);\n  }\n\n  public allowsWrites(): boolean {\n    return this.writable || false;\n  }\n\n  private isWritable(doc: ProsemirrorNode, ui: EditorUI): boolean {\n    const bibliographyFiles = this.bibliographyFiles(doc, ui);\n    if (bibliographyFiles.length === 0) {\n      // Since there are no bibliographies, we can permit writing a fresh one\n      return true;\n    }\n    return bibliographyFiles.filter(bibFile => bibFile.writable).length > 0;\n  }\n\n  public writableBibliographyFiles(doc: ProsemirrorNode, ui: EditorUI) {\n    return this.bibliographyFiles(doc, ui).filter(bibFile => bibFile.writable);\n  }\n\n  public bibliographyFiles(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n    const bibliographyPaths = this.providers.map(provider => provider.bibliographyPaths(doc, ui));\n    return ([] as BibliographyFile[]).concat(...bibliographyPaths);\n  }\n\n  public localProviders(): BibliographyDataProvider[] {\n    if (this.allowsWrites()) {\n      return this.providers;\n    } else {\n      return this.providers.filter(provider => provider.requiresWritable === false);\n    }\n  }\n\n  public providerName(providerKey: string): string | undefined {\n    const dataProvider = this.providers.find(prov => prov.key === providerKey);\n    return dataProvider?.name;\n  }\n\n  // Allows providers to generate bibTeX, if needed. This is useful in contexts\n  // like Zotero where a user may be using the Better Bibtex plugin which can generate\n  // superior BibTeX using things like stable citekeys with custom rules, and more.\n  //\n  // If the provider doesn't provide BibTeX, we can generate it ourselves\n  public async generateBibTeX(ui: EditorUI, id: string, csl: CSL, provider?: string): Promise<string | undefined> {\n    const dataProvider = this.providers.find(prov => prov.key === provider);\n    if (dataProvider) {\n      const dataProviderBibTeX = dataProvider.generateBibTeX(ui, id, csl);\n      if (dataProviderBibTeX) {\n        return dataProviderBibTeX;\n      }\n    }\n    return Promise.resolve(toBibTeX(id, csl));\n  }\n\n  public warning(): string | undefined {\n    const warningProvider = this.providers.find(provider => provider.warningMessage());\n    if (warningProvider) {\n      return warningProvider.warningMessage();\n    }\n  }\n\n  public warningForProvider(providerKey?: string): string | undefined {\n    if (providerKey) {\n      const warningProvider = this.providers.find(prov => prov.key === providerKey);\n      if (warningProvider) {\n        return warningProvider.warningMessage();\n      }\n    }\n  }\n\n  public findDoiInLocalBibliography(doi: string): BibliographySourceWithCollections | undefined {\n    // NOTE: This will only search sources that have already been loaded.\n    // Please be sure to use load() before calling this or\n    // accept the risk that this will not properly search for a DOI if the\n    // bibliography hasn't already been loaded.\n    return this.localSources().find(source => source.DOI === doi);\n  }\n\n  public findIdInLocalBibliography(id: string): BibliographySourceWithCollections | undefined {\n    // NOTE: This will only search sources that have already been loaded.\n    // Please be sure to use load() before calling this or\n    // accept the risk that this will not properly search for a DOI if the\n    // bibliography hasn't already been loaded.\n\n    return this.localSources().find(source => source.id === id);\n  }\n\n  // A general purpose search interface for filtered searching\n  public search(query?: string, providerKey?: string, collectionKey?: string): BibliographySourceWithCollections[] {\n    const limit = 100;\n    if (query && query.length > 0) {\n      // These are ordered by search score, so leave as is\n      if (providerKey && collectionKey) {\n        return this.searchProviderCollection(query, limit, providerKey, collectionKey);\n      } else if (providerKey) {\n        return this.searchProvider(query, limit, providerKey);\n      } else {\n        return this.searchAllSources(query, limit);\n      }\n    } else {\n      if (providerKey && collectionKey) {\n        return this.sourcesForProviderCollection(providerKey, collectionKey);\n      } else if (providerKey) {\n        return this.sourcesForProvider(providerKey);\n      } else {\n        return this.allSources();\n      }\n    }\n  }\n\n  public searchAllSources(query: string, limit: number): BibliographySourceWithCollections[] {\n    return this.searchSources(query, limit, this.allSources());\n  }\n\n  public searchSources(\n    query: string,\n    limit: number,\n    sources: BibliographySourceWithCollections[],\n  ): BibliographySourceWithCollections[] {\n    // NOTE: This will only search sources that have already been loaded.\n    // Please be sure to use load() before calling this or\n    // accept the risk that this will not properly search for a source if the\n    // bibliography hasn't already been loaded.\n    if (sources && this.searchIndex) {\n      // NOTE: Search performance can really drop off for long strings\n      // Test cases start at 20ms to search for a single character\n      // grow to 270ms to search for 20 character string\n      // grow to 1060ms to search for 40 character string\n      const searchResults = this.searchIndex.search(query, { ...kSearchOptions, limit });\n      const items = searchResults.map((result: { item: any }) => result.item);\n\n      // Filter out any non local items if this isn't a writable bibliography\n      const filteredItems = this.allowsWrites()\n        ? items\n        : items.filter(item => item.provider === kLocalBiliographyProviderKey);\n      return filteredItems;\n    } else {\n      return [];\n    }\n  }\n\n  // Search only a specific provider\n  public searchProvider(query: string, limit: number, providerKey: string): BibliographySourceWithCollections[] {\n    const orFields = kFields.map(field => {\n      return {\n        [field.name]: query,\n      };\n    });\n    const q = {\n      $and: [\n        { providerKey },\n        {\n          $or: orFields,\n        },\n      ],\n    };\n\n    if (this.searchIndex) {\n      const searchResults = this.searchIndex.search(q, { limit });\n      return searchResults.map((result: { item: any }) => result.item);\n    } else {\n      return [];\n    }\n  }\n\n  // Search a specific provider and collection\n  public searchProviderCollection(\n    query: string,\n    limit: number,\n    providerKey: string,\n    collectionKey: string,\n  ): BibliographySourceWithCollections[] {\n    const orFields = kFields.map(field => {\n      return {\n        [field.name]: query,\n      };\n    });\n    const q = {\n      $and: [\n        {\n          providerKey,\n        },\n        {\n          collectionKeys: collectionKey,\n        },\n        {\n          $or: orFields,\n        },\n      ],\n    };\n\n    if (this.searchIndex) {\n      const searchResults = this.searchIndex.search(q, { limit });\n      return searchResults.map((result: { item: any }) => result.item);\n    } else {\n      return [];\n    }\n  }\n\n  private getFuse(bibSources: BibliographySourceWithCollections[]) {\n    // build search index\n    const options = {\n      ...kSearchOptions,\n      keys: kFields.map(field => field.name),\n    };\n    const index = Fuse.createIndex<BibliographySourceWithCollections>(options.keys, bibSources);\n    return new Fuse(bibSources, options, index);\n  }\n}\n","/*\n * bibliography-provider_local.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\n\nimport { PandocServer } from '../pandoc';\n\nimport { expandPaths, getExtension, joinPaths } from '../path';\nimport { EditorUI } from '../ui';\n\nimport {\n  BibliographyDataProvider,\n  Bibliography,\n  BibliographyFile,\n  BibliographyCollection,\n  BibliographySourceWithCollections,\n} from './bibliography';\nimport { ParsedYaml, parseYamlNodes, valueFromYamlText } from '../yaml';\nimport { toBibLaTeX, toBibTeX } from './bibDB';\nimport { CSL } from '../csl';\n\nexport interface BibliographyResult {\n  etag: string;\n  bibliography: Bibliography;\n}\nexport const kLocalBiliographyProviderKey = 'E06068FE-45DA-4D88-ABDA-0DF290624950';\n\nexport class BibliographyDataProviderLocal implements BibliographyDataProvider {\n  private etag: string;\n  private bibliography?: Bibliography;\n  private readonly server: PandocServer;\n\n  public constructor(server: PandocServer) {\n    this.server = server;\n    this.etag = '';\n  }\n  public name: string = 'Bibliography';\n  public key: string = kLocalBiliographyProviderKey;\n  public requiresWritable: boolean = false;\n\n  // Always enabled;\n  public isEnabled(): boolean {\n    return true;\n  }\n\n  public prime(): Promise<any> {\n    return Promise.resolve();\n  }\n\n  public async load(docPath: string | null, resourcePath: string, yamlBlocks: ParsedYaml[]): Promise<boolean> {\n    // Gather the biblography files from the document\n    const bibliographiesRelative = bibliographyFilesFromDoc(yamlBlocks);\n    const bibliographiesAbsolute = expandPaths(resourcePath, bibliographiesRelative || []);\n\n    // Gather the reference block\n    const refBlock = referenceBlockFromYaml(yamlBlocks);\n\n    let updateIndex = false;\n    if (docPath || bibliographiesAbsolute.length > 0 || refBlock) {\n      // get the bibliography\n      try {\n        const result = await this.server.getBibliography(docPath, bibliographiesAbsolute, refBlock, this.etag);\n\n        // Read bibliography data from files (via server)\n        if (!this.bibliography || result.etag !== this.etag) {\n          this.bibliography = result.bibliography;\n          updateIndex = true;\n        }\n\n        // record the etag for future queries\n        this.etag = result.etag;\n      } catch (e) {\n        // ignore error\n      }\n    }\n    return updateIndex;\n  }\n\n  public collections(): BibliographyCollection[] {\n    return [];\n\n    // NOTE: If we can make the 'itemsForCollections' call work, we can begin emitting the various\n    // bibliography files here. Right now, the server generates the CSL for all the bibligraphy runs\n    // in a single call, meaning that the items lose context of which bibliography file that they\n    // come from.\n    /*\n    if (!this.bibliography || !this.bibliography.sources) {\n      return [];\n    }\n\n    if (this.projectBiblios().length > 0) {\n      return this.projectBiblios().map(biblio => ({ name: biblio, key: biblio }));\n    }\n\n    const bibliographies = bibliographyFilesFromDocument(doc, ui);\n    return bibliographies ? bibliographies.map(biblio => ({ name: biblio, key: biblio })) : [];\n    */\n  }\n\n  public items(): BibliographySourceWithCollections[] {\n    if (!this.bibliography || !this.bibliography.sources) {\n      return [];\n    }\n\n    return this.bibliography.sources.map(source => ({\n      ...source,\n      id: source.id!, // Local CSL always has an id\n      providerKey: this.key,\n      collectionKeys: [],\n    }));\n  }\n\n  public itemsForCollection(collectionKey: string): BibliographySourceWithCollections[] {\n    // NOTE: IF we add support, need to filter by biblio file\n    return [];\n  }\n\n  public projectBiblios(): string[] {\n    return this.bibliography?.project_biblios || [];\n  }\n\n  public generateBibTeX(_ui: EditorUI, id: string, csl: CSL): Promise<string | undefined> {\n    return Promise.resolve(toBibTeX(id, csl));\n  }\n\n  public warningMessage(): string | undefined {\n    return undefined;\n  }\n\n  public bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n    const kPermissableFileExtensions = ['bibtex', 'bib', 'yaml', 'yml', 'json'];\n    if (this.bibliography?.project_biblios && this.bibliography.project_biblios.length > 0) {\n      return this.bibliography?.project_biblios.map(projectBiblio => {\n        return {\n          displayPath: projectBiblio,\n          fullPath: projectBiblio,\n          isProject: true,\n          writable: kPermissableFileExtensions.includes(getExtension(projectBiblio)),\n        };\n      });\n    }\n    return (\n      bibliographyFilesFromDocument(doc, ui)?.map(path => {\n        return {\n          displayPath: path,\n          fullPath: joinPaths(ui.context.getDefaultResourceDir(), path),\n          isProject: false,\n          writable: kPermissableFileExtensions.includes(getExtension(path)),\n        };\n      }) || []\n    );\n  }\n}\n\nfunction bibliographyFilesFromDocument(doc: ProsemirrorNode, ui: EditorUI): string[] | undefined {\n  // Gather the files from the document\n  return bibliographyFilesFromDoc(parseYamlNodes(doc));\n}\n\nfunction bibliographyFilesFromDoc(parsedYamls: ParsedYaml[]): string[] | undefined {\n  // Read the values of any yaml blocks that include bibliography headers\n  // filter out blocks that don't include such headers\n  const bibliographyValues = parsedYamls\n    .map(parsedYaml => {\n      return valueFromYamlText('bibliography', parsedYaml.yamlCode);\n    })\n    .filter(val => val !== null);\n\n  if (bibliographyValues.length > 0) {\n    // Pandoc will use the last biblography node when generating a bibliography.\n    // So replicate this and use the last biblography node that we find\n    const bibliographyFiles = bibliographyValues[bibliographyValues.length - 1];\n    if (\n      Array.isArray(bibliographyFiles) &&\n      bibliographyFiles.every(bibliographyFile => typeof bibliographyFile === 'string')\n    ) {\n      return bibliographyFiles;\n    } else {\n      // A single bibliography\n      return [bibliographyFiles];\n    }\n  }\n  return undefined;\n}\n\nfunction referenceBlockFromYaml(parsedYamls: ParsedYaml[]): string {\n  const refBlockParsedYamls = parsedYamls.filter(\n    parsedYaml => parsedYaml.yaml !== null && typeof parsedYaml.yaml === 'object' && parsedYaml.yaml.references,\n  );\n\n  // Pandoc will use the last references node when generating a bibliography.\n  // So replicate this and use the last biblography node that we find\n  if (refBlockParsedYamls.length > 0) {\n    const lastReferenceParsedYaml = refBlockParsedYamls[refBlockParsedYamls.length - 1];\n    if (lastReferenceParsedYaml) {\n      return `---\\n${lastReferenceParsedYaml.yamlCode}\\n---\\n`;\n    }\n  }\n\n  return '';\n}\n\nconst kSpaceOrColonRegex = /[\\s:]/;\nfunction bibliographyLine(bibliographyFile: string): string {\n  const sketchyCharMatch = bibliographyFile.match(kSpaceOrColonRegex);\n  if (sketchyCharMatch) {\n    return `bibliography: \"${bibliographyFile}\"`;\n  } else {\n    return `bibliography: ${bibliographyFile}`;\n  }\n}\n\nexport function ensureBibliographyFileForDoc(tr: Transaction, bibliographyFile: string, ui: EditorUI) {\n  // read the Yaml blocks from the document\n  const parsedYamlNodes = parseYamlNodes(tr.doc);\n\n  // Gather the biblography files from the document\n  const bibliographiesRelative = bibliographyFilesFromDoc(parsedYamlNodes);\n  if (bibliographiesRelative && bibliographiesRelative.length > 0) {\n    // The user selected bibliography is already in the document OR\n    // There is a bibliography entry, but it doesn't include the user\n    // selected bibliography. In either case, we're not going to write\n    // a bibliography entry to any YAML node.\n    return bibliographiesRelative.includes(bibliographyFile);\n  } else {\n    // There aren't any bibliographies declared for this document yet either because\n    // there are no yaml metadata blocks or the yaml metadata blocks that exist omit\n    // the bibliography property\n    if (parsedYamlNodes.length === 0) {\n      // There aren't any yaml nodes in this document, need to create one\n      const biblioNode = createBiblographyYamlNode(tr.doc.type.schema, bibliographyFile);\n      tr.insert(1, biblioNode);\n    } else {\n      // We found at least one node in the document, add to the first node that we found\n      const firstBlock = parsedYamlNodes[0];\n      const updatedNode = addBibliographyToYamlNode(tr.doc.type.schema, bibliographyFile, firstBlock);\n      tr.replaceRangeWith(firstBlock.node.pos, firstBlock.node.pos + firstBlock.node.node.nodeSize, updatedNode);\n    }\n    return true;\n  }\n}\n\nfunction addBibliographyToYamlNode(schema: Schema, bibliographyFile: string, parsedYaml: ParsedYaml) {\n  // Add this to the first node\n  const yamlCode = parsedYaml.yamlCode;\n  const yamlWithBib = `---\\n${yamlCode}\\n${bibliographyLine(bibliographyFile)}\\n---`;\n  const yamlText = schema.text(yamlWithBib);\n  return schema.nodes.yaml_metadata.create({}, yamlText);\n}\n\nfunction createBiblographyYamlNode(schema: Schema, bibliographyFile: string) {\n  const yamlText = schema.text(`---\\n${bibliographyLine(bibliographyFile)}\\n---`);\n  return schema.nodes.yaml_metadata.create({}, yamlText);\n}\n","/*\n * path.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function expandPaths(rootPath: string, paths: string[]): string[] {\n  return paths.map(path => joinPaths(rootPath, path));\n}\n\nexport function joinPaths(root: string, path: string) {\n  const mergedPath = `${root}/${path}`;\n\n  // Clean out duplicate paths\n  return mergedPath.replace(/\\/\\//g, '/');\n}\n\nexport function getExtension(path: string) {\n  // Get the file out of the path\n  const fileName = path.split(/[\\\\/]/).pop();\n  if (fileName) {\n    const lastDot = fileName.lastIndexOf('.');\n    if (lastDot > 0) {\n      return fileName.slice(lastDot + 1);\n    }\n  }\n  return '';\n}\n\nexport function changeExtension(path: string, extension: string) {\n  const lastDot = path.lastIndexOf('.');\n  const pathNoExtension = path.substr(0, lastDot + 1);\n  return pathNoExtension + extension;\n}\n","/*\n * BibDB.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport {\n  BibFieldTypes,\n  NameDictObject,\n  NodeArray,\n  RangeArray,\n  BibField,\n  BibLatexExporter,\n  BibTypes,\n  BibType,\n} from 'biblatex-csl-converter';\n\nimport { Mark, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { CSL, CSLDate, cslDateToEDTFDate, CSLName } from '../csl';\nimport { cslTextToProsemirrorNode } from '../csl-text';\nimport { bibDbToBibTeX } from '../bibtex/bibtex';\n\nexport type BibDB = Record<string, EntryObject>;\n\nexport interface EntryObject {\n  csl_type?: string;\n  bib_type: string;\n  entry_key: string;\n  fields: Record<string, any>;\n  incomplete?: boolean;\n  unexpected_fields?: Record<string, any>;\n  unknown_fields?: Record<string, any>;\n}\n\n// This is our wrapper of a typescript BibLaTeX exporter\n// https://github.com/fiduswriter/biblatex-csl-converter\n\n// Traditional Form Looks Like:\n// author = {{Abbas}, {Osma Ahmed} and {Ibrahim}, {Issa Ghada} and {Ismail}, {Abdel-Gawad Eman}}\n//\n// Non traditional form looks like:\n// author = {given={Osma Ahmed}, family={Abbas} and given={Issa Ghada}, family={Ibrahim} and given={Abdel-Gawad Eman}, family={Ismail}}\nconst kUseTraditionalNameForm = false;\n\n// Generates bibLaTeX for a given CSL object / id\nexport function toBibLaTeX(id: string, csl: CSL): string | undefined {\n  // A BibDB is basically a map of key / EntryObject[] that is\n  // used by the exporter to generate BibLaTeX\n  const bibDB = cslToBibDB(id, csl);\n  if (bibDB) {\n    // Use the exported to parse the bibDB and generate bibLaTeX\n    const exporter: BibLatexExporter = new BibLatexExporter(bibDB, false, {\n      traditionalNames: kUseTraditionalNameForm,\n    });\n    const sourceAsBibLaTeX = exporter.parse();\n\n    // Indent any , new lines\n    return sourceAsBibLaTeX.replace(/,\\n/g, ',\\n\\t');\n  }\n  return undefined;\n}\n\nexport function toBibTeX(id: string, csl: CSL): string | undefined {\n  // A BibDB is basically a map of key / EntryObject[] that is\n  // used by the exporter to generate BibLaTeX\n  const bibDB = cslToBibDB(id, csl);\n  if (bibDB) {\n    // Use the exported to parse the bibDB and generate bibLaTeX\n    const sourceAsBibTeX = bibDbToBibTeX(bibDB);\n\n    // Indent any , new lines\n    return sourceAsBibTeX;\n  }\n  return undefined;\n}\n\n// Converts a single CSL item to a bibDB containing\n// a single EntryObject representing that CSL item\nfunction cslToBibDB(id: string, csl: CSL): BibDB | undefined {\n  const bibType = bibTypeForCSL(csl.type);\n  const bibObject: EntryObject = {\n    bib_type: bibType[0],\n    csl_type: bibType[1].csl,\n    entry_key: id,\n    fields: {},\n  };\n\n  const enumerableCSL = csl as any;\n  sortedKeys(csl).forEach(key => {\n    const value: any = enumerableCSL[key];\n\n    const bibFieldDatas = bibFieldForValue(key, csl.type);\n\n    bibFieldDatas?.forEach(bibFieldData => {\n      if (bibFieldData) {\n        const bibFieldKey = bibFieldData[0];\n        const bibField = bibFieldData[1];\n        const type = bibField.type;\n        let nodeValue: any;\n        switch (type) {\n          case 'f_date':\n            // f_date = // EDTF 1.0 level 0/1 compliant string. (2000-12-31)\n            const cslDate = value as CSLDate;\n            if (cslDate) {\n              const edtfDate = cslDateToEDTFDate(cslDate);\n              if (edtfDate) {\n                nodeValue = edtfDate;\n              }\n            }\n            break;\n          case 'f_integer':\n          case 'f_literal':\n          case 'f_long_literal':\n          case 'f_title':\n            // f_integer, f_literal, f_long_literal, f_title = [nodeValue]\n            // l_literal = [nodeValue]\n            if (value && value.length > 0) {\n              nodeValue = textNodes(value);\n            }\n            break;\n          case 'l_literal':\n            // l_literal = [NodeArray]\n            if (value && value.length > 0) {\n              nodeValue = [textNodes(value)];\n            }\n            break;\n          case 'f_key':\n            // f_key: string | NodeArray (string points to another key\n            // name in BibObject whose value is used for this key)\n            if (bibField.options) {\n              const options = bibField.options as any;\n              Object.keys(options).find(optionKey => {\n                const optionValue: any = options[optionKey];\n                if (optionValue.csl === value) {\n                  nodeValue = optionKey;\n                  return true;\n                }\n              });\n\n              if (!nodeValue) {\n                nodeValue = textNodes(value);\n              }\n            }\n\n            break;\n          case 'l_key':\n            // l_key, list of [string | NodeArray]\n            if (bibField.options) {\n              const options = bibField.options as any;\n              Object.keys(options).find(optionKey => {\n                const optionValue: any = options[optionKey];\n                if (optionValue.csl === value) {\n                  nodeValue = [optionKey];\n                  return true;\n                }\n              });\n\n              if (!nodeValue && value && value.length > 0) {\n                nodeValue = textNodes(value);\n              }\n            }\n            break;\n          case 'l_range':\n            // l_range Array<RangeArray>\n            const valueStr = value as string;\n            const parts = valueStr.split('-');\n            const range = rangeArray(parts);\n            if (range) {\n              nodeValue = [range];\n            }\n            break;\n          case 'f_uri':\n          case 'f_verbatim':\n            // f_uri, f_verbatim: string\n            nodeValue = value;\n            break;\n          case 'l_name':\n            // l_name Array<NameDictObject>\n            const names = value as CSLName[];\n            nodeValue = names.map(name => {\n              const nameDict: NameDictObject = {\n                family: name.family ? textNodes(name.family) : undefined,\n                given: name.given ? textNodes(name.given) : undefined,\n                literal: name.literal ? textNodes(name.literal) : undefined,\n              };\n              return nameDict;\n            });\n\n            break;\n          case 'l_tag':\n            // l_tag: string[]\n            nodeValue = [value];\n            break;\n        }\n\n        if (nodeValue) {\n          if (shouldIncludeField(bibFieldKey, bibType[1])) {\n            bibObject.fields[bibFieldKey] = nodeValue;\n          }\n        }\n      }\n    });\n  });\n\n  const bibDB: BibDB = {\n    item: bibObject,\n  };\n  return bibDB;\n}\n\n// For a given type, we filter out any fields that aren't required,\n// eitheror, or optional.\nfunction shouldIncludeField(bibDBFieldName: string, bibType: BibType) {\n  return (\n    bibType.required.includes(bibDBFieldName) ||\n    bibType.optional.includes(bibDBFieldName) ||\n    bibType.eitheror.includes(bibDBFieldName)\n  );\n}\n\n// Returns text nodes for a given CSL string. This implements\n// support for the basic CSL marks that are outlined here:\n// https://citeproc-js.readthedocs.io/en/latest/csl-json/markup.html#html-like-formatting-tags\nfunction textNodes(str: string): NodeArray {\n  const pmNode = cslTextToProsemirrorNode(str);\n  if (pmNode) {\n    const nodes: NodeArray = [];\n    pmNode.forEach((node: ProsemirrorNode) => {\n      nodes.push({\n        type: 'text',\n        text: node.textContent,\n        marks: node.marks.map((mark: Mark) => ({ type: mark.type.name })),\n      });\n    });\n    return nodes;\n  } else {\n    return [\n      {\n        type: 'text',\n        text: str,\n        marks: [],\n        attrs: {},\n      },\n    ];\n  }\n}\n\n// Useful for things like page ranges\nfunction rangeArray(parts: string[]): RangeArray | undefined {\n  if (parts.length === 1) {\n    return [textNodes(parts[0])];\n  } else if (parts.length === 2) {\n    return [textNodes(parts[0]), textNodes(parts[1])];\n  }\n}\n\n// Returns the bibDB type for a given CSL type.\nfunction bibTypeForCSL(cslType: string): [string, BibType] {\n  const key = Object.keys(BibTypes).find(bibTypeKey => {\n    const bibType = BibTypes[bibTypeKey];\n    if (bibType.csl === cslType) {\n      return bibTypeKey;\n    }\n  });\n\n  if (key) {\n    const bibType = BibTypes[key];\n    return [key, bibType];\n  } else {\n    const bibType = BibTypes.misc;\n    return ['misc', bibType];\n  }\n}\n\nfunction bibFieldForValue(cslKey: string, cslType: string): Array<[string, BibField]> | undefined {\n  // Special case the following fields:\n  // article-journal issue\n  // patent number\n  // * collection-number\n  // See https://discourse.citationstyles.org/t/issue-number-and-bibtex/1072\n  // https://github.com/fiduswriter/biblatex-csl-converter/blob/35d152935eba253ebadd00e285fb13c5828f167f/src/const.js#L561\n  if (\n    (cslType === 'article-journal' && cslKey === 'issue') ||\n    (cslType === 'patent' && cslKey === 'number') ||\n    cslKey === 'collection-number'\n  ) {\n    const bibField = {\n      type: 'f_literal',\n      biblatex: 'number',\n      csl: cslKey,\n    };\n    return [['number', bibField]];\n  }\n\n  // Find the key that corresponds to this CSL key\n  const keys = Object.keys(BibFieldTypes).filter(bibFieldKey => {\n    const bibField = BibFieldTypes[bibFieldKey];\n    const cslFieldName = bibField.csl;\n    if (cslFieldName && cslFieldName === cslKey) {\n      return bibField;\n    }\n  });\n\n  // Get the field and return\n  if (keys) {\n    return keys.map(key => {\n      const bibField = BibFieldTypes[key];\n      return [key, bibField];\n    });\n  }\n}\n\nfunction sortedKeys(csl: CSL) {\n  let pos = 1;\n  const keySortOrder: { [id: string]: number } = {};\n  keySortOrder.title = pos++;\n\n  keySortOrder.author = pos++;\n  keySortOrder.editor = pos++;\n  keySortOrder.director = pos++;\n  keySortOrder.illustrator = pos++;\n  keySortOrder['collection-editor'] = pos++;\n  keySortOrder.translator = pos++;\n\n  keySortOrder.doi = pos++;\n\n  keySortOrder.issued = pos++;\n  keySortOrder['event-date'] = pos++;\n\n  keySortOrder['container-title'] = pos++;\n  keySortOrder['collection-title'] = pos++;\n\n  keySortOrder.url = pos++;\n\n  keySortOrder.page = pos++;\n  keySortOrder.publisher = pos++;\n\n  const enumerableCSL = csl as any;\n  const keys = Object.keys(enumerableCSL);\n  const sorted = keys.sort((a, b) => {\n    const aOrder = keySortOrder[a.toLowerCase()];\n    const bOrder = keySortOrder[b.toLowerCase()];\n    if (aOrder && bOrder) {\n      return aOrder - bOrder;\n    } else if (aOrder !== undefined) {\n      return -1;\n    } else if (bOrder !== undefined) {\n      return 1;\n    }\n    return a.localeCompare(b);\n  });\n  return sorted;\n}\n","/*\n * csl.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { parseYamlNodes } from './yaml';\nimport { crossRefTypeToCSLType } from './crossref';\nimport { EditorUI } from './ui';\nimport { EditorUIImages } from './ui-images';\n\nexport interface CSL {\n  // The id. This is technically required, but some providers (like crossref) don't provide\n  // one\n  id?: string;\n\n  // Enumeration, one of the type ids from https://api.crossref.org/v1/types\n  type: string;\n\n  // An item key that may be used to identify this item\n  key?: string;\n\n  // Name of work's publisher\n  publisher?: string;\n\n  // Title\n  title?: string;\n\n  // DOI of the work\n  DOI?: string;\n\n  // URL form of the work's DOI\n  URL?: string;\n\n  // Array of Contributors\n  author?: CSLName[];\n\n  // Earliest of published-print and published-online\n  issued?: CSLDate;\n\n  // Full titles of the containing work (usually a book or journal)\n  'container-title'?: string;\n\n  // Short titles of the containing work (usually a book or journal)\n  'short-container-title'?: string;\n\n  // Issue number of an article's journal\n  issue?: string;\n\n  // Volume number of an article's journal\n  volume?: string;\n\n  // Pages numbers of an article within its journal\n  page?: string;\n\n  // These properties are often not included in CSL entries and are here\n  // primarily because they may need to be sanitized\n  ISSN?: string;\n  ISBN?: string;\n  'original-title'?: string;\n  'short-title'?: string;\n  subtitle?: string;\n  subject?: string;\n  archive?: string;\n  license?: [];\n}\n\nexport interface CSLName {\n  family: string;\n  given: string;\n  literal?: string;\n}\n\nexport interface CSLDate {\n  'date-parts'?: Array<[number, number?, number?]>;\n  raw?: string;\n}\n\n// Crossref sends some items back with invalid data types in the CSL JSON\n// This appears to tend to happen the most frequently with fields that CrossRef\n// stores as Arrays which are not properly flatted to strings as Pandoc cite-proc expects.\n// This will flatten any of these fields to the first element of the array\nexport function sanitizeForCiteproc(csl: CSL): CSL {\n  // This field list was create speculatively, so may contain fields that do not require\n  // sanitization (or may omit fields that require it).\n  const sanitizeProperties = [\n    'ISSN',\n    'ISBN',\n    'title',\n    'subject',\n    'archive',\n    'original-title',\n    'short-title',\n    'subtitle',\n    'container-title',\n    'short-container-title',\n    'license'\n  ];\n  const cslAny: { [key: string]: any } = {\n    ...csl,\n  };\n  const keys = Object.keys(cslAny);\n  keys\n    .filter(key => sanitizeProperties.includes(key))\n    .forEach(property => {\n      const value = cslAny[property];\n      if (value && Array.isArray(value)) {\n        if (value.length > 0) {\n          cslAny[property] = value[0];\n        } else {\n          cslAny[property] = undefined;\n        }\n      }\n      return cslAny;\n    });\n\n  // Strip any raw date representations\n  if (cslAny.issued?.raw) {\n    delete cslAny.issued.raw;\n  }\n\n  // Pubmed and others may included license information (including date ranges and more)\n  // which will not be properly parsed by Pandoc (when writing to the bibiliography). Remove\n  if (cslAny.license) {\n    delete cslAny.license;\n  }\n\n  // pandoc-citeproc performance is extremely poor with large abstracts. As a result, purge this property\n  delete cslAny.abstract;\n  delete cslAny.id;\n\n  // Ensure only valid CSL types make it through\n  cslAny.type = ensureValidCSLType(cslAny.type);\n\n  return cslAny as CSL;\n}\n\n// Crossref and other sources may allow invalid types to leak through\n// (for example, this DOI 10.5962/bhl.title.5326 is of a monograph)\n// and the type will leak through as monograph. This function will verify\n// that the type is a CSL type and if it not, do its best to map the type\n// to a valid CSL type\nexport function ensureValidCSLType(type: string): string {\n  if (Object.values(cslTypes).includes(type)) {\n    // This is a valid type\n    return type;\n  } else {\n    return crossRefTypeToCSLType(type);\n  }\n}\n\nexport function cslFromDoc(doc: ProsemirrorNode): string | undefined {\n  // read the Yaml blocks from the document\n  const parsedYamlNodes = parseYamlNodes(doc);\n\n  const cslParsedYamls = parsedYamlNodes.filter(\n    parsedYaml => parsedYaml.yaml !== null && typeof parsedYaml.yaml === 'object' && parsedYaml.yaml.csl,\n  );\n\n  // Look through any yaml nodes to see whether any contain csl information\n  if (cslParsedYamls.length > 0) {\n    // Pandoc uses the last csl block (whether or not it shares a yaml block with the\n    // bibliographies element that pandoc will ultimately use) so just pick the last csl\n    // block.\n    const cslParsedYaml = cslParsedYamls[cslParsedYamls.length - 1];\n    const cslFile = cslParsedYaml.yaml.csl;\n    return cslFile;\n  }\n  return undefined;\n}\n\n// Converts a csl date to an EDTF date.\n// See https://www.loc.gov/standards/datetime/\n// Currently omits time component so this isn't truly level 0\nexport function cslDateToEDTFDate(date: CSLDate) {\n  if (date['date-parts']) {\n    const paddedParts = date['date-parts'][0].map(part => {\n      const partStr = part?.toString();\n      if (partStr?.length === 1) {\n        return `0${partStr}`;\n      }\n      return partStr;\n    });\n    return paddedParts.join('-');\n  }\n}\n\nexport function imageForType(images: EditorUIImages, type: string): [string?, string?] {\n  switch (type) {\n    case cslTypes.article:\n    case cslTypes.articleJournal:\n    case cslTypes.articleMagazine:\n    case cslTypes.articleNewspaper:\n    case cslTypes.paperConference:\n    case cslTypes.review:\n    case cslTypes.reviewBook:\n      return [images.citations?.article, images.citations?.article_dark];\n    case cslTypes.bill:\n    case cslTypes.legislation:\n    case cslTypes.legalCase:\n    case cslTypes.treaty:\n      return [images.citations?.legal, images.citations?.legal_dark];\n    case cslTypes.book:\n    case cslTypes.chapter:\n    case cslTypes.manuscript:\n    case cslTypes.thesis:\n      return [images.citations?.book, images.citations?.book_dark];\n    case cslTypes.broadcast:\n      return [images.citations?.broadcast, images.citations?.broadcast_dark];\n    case cslTypes.dataset:\n      return [images.citations?.data, images.citations?.data_dark];\n    case cslTypes.entry:\n    case cslTypes.entryDictionary:\n    case cslTypes.entryEncylopedia:\n      return [images.citations?.entry, images.citations?.entry_dark];\n    case cslTypes.figure:\n    case cslTypes.graphic:\n      return [images.citations?.image, images.citations?.image_dark];\n    case cslTypes.map:\n      return [images.citations?.map, images.citations?.map_dark];\n    case cslTypes.motionPicture:\n      return [images.citations?.movie, images.citations?.movie_dark];\n    case cslTypes.musicalScore:\n    case cslTypes.song:\n      return [images.citations?.song, images.citations?.song_dark];\n    case cslTypes.post:\n    case cslTypes.postWeblog:\n    case cslTypes.webpage:\n      return [images.citations?.web, images.citations?.web_dark];\n    case cslTypes.paperConference:\n    case cslTypes.interview:\n    case cslTypes.pamphlet:\n    case cslTypes.personalCommunication:\n    case cslTypes.report:\n    case cslTypes.speech:\n    default:\n      return [images.citations?.other, images.citations?.other_dark];\n  }\n}\n\nexport const cslTypes = {\n  article: 'article',\n  articleMagazine: 'article-magazine',\n  articleNewspaper: 'article-newspaper',\n  articleJournal: 'article-journal',\n  bill: 'bill',\n  book: 'book',\n  broadcast: 'broadcast',\n  chapter: 'chapter',\n  dataset: 'dataset',\n  entry: 'entry',\n  entryDictionary: 'entry-dictionary',\n  entryEncylopedia: 'entry-encyclopedia',\n  figure: 'figure',\n  graphic: 'graphic',\n  interview: 'interview',\n  legislation: 'legislation',\n  legalCase: 'legal_case',\n  manuscript: 'manuscript',\n  map: 'map',\n  motionPicture: 'motion_picture',\n  musicalScore: 'musical_score',\n  pamphlet: 'pamphlet',\n  paperConference: 'paper-conference',\n  patent: 'patent',\n  post: 'post',\n  postWeblog: 'post-weblog',\n  personalCommunication: 'personal_communication',\n  report: 'report',\n  review: 'review',\n  reviewBook: 'review-book',\n  song: 'song',\n  speech: 'speech',\n  thesis: 'thesis',\n  treaty: 'treaty',\n  webpage: 'webpage',\n};\n","/*\n * crossref.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUI } from './ui';\nimport { cslTypes } from './csl';\n\n// https://github.com/CrossRef/rest-api-doc\nexport interface CrossrefServer {\n  works: (query: string) => Promise<CrossrefMessage<CrossrefWork>>;\n}\n\nexport const kCrossrefItemsPerPage = 'items-per-page';\nexport const kCrossrefStartIndex = 'start-index';\nexport const kCrossrefSearchTerms = 'search-terms';\nexport const kCrossrefTotalResults = 'total-results';\n\nexport interface CrossrefMessage<T> {\n  items: T[];\n  [kCrossrefItemsPerPage]: number;\n  query: {\n    [kCrossrefStartIndex]: number;\n    [kCrossrefSearchTerms]: string;\n  };\n  [kCrossrefTotalResults]: number;\n}\n\n// https://github.com/Crossref/rest-api-doc/blob/master/api_format.md#work\nexport interface CrossrefWork {\n  // Name of work's publisher\n  publisher: string;\n\n  // Work titles, including translated titles\n  title?: string[];\n\n  // DOI of the work\n  DOI: string;\n\n  // URL form of the work's DOI\n  URL: string;\n\n  // Enumeration, one of the type ids from https://api.crossref.org/v1/types\n  type: string;\n\n  // Array of Contributors\n  author: CrossrefContributor[];\n\n  // Earliest of published-print and published-online\n  issued: CrossrefDate;\n\n  // Full titles of the containing work (usually a book or journal)\n  'container-title'?: string;\n\n  // Short titles of the containing work (usually a book or journal)\n  'short-container-title'?: string;\n\n  // Issue number of an article's journal\n  issue: string;\n\n  // Volume number of an article's journal\n  volume: string;\n\n  // Pages numbers of an article within its journal\n  page: string;\n}\n\nexport interface CrossrefContributor {\n  family: string;\n  given?: string;\n}\n\n/* (Partial Date) Contains an ordered array of year, month, day of month. Only year is required. \nNote that the field contains a nested array, e.g. [ [ 2006, 5, 19 ] ] to conform \nto citeproc JSON dates */\nexport interface CrossrefDate {\n  'date-parts': Array<[number, number?, number?]>;\n}\n\nexport function imageForCrossrefType(ui: EditorUI, type: string): [string?, string?] {\n  switch (type) {\n    case crossRefTypes.monograph:\n    case crossRefTypes.report:\n    case crossRefTypes.journalArticle:\n    case crossRefTypes.journalVolume:\n    case crossRefTypes.journal:\n    case crossRefTypes.journalIssue:\n    case crossRefTypes.proceedingsArticle:\n    case crossRefTypes.dissertation:\n    case crossRefTypes.reportSeries:\n      return [ui.images.citations?.article, ui.images.citations?.article_dark];\n    case crossRefTypes.bookSection:\n    case crossRefTypes.bookPart:\n    case crossRefTypes.bookSeries:\n    case crossRefTypes.editedBook:\n    case crossRefTypes.bookChapter:\n    case crossRefTypes.book:\n    case crossRefTypes.bookSet:\n    case crossRefTypes.bookTrack:\n    case crossRefTypes.referenceBook:\n      return [ui.images.citations?.book, ui.images.citations?.book_dark];\n    case crossRefTypes.dataset:\n      return [ui.images.citations?.data, ui.images.citations?.data_dark];\n    case crossRefTypes.referenceEntry:\n      return [ui.images.citations?.entry, ui.images.citations?.entry_dark];\n    case crossRefTypes.postedContent:\n      return [ui.images.citations?.web, ui.images.citations?.web_dark];\n    case crossRefTypes.other:\n    case crossRefTypes.standard:\n    case crossRefTypes.standardSeries:\n    case crossRefTypes.peerReview:\n    case crossRefTypes.component:\n    case crossRefTypes.proceedingsSeries:\n    case crossRefTypes.proceedings:\n    default:\n      return [ui.images.citations?.other, ui.images.citations?.other_dark];\n  }\n}\n\nexport function prettyType(ui: EditorUI, type: string): string {\n  switch (type) {\n    case crossRefTypes.monograph:\n      return ui.context.translateText('Monograph');\n    case crossRefTypes.report:\n      return ui.context.translateText('Report');\n    case crossRefTypes.journalArticle:\n      return ui.context.translateText('Journal');\n    case crossRefTypes.journalVolume:\n      return ui.context.translateText('Journal Volume');\n    case crossRefTypes.journal:\n      return ui.context.translateText('Journal');\n    case crossRefTypes.journalIssue:\n      return ui.context.translateText('Journal Issue');\n    case crossRefTypes.proceedingsArticle:\n    case crossRefTypes.proceedingsSeries:\n    case crossRefTypes.proceedings:\n      return ui.context.translateText('Proceedings');\n    case crossRefTypes.dissertation:\n      return ui.context.translateText('Dissertation');\n    case crossRefTypes.reportSeries:\n      return ui.context.translateText('Series');\n    case crossRefTypes.bookSection:\n      return ui.context.translateText('Book Section');\n    case crossRefTypes.bookPart:\n      return ui.context.translateText('Book Part');\n    case crossRefTypes.bookSeries:\n      return ui.context.translateText('Book Series');\n    case crossRefTypes.bookChapter:\n      return ui.context.translateText('Book Chapter');\n    case crossRefTypes.editedBook:\n    case crossRefTypes.bookSet:\n    case crossRefTypes.bookTrack:\n    case crossRefTypes.referenceBook:\n      return ui.context.translateText('Book');\n    case crossRefTypes.dataset:\n      return ui.context.translateText('Dataset');\n    case crossRefTypes.referenceEntry:\n      return ui.context.translateText('Entry');\n    case crossRefTypes.postedContent:\n      return ui.context.translateText('Content');\n    case crossRefTypes.other:\n    case crossRefTypes.standard:\n    case crossRefTypes.standardSeries:\n    case crossRefTypes.peerReview:\n    case crossRefTypes.component:\n      return ui.context.translateText('Other');\n    default:\n      return type;\n  }\n}\n\nexport function crossRefTypeToCSLType(type: string): string {\n  // This isn't a valid type, try to map it to a valid type\n  switch (type) {\n    case crossRefTypes.bookSection:\n    case crossRefTypes.bookChapter:\n    case crossRefTypes.bookPart:\n      return cslTypes.chapter;\n    case crossRefTypes.book:\n    case crossRefTypes.bookSet:\n    case crossRefTypes.bookTrack:\n    case crossRefTypes.referenceBook:\n    case crossRefTypes.bookSeries:\n    case crossRefTypes.editedBook:\n      return cslTypes.book;\n    case crossRefTypes.report:\n      return cslTypes.report;\n    case crossRefTypes.peerReview:\n      return cslTypes.review;\n    case crossRefTypes.journalArticle:\n    case crossRefTypes.journalVolume:\n    case crossRefTypes.journal:\n    case crossRefTypes.journalIssue:\n      return cslTypes.articleJournal;\n    case crossRefTypes.referenceEntry:\n      return cslTypes.entry;\n    case crossRefTypes.monograph:\n    case crossRefTypes.proceedingsArticle:\n    case crossRefTypes.component:\n    case crossRefTypes.other:\n      return cslTypes.article;\n    case crossRefTypes.proceedings:\n    case crossRefTypes.proceedingsSeries:\n      return cslTypes.paperConference;\n    case crossRefTypes.reportSeries:\n      return cslTypes.report;\n    case crossRefTypes.standard:\n    case crossRefTypes.standardSeries:\n      return cslTypes.patent;\n    case crossRefTypes.postedContent:\n      return cslTypes.webpage;\n    case crossRefTypes.dissertation:\n      return cslTypes.thesis;\n    case crossRefTypes.dataset:\n      return cslTypes.dataset;\n    default:\n      return cslTypes.article;\n  }\n}\n\nexport const crossRefTypes = {\n  bookSection: 'book-section',\n  monograph: 'monograph',\n  report: 'report',\n  peerReview: 'peer-review',\n  bookTrack: 'book-track',\n  journalArticle: 'journal-article',\n  bookPart: 'book-part',\n  other: 'other',\n  book: 'book',\n  journalVolume: 'journal-volume',\n  bookSet: 'book-set',\n  referenceEntry: 'reference-entry',\n  proceedingsArticle: 'proceedings-article',\n  journal: 'journal',\n  component: 'component',\n  bookChapter: 'book-chapter',\n  proceedingsSeries: 'proceedings-series',\n  reportSeries: 'report-series',\n  proceedings: 'proceedings',\n  standard: 'standard',\n  referenceBook: 'reference-book',\n  postedContent: 'posted-content',\n  journalIssue: 'journal-issue',\n  dissertation: 'dissertation',\n  dataset: 'dataset',\n  bookSeries: 'book-series',\n  editedBook: 'edited-book',\n  standardSeries: 'standard-series',\n};\n","import { Schema, NodeSpec, MarkSpec, DOMParser, Node as ProsemirrorNode } from 'prosemirror-model';\n\nconst kCslDOMParser = cslDOMParser();\n\nexport function cslTextToProsemirrorNode(text: string): ProsemirrorNode | null {\n  const domParser = new window.DOMParser();\n  const doc = domParser.parseFromString(text, 'text/html');\n  if (doc) {\n    const pmNode = kCslDOMParser.parse(doc.body, { preserveWhitespace: 'full' });\n    return pmNode;\n  } else {\n    return null;\n  }\n}\n\nexport function cslDOMParser(): DOMParser {\n  return DOMParser.fromSchema(cslSchema());\n}\n\nfunction cslSchema() {\n  const nodes: { [name: string]: NodeSpec } = {\n    doc: {\n      content: 'inline*',\n    },\n    text: {\n      group: 'inline',\n      toDOM(node: ProsemirrorNode): any {\n        return node.text;\n      },\n    },\n  };\n  const marks: { [name: string]: MarkSpec } = {};\n  marks.strong = tagSpec('b');\n  marks.em = tagSpec('i');\n  marks.sup = tagSpec('sup');\n  marks.sub = tagSpec('sub');\n  marks.smallcaps = spanSpec('smallcaps');\n  marks.nocase = spanSpec('nocase');\n\n  // return schema\n  return new Schema({\n    nodes,\n    marks,\n  });\n}\n\nfunction tagSpec(tag: string): MarkSpec {\n  return {\n    parseDOM: [{ tag }],\n    toDOM() {\n      return [tag];\n    },\n  };\n}\n\nfunction spanSpec(clz: string): MarkSpec {\n  return {\n    parseDOM: [{ tag: `span[class*='${clz}']` }],\n    toDOM() {\n      return ['span', { class: clz }];\n    },\n  };\n}\n","/*\n * bibtex.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeArray, RangeArray, NameDictObject, TextNodeObject } from 'biblatex-csl-converter';\nimport { FieldMap } from './fields';\nimport { typeMapping } from './types';\nimport { FormattingTags } from './formatting';\nimport characters from './characters';\nimport { BibDB, EntryObject } from '../bibliography/bibDB';\n\nexport interface Config {\n  traditionalNames?: boolean;\n  exportUnexpectedFields?: boolean;\n}\n\nexport interface Entry {\n  type: string;\n  key: string;\n  values?: { [key: string]: string };\n}\n\ninterface Warning {\n  type: string;\n  variable: string;\n}\n\nexport function bibDbToBibTeX(bibDB: BibDB, config: Config = {}) {\n  // Keys of items to export\n  const keysToExport = Object.keys(bibDB);\n\n  // The final entries\n  const bibtexEntries: Entry[] = [];\n\n  // Go through each item and compose the entry and\n  // append all the fields with BibTeX specific formatting\n  keysToExport?.forEach(key => {\n    const entryObject: EntryObject = bibDB[key];\n\n    const cslType = entryObject.csl_type;\n    const bibTexType = cslType ? typeMapping(cslType).bibtex : entryObject.bib_type;\n\n    const bibtexEntry: Entry = {\n      type: bibTexType,\n      key: entryObject.entry_key,\n    };\n\n    // The formatted output fields for this entry\n    const outputFields: { [key: string]: string } = {};\n\n    // All the fields for this entry\n    const fieldsForExport: Record<string, any> = entryObject.fields;\n    Object.keys(fieldsForExport).forEach(fieldKey => {\n      // Lookup the field information in the mapping\n      // (maps CSL fields names to their peer BibTeX types)\n      const fieldType = FieldMap[fieldKey];\n\n      // This is a well understood field type\n      if (fieldType) {\n        const type = fieldType.type;\n\n        // Read the type (either as raw value or passing the type to look it up)\n        const typeReader = fieldType.bibtex;\n        const bibtexKey = typeof typeReader === 'string' ? typeReader : typeReader(bibTexType);\n        const bibtexValue = fieldsForExport[fieldKey];\n\n        switch (type) {\n          case 'f_date':\n            // Output the raw date value\n            outputFields[bibtexKey] = bibtexValue;\n\n            // Also output the year and month, if possible\n            // The value being parsed is a EDTF 1.0 level 0/1 compliant string. (2000-12-31)\n            const parts: string[] = bibtexValue.split('-');\n            if (parts.length > 0) {\n              outputFields.year = parts[0];\n              if (parts.length > 1) {\n                outputFields.month = parts[1];\n              }\n            }\n\n            break;\n          case 'f_integer':\n            outputFields[bibtexKey] = formatText(bibtexValue);\n            break;\n          case 'f_key':\n            outputFields[bibtexKey] = formatKey(bibtexValue, bibtexKey);\n            break;\n          case 'f_literal':\n          case 'f_long_literal':\n            outputFields[bibtexKey] = formatText(bibtexValue);\n            break;\n          case 'l_range':\n            outputFields[bibtexKey] = formatRange(bibtexValue);\n            break;\n          case 'f_title':\n            outputFields[bibtexKey] = formatText(bibtexValue);\n            break;\n          case 'f_uri':\n          case 'f_verbatim':\n            // Strip any braces from verbatims\n            outputFields[bibtexKey] = bibtexValue.replace(/{|}/g, '');\n            break;\n          case 'l_key':\n            outputFields[bibtexKey] = escapeNonAscii(\n              bibtexValue.map((k: string) => formatKey(k, bibtexKey)).join(' and '),\n            );\n            break;\n          case 'l_literal':\n            outputFields[bibtexKey] = bibtexValue.map((text: NodeArray) => formatText(text)).join(' and ');\n            break;\n          case 'l_name':\n            outputFields[bibtexKey] = formatNames(bibtexValue);\n            break;\n          case 'l_tag':\n            outputFields[bibtexKey] = escapeNonAscii(bibtexValue.join(', '));\n            break;\n          default:\n            // This is a field type that we don't understand, skip it\n            break;\n        }\n      }\n    });\n\n    bibtexEntry.values = outputFields;\n    bibtexEntries.push(bibtexEntry);\n  });\n  return toBibtex(bibtexEntries);\n}\n\n// Writes BibTex\nconst toBibtex = (entries: Entry[]): string => {\n  const length = entries.length;\n  let bibTexStr = '';\n  for (let i = 0; i < length; i++) {\n    // The entry we're writing\n    const entry = entries[i];\n\n    // Write the key and open the entry\n    bibTexStr = bibTexStr + `@${entry.type}{${entry.key}`;\n\n    // The fields for this item\n    if (entry.values && Object.keys(entry.values).length > 0) {\n      sortedKeys(entry.values).forEach(key => {\n        if (entry.values) {\n          const rawValue = entry.values[key];\n          const value = `{${rawValue}}`;\n\n          // Strip empty braces\n          // TODO: If we support variables, we may need to clean this\n          // const cleanedValue = value.replace(/\\{\\} # /g, '').replace(/# \\{\\}/g, '');\n          bibTexStr = bibTexStr + `,\\n\\t${key} = ${value}`;\n        }\n      });\n    } else {\n      // There are no values, we need to minimally place a ',' at the end of the id\n      // If we omit this, pandoc cannot parse the bibliography\n      bibTexStr = bibTexStr + \",\";\n    }\n\n    // Close the entry\n    bibTexStr = bibTexStr + '\\n}';\n  }\n  return bibTexStr;\n};\n\nconst sortedKeys = (fields: { [key: string]: string }) => {\n  let pos = 1;\n  const keySortOrder: { [id: string]: number } = {};\n  keySortOrder.title = pos++;\n  keySortOrder.author = pos++;\n  keySortOrder.editor = pos++;\n  keySortOrder.year = pos++;\n  keySortOrder.month = pos++;\n  keySortOrder.date = pos++;\n  keySortOrder.journal = pos++;\n  keySortOrder.booktitle = pos++;\n  keySortOrder.publisher = pos++;\n  keySortOrder.howpublished = pos++;\n  keySortOrder.pages = pos++;\n  keySortOrder.series = pos++;\n  keySortOrder.volume = pos++;\n  keySortOrder.chapter = pos++;\n  keySortOrder.number = pos++;\n  keySortOrder.edition = pos++;\n  keySortOrder.issue = pos++;\n  keySortOrder.doi = pos++;\n  keySortOrder.url = pos++;\n  keySortOrder.abstract = pos++;\n  keySortOrder.note = pos++;\n\n  const keys = Object.keys(fields);\n  const sorted = keys.sort((a, b) => {\n    const aOrder = keySortOrder[a.toLowerCase()];\n    const bOrder = keySortOrder[b.toLowerCase()];\n    if (aOrder && bOrder) {\n      return aOrder - bOrder;\n    } else if (aOrder !== undefined) {\n      return -1;\n    } else if (bOrder !== undefined) {\n      return 1;\n    }\n    return a.localeCompare(b);\n  });\n  return sorted;\n};\n\n// Converts any non asciii characters to their LaTeX representations\nconst escapeNonAscii = (value: string): string => {\n  let result = '';\n\n  // Split the string in a way that will maintain unicode characters\n  const chars = Array.from(value);\n  chars.forEach(c => {\n    const char = c.codePointAt(0);\n    // Look for a LaTeX replace in the character mapping\n    if (char) {\n      const characterMap = characters[char];\n      if (characterMap) {\n        // Found one, emit the LaTeX\n        // Use the braces to group the expression, unless the character replacement explicitly\n        // doesn't want to be grouped\n        result = result + (characterMap.ungrouped ? characterMap.latex : `{${characterMap.latex}}`);\n      } else {\n        // No LaTeX replacement, just emit the character\n        if (char < 255) {\n          result = result + String.fromCodePoint(char);\n        } else {\n          // A unicode character for which we have no valid LaTeX replacement\n          // emit a question mark\n          result = result + '?';\n        }\n      }\n    } else {\n      // A position which has no codepoint. what on earth is this?\n      result = result + '?';\n    }\n  });\n  return result;\n};\n\n// Formats keys\nconst formatKey = (value: string | NodeArray, fieldKey: string) => {\n  if (typeof value === 'string') {\n    const fieldType = FieldMap[fieldKey];\n    // If the field is an array, we can just emit the value\n    // Otherwise, we should treat options as a keyed object and lookup\n    // the bibtex value for this value\n    if (Array.isArray(fieldType.options)) {\n      return escapeNonAscii(value);\n    } else if (fieldType.options) {\n      return escapeNonAscii(fieldType.options[value].bibtex);\n    } else {\n      return escapeNonAscii(value);\n    }\n  } else {\n    return formatText(value);\n  }\n};\n\n// Formats text\nconst formatText = (nodes: NodeArray): string => {\n  let formattedText = '';\n  let lastNodeMarks: string[] = [];\n\n  // This empty node at the end will cause us to go through the loop\n  // after the last 'real' node and close out any open marks.\n  const textNodes = nodes.concat({ type: 'text', text: '' });\n\n  textNodes.forEach(node => {\n    /*\n    // TODO: Do we need to deal with this (and if so, we need to re-add that escape routine)\n    if (node.type === 'variable') {\n      // This is an undefined variable\n      // This should usually not happen, as CSL doesn't know what to\n      // do with these. We'll put them into an unsupported tag.\n      latex += `} # ${node.attrs.variable} # {`\n      this.warnings.push({\n        type: 'undefined_variable',\n        variable: node.attrs.variable\n      })\n      return\n    }\n    */\n\n    const thisNodeMarks: string[] = [];\n    if (node.marks) {\n      // Figure out the new marks for this node\n      // TODO: Do we need to re-enable math mode for these low level sup/sub nodes?\n      // let mathEnabled = false;\n      node.marks.forEach(mark => {\n        // We need to activate mathmode for the lowest level sub/sup node.\n        // Don't activate math mode for the lowest level node\n        /*\n        if ((mark.type === 'sup' || mark.type === 'sub') && !mathEnabled) {\n          thisNodeMarks.push('math');\n          thisNodeMarks.push(mark.type);\n          mathEnabled = true;\n        } else \n        */\n\n        if (mark.type === 'nocase') {\n          // No case should be the outer mark\n          thisNodeMarks.unshift(mark.type);\n        } else {\n          // regular old mark\n          thisNodeMarks.push(mark.type);\n        }\n      });\n    }\n\n    // Close any marks that aren't still open in this node\n    let closing = false;\n    const closeTags: string[] = [];\n    lastNodeMarks.forEach((mark, index) => {\n      if (mark !== thisNodeMarks[index]) {\n        closing = true;\n      }\n      if (closing) {\n        const closeTag =\n          lastNodeMarks[0] !== 'nocase' && FormattingTags[mark].open[0] === '\\\\'\n            ? `${FormattingTags[mark].close}}`\n            : FormattingTags[mark].close;\n        closeTags.push(closeTag);\n      }\n    });\n\n    // Emit the close tags for the previous (last to first)\n    closeTags.reverse();\n    formattedText = formattedText + closeTags.join('');\n\n    // Emit the open tags\n    let opening = false;\n    let doNotEscape = false;\n    thisNodeMarks.forEach((mark, index) => {\n      if (mark !== lastNodeMarks[index]) {\n        opening = true;\n      }\n      if (opening) {\n        // If not in a nocase, we can add protective brace\n        if (thisNodeMarks[0] !== 'nocase' && FormattingTags[mark].open[0] === '\\\\') {\n          formattedText = formattedText + '{';\n        }\n        formattedText = formattedText + FormattingTags[mark].open;\n        if (FormattingTags[mark].verbatim) {\n          doNotEscape = true;\n        }\n      }\n    });\n\n    const textNode = node as TextNodeObject;\n    if (doNotEscape) {\n      formattedText = formattedText + textNode.text;\n    } else {\n      formattedText = formattedText + escapeNonAscii(textNode.text);\n    }\n    lastNodeMarks = thisNodeMarks;\n  });\n  return formattedText;\n};\n\n// Formats ranges\nconst formatRange = (value: RangeArray[]): string => {\n  // The correct symbol for a range of numbers is an en-dash, which in LaTeX is usually input as --.\n  return value.map(range => range.map(text => formatText(text)).join('--')).join(',');\n};\n\n// Formats author values\nconst formatNames = (names: NameDictObject[]): string => {\n  const formattedNames: string[] = [];\n  names.forEach(name => {\n    if (name.literal) {\n      // Use the literal\n      const literal = formatText(name.literal);\n      if (literal.length) {\n        formattedNames.push(`{${literal}}`);\n      }\n    } else {\n      // Compose the name\n      // http://www.texfaq.org/FAQ-manyauthor\n      const family = name.family ? formatText(name.family) : '';\n      const given = name.given ? formatText(name.given) : '';\n      const suffix = name.suffix ? formatText(name.suffix) : false;\n      const prefix = name.prefix ? formatText(name.prefix) : false;\n\n      if (suffix && prefix) {\n        formattedNames.push(`{${prefix} ${family}}, {${suffix}}, {${given}}`);\n      } else if (suffix) {\n        formattedNames.push(`{${family}}, {${suffix}}, {${given}}`);\n      } else if (prefix) {\n        formattedNames.push(`{${prefix} ${family}}, {${given}}`);\n      } else {\n        formattedNames.push(`{${family}}, {${given}}`);\n      }\n    }\n  });\n  return formattedNames.join(' and ');\n};\n","/*\n * fields.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { lanagugeMappings } from './language';\n\nexport interface Field {\n  type: string;\n  bibtex: ((bibTexType: string) => string) | string;\n  csl: string | undefined;\n  options?: string[] | { [key: string]: { bibtex: string } } | undefined;\n}\n\n// CSL Field (variable) definitions from\n// https://docs.citationstyles.org/en/stable/specification.html#appendix-iv-variables\n\n// TODO: bibtex: string | (type: string) => string\n//\n\nexport const FieldMap: { [key: string]: Field } = {\n  abstract: {\n    type: 'f_long_literal',\n    bibtex: 'abstract',\n    csl: 'abstract',\n  },\n  author: {\n    type: 'l_name',\n    bibtex: 'author',\n    csl: 'author',\n  },\n  bookauthor: {\n    type: 'l_name',\n    bibtex: 'author',\n    csl: 'container-author',\n  },\n  containerTitle: {\n    type: 'f_title',\n    bibtex: (bibTexType: string) => {\n      switch (bibTexType) {\n        case 'conference':\n        case 'inproceedings':\n        case 'incollection':\n          return 'booktitle';\n        default:\n          return 'journal';\n      }\n    },\n    csl: 'container-title',\n  },\n  chapter: {\n    type: 'f_literal',\n    bibtex: 'chapter',\n    csl: 'chapter-number',\n  },\n  date: {\n    type: 'f_date',\n    bibtex: 'date',\n    csl: 'issued',\n  },\n  doi: {\n    type: 'f_verbatim',\n    bibtex: 'doi',\n    csl: 'DOI',\n  },\n  edition: {\n    type: 'f_integer',\n    bibtex: 'edition',\n    csl: 'edition',\n  },\n  editor: {\n    type: 'l_name',\n    bibtex: 'editor',\n    csl: 'editor',\n  },\n  eventdate: {\n    type: 'f_date',\n    bibtex: 'date',\n    csl: 'event-date',\n  },\n  eventtitle: {\n    type: 'f_title',\n    bibtex: 'title',\n    csl: 'event',\n  },\n  howpublished: {\n    type: 'f_literal',\n    bibtex: 'howpublished',\n    csl: 'medium',\n  },\n  issue: {\n    type: 'f_literal',\n    bibtex: 'issue',\n    csl: 'issue',\n  },\n  journaltitle: {\n    type: 'f_literal',\n    bibtex: 'journal',\n    csl: 'container-title',\n  },\n  // Special - not really in CSL or BibTeX\n  langid: {\n    type: 'f_key',\n    bibtex: 'langid',\n    csl: 'language',\n    options: lanagugeMappings,\n  },\n  location: {\n    type: 'l_literal',\n    bibtex: 'address',\n    csl: 'publisher-place',\n  },\n  note: {\n    type: 'f_literal',\n    bibtex: 'note',\n    csl: 'note',\n  },\n  number: {\n    type: 'f_literal',\n    bibtex: 'number',\n    csl: 'collection-number',\n  },\n  pages: {\n    type: 'l_range',\n    bibtex: 'pages',\n    csl: 'page',\n  },\n  publisher: {\n    type: 'l_literal',\n    bibtex: 'publisher',\n    csl: 'publisher',\n  },\n  series: {\n    type: 'f_literal',\n    bibtex: 'series',\n    csl: 'collection-title',\n  },\n  title: {\n    type: 'f_title',\n    bibtex: 'title',\n    csl: 'title',\n  },\n  url: {\n    type: 'f_uri',\n    bibtex: 'url',\n    csl: 'URL',\n  },\n  volume: {\n    type: 'f_literal',\n    bibtex: 'volume',\n    csl: 'volume',\n  },\n};\n","/*\n * language.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Support emitting languages using 'babel' names\n// This isn't strictly supported by pure BibTex\n// but this seems likely to helpful to include\nexport const lanagugeMappings = {\n  acadian: {\n    csl: 'fr-CA',\n    bibtex: 'acadian',\n  },\n  afrikaans: {\n    csl: 'af-ZA',\n    bibtex: 'afrikaans',\n  },\n  arabic: {\n    csl: 'ar',\n    bibtex: 'arabic',\n  },\n  basque: {\n    csl: 'eu',\n    bibtex: 'basque',\n  },\n  bulgarian: {\n    csl: 'bg-BG',\n    bibtex: 'bulgarian',\n  },\n  catalan: {\n    csl: 'ca-AD',\n    bibtex: 'catalan',\n  },\n  chinese: {\n    csl: 'zh-CN',\n    bibtex: 'pinyin',\n  },\n  croatian: {\n    csl: 'hr-HR',\n    bibtex: 'croatian',\n  },\n  czech: {\n    csl: 'cs-CZ',\n    bibtex: 'czech',\n  },\n  danish: {\n    csl: 'da-DK',\n    bibtex: 'danish',\n  },\n  dutch: {\n    csl: 'nl-NL',\n    bibtex: 'dutch',\n  },\n  auenglish: {\n    csl: 'en-GB',\n    bibtex: 'australian',\n  },\n  caenglish: {\n    csl: 'en-US',\n    bibtex: 'canadian',\n  },\n  nzenglish: {\n    csl: 'en-GB',\n    bibtex: 'newzealand',\n  },\n  ukenglish: {\n    csl: 'en-GB',\n    bibtex: 'ukenglish',\n  },\n  usenglish: {\n    csl: 'en-US',\n    bibtex: 'usenglish',\n  },\n  estonian: {\n    csl: 'et-EE',\n    bibtex: 'estonian',\n  },\n  finnish: {\n    csl: 'fi-FI',\n    bibtex: 'finnish',\n  },\n  french: {\n    csl: 'fr-FR',\n    bibtex: 'french',\n  },\n  cafrench: {\n    csl: 'fr-CA',\n    bibtex: 'canadien',\n  },\n  german: {\n    csl: 'de-DE',\n    bibtex: 'ngerman',\n  },\n  atgerman: {\n    csl: 'de-AT',\n    bibtex: 'naustrian',\n  },\n  greek: {\n    csl: 'el-GR',\n    bibtex: 'greek',\n  },\n  hebrew: {\n    csl: 'he-IL',\n    bibtex: 'hebrew',\n  },\n  hungarian: {\n    csl: 'hu-HU',\n    bibtex: 'hungarian',\n  },\n  icelandic: {\n    csl: 'is-IS',\n    bibtex: 'icelandic',\n  },\n  italian: {\n    csl: 'it-IT',\n    bibtex: 'italian',\n  },\n  japanese: {\n    csl: 'ja-JP',\n    bibtex: 'japanese',\n  },\n  latin: {\n    csl: 'la',\n    bibtex: 'latin',\n  },\n  latvian: {\n    csl: 'lv-LV',\n    bibtex: 'latvian',\n  },\n  lithuanian: {\n    csl: 'lt-LT',\n    bibtex: 'lithuanian',\n  },\n  magyar: {\n    csl: 'hu-HU',\n    bibtex: 'magyar',\n  },\n  mongolian: {\n    csl: 'mn-MN',\n    bibtex: 'mongolian',\n  },\n  norwegian: {\n    csl: 'nb-NO',\n    bibtex: 'norsk',\n  },\n  newnorwegian: {\n    csl: 'nn-NO',\n    bibtex: 'nynorsk',\n  },\n  farsi: {\n    csl: 'fa-IR',\n    bibtex: 'farsi',\n  },\n  polish: {\n    csl: 'pl-PL',\n    bibtex: 'polish',\n  },\n  portuguese: {\n    csl: 'pt-PT',\n    bibtex: 'portuguese',\n  },\n  brportuguese: {\n    csl: 'pt-BR',\n    bibtex: 'brazilian',\n  },\n  romanian: {\n    csl: 'ro-RO',\n    bibtex: 'romanian',\n  },\n  russian: {\n    csl: 'ru-RU',\n    bibtex: 'russian',\n  },\n  serbian: {\n    csl: 'sr-RS',\n    bibtex: 'serbian',\n  },\n  cyrillicserbian: {\n    csl: 'sr-RS',\n    bibtex: 'serbianc',\n  },\n  slovak: {\n    csl: 'sk-SK',\n    bibtex: 'slovak',\n  },\n  slovene: {\n    csl: 'sl-SL',\n    bibtex: 'slovene',\n  },\n  spanish: {\n    csl: 'es-ES',\n    bibtex: 'spanish',\n  },\n  swedish: {\n    csl: 'sv-SE',\n    bibtex: 'swedish',\n  },\n  thai: {\n    csl: 'th-TH',\n    bibtex: 'thai',\n  },\n  turkish: {\n    csl: 'tr-TR',\n    bibtex: 'turkish',\n  },\n  ukrainian: {\n    csl: 'uk-UA',\n    bibtex: 'ukrainian',\n  },\n  vietnamese: {\n    csl: 'vi-VN',\n    bibtex: 'vietnamese',\n  },\n};\n","/*\n * types.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { cslTypes } from '../csl';\n\nexport interface Type {\n  bibtex: string;\n  fieldsRequired: string[];\n  fieldsOptional: string[];\n  fieldsEitherOr: string[];\n}\n\n// Maps CSL Types to the equivalent BibTeX types.\n// Mapping derived from:\n// https://github.com/citation-style-language/styles/blob/master/bibtex.csl\nexport function typeMapping(cslType: string): Type {\n  switch (cslType) {\n    case cslTypes.article:\n    case cslTypes.articleJournal:\n    case cslTypes.articleMagazine:\n    case cslTypes.articleNewspaper:\n      return {\n        bibtex: BibTextTypes.article.type,\n        ...BibTextTypes.article.fields,\n      };\n\n    case cslTypes.book:\n      return {\n        bibtex: BibTextTypes.book.type,\n        ...BibTextTypes.book.fields,\n      };\n\n    case cslTypes.chapter:\n      return {\n        bibtex: BibTextTypes.inbook.type,\n        ...BibTextTypes.inbook.fields,\n      };\n\n    case cslTypes.thesis:\n      return {\n        bibtex: BibTextTypes.phdthesis.type,\n        ...BibTextTypes.phdthesis.fields,\n      };\n\n    case cslTypes.manuscript:\n      return {\n        bibtex: BibTextTypes.unpublished.type,\n        ...BibTextTypes.unpublished.fields,\n      };\n\n    case cslTypes.paperConference:\n      return {\n        bibtex: BibTextTypes.inproceedings.type,\n        ...BibTextTypes.inproceedings.fields,\n      };\n\n    case cslTypes.report:\n      return {\n        bibtex: BibTextTypes.techreport.type,\n        ...BibTextTypes.techreport.fields,\n      };\n\n    case cslTypes.bill:\n    case cslTypes.graphic:\n    case cslTypes.legalCase:\n    case cslTypes.legislation:\n    case cslTypes.motionPicture:\n    case cslTypes.report:\n    case cslTypes.song:\n    default:\n      return {\n        bibtex: BibTextTypes.misc.type,\n        ...BibTextTypes.misc.fields,\n      };\n  }\n}\n\n// BibTeX types and their fields\n// See https://www.openoffice.org/bibliographic/bibtex-defs.html\n// (a corrected version of Appendix B.2 of the LATEX book [2], © 1986, by Addison-Wesley.)\nexport const BibTextTypes = {\n  // An article from a journal or magazine.\n  article: {\n    type: 'article',\n    fields: {\n      fieldsRequired: ['author', 'title', 'journal', 'year'],\n      fieldsOptional: ['volume', 'number', 'pages', 'month', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n  // A book with an explicit publisher.\n  book: {\n    type: 'book',\n    fields: {\n      fieldsRequired: ['title', 'publisher', 'year'],\n      fieldsOptional: ['volume', 'number', 'series', 'address', 'edition', 'month', 'note'],\n      fieldsEitherOr: ['author', 'editor'],\n    },\n  },\n\n  // A work that is printed and bound, but without a named publisher or sponsoring institution.\n  booklet: {\n    type: 'booklet',\n    fields: {\n      fieldsRequired: ['title'],\n      fieldsOptional: ['author', 'howpublished', 'address', 'month', 'year', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // The same as inproceedings, included for Scribe compatibility.\n  conference: {\n    type: 'conference',\n    fields: {\n      fieldsRequired: ['author', 'title', 'booktitle', 'year'],\n      fieldsOptional: [\n        'editor',\n        'volume',\n        'number',\n        'series',\n        'pages',\n        'address',\n        'month',\n        'organization',\n        'publisher',\n        'note',\n      ],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // A part of a book, which may be a chapter (or section or whatever) and/or a range of pages.\n  inbook: {\n    type: 'inbook',\n    fields: {\n      fieldsRequired: ['title', 'chapter', 'pages', 'publisher', 'year'],\n      fieldsOptional: ['volume', 'number', 'series', 'type', 'address', 'edition', 'month', 'note'],\n      fieldsEitherOr: ['author', 'editor'],\n    },\n  },\n\n  // A part of a book having its own title.\n  incollection: {\n    type: 'incollection',\n    fields: {\n      fieldsRequired: ['author', 'title', 'booktitle', 'publisher', 'year'],\n      fieldsOptional: [\n        'editor',\n        'volume',\n        'number',\n        'series',\n        'type',\n        'chapter',\n        'pages',\n        'address',\n        'edition',\n        'month',\n        'note',\n      ],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // An article in a conference proceedings.\n  inproceedings: {\n    type: 'inproceedings',\n    fields: {\n      fieldsRequired: ['author', 'title', 'booktitle', 'year'],\n      fieldsOptional: [\n        'editor',\n        'volume',\n        'number',\n        'series',\n        'pages',\n        'address',\n        'month',\n        'organization',\n        'publisher',\n        'note',\n      ],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // Technical documentation\n  manual: {\n    type: 'manual',\n    fields: {\n      fieldsRequired: ['title'],\n      fieldsOptional: ['author', 'organization', 'address', 'edition', 'month', 'year', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // A Master's thesis.\n  mastersthesis: {\n    type: 'mastersthesis',\n    fields: {\n      fieldsRequired: ['author', 'title', 'school', 'year'],\n      fieldsOptional: ['type', 'address', 'month', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // Use this type when nothing else fits.\n  misc: {\n    type: 'misc',\n    fields: {\n      fieldsRequired: [],\n      fieldsOptional: ['author', 'title', 'howpublished', 'month', 'year', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // A PhD thesis.\n  phdthesis: {\n    type: 'phdthesis',\n    fields: {\n      fieldsRequired: ['author', 'title', 'school', 'year'],\n      fieldsOptional: ['type', 'address', 'month', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // The proceedings of a conference.\n  proceedings: {\n    type: 'proceedings',\n    fields: {\n      fieldsRequired: ['title', 'year'],\n      fieldsOptional: ['editor', 'volume', 'number', 'series', 'address', 'month', 'organization', 'publisher', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // A report published by a school or other institution, usually numbered within a series.\n  techreport: {\n    type: 'techreport',\n    fields: {\n      fieldsRequired: ['author', 'title', 'institution', 'year'],\n      fieldsOptional: ['type', 'number', 'address', 'month', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // A document having an author and title, but not formally published.\n  unpublished: {\n    type: 'unpublished',\n    fields: {\n      fieldsRequired: ['author', 'title', 'note'],\n      fieldsOptional: ['month', 'year'],\n      fieldsEitherOr: [],\n    },\n  },\n};\n","/*\n * formatting.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface FormattingTag {\n  open: string;\n  close: string;\n  verbatim: boolean;\n}\n\n// Maps formatting tags/marks to the LaTeX replacements\n// When marks are applied to text nodes, these will be emitted in place of those marks\nexport const FormattingTags: { [key: string]: FormattingTag } = {\n  strong: { open: '\\\\textbf{', close: '}', verbatim: false },\n  em: { open: '\\\\emph{', close: '}', verbatim: false },\n  sub: { open: '\\\\textsubscript{', close: '}', verbatim: false },\n  sup: { open: '\\\\textsuperscript{', close: '}', verbatim: false },\n  nocase: { open: '{{', close: '}}', verbatim: false },\n  smallcaps: { open: '\\\\textsc{', close: '}', verbatim: false },\n  enquote: { open: '\\\\enquote{', close: '}', verbatim: false },\n  math: { open: '$', close: '$', verbatim: false },\n  url: { open: '\\\\url{', close: '}', verbatim: true },\n};\n","/*\n * character.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Maps unicode characters to their latex equivalent.\n// Generated from:\n// https://www.w3.org/2003/entities/2007xml/unicode.xml\n// and\n// http://www.w3.org/Math/characters/unicode.xml\n//\n// When both xml files contained entries for a unicode character,\n// the definition provided by entities/2007xml was preferred\nexport interface CharacterMap {\n  id: string;\n  decimal: number;\n  character: string;\n  latex: string;\n  ungrouped?: boolean;\n}\n\nconst characters: { [key: number]: CharacterMap } = {\n  34: { id: 'U00022', decimal: 34, character: '\"', latex: '\"' },\n  35: { id: 'U00023', decimal: 35, character: '#', latex: '\\\\#' },\n  36: { id: 'U00024', decimal: 36, character: '$', latex: '\\\\$' },\n  94: { id: 'U0005e', decimal: 94, character: '^', latex: '\\\\textasciicircum' },\n  95: { id: 'U0005f', decimal: 95, character: '_', latex: '\\\\_' },\n  123: { id: 'U0007b', decimal: 123, character: '{', latex: '\\\\textbraceleft' },\n  125: { id: 'U0007d', decimal: 125, character: '}', latex: '\\\\textbraceright' },\n  256: {\n    id: 'U00100',\n    decimal: 256,\n    character: 'Ā',\n    latex: '\\\\={A}',\n  },\n  257: {\n    id: 'U00101',\n    decimal: 257,\n    character: 'ā',\n    latex: '\\\\={a}',\n  },\n  258: {\n    id: 'U00102',\n    decimal: 258,\n    character: 'Ă',\n    latex: '\\\\u{A}',\n  },\n  259: {\n    id: 'U00103',\n    decimal: 259,\n    character: 'ă',\n    latex: '\\\\u{a}',\n  },\n  260: {\n    id: 'U00104',\n    decimal: 260,\n    character: 'Ą',\n    latex: '\\\\k{A}',\n  },\n  261: {\n    id: 'U00105',\n    decimal: 261,\n    character: 'ą',\n    latex: '\\\\k{a}',\n  },\n  262: {\n    id: 'U00106',\n    decimal: 262,\n    character: 'Ć',\n    latex: \"\\\\'{C}\",\n  },\n  263: {\n    id: 'U00107',\n    decimal: 263,\n    character: 'ć',\n    latex: \"\\\\'{c}\",\n  },\n  264: {\n    id: 'U00108',\n    decimal: 264,\n    character: 'Ĉ',\n    latex: '\\\\^{C}',\n  },\n  265: {\n    id: 'U00109',\n    decimal: 265,\n    character: 'ĉ',\n    latex: '\\\\^{c}',\n  },\n  266: {\n    id: 'U0010A',\n    decimal: 266,\n    character: 'Ċ',\n    latex: '\\\\.{C}',\n  },\n  267: {\n    id: 'U0010B',\n    decimal: 267,\n    character: 'ċ',\n    latex: '\\\\.{c}',\n  },\n  268: {\n    id: 'U0010C',\n    decimal: 268,\n    character: 'Č',\n    latex: '\\\\v{C}',\n  },\n  269: {\n    id: 'U0010D',\n    decimal: 269,\n    character: 'č',\n    latex: '\\\\v{c}',\n  },\n  270: {\n    id: 'U0010E',\n    decimal: 270,\n    character: 'Ď',\n    latex: '\\\\v{D}',\n  },\n  271: {\n    id: 'U0010F',\n    decimal: 271,\n    character: 'ď',\n    latex: '\\\\v{d}',\n  },\n  272: {\n    id: 'U00110',\n    decimal: 272,\n    character: 'Đ',\n    latex: '\\\\DJ',\n  },\n  273: {\n    id: 'U00111',\n    decimal: 273,\n    character: 'đ',\n    latex: '\\\\dj',\n  },\n  274: {\n    id: 'U00112',\n    decimal: 274,\n    character: 'Ē',\n    latex: '\\\\={E}',\n  },\n  275: {\n    id: 'U00113',\n    decimal: 275,\n    character: 'ē',\n    latex: '\\\\={e}',\n  },\n  276: {\n    id: 'U00114',\n    decimal: 276,\n    character: 'Ĕ',\n    latex: '\\\\u{E}',\n  },\n  277: {\n    id: 'U00115',\n    decimal: 277,\n    character: 'ĕ',\n    latex: '\\\\u{e}',\n  },\n  278: {\n    id: 'U00116',\n    decimal: 278,\n    character: 'Ė',\n    latex: '\\\\.{E}',\n  },\n  279: {\n    id: 'U00117',\n    decimal: 279,\n    character: 'ė',\n    latex: '\\\\.{e}',\n  },\n  280: {\n    id: 'U00118',\n    decimal: 280,\n    character: 'Ę',\n    latex: '\\\\k{E}',\n  },\n  281: {\n    id: 'U00119',\n    decimal: 281,\n    character: 'ę',\n    latex: '\\\\k{e}',\n  },\n  282: {\n    id: 'U0011A',\n    decimal: 282,\n    character: 'Ě',\n    latex: '\\\\v{E}',\n  },\n  283: {\n    id: 'U0011B',\n    decimal: 283,\n    character: 'ě',\n    latex: '\\\\v{e}',\n  },\n  284: {\n    id: 'U0011C',\n    decimal: 284,\n    character: 'Ĝ',\n    latex: '\\\\^{G}',\n  },\n  285: {\n    id: 'U0011D',\n    decimal: 285,\n    character: 'ĝ',\n    latex: '\\\\^{g}',\n  },\n  286: {\n    id: 'U0011E',\n    decimal: 286,\n    character: 'Ğ',\n    latex: '\\\\u{G}',\n  },\n  287: {\n    id: 'U0011F',\n    decimal: 287,\n    character: 'ğ',\n    latex: '\\\\u{g}',\n  },\n  288: {\n    id: 'U00120',\n    decimal: 288,\n    character: 'Ġ',\n    latex: '\\\\.{G}',\n  },\n  289: {\n    id: 'U00121',\n    decimal: 289,\n    character: 'ġ',\n    latex: '\\\\.{g}',\n  },\n  290: {\n    id: 'U00122',\n    decimal: 290,\n    character: 'Ģ',\n    latex: '\\\\c{G}',\n  },\n  291: {\n    id: 'U00123',\n    decimal: 291,\n    character: 'ģ',\n    latex: '\\\\c{g}',\n  },\n  292: {\n    id: 'U00124',\n    decimal: 292,\n    character: 'Ĥ',\n    latex: '\\\\^{H}',\n  },\n  293: {\n    id: 'U00125',\n    decimal: 293,\n    character: 'ĥ',\n    latex: '\\\\^{h}',\n  },\n  296: {\n    id: 'U00128',\n    decimal: 296,\n    character: 'Ĩ',\n    latex: '\\\\~{I}',\n  },\n  297: {\n    id: 'U00129',\n    decimal: 297,\n    character: 'ĩ',\n    latex: '\\\\~{\\\\i}',\n  },\n  298: {\n    id: 'U0012A',\n    decimal: 298,\n    character: 'Ī',\n    latex: '\\\\={I}',\n  },\n  299: {\n    id: 'U0012B',\n    decimal: 299,\n    character: 'ī',\n    latex: '\\\\={\\\\i}',\n  },\n  300: {\n    id: 'U0012C',\n    decimal: 300,\n    character: 'Ĭ',\n    latex: '\\\\u{I}',\n  },\n  301: {\n    id: 'U0012D',\n    decimal: 301,\n    character: 'ĭ',\n    latex: '\\\\u{\\\\i}',\n  },\n  302: {\n    id: 'U0012E',\n    decimal: 302,\n    character: 'Į',\n    latex: '\\\\k{I}',\n  },\n  303: {\n    id: 'U0012F',\n    decimal: 303,\n    character: 'į',\n    latex: '\\\\k{i}',\n  },\n  304: {\n    id: 'U00130',\n    decimal: 304,\n    character: 'İ',\n    latex: '\\\\.{I}',\n  },\n  305: {\n    id: 'U00131',\n    decimal: 305,\n    character: 'ı',\n    latex: '\\\\i',\n  },\n  306: {\n    id: 'U00132',\n    decimal: 306,\n    character: 'IJ',\n    latex: 'IJ',\n  },\n  307: {\n    id: 'U00133',\n    decimal: 307,\n    character: 'ij',\n    latex: 'ij',\n  },\n  308: {\n    id: 'U00134',\n    decimal: 308,\n    character: 'Ĵ',\n    latex: '\\\\^{J}',\n  },\n  309: {\n    id: 'U00135',\n    decimal: 309,\n    character: 'ĵ',\n    latex: '\\\\^{\\\\j}',\n  },\n  310: {\n    id: 'U00136',\n    decimal: 310,\n    character: 'Ķ',\n    latex: '\\\\c{K}',\n  },\n  311: {\n    id: 'U00137',\n    decimal: 311,\n    character: 'ķ',\n    latex: '\\\\c{k}',\n  },\n  313: {\n    id: 'U00139',\n    decimal: 313,\n    character: 'Ĺ',\n    latex: \"\\\\'{L}\",\n  },\n  314: {\n    id: 'U0013A',\n    decimal: 314,\n    character: 'ĺ',\n    latex: \"\\\\'{l}\",\n  },\n  315: {\n    id: 'U0013B',\n    decimal: 315,\n    character: 'Ļ',\n    latex: '\\\\c{L}',\n  },\n  316: {\n    id: 'U0013C',\n    decimal: 316,\n    character: 'ļ',\n    latex: '\\\\c{l}',\n  },\n  317: {\n    id: 'U0013D',\n    decimal: 317,\n    character: 'Ľ',\n    latex: '\\\\v{L}',\n  },\n  318: {\n    id: 'U0013E',\n    decimal: 318,\n    character: 'ľ',\n    latex: '\\\\v{l}',\n  },\n  321: {\n    id: 'U00141',\n    decimal: 321,\n    character: 'Ł',\n    latex: '\\\\L',\n  },\n  322: {\n    id: 'U00142',\n    decimal: 322,\n    character: 'ł',\n    latex: '\\\\l',\n  },\n  323: {\n    id: 'U00143',\n    decimal: 323,\n    character: 'Ń',\n    latex: \"\\\\'{N}\",\n  },\n  324: {\n    id: 'U00144',\n    decimal: 324,\n    character: 'ń',\n    latex: \"\\\\'{n}\",\n  },\n  325: {\n    id: 'U00145',\n    decimal: 325,\n    character: 'Ņ',\n    latex: '\\\\c{N}',\n  },\n  326: {\n    id: 'U00146',\n    decimal: 326,\n    character: 'ņ',\n    latex: '\\\\c{n}',\n  },\n  327: {\n    id: 'U00147',\n    decimal: 327,\n    character: 'Ň',\n    latex: '\\\\v{N}',\n  },\n  328: {\n    id: 'U00148',\n    decimal: 328,\n    character: 'ň',\n    latex: '\\\\v{n}',\n  },\n  329: {\n    id: 'U00149',\n    decimal: 329,\n    character: 'ʼn',\n    latex: \"'n\",\n  },\n  330: {\n    id: 'U0014A',\n    decimal: 330,\n    character: 'Ŋ',\n    latex: '\\\\NG',\n  },\n  331: {\n    id: 'U0014B',\n    decimal: 331,\n    character: 'ŋ',\n    latex: '\\\\ng',\n  },\n  332: {\n    id: 'U0014C',\n    decimal: 332,\n    character: 'Ō',\n    latex: '\\\\={O}',\n  },\n  333: {\n    id: 'U0014D',\n    decimal: 333,\n    character: 'ō',\n    latex: '\\\\={o}',\n  },\n  334: {\n    id: 'U0014E',\n    decimal: 334,\n    character: 'Ŏ',\n    latex: '\\\\u{O}',\n  },\n  335: {\n    id: 'U0014F',\n    decimal: 335,\n    character: 'ŏ',\n    latex: '\\\\u{o}',\n  },\n  336: {\n    id: 'U00150',\n    decimal: 336,\n    character: 'Ő',\n    latex: '{\\\\H O}',\n  },\n  337: {\n    id: 'U00151',\n    decimal: 337,\n    character: 'ő',\n    latex: '{\\\\H o}',\n  },\n  338: {\n    id: 'U00152',\n    decimal: 338,\n    character: 'Œ',\n    latex: '\\\\OE',\n  },\n  339: {\n    id: 'U00153',\n    decimal: 339,\n    character: 'œ',\n    latex: '\\\\oe',\n  },\n  340: {\n    id: 'U00154',\n    decimal: 340,\n    character: 'Ŕ',\n    latex: \"\\\\'{R}\",\n  },\n  341: {\n    id: 'U00155',\n    decimal: 341,\n    character: 'ŕ',\n    latex: \"\\\\'{r}\",\n  },\n  342: {\n    id: 'U00156',\n    decimal: 342,\n    character: 'Ŗ',\n    latex: '\\\\c{R}',\n  },\n  343: {\n    id: 'U00157',\n    decimal: 343,\n    character: 'ŗ',\n    latex: '\\\\c{r}',\n  },\n  344: {\n    id: 'U00158',\n    decimal: 344,\n    character: 'Ř',\n    latex: '\\\\v{R}',\n  },\n  345: {\n    id: 'U00159',\n    decimal: 345,\n    character: 'ř',\n    latex: '\\\\v{r}',\n  },\n  346: {\n    id: 'U0015A',\n    decimal: 346,\n    character: 'Ś',\n    latex: \"\\\\'{S}\",\n  },\n  347: {\n    id: 'U0015B',\n    decimal: 347,\n    character: 'ś',\n    latex: \"\\\\'{s}\",\n  },\n  348: {\n    id: 'U0015C',\n    decimal: 348,\n    character: 'Ŝ',\n    latex: '\\\\^{S}',\n  },\n  349: {\n    id: 'U0015D',\n    decimal: 349,\n    character: 'ŝ',\n    latex: '\\\\^{s}',\n  },\n  350: {\n    id: 'U0015E',\n    decimal: 350,\n    character: 'Ş',\n    latex: '\\\\c{S}',\n  },\n  351: {\n    id: 'U0015F',\n    decimal: 351,\n    character: 'ş',\n    latex: '\\\\c{s}',\n  },\n  352: {\n    id: 'U00160',\n    decimal: 352,\n    character: 'Š',\n    latex: '\\\\v{S}',\n  },\n  353: {\n    id: 'U00161',\n    decimal: 353,\n    character: 'š',\n    latex: '\\\\v{s}',\n  },\n  354: {\n    id: 'U00162',\n    decimal: 354,\n    character: 'Ţ',\n    latex: '\\\\c{T}',\n  },\n  355: {\n    id: 'U00163',\n    decimal: 355,\n    character: 'ţ',\n    latex: '\\\\c{t}',\n  },\n  356: {\n    id: 'U00164',\n    decimal: 356,\n    character: 'Ť',\n    latex: '\\\\v{T}',\n  },\n  357: {\n    id: 'U00165',\n    decimal: 357,\n    character: 'ť',\n    latex: '\\\\v{t}',\n  },\n  360: {\n    id: 'U00168',\n    decimal: 360,\n    character: 'Ũ',\n    latex: '\\\\~{U}',\n  },\n  361: {\n    id: 'U00169',\n    decimal: 361,\n    character: 'ũ',\n    latex: '\\\\~{u}',\n  },\n  362: {\n    id: 'U0016A',\n    decimal: 362,\n    character: 'Ū',\n    latex: '\\\\={U}',\n  },\n  363: {\n    id: 'U0016B',\n    decimal: 363,\n    character: 'ū',\n    latex: '\\\\={u}',\n  },\n  364: {\n    id: 'U0016C',\n    decimal: 364,\n    character: 'Ŭ',\n    latex: '\\\\u{U}',\n  },\n  365: {\n    id: 'U0016D',\n    decimal: 365,\n    character: 'ŭ',\n    latex: '\\\\u{u}',\n  },\n  366: {\n    id: 'U0016E',\n    decimal: 366,\n    character: 'Ů',\n    latex: '\\\\r{U}',\n  },\n  367: {\n    id: 'U0016F',\n    decimal: 367,\n    character: 'ů',\n    latex: '\\\\r{u}',\n  },\n  368: {\n    id: 'U00170',\n    decimal: 368,\n    character: 'Ű',\n    latex: '{\\\\H U}',\n  },\n  369: {\n    id: 'U00171',\n    decimal: 369,\n    character: 'ű',\n    latex: '{\\\\H u}',\n  },\n  370: {\n    id: 'U00172',\n    decimal: 370,\n    character: 'Ų',\n    latex: '\\\\k{U}',\n  },\n  371: {\n    id: 'U00173',\n    decimal: 371,\n    character: 'ų',\n    latex: '\\\\k{u}',\n  },\n  372: {\n    id: 'U00174',\n    decimal: 372,\n    character: 'Ŵ',\n    latex: '\\\\^{W}',\n  },\n  373: {\n    id: 'U00175',\n    decimal: 373,\n    character: 'ŵ',\n    latex: '\\\\^{w}',\n  },\n  374: {\n    id: 'U00176',\n    decimal: 374,\n    character: 'Ŷ',\n    latex: '\\\\^{Y}',\n  },\n  375: {\n    id: 'U00177',\n    decimal: 375,\n    character: 'ŷ',\n    latex: '\\\\^{y}',\n  },\n  376: {\n    id: 'U00178',\n    decimal: 376,\n    character: 'Ÿ',\n    latex: '\\\\\"{Y}',\n  },\n  377: {\n    id: 'U00179',\n    decimal: 377,\n    character: 'Ź',\n    latex: \"\\\\'{Z}\",\n  },\n  378: {\n    id: 'U0017A',\n    decimal: 378,\n    character: 'ź',\n    latex: \"\\\\'{z}\",\n  },\n  379: {\n    id: 'U0017B',\n    decimal: 379,\n    character: 'Ż',\n    latex: '\\\\.{Z}',\n  },\n  380: {\n    id: 'U0017C',\n    decimal: 380,\n    character: 'ż',\n    latex: '\\\\.{z}',\n  },\n  381: {\n    id: 'U0017D',\n    decimal: 381,\n    character: 'Ž',\n    latex: '\\\\v{Z}',\n  },\n  382: {\n    id: 'U0017E',\n    decimal: 382,\n    character: 'ž',\n    latex: '\\\\v{z}',\n  },\n  402: {\n    id: 'U00192',\n    decimal: 402,\n    character: 'ƒ',\n    latex: '\\\\textflorin',\n  },\n  501: {\n    id: 'U001F5',\n    decimal: 501,\n    character: 'ǵ',\n    latex: \"\\\\'{g}\",\n  },\n  609: {\n    id: 'U00261',\n    decimal: 609,\n    character: 'ɡ',\n    latex: 'g',\n  },\n  700: {\n    id: 'U002BC',\n    decimal: 700,\n    character: 'ʼ',\n    latex: \"'\",\n  },\n  711: {\n    id: 'U002C7',\n    decimal: 711,\n    character: 'ˇ',\n    latex: '\\\\textasciicaron',\n  },\n  714: {\n    id: 'U002ca',\n    decimal: 714,\n    character: 'ˊ',\n    latex: '\\\\textasciitilde',\n  },\n  728: {\n    id: 'U002D8',\n    decimal: 728,\n    character: '˘',\n    latex: '\\\\textasciibreve',\n  },\n  729: {\n    id: 'U002D9',\n    decimal: 729,\n    character: '˙',\n    latex: '\\\\textperiodcentered',\n  },\n  730: {\n    id: 'U002DA',\n    decimal: 730,\n    character: '˚',\n    latex: '\\\\r{}',\n  },\n  731: {\n    id: 'U002DB',\n    decimal: 731,\n    character: '˛',\n    latex: '\\\\k{}',\n  },\n  732: {\n    id: 'U002DC',\n    decimal: 732,\n    character: '˜',\n    latex: '\\\\texttildelow',\n  },\n  733: {\n    id: 'U002dd',\n    decimal: 733,\n    character: '˝',\n    latex: '\\\\textacutedbl',\n  },\n  768: {\n    id: 'U00300',\n    decimal: 768,\n    character: '̀',\n    latex: '\\\\`',\n    ungrouped: true,\n  },\n  769: {\n    id: 'U00301',\n    decimal: 769,\n    character: '́',\n    latex: \"\\\\'\",\n    ungrouped: true,\n  },\n  770: {\n    id: 'U00302',\n    decimal: 770,\n    character: '̂',\n    latex: '\\\\^',\n    ungrouped: true,\n  },\n  771: {\n    id: 'U00303',\n    decimal: 771,\n    character: '̃',\n    latex: '\\\\~',\n    ungrouped: true,\n  },\n  772: {\n    id: 'U00304',\n    decimal: 772,\n    character: '̄',\n    latex: '\\\\=',\n    ungrouped: true,\n  },\n  774: {\n    id: 'U00306',\n    decimal: 774,\n    character: '̆',\n    latex: '\\\\u',\n    ungrouped: true,\n  },\n  775: {\n    id: 'U00307',\n    decimal: 775,\n    character: '̇',\n    latex: '\\\\.',\n    ungrouped: true,\n  },\n  776: {\n    id: 'U00308',\n    decimal: 776,\n    character: '̈',\n    latex: '\\\\\"',\n    ungrouped: true,\n  },\n  778: {\n    id: 'U0030A',\n    decimal: 778,\n    character: '̊',\n    latex: '\\\\r',\n    ungrouped: true,\n  },\n  780: {\n    id: 'U0030C',\n    decimal: 780,\n    character: '̌',\n    latex: '\\\\v',\n    ungrouped: true,\n  },\n  807: {\n    id: 'U00327',\n    decimal: 807,\n    character: '̧',\n    latex: '\\\\c',\n    ungrouped: true,\n  },\n  808: {\n    id: 'U00328',\n    decimal: 808,\n    character: '̨',\n    latex: '\\\\k',\n    ungrouped: true,\n  },\n  902: {\n    id: 'U00386',\n    decimal: 902,\n    character: 'Ά',\n    latex: \"\\\\'{A}\",\n  },\n  904: {\n    id: 'U00388',\n    decimal: 904,\n    character: 'Έ',\n    latex: \"\\\\'{E}\",\n  },\n  905: {\n    id: 'U00389',\n    decimal: 905,\n    character: 'Ή',\n    latex: \"\\\\'{H}\",\n  },\n  906: {\n    id: 'U0038A',\n    decimal: 906,\n    character: 'Ί',\n    latex: \"\\\\'{}{I}\",\n  },\n  908: {\n    id: 'U0038C',\n    decimal: 908,\n    character: 'Ό',\n    latex: \"\\\\'{}O\",\n  },\n  910: {\n    id: 'U0038E',\n    decimal: 910,\n    character: 'Ύ',\n    latex: \"$\\\\mathrm{'Y}$\",\n  },\n  911: {\n    id: 'U0038F',\n    decimal: 911,\n    character: 'Ώ',\n    latex: \"$\\\\mathrm{'\\\\Omega}$\",\n  },\n  924: {\n    id: 'U0039C',\n    decimal: 924,\n    character: 'Μ',\n    latex: 'M',\n  },\n  925: {\n    id: 'U0039D',\n    decimal: 925,\n    character: 'Ν',\n    latex: 'N',\n  },\n  927: {\n    id: 'U0039F',\n    decimal: 927,\n    character: 'Ο',\n    latex: 'O',\n  },\n  938: {\n    id: 'U003AA',\n    decimal: 938,\n    character: 'Ϊ',\n    latex: '$\\\\mathrm{\\\\ddot{I}}$',\n  },\n  939: {\n    id: 'U003AB',\n    decimal: 939,\n    character: 'Ϋ',\n    latex: '$\\\\mathrm{\\\\ddot{Y}}$',\n  },\n  940: {\n    id: 'U003AC',\n    decimal: 940,\n    character: 'ά',\n    latex: \"\\\\'{$\\\\alpha$}\",\n  },\n  959: {\n    id: 'U003BF',\n    decimal: 959,\n    character: 'ο',\n    latex: 'o',\n  },\n  972: {\n    id: 'U003CC',\n    decimal: 972,\n    character: 'ό',\n    latex: \"\\\\'{o}\",\n  },\n  8194: {\n    id: 'U02002',\n    decimal: 8194,\n    character: ' ',\n    latex: '\\\\hspace{0.6em}',\n  },\n  8195: {\n    id: 'U02003',\n    decimal: 8195,\n    character: ' ',\n    latex: '\\\\hspace{1em}',\n  },\n  8196: {\n    id: 'U02004',\n    decimal: 8196,\n    character: ' ',\n    latex: '\\\\hspace{0.33em}',\n  },\n  8197: {\n    id: 'U02005',\n    decimal: 8197,\n    character: ' ',\n    latex: '\\\\hspace{0.25em}',\n  },\n  8198: {\n    id: 'U02006',\n    decimal: 8198,\n    character: ' ',\n    latex: '\\\\hspace{0.166em}',\n  },\n  8199: {\n    id: 'U02007',\n    decimal: 8199,\n    character: ' ',\n    latex: '\\\\hphantom{0}',\n  },\n  8200: {\n    id: 'U02008',\n    decimal: 8200,\n    character: ' ',\n    latex: '\\\\hphantom{,}',\n  },\n  8201: {\n    id: 'U02009',\n    decimal: 8201,\n    character: ' ',\n    latex: '\\\\hspace{0.167em}',\n  },\n  8204: {\n    id: 'U00200c',\n    decimal: 8204,\n    character: '‌',\n    latex: '\\\\textcompwordmark',\n  },\n  8208: {\n    id: 'U02010',\n    decimal: 8208,\n    character: '‐',\n    latex: '-',\n  },\n  8211: {\n    id: 'U02013',\n    decimal: 8211,\n    character: '–',\n    latex: '\\\\textendash',\n  },\n  8212: {\n    id: 'U02014',\n    decimal: 8212,\n    character: '—',\n    latex: '\\\\textemdash',\n  },\n  8213: {\n    id: 'U02015',\n    decimal: 8213,\n    character: '―',\n    latex: '\\\\rule{1em}{1pt}',\n  },\n  8216: {\n    id: 'U02018',\n    decimal: 8216,\n    character: '‘',\n    latex: '\\\\textquoteleft',\n  },\n  8217: {\n    id: 'U02019',\n    decimal: 8217,\n    character: '’',\n    latex: '\\\\textquoteright',\n  },\n  8218: {\n    id: 'U0201A',\n    decimal: 8218,\n    character: '‚',\n    latex: ',',\n  },\n  8220: {\n    id: 'U0201C',\n    decimal: 8220,\n    character: '“',\n    latex: '\\\\textquotedblleft',\n  },\n  8221: {\n    id: 'U0201D',\n    decimal: 8221,\n    character: '”',\n    latex: '\\\\textquotedblright',\n  },\n  8222: {\n    id: 'U0201E',\n    decimal: 8222,\n    character: '„',\n    latex: ',,',\n  },\n  8224: {\n    id: 'U02020',\n    decimal: 8224,\n    character: '†',\n    latex: '\\\\textdagger',\n  },\n  8225: {\n    id: 'U02021',\n    decimal: 8225,\n    character: '‡',\n    latex: '\\\\textdaggerdbl',\n  },\n  8226: {\n    id: 'U02022',\n    decimal: 8226,\n    character: '•',\n    latex: '\\\\textbullet',\n  },\n  8228: {\n    id: 'U02024',\n    decimal: 8228,\n    character: '․',\n    latex: '.',\n  },\n  8229: {\n    id: 'U02025',\n    decimal: 8229,\n    character: '‥',\n    latex: '..',\n  },\n  8230: {\n    id: 'U02026',\n    decimal: 8230,\n    character: '…',\n    latex: '\\\\ldots',\n  },\n  8240: {\n    id: 'U02030',\n    decimal: 8240,\n    character: '‰',\n    latex: '\\\\textperthousand',\n  },\n  8241: {\n    id: 'U02031',\n    decimal: 8241,\n    character: '‱',\n    latex: '\\\\textpertenthousand',\n  },\n  8242: {\n    id: 'U02032',\n    decimal: 8242,\n    character: '′',\n    latex: \"{'}\",\n  },\n  8243: {\n    id: 'U02033',\n    decimal: 8243,\n    character: '″',\n    latex: \"{''}\",\n  },\n  8244: {\n    id: 'U02034',\n    decimal: 8244,\n    character: '‴',\n    latex: \"{'''}\",\n  },\n  8249: {\n    id: 'U02039',\n    decimal: 8249,\n    character: '‹',\n    latex: '\\\\guilsinglleft',\n  },\n  8250: {\n    id: 'U0203A',\n    decimal: 8250,\n    character: '›',\n    latex: '\\\\guilsinglright',\n  },\n  8279: {\n    id: 'U02057',\n    decimal: 8279,\n    character: '⁗',\n    latex: \"''''\",\n  },\n  8288: {\n    id: 'U02060',\n    decimal: 8288,\n    character: '⁠',\n    latex: '\\\\nolinebreak',\n  },\n  8364: {\n    id: 'U020AC',\n    decimal: 8364,\n    character: '€',\n    latex: '\\\\mbox{\\\\texteuro}',\n  },\n  8450: {\n    id: 'U02102',\n    decimal: 8450,\n    character: 'ℂ',\n    latex: '$\\\\mathbb{C}$',\n  },\n  8460: {\n    id: 'U0210C',\n    decimal: 8460,\n    character: 'ℌ',\n    latex: '$\\\\mathfrak{H}$',\n  },\n  8461: {\n    id: 'U0210D',\n    decimal: 8461,\n    character: 'ℍ',\n    latex: '$\\\\mathbb{H}$',\n  },\n  8465: {\n    id: 'U02111',\n    decimal: 8465,\n    character: 'ℑ',\n    latex: '$\\\\mathfrak{I}$',\n  },\n  8469: {\n    id: 'U02115',\n    decimal: 8469,\n    character: 'ℕ',\n    latex: '$\\\\mathbb{N}$',\n  },\n  8473: {\n    id: 'U02119',\n    decimal: 8473,\n    character: 'ℙ',\n    latex: '$\\\\mathbb{P}$',\n  },\n  8474: {\n    id: 'U0211A',\n    decimal: 8474,\n    character: 'ℚ',\n    latex: '$\\\\mathbb{Q}$',\n  },\n  8476: {\n    id: 'U0211C',\n    decimal: 8476,\n    character: 'ℜ',\n    latex: '$\\\\mathfrak{R}$',\n  },\n  8477: {\n    id: 'U0211D',\n    decimal: 8477,\n    character: 'ℝ',\n    latex: '$\\\\mathbb{R}$',\n  },\n  8482: {\n    id: 'U02122',\n    decimal: 8482,\n    character: '™',\n    latex: '\\\\texttrademark',\n  },\n  8484: {\n    id: 'U02124',\n    decimal: 8484,\n    character: 'ℤ',\n    latex: '$\\\\mathbb{Z}$',\n  },\n  8488: {\n    id: 'U02128',\n    decimal: 8488,\n    character: 'ℨ',\n    latex: '$\\\\mathfrak{Z}$',\n  },\n  8491: {\n    id: 'U0212B',\n    decimal: 8491,\n    character: 'Å',\n    latex: '\\\\AA',\n  },\n  8493: {\n    id: 'U0212D',\n    decimal: 8493,\n    character: 'ℭ',\n    latex: '$\\\\mathfrak{C}$',\n  },\n  8722: {\n    id: 'U02212',\n    decimal: 8722,\n    character: '−',\n    latex: '-',\n  },\n  8762: {\n    id: 'U0223A',\n    decimal: 8762,\n    character: '∺',\n    latex: '$\\\\mathbin{{:}\\\\!\\\\!{-}\\\\!\\\\!{:}}$',\n  },\n  8788: {\n    id: 'U02254',\n    decimal: 8788,\n    character: '≔',\n    latex: ':=',\n  },\n  8789: {\n    id: 'U02255',\n    decimal: 8789,\n    character: '≕',\n    latex: '=:',\n  },\n  8942: {\n    id: 'U022EE',\n    decimal: 8942,\n    character: '⋮',\n    latex: '\\\\vdots',\n  },\n  8982: {\n    id: 'U02316',\n    decimal: 8982,\n    character: '⌖',\n    latex: '$\\\\mathchar\"2208$',\n  },\n  9251: {\n    id: 'U02423',\n    decimal: 9251,\n    character: '␣',\n    latex: '\\\\textvisiblespace',\n  },\n  9645: {\n    id: 'U025AD',\n    decimal: 9645,\n    character: '▭',\n    latex: '\\\\fbox{~~}',\n  },\n  11005: {\n    id: 'U02AFD-020E5',\n    decimal: 11005,\n    character: '⫽',\n    latex: '{\\\\rlap{\\\\textbackslash}{{/}\\\\!\\\\!{/}}}',\n  },\n  64256: {\n    id: 'U0FB00',\n    decimal: 64256,\n    character: 'ff',\n    latex: 'ff',\n  },\n  64257: {\n    id: 'U0FB01',\n    decimal: 64257,\n    character: 'fi',\n    latex: 'fi',\n  },\n  64258: {\n    id: 'U0FB02',\n    decimal: 64258,\n    character: 'fl',\n    latex: 'fl',\n  },\n  64259: {\n    id: 'U0FB03',\n    decimal: 64259,\n    character: 'ffi',\n    latex: 'ffi',\n  },\n  64260: {\n    id: 'U0FB04',\n    decimal: 64260,\n    character: 'ffl',\n    latex: 'ffl',\n  },\n  119808: {\n    id: 'U1D400',\n    decimal: 119808,\n    character: '퐀',\n    latex: '$\\\\mathbf{A}$',\n  },\n  119809: {\n    id: 'U1D401',\n    decimal: 119809,\n    character: '퐁',\n    latex: '$\\\\mathbf{B}$',\n  },\n  119810: {\n    id: 'U1D402',\n    decimal: 119810,\n    character: '퐂',\n    latex: '$\\\\mathbf{C}$',\n  },\n  119811: {\n    id: 'U1D403',\n    decimal: 119811,\n    character: '퐃',\n    latex: '$\\\\mathbf{D}$',\n  },\n  119812: {\n    id: 'U1D404',\n    decimal: 119812,\n    character: '퐄',\n    latex: '$\\\\mathbf{E}$',\n  },\n  119813: {\n    id: 'U1D405',\n    decimal: 119813,\n    character: '퐅',\n    latex: '{$\\\\mathbf{F}$}',\n  },\n  119814: {\n    id: 'U1D406',\n    decimal: 119814,\n    character: '퐆',\n    latex: '$\\\\mathbf{G}$',\n  },\n  119815: {\n    id: 'U1D407',\n    decimal: 119815,\n    character: '퐇',\n    latex: '$\\\\mathbf{H}$',\n  },\n  119816: {\n    id: 'U1D408',\n    decimal: 119816,\n    character: '퐈',\n    latex: '$\\\\mathbf{I}$',\n  },\n  119817: {\n    id: 'U1D409',\n    decimal: 119817,\n    character: '퐉',\n    latex: '$\\\\mathbf{J}$',\n  },\n  119818: {\n    id: 'U1D40A',\n    decimal: 119818,\n    character: '퐊',\n    latex: '$\\\\mathbf{K}$',\n  },\n  119819: {\n    id: 'U1D40B',\n    decimal: 119819,\n    character: '퐋',\n    latex: '$\\\\mathbf{L}$',\n  },\n  119820: {\n    id: 'U1D40C',\n    decimal: 119820,\n    character: '퐌',\n    latex: '$\\\\mathbf{M}$',\n  },\n  119821: {\n    id: 'U1D40D',\n    decimal: 119821,\n    character: '퐍',\n    latex: '$\\\\mathbf{N}$',\n  },\n  119822: {\n    id: 'U1D40E',\n    decimal: 119822,\n    character: '퐎',\n    latex: '$\\\\mathbf{O}$',\n  },\n  119823: {\n    id: 'U1D40F',\n    decimal: 119823,\n    character: '퐏',\n    latex: '$\\\\mathbf{P}$',\n  },\n  119824: {\n    id: 'U1D410',\n    decimal: 119824,\n    character: '퐐',\n    latex: '$\\\\mathbf{Q}$',\n  },\n  119825: {\n    id: 'U1D411',\n    decimal: 119825,\n    character: '퐑',\n    latex: '$\\\\mathbf{R}$',\n  },\n  119826: {\n    id: 'U1D412',\n    decimal: 119826,\n    character: '퐒',\n    latex: '$\\\\mathbf{S}$',\n  },\n  119827: {\n    id: 'U1D413',\n    decimal: 119827,\n    character: '퐓',\n    latex: '$\\\\mathbf{T}$',\n  },\n  119828: {\n    id: 'U1D414',\n    decimal: 119828,\n    character: '퐔',\n    latex: '$\\\\mathbf{U}$',\n  },\n  119829: {\n    id: 'U1D415',\n    decimal: 119829,\n    character: '퐕',\n    latex: '$\\\\mathbf{V}$',\n  },\n  119830: {\n    id: 'U1D416',\n    decimal: 119830,\n    character: '퐖',\n    latex: '$\\\\mathbf{W}$',\n  },\n  119831: {\n    id: 'U1D417',\n    decimal: 119831,\n    character: '퐗',\n    latex: '$\\\\mathbf{X}$',\n  },\n  119832: {\n    id: 'U1D418',\n    decimal: 119832,\n    character: '퐘',\n    latex: '$\\\\mathbf{Y}$',\n  },\n  119833: {\n    id: 'U1D419',\n    decimal: 119833,\n    character: '퐙',\n    latex: '$\\\\mathbf{Z}$',\n  },\n  119834: {\n    id: 'U1D41A',\n    decimal: 119834,\n    character: '퐚',\n    latex: '$\\\\mathbf{a}$',\n  },\n  119835: {\n    id: 'U1D41B',\n    decimal: 119835,\n    character: '퐛',\n    latex: '$\\\\mathbf{b}$',\n  },\n  119836: {\n    id: 'U1D41C',\n    decimal: 119836,\n    character: '퐜',\n    latex: '$\\\\mathbf{c}$',\n  },\n  119837: {\n    id: 'U1D41D',\n    decimal: 119837,\n    character: '퐝',\n    latex: '$\\\\mathbf{d}$',\n  },\n  119838: {\n    id: 'U1D41E',\n    decimal: 119838,\n    character: '퐞',\n    latex: '$\\\\mathbf{e}$',\n  },\n  119839: {\n    id: 'U1D41F',\n    decimal: 119839,\n    character: '퐟',\n    latex: '{$\\\\mathbf{f}$}',\n  },\n  119840: {\n    id: 'U1D420',\n    decimal: 119840,\n    character: '퐠',\n    latex: '$\\\\mathbf{g}$',\n  },\n  119841: {\n    id: 'U1D421',\n    decimal: 119841,\n    character: '퐡',\n    latex: '$\\\\mathbf{h}$',\n  },\n  119842: {\n    id: 'U1D422',\n    decimal: 119842,\n    character: '퐢',\n    latex: '$\\\\mathbf{i}$',\n  },\n  119843: {\n    id: 'U1D423',\n    decimal: 119843,\n    character: '퐣',\n    latex: '$\\\\mathbf{j}$',\n  },\n  119844: {\n    id: 'U1D424',\n    decimal: 119844,\n    character: '퐤',\n    latex: '$\\\\mathbf{k}$',\n  },\n  119845: {\n    id: 'U1D425',\n    decimal: 119845,\n    character: '퐥',\n    latex: '$\\\\mathbf{l}$',\n  },\n  119846: {\n    id: 'U1D426',\n    decimal: 119846,\n    character: '퐦',\n    latex: '$\\\\mathbf{m}$',\n  },\n  119847: {\n    id: 'U1D427',\n    decimal: 119847,\n    character: '퐧',\n    latex: '$\\\\mathbf{n}$',\n  },\n  119848: {\n    id: 'U1D428',\n    decimal: 119848,\n    character: '퐨',\n    latex: '$\\\\mathbf{o}$',\n  },\n  119849: {\n    id: 'U1D429',\n    decimal: 119849,\n    character: '퐩',\n    latex: '$\\\\mathbf{p}$',\n  },\n  119850: {\n    id: 'U1D42A',\n    decimal: 119850,\n    character: '퐪',\n    latex: '$\\\\mathbf{q}$',\n  },\n  119851: {\n    id: 'U1D42B',\n    decimal: 119851,\n    character: '퐫',\n    latex: '$\\\\mathbf{r}$',\n  },\n  119852: {\n    id: 'U1D42C',\n    decimal: 119852,\n    character: '퐬',\n    latex: '$\\\\mathbf{s}$',\n  },\n  119853: {\n    id: 'U1D42D',\n    decimal: 119853,\n    character: '퐭',\n    latex: '$\\\\mathbf{t}$',\n  },\n  119854: {\n    id: 'U1D42E',\n    decimal: 119854,\n    character: '퐮',\n    latex: '$\\\\mathbf{u}$',\n  },\n  119855: {\n    id: 'U1D42F',\n    decimal: 119855,\n    character: '퐯',\n    latex: '$\\\\mathbf{v}$',\n  },\n  119856: {\n    id: 'U1D430',\n    decimal: 119856,\n    character: '퐰',\n    latex: '$\\\\mathbf{w}$',\n  },\n  119857: {\n    id: 'U1D431',\n    decimal: 119857,\n    character: '퐱',\n    latex: '$\\\\mathbf{x}$',\n  },\n  119858: {\n    id: 'U1D432',\n    decimal: 119858,\n    character: '퐲',\n    latex: '$\\\\mathbf{y}$',\n  },\n  119859: {\n    id: 'U1D433',\n    decimal: 119859,\n    character: '퐳',\n    latex: '$\\\\mathbf{z}$',\n  },\n  120068: {\n    id: 'U1D504',\n    decimal: 120068,\n    character: '프',\n    latex: '$\\\\mathfrak{A}$',\n  },\n  120069: {\n    id: 'U1D505',\n    decimal: 120069,\n    character: '픅',\n    latex: '$\\\\mathfrak{B}$',\n  },\n  120071: {\n    id: 'U1D507',\n    decimal: 120071,\n    character: '픇',\n    latex: '$\\\\mathfrak{D}$',\n  },\n  120072: {\n    id: 'U1D508',\n    decimal: 120072,\n    character: '픈',\n    latex: '$\\\\mathfrak{E}$',\n  },\n  120073: {\n    id: 'U1D509',\n    decimal: 120073,\n    character: '픉',\n    latex: '$\\\\mathfrak{F}$',\n  },\n  120074: {\n    id: 'U1D50A',\n    decimal: 120074,\n    character: '픊',\n    latex: '$\\\\mathfrak{G}$',\n  },\n  120077: {\n    id: 'U1D50D',\n    decimal: 120077,\n    character: '픍',\n    latex: '$\\\\mathfrak{J}$',\n  },\n  120078: {\n    id: 'U1D50E',\n    decimal: 120078,\n    character: '픎',\n    latex: '$\\\\mathfrak{K}$',\n  },\n  120079: {\n    id: 'U1D50F',\n    decimal: 120079,\n    character: '픏',\n    latex: '$\\\\mathfrak{L}$',\n  },\n  120080: {\n    id: 'U1D510',\n    decimal: 120080,\n    character: '픐',\n    latex: '$\\\\mathfrak{M}$',\n  },\n  120081: {\n    id: 'U1D511',\n    decimal: 120081,\n    character: '픑',\n    latex: '$\\\\mathfrak{N}$',\n  },\n  120082: {\n    id: 'U1D512',\n    decimal: 120082,\n    character: '픒',\n    latex: '$\\\\mathfrak{O}$',\n  },\n  120083: {\n    id: 'U1D513',\n    decimal: 120083,\n    character: '픓',\n    latex: '$\\\\mathfrak{P}$',\n  },\n  120084: {\n    id: 'U1D514',\n    decimal: 120084,\n    character: '픔',\n    latex: '$\\\\mathfrak{Q}$',\n  },\n  120086: {\n    id: 'U1D516',\n    decimal: 120086,\n    character: '픖',\n    latex: '$\\\\mathfrak{S}$',\n  },\n  120087: {\n    id: 'U1D517',\n    decimal: 120087,\n    character: '픗',\n    latex: '$\\\\mathfrak{T}$',\n  },\n  120088: {\n    id: 'U1D518',\n    decimal: 120088,\n    character: '픘',\n    latex: '$\\\\mathfrak{U}$',\n  },\n  120089: {\n    id: 'U1D519',\n    decimal: 120089,\n    character: '픙',\n    latex: '$\\\\mathfrak{V}$',\n  },\n  120090: {\n    id: 'U1D51A',\n    decimal: 120090,\n    character: '픚',\n    latex: '$\\\\mathfrak{W}$',\n  },\n  120091: {\n    id: 'U1D51B',\n    decimal: 120091,\n    character: '픛',\n    latex: '$\\\\mathfrak{X}$',\n  },\n  120092: {\n    id: 'U1D51C',\n    decimal: 120092,\n    character: '픜',\n    latex: '$\\\\mathfrak{Y}$',\n  },\n  120094: {\n    id: 'U1D51E',\n    decimal: 120094,\n    character: '픞',\n    latex: '$\\\\mathfrak{a}$',\n  },\n  120095: {\n    id: 'U1D51F',\n    decimal: 120095,\n    character: '픟',\n    latex: '$\\\\mathfrak{b}$',\n  },\n  120096: {\n    id: 'U1D520',\n    decimal: 120096,\n    character: '픠',\n    latex: '$\\\\mathfrak{c}$',\n  },\n  120097: {\n    id: 'U1D521',\n    decimal: 120097,\n    character: '픡',\n    latex: '$\\\\mathfrak{d}$',\n  },\n  120098: {\n    id: 'U1D522',\n    decimal: 120098,\n    character: '픢',\n    latex: '$\\\\mathfrak{e}$',\n  },\n  120099: {\n    id: 'U1D523',\n    decimal: 120099,\n    character: '픣',\n    latex: '$\\\\mathfrak{f}$',\n  },\n  120100: {\n    id: 'U1D524',\n    decimal: 120100,\n    character: '픤',\n    latex: '$\\\\mathfrak{g}$',\n  },\n  120101: {\n    id: 'U1D525',\n    decimal: 120101,\n    character: '픥',\n    latex: '$\\\\mathfrak{h}$',\n  },\n  120102: {\n    id: 'U1D526',\n    decimal: 120102,\n    character: '픦',\n    latex: '$\\\\mathfrak{i}$',\n  },\n  120103: {\n    id: 'U1D527',\n    decimal: 120103,\n    character: '픧',\n    latex: '$\\\\mathfrak{j}$',\n  },\n  120104: {\n    id: 'U1D528',\n    decimal: 120104,\n    character: '픨',\n    latex: '$\\\\mathfrak{k}$',\n  },\n  120105: {\n    id: 'U1D529',\n    decimal: 120105,\n    character: '픩',\n    latex: '$\\\\mathfrak{l}$',\n  },\n  120106: {\n    id: 'U1D52A',\n    decimal: 120106,\n    character: '픪',\n    latex: '$\\\\mathfrak{m}$',\n  },\n  120107: {\n    id: 'U1D52B',\n    decimal: 120107,\n    character: '픫',\n    latex: '$\\\\mathfrak{n}$',\n  },\n  120108: {\n    id: 'U1D52C',\n    decimal: 120108,\n    character: '픬',\n    latex: '$\\\\mathfrak{o}$',\n  },\n  120109: {\n    id: 'U1D52D',\n    decimal: 120109,\n    character: '픭',\n    latex: '$\\\\mathfrak{p}$',\n  },\n  120110: {\n    id: 'U1D52E',\n    decimal: 120110,\n    character: '픮',\n    latex: '$\\\\mathfrak{q}$',\n  },\n  120111: {\n    id: 'U1D52F',\n    decimal: 120111,\n    character: '픯',\n    latex: '$\\\\mathfrak{r}$',\n  },\n  120112: {\n    id: 'U1D530',\n    decimal: 120112,\n    character: '픰',\n    latex: '$\\\\mathfrak{s}$',\n  },\n  120113: {\n    id: 'U1D531',\n    decimal: 120113,\n    character: '픱',\n    latex: '$\\\\mathfrak{t}$',\n  },\n  120114: {\n    id: 'U1D532',\n    decimal: 120114,\n    character: '픲',\n    latex: '$\\\\mathfrak{u}$',\n  },\n  120115: {\n    id: 'U1D533',\n    decimal: 120115,\n    character: '픳',\n    latex: '$\\\\mathfrak{v}$',\n  },\n  120116: {\n    id: 'U1D534',\n    decimal: 120116,\n    character: '픴',\n    latex: '$\\\\mathfrak{w}$',\n  },\n  120117: {\n    id: 'U1D535',\n    decimal: 120117,\n    character: '픵',\n    latex: '$\\\\mathfrak{x}$',\n  },\n  120118: {\n    id: 'U1D536',\n    decimal: 120118,\n    character: '픶',\n    latex: '$\\\\mathfrak{y}$',\n  },\n  120119: {\n    id: 'U1D537',\n    decimal: 120119,\n    character: '픷',\n    latex: '$\\\\mathfrak{z}$',\n  },\n  120120: {\n    id: 'U1D538',\n    decimal: 120120,\n    character: '픸',\n    latex: '$\\\\mathbb{A}$',\n  },\n  120121: {\n    id: 'U1D539',\n    decimal: 120121,\n    character: '픹',\n    latex: '$\\\\mathbb{B}$',\n  },\n  120123: {\n    id: 'U1D53B',\n    decimal: 120123,\n    character: '픻',\n    latex: '$\\\\mathbb{D}$',\n  },\n  120124: {\n    id: 'U1D53C',\n    decimal: 120124,\n    character: '피',\n    latex: '$\\\\mathbb{E}$',\n  },\n  120125: {\n    id: 'U1D53D',\n    decimal: 120125,\n    character: '픽',\n    latex: '$\\\\mathbb{F}$',\n  },\n  120126: {\n    id: 'U1D53E',\n    decimal: 120126,\n    character: '픾',\n    latex: '$\\\\mathbb{G}$',\n  },\n  120128: {\n    id: 'U1D540',\n    decimal: 120128,\n    character: '핀',\n    latex: '$\\\\mathbb{I}$',\n  },\n  120129: {\n    id: 'U1D541',\n    decimal: 120129,\n    character: '핁',\n    latex: '$\\\\mathbb{J}$',\n  },\n  120130: {\n    id: 'U1D542',\n    decimal: 120130,\n    character: '핂',\n    latex: '$\\\\mathbb{K}$',\n  },\n  120131: {\n    id: 'U1D543',\n    decimal: 120131,\n    character: '핃',\n    latex: '$\\\\mathbb{L}$',\n  },\n  120132: {\n    id: 'U1D544',\n    decimal: 120132,\n    character: '필',\n    latex: '$\\\\mathbb{M}$',\n  },\n  120134: {\n    id: 'U1D546',\n    decimal: 120134,\n    character: '핆',\n    latex: '$\\\\mathbb{O}$',\n  },\n  120138: {\n    id: 'U1D54A',\n    decimal: 120138,\n    character: '핊',\n    latex: '$\\\\mathbb{S}$',\n  },\n  120139: {\n    id: 'U1D54B',\n    decimal: 120139,\n    character: '핋',\n    latex: '$\\\\mathbb{T}$',\n  },\n  120140: {\n    id: 'U1D54C',\n    decimal: 120140,\n    character: '핌',\n    latex: '$\\\\mathbb{U}$',\n  },\n  120141: {\n    id: 'U1D54D',\n    decimal: 120141,\n    character: '핍',\n    latex: '$\\\\mathbb{V}$',\n  },\n  120142: {\n    id: 'U1D54E',\n    decimal: 120142,\n    character: '핎',\n    latex: '$\\\\mathbb{W}$',\n  },\n  120143: {\n    id: 'U1D54F',\n    decimal: 120143,\n    character: '핏',\n    latex: '$\\\\mathbb{X}$',\n  },\n  120144: {\n    id: 'U1D550',\n    decimal: 120144,\n    character: '핐',\n    latex: '$\\\\mathbb{Y}$',\n  },\n  120146: {\n    id: 'U1D552',\n    decimal: 120146,\n    character: '핒',\n    latex: '$\\\\mathbb{a}$',\n  },\n  120147: {\n    id: 'U1D553',\n    decimal: 120147,\n    character: '핓',\n    latex: '$\\\\mathbb{b}$',\n  },\n  120148: {\n    id: 'U1D554',\n    decimal: 120148,\n    character: '핔',\n    latex: '$\\\\mathbb{c}$',\n  },\n  120149: {\n    id: 'U1D555',\n    decimal: 120149,\n    character: '핕',\n    latex: '$\\\\mathbb{d}$',\n  },\n  120150: {\n    id: 'U1D556',\n    decimal: 120150,\n    character: '핖',\n    latex: '$\\\\mathbb{e}$',\n  },\n  120151: {\n    id: 'U1D557',\n    decimal: 120151,\n    character: '핗',\n    latex: '$\\\\mathbb{f}$',\n  },\n  120152: {\n    id: 'U1D558',\n    decimal: 120152,\n    character: '하',\n    latex: '$\\\\mathbb{g}$',\n  },\n  120153: {\n    id: 'U1D559',\n    decimal: 120153,\n    character: '학',\n    latex: '$\\\\mathbb{h}$',\n  },\n  120154: {\n    id: 'U1D55A',\n    decimal: 120154,\n    character: '핚',\n    latex: '$\\\\mathbb{i}$',\n  },\n  120155: {\n    id: 'U1D55B',\n    decimal: 120155,\n    character: '핛',\n    latex: '$\\\\mathbb{j}$',\n  },\n  120156: {\n    id: 'U1D55C',\n    decimal: 120156,\n    character: '한',\n    latex: '$\\\\mathbb{k}$',\n  },\n  120157: {\n    id: 'U1D55D',\n    decimal: 120157,\n    character: '핝',\n    latex: '$\\\\mathbb{l}$',\n  },\n  120158: {\n    id: 'U1D55E',\n    decimal: 120158,\n    character: '핞',\n    latex: '$\\\\mathbb{m}$',\n  },\n  120159: {\n    id: 'U1D55F',\n    decimal: 120159,\n    character: '핟',\n    latex: '$\\\\mathbb{n}$',\n  },\n  120160: {\n    id: 'U1D560',\n    decimal: 120160,\n    character: '할',\n    latex: '$\\\\mathbb{o}$',\n  },\n  120161: {\n    id: 'U1D561',\n    decimal: 120161,\n    character: '핡',\n    latex: '$\\\\mathbb{p}$',\n  },\n  120162: {\n    id: 'U1D562',\n    decimal: 120162,\n    character: '핢',\n    latex: '$\\\\mathbb{q}$',\n  },\n  120163: {\n    id: 'U1D563',\n    decimal: 120163,\n    character: '핣',\n    latex: '$\\\\mathbb{r}$',\n  },\n  120164: {\n    id: 'U1D564',\n    decimal: 120164,\n    character: '핤',\n    latex: '$\\\\mathbb{s}$',\n  },\n  120165: {\n    id: 'U1D565',\n    decimal: 120165,\n    character: '핥',\n    latex: '$\\\\mathbb{t}$',\n  },\n  120166: {\n    id: 'U1D566',\n    decimal: 120166,\n    character: '핦',\n    latex: '$\\\\mathbb{u}$',\n  },\n  120167: {\n    id: 'U1D567',\n    decimal: 120167,\n    character: '핧',\n    latex: '$\\\\mathbb{v}$',\n  },\n  120168: {\n    id: 'U1D568',\n    decimal: 120168,\n    character: '함',\n    latex: '$\\\\mathbb{w}$',\n  },\n  120169: {\n    id: 'U1D569',\n    decimal: 120169,\n    character: '합',\n    latex: '$\\\\mathbb{x}$',\n  },\n  120170: {\n    id: 'U1D56A',\n    decimal: 120170,\n    character: '핪',\n    latex: '$\\\\mathbb{y}$',\n  },\n  120171: {\n    id: 'U1D56B',\n    decimal: 120171,\n    character: '핫',\n    latex: '$\\\\mathbb{z}$',\n  },\n  120224: {\n    id: 'U1D5A0',\n    decimal: 120224,\n    character: '햠',\n    latex: '$\\\\mathsf{A}$',\n  },\n  120225: {\n    id: 'U1D5A1',\n    decimal: 120225,\n    character: '햡',\n    latex: '$\\\\mathsf{B}$',\n  },\n  120226: {\n    id: 'U1D5A2',\n    decimal: 120226,\n    character: '햢',\n    latex: '$\\\\mathsf{C}$',\n  },\n  120227: {\n    id: 'U1D5A3',\n    decimal: 120227,\n    character: '햣',\n    latex: '$\\\\mathsf{D}$',\n  },\n  120228: {\n    id: 'U1D5A4',\n    decimal: 120228,\n    character: '햤',\n    latex: '$\\\\mathsf{E}$',\n  },\n  120229: {\n    id: 'U1D5A5',\n    decimal: 120229,\n    character: '향',\n    latex: '$\\\\mathsf{F}$',\n  },\n  120230: {\n    id: 'U1D5A6',\n    decimal: 120230,\n    character: '햦',\n    latex: '$\\\\mathsf{G}$',\n  },\n  120231: {\n    id: 'U1D5A7',\n    decimal: 120231,\n    character: '햧',\n    latex: '$\\\\mathsf{H}$',\n  },\n  120232: {\n    id: 'U1D5A8',\n    decimal: 120232,\n    character: '햨',\n    latex: '$\\\\mathsf{I}$',\n  },\n  120233: {\n    id: 'U1D5A9',\n    decimal: 120233,\n    character: '햩',\n    latex: '$\\\\mathsf{J}$',\n  },\n  120234: {\n    id: 'U1D5AA',\n    decimal: 120234,\n    character: '햪',\n    latex: '$\\\\mathsf{K}$',\n  },\n  120235: {\n    id: 'U1D5AB',\n    decimal: 120235,\n    character: '햫',\n    latex: '$\\\\mathsf{L}$',\n  },\n  120236: {\n    id: 'U1D5AC',\n    decimal: 120236,\n    character: '햬',\n    latex: '$\\\\mathsf{M}$',\n  },\n  120237: {\n    id: 'U1D5AD',\n    decimal: 120237,\n    character: '햭',\n    latex: '$\\\\mathsf{N}$',\n  },\n  120238: {\n    id: 'U1D5AE',\n    decimal: 120238,\n    character: '햮',\n    latex: '$\\\\mathsf{O}$',\n  },\n  120239: {\n    id: 'U1D5AF',\n    decimal: 120239,\n    character: '햯',\n    latex: '$\\\\mathsf{P}$',\n  },\n  120240: {\n    id: 'U1D5B0',\n    decimal: 120240,\n    character: '햰',\n    latex: '$\\\\mathsf{Q}$',\n  },\n  120241: {\n    id: 'U1D5B1',\n    decimal: 120241,\n    character: '햱',\n    latex: '$\\\\mathsf{R}$',\n  },\n  120242: {\n    id: 'U1D5B2',\n    decimal: 120242,\n    character: '햲',\n    latex: '$\\\\mathsf{S}$',\n  },\n  120243: {\n    id: 'U1D5B3',\n    decimal: 120243,\n    character: '햳',\n    latex: '$\\\\mathsf{T}$',\n  },\n  120244: {\n    id: 'U1D5B4',\n    decimal: 120244,\n    character: '햴',\n    latex: '$\\\\mathsf{U}$',\n  },\n  120245: {\n    id: 'U1D5B5',\n    decimal: 120245,\n    character: '햵',\n    latex: '$\\\\mathsf{V}$',\n  },\n  120246: {\n    id: 'U1D5B6',\n    decimal: 120246,\n    character: '햶',\n    latex: '$\\\\mathsf{W}$',\n  },\n  120247: {\n    id: 'U1D5B7',\n    decimal: 120247,\n    character: '햷',\n    latex: '$\\\\mathsf{X}$',\n  },\n  120248: {\n    id: 'U1D5B8',\n    decimal: 120248,\n    character: '햸',\n    latex: '$\\\\mathsf{Y}$',\n  },\n  120249: {\n    id: 'U1D5B9',\n    decimal: 120249,\n    character: '햹',\n    latex: '$\\\\mathsf{Z}$',\n  },\n  120250: {\n    id: 'U1D5BA',\n    decimal: 120250,\n    character: '햺',\n    latex: '$\\\\mathsf{a}$',\n  },\n  120251: {\n    id: 'U1D5BB',\n    decimal: 120251,\n    character: '햻',\n    latex: '$\\\\mathsf{b}$',\n  },\n  120252: {\n    id: 'U1D5BC',\n    decimal: 120252,\n    character: '햼',\n    latex: '$\\\\mathsf{c}$',\n  },\n  120253: {\n    id: 'U1D5BD',\n    decimal: 120253,\n    character: '햽',\n    latex: '$\\\\mathsf{d}$',\n  },\n  120254: {\n    id: 'U1D5BE',\n    decimal: 120254,\n    character: '햾',\n    latex: '$\\\\mathsf{e}$',\n  },\n  120255: {\n    id: 'U1D5BF',\n    decimal: 120255,\n    character: '햿',\n    latex: '$\\\\mathsf{f}$',\n  },\n  120256: {\n    id: 'U1D5C0',\n    decimal: 120256,\n    character: '헀',\n    latex: '$\\\\mathsf{g}$',\n  },\n  120257: {\n    id: 'U1D5C1',\n    decimal: 120257,\n    character: '헁',\n    latex: '$\\\\mathsf{h}$',\n  },\n  120258: {\n    id: 'U1D5C2',\n    decimal: 120258,\n    character: '헂',\n    latex: '$\\\\mathsf{i}$',\n  },\n  120259: {\n    id: 'U1D5C3',\n    decimal: 120259,\n    character: '헃',\n    latex: '$\\\\mathsf{j}$',\n  },\n  120260: {\n    id: 'U1D5C4',\n    decimal: 120260,\n    character: '헄',\n    latex: '$\\\\mathsf{k}$',\n  },\n  120261: {\n    id: 'U1D5C5',\n    decimal: 120261,\n    character: '헅',\n    latex: '$\\\\mathsf{l}$',\n  },\n  120262: {\n    id: 'U1D5C6',\n    decimal: 120262,\n    character: '헆',\n    latex: '$\\\\mathsf{m}$',\n  },\n  120263: {\n    id: 'U1D5C7',\n    decimal: 120263,\n    character: '헇',\n    latex: '$\\\\mathsf{n}$',\n  },\n  120264: {\n    id: 'U1D5C8',\n    decimal: 120264,\n    character: '허',\n    latex: '$\\\\mathsf{o}$',\n  },\n  120265: {\n    id: 'U1D5C9',\n    decimal: 120265,\n    character: '헉',\n    latex: '$\\\\mathsf{p}$',\n  },\n  120266: {\n    id: 'U1D5CA',\n    decimal: 120266,\n    character: '헊',\n    latex: '$\\\\mathsf{q}$',\n  },\n  120267: {\n    id: 'U1D5CB',\n    decimal: 120267,\n    character: '헋',\n    latex: '$\\\\mathsf{r}$',\n  },\n  120268: {\n    id: 'U1D5CC',\n    decimal: 120268,\n    character: '헌',\n    latex: '$\\\\mathsf{s}$',\n  },\n  120269: {\n    id: 'U1D5CD',\n    decimal: 120269,\n    character: '헍',\n    latex: '$\\\\mathsf{t}$',\n  },\n  120270: {\n    id: 'U1D5CE',\n    decimal: 120270,\n    character: '헎',\n    latex: '$\\\\mathsf{u}$',\n  },\n  120271: {\n    id: 'U1D5CF',\n    decimal: 120271,\n    character: '헏',\n    latex: '$\\\\mathsf{v}$',\n  },\n  120272: {\n    id: 'U1D5D0',\n    decimal: 120272,\n    character: '헐',\n    latex: '$\\\\mathsf{w}$',\n  },\n  120273: {\n    id: 'U1D5D1',\n    decimal: 120273,\n    character: '헑',\n    latex: '$\\\\mathsf{x}$',\n  },\n  120274: {\n    id: 'U1D5D2',\n    decimal: 120274,\n    character: '헒',\n    latex: '$\\\\mathsf{y}$',\n  },\n  120275: {\n    id: 'U1D5D3',\n    decimal: 120275,\n    character: '헓',\n    latex: '$\\\\mathsf{z}$',\n  },\n  120432: {\n    id: 'U1D670',\n    decimal: 120432,\n    character: '홰',\n    latex: '$\\\\mathtt{A}$',\n  },\n  120433: {\n    id: 'U1D671',\n    decimal: 120433,\n    character: '홱',\n    latex: '$\\\\mathtt{B}$',\n  },\n  120434: {\n    id: 'U1D672',\n    decimal: 120434,\n    character: '홲',\n    latex: '$\\\\mathtt{C}$',\n  },\n  120435: {\n    id: 'U1D673',\n    decimal: 120435,\n    character: '홳',\n    latex: '$\\\\mathtt{D}$',\n  },\n  120436: {\n    id: 'U1D674',\n    decimal: 120436,\n    character: '홴',\n    latex: '$\\\\mathtt{E}$',\n  },\n  120437: {\n    id: 'U1D675',\n    decimal: 120437,\n    character: '홵',\n    latex: '$\\\\mathtt{F}$',\n  },\n  120438: {\n    id: 'U1D676',\n    decimal: 120438,\n    character: '홶',\n    latex: '$\\\\mathtt{G}$',\n  },\n  120439: {\n    id: 'U1D677',\n    decimal: 120439,\n    character: '홷',\n    latex: '$\\\\mathtt{H}$',\n  },\n  120440: {\n    id: 'U1D678',\n    decimal: 120440,\n    character: '홸',\n    latex: '$\\\\mathtt{I}$',\n  },\n  120441: {\n    id: 'U1D679',\n    decimal: 120441,\n    character: '홹',\n    latex: '$\\\\mathtt{J}$',\n  },\n  120442: {\n    id: 'U1D67A',\n    decimal: 120442,\n    character: '홺',\n    latex: '$\\\\mathtt{K}$',\n  },\n  120443: {\n    id: 'U1D67B',\n    decimal: 120443,\n    character: '홻',\n    latex: '$\\\\mathtt{L}$',\n  },\n  120444: {\n    id: 'U1D67C',\n    decimal: 120444,\n    character: '홼',\n    latex: '$\\\\mathtt{M}$',\n  },\n  120445: {\n    id: 'U1D67D',\n    decimal: 120445,\n    character: '홽',\n    latex: '$\\\\mathtt{N}$',\n  },\n  120446: {\n    id: 'U1D67E',\n    decimal: 120446,\n    character: '홾',\n    latex: '$\\\\mathtt{O}$',\n  },\n  120447: {\n    id: 'U1D67F',\n    decimal: 120447,\n    character: '홿',\n    latex: '$\\\\mathtt{P}$',\n  },\n  120448: {\n    id: 'U1D680',\n    decimal: 120448,\n    character: '횀',\n    latex: '$\\\\mathtt{Q}$',\n  },\n  120449: {\n    id: 'U1D681',\n    decimal: 120449,\n    character: '횁',\n    latex: '$\\\\mathtt{R}$',\n  },\n  120450: {\n    id: 'U1D682',\n    decimal: 120450,\n    character: '횂',\n    latex: '$\\\\mathtt{S}$',\n  },\n  120451: {\n    id: 'U1D683',\n    decimal: 120451,\n    character: '횃',\n    latex: '$\\\\mathtt{T}$',\n  },\n  120452: {\n    id: 'U1D684',\n    decimal: 120452,\n    character: '횄',\n    latex: '$\\\\mathtt{U}$',\n  },\n  120453: {\n    id: 'U1D685',\n    decimal: 120453,\n    character: '횅',\n    latex: '$\\\\mathtt{V}$',\n  },\n  120454: {\n    id: 'U1D686',\n    decimal: 120454,\n    character: '횆',\n    latex: '$\\\\mathtt{W}$',\n  },\n  120455: {\n    id: 'U1D687',\n    decimal: 120455,\n    character: '횇',\n    latex: '$\\\\mathtt{X}$',\n  },\n  120456: {\n    id: 'U1D688',\n    decimal: 120456,\n    character: '횈',\n    latex: '$\\\\mathtt{Y}$',\n  },\n  120457: {\n    id: 'U1D689',\n    decimal: 120457,\n    character: '횉',\n    latex: '$\\\\mathtt{Z}$',\n  },\n  120458: {\n    id: 'U1D68A',\n    decimal: 120458,\n    character: '횊',\n    latex: '$\\\\mathtt{a}$',\n  },\n  120459: {\n    id: 'U1D68B',\n    decimal: 120459,\n    character: '횋',\n    latex: '$\\\\mathtt{b}$',\n  },\n  120460: {\n    id: 'U1D68C',\n    decimal: 120460,\n    character: '회',\n    latex: '$\\\\mathtt{c}$',\n  },\n  120461: {\n    id: 'U1D68D',\n    decimal: 120461,\n    character: '획',\n    latex: '$\\\\mathtt{d}$',\n  },\n  120462: {\n    id: 'U1D68E',\n    decimal: 120462,\n    character: '횎',\n    latex: '$\\\\mathtt{e}$',\n  },\n  120463: {\n    id: 'U1D68F',\n    decimal: 120463,\n    character: '횏',\n    latex: '$\\\\mathtt{f}$',\n  },\n  120464: {\n    id: 'U1D690',\n    decimal: 120464,\n    character: '횐',\n    latex: '$\\\\mathtt{g}$',\n  },\n  120465: {\n    id: 'U1D691',\n    decimal: 120465,\n    character: '횑',\n    latex: '$\\\\mathtt{h}$',\n  },\n  120466: {\n    id: 'U1D692',\n    decimal: 120466,\n    character: '횒',\n    latex: '$\\\\mathtt{i}$',\n  },\n  120467: {\n    id: 'U1D693',\n    decimal: 120467,\n    character: '횓',\n    latex: '$\\\\mathtt{j}$',\n  },\n  120468: {\n    id: 'U1D694',\n    decimal: 120468,\n    character: '횔',\n    latex: '$\\\\mathtt{k}$',\n  },\n  120469: {\n    id: 'U1D695',\n    decimal: 120469,\n    character: '횕',\n    latex: '$\\\\mathtt{l}$',\n  },\n  120470: {\n    id: 'U1D696',\n    decimal: 120470,\n    character: '횖',\n    latex: '$\\\\mathtt{m}$',\n  },\n  120471: {\n    id: 'U1D697',\n    decimal: 120471,\n    character: '횗',\n    latex: '$\\\\mathtt{n}$',\n  },\n  120472: {\n    id: 'U1D698',\n    decimal: 120472,\n    character: '횘',\n    latex: '$\\\\mathtt{o}$',\n  },\n  120473: {\n    id: 'U1D699',\n    decimal: 120473,\n    character: '횙',\n    latex: '$\\\\mathtt{p}$',\n  },\n  120474: {\n    id: 'U1D69A',\n    decimal: 120474,\n    character: '횚',\n    latex: '$\\\\mathtt{q}$',\n  },\n  120475: {\n    id: 'U1D69B',\n    decimal: 120475,\n    character: '횛',\n    latex: '$\\\\mathtt{r}$',\n  },\n  120476: {\n    id: 'U1D69C',\n    decimal: 120476,\n    character: '횜',\n    latex: '$\\\\mathtt{s}$',\n  },\n  120477: {\n    id: 'U1D69D',\n    decimal: 120477,\n    character: '횝',\n    latex: '$\\\\mathtt{t}$',\n  },\n  120478: {\n    id: 'U1D69E',\n    decimal: 120478,\n    character: '횞',\n    latex: '$\\\\mathtt{u}$',\n  },\n  120479: {\n    id: 'U1D69F',\n    decimal: 120479,\n    character: '횟',\n    latex: '$\\\\mathtt{v}$',\n  },\n  120480: {\n    id: 'U1D6A0',\n    decimal: 120480,\n    character: '횠',\n    latex: '$\\\\mathtt{w}$',\n  },\n  120481: {\n    id: 'U1D6A1',\n    decimal: 120481,\n    character: '횡',\n    latex: '$\\\\mathtt{x}$',\n  },\n  120482: {\n    id: 'U1D6A2',\n    decimal: 120482,\n    character: '횢',\n    latex: '$\\\\mathtt{y}$',\n  },\n  120483: {\n    id: 'U1D6A3',\n    decimal: 120483,\n    character: '횣',\n    latex: '$\\\\mathtt{z}$',\n  },\n  120490: {\n    id: 'U1D6AA',\n    decimal: 120490,\n    character: '횪',\n    latex: '$\\\\mathbf{\\\\Gamma}$',\n  },\n  120491: {\n    id: 'U1D6AB',\n    decimal: 120491,\n    character: '횫',\n    latex: '$\\\\mathbf{\\\\Delta}$',\n  },\n  120495: {\n    id: 'U1D6AF',\n    decimal: 120495,\n    character: '횯',\n    latex: '$\\\\mathbf{\\\\Theta}$',\n  },\n  120498: {\n    id: 'U1D6B2',\n    decimal: 120498,\n    character: '횲',\n    latex: '$\\\\mathbf{\\\\Lambda}$',\n  },\n  120499: {\n    id: 'U1D6B3',\n    decimal: 120499,\n    character: '횳',\n    latex: '$\\\\mathbf{M}$',\n  },\n  120500: {\n    id: 'U1D6B4',\n    decimal: 120500,\n    character: '횴',\n    latex: 'N',\n  },\n  120501: {\n    id: 'U1D6B5',\n    decimal: 120501,\n    character: '횵',\n    latex: '$\\\\mathbf{\\\\Xi}$',\n  },\n  120502: {\n    id: 'U1D6B6',\n    decimal: 120502,\n    character: '횶',\n    latex: 'O',\n  },\n  120503: {\n    id: 'U1D6B7',\n    decimal: 120503,\n    character: '횷',\n    latex: '$\\\\mathbf{\\\\Pi}$',\n  },\n  120505: {\n    id: 'U1D6B9',\n    decimal: 120505,\n    character: '횹',\n    latex: '$\\\\mathbf{\\\\vartheta}$',\n  },\n  120506: {\n    id: 'U1D6BA',\n    decimal: 120506,\n    character: '횺',\n    latex: '$\\\\mathbf{\\\\Sigma}$',\n  },\n  120508: {\n    id: 'U1D6BC',\n    decimal: 120508,\n    character: '횼',\n    latex: '$\\\\mathbf{\\\\Upsilon}$',\n  },\n  120509: {\n    id: 'U1D6BD',\n    decimal: 120509,\n    character: '횽',\n    latex: '$\\\\mathbf{\\\\Phi}$',\n  },\n  120511: {\n    id: 'U1D6BF',\n    decimal: 120511,\n    character: '횿',\n    latex: '$\\\\mathbf{\\\\Psi}$',\n  },\n  120512: {\n    id: 'U1D6C0',\n    decimal: 120512,\n    character: '훀',\n    latex: '$\\\\mathbf{\\\\Omega}$',\n  },\n  120513: {\n    id: 'U1D6C1',\n    decimal: 120513,\n    character: '훁',\n    latex: '$\\\\mathbf{\\\\nabla}$',\n  },\n  120514: {\n    id: 'U1D6C2',\n    decimal: 120514,\n    character: '훂',\n    latex: '$\\\\mathbf{\\\\alpha}$',\n  },\n  120515: {\n    id: 'U1D6C3',\n    decimal: 120515,\n    character: '훃',\n    latex: '$\\\\mathbf{\\\\beta}$',\n  },\n  120516: {\n    id: 'U1D6C4',\n    decimal: 120516,\n    character: '후',\n    latex: '$\\\\mathbf{\\\\gamma}$',\n  },\n  120517: {\n    id: 'U1D6C5',\n    decimal: 120517,\n    character: '훅',\n    latex: '$\\\\mathbf{\\\\delta}$',\n  },\n  120518: {\n    id: 'U1D6C6',\n    decimal: 120518,\n    character: '훆',\n    latex: '$\\\\mathbf{\\\\epsilon}$',\n  },\n  120519: {\n    id: 'U1D6C7',\n    decimal: 120519,\n    character: '훇',\n    latex: '$\\\\mathbf{\\\\zeta}$',\n  },\n  120520: {\n    id: 'U1D6C8',\n    decimal: 120520,\n    character: '훈',\n    latex: '$\\\\mathbf{\\\\eta}$',\n  },\n  120521: {\n    id: 'U1D6C9',\n    decimal: 120521,\n    character: '훉',\n    latex: '$\\\\mathbf{\\\\theta}$',\n  },\n  120522: {\n    id: 'U1D6CA',\n    decimal: 120522,\n    character: '훊',\n    latex: '$\\\\mathbf{\\\\iota}$',\n  },\n  120523: {\n    id: 'U1D6CB',\n    decimal: 120523,\n    character: '훋',\n    latex: '$\\\\mathbf{\\\\kappa}$',\n  },\n  120524: {\n    id: 'U1D6CC',\n    decimal: 120524,\n    character: '훌',\n    latex: '$\\\\mathbf{\\\\lambda}$',\n  },\n  120525: {\n    id: 'U1D6CD',\n    decimal: 120525,\n    character: '훍',\n    latex: '$\\\\mathbf{\\\\mu}$',\n  },\n  120526: {\n    id: 'U1D6CE',\n    decimal: 120526,\n    character: '훎',\n    latex: '$\\\\mathbf{\\\\nu}$',\n  },\n  120527: {\n    id: 'U1D6CF',\n    decimal: 120527,\n    character: '훏',\n    latex: '$\\\\mathbf{\\\\xi}$',\n  },\n  120528: {\n    id: 'U1D6D0',\n    decimal: 120528,\n    character: '훐',\n    latex: '$\\\\mathbf{o}$',\n  },\n  120529: {\n    id: 'U1D6D1',\n    decimal: 120529,\n    character: '훑',\n    latex: '$\\\\mathbf{\\\\pi}$',\n  },\n  120530: {\n    id: 'U1D6D2',\n    decimal: 120530,\n    character: '훒',\n    latex: '$\\\\mathbf{\\\\rho}$',\n  },\n  120531: {\n    id: 'U1D6D3',\n    decimal: 120531,\n    character: '훓',\n    latex: '$\\\\mathbf{\\\\varsigma}$',\n  },\n  120532: {\n    id: 'U1D6D4',\n    decimal: 120532,\n    character: '훔',\n    latex: '$\\\\mathbf{\\\\sigma}$',\n  },\n  120533: {\n    id: 'U1D6D5',\n    decimal: 120533,\n    character: '훕',\n    latex: '$\\\\mathbf{\\\\tau}$',\n  },\n  120534: {\n    id: 'U1D6D6',\n    decimal: 120534,\n    character: '훖',\n    latex: '$\\\\mathbf{\\\\upsilon}$',\n  },\n  120535: {\n    id: 'U1D6D7',\n    decimal: 120535,\n    character: '훗',\n    latex: '$\\\\mathbf{\\\\phi}$',\n  },\n  120536: {\n    id: 'U1D6D8',\n    decimal: 120536,\n    character: '훘',\n    latex: '$\\\\mathbf{\\\\chi}$',\n  },\n  120537: {\n    id: 'U1D6D9',\n    decimal: 120537,\n    character: '훙',\n    latex: '$\\\\mathbf{\\\\psi}$',\n  },\n  120538: {\n    id: 'U1D6DA',\n    decimal: 120538,\n    character: '훚',\n    latex: '$\\\\mathbf{\\\\omega}$',\n  },\n  120540: {\n    id: 'U1D6DC',\n    decimal: 120540,\n    character: '훜',\n    latex: '$\\\\mathbf{\\\\varepsilon}$',\n  },\n  120541: {\n    id: 'U1D6DD',\n    decimal: 120541,\n    character: '훝',\n    latex: '$\\\\mathbf{\\\\vartheta}$',\n  },\n  120542: {\n    id: 'U1D6DE',\n    decimal: 120542,\n    character: '훞',\n    latex: '$\\\\mathbf{\\\\varkappa}$',\n  },\n  120543: {\n    id: 'U1D6DF',\n    decimal: 120543,\n    character: '훟',\n    latex: '$\\\\mathbf{\\\\phi}$',\n  },\n  120544: {\n    id: 'U1D6E0',\n    decimal: 120544,\n    character: '훠',\n    latex: '$\\\\mathbf{\\\\varrho}$',\n  },\n  120545: {\n    id: 'U1D6E1',\n    decimal: 120545,\n    character: '훡',\n    latex: '$\\\\mathbf{\\\\varpi}$',\n  },\n  120558: {\n    id: 'U1D6EE',\n    decimal: 120558,\n    character: '훮',\n    latex: 'N',\n  },\n  120560: {\n    id: 'U1D6F0',\n    decimal: 120560,\n    character: '훰',\n    latex: 'O',\n  },\n  120618: {\n    id: 'U1D72A',\n    decimal: 120618,\n    character: '휪',\n    latex: 'O',\n  },\n  120676: {\n    id: 'U1D764',\n    decimal: 120676,\n    character: '흤',\n    latex: 'O',\n  },\n  120734: {\n    id: 'U1D79E',\n    decimal: 120734,\n    character: '힞',\n    latex: 'O',\n  },\n  120782: {\n    id: 'U1D7CE',\n    decimal: 120782,\n    character: 'ퟎ',\n    latex: '$\\\\mathbf{0}$',\n  },\n  120783: {\n    id: 'U1D7CF',\n    decimal: 120783,\n    character: 'ퟏ',\n    latex: '$\\\\mathbf{1}$',\n  },\n  120784: {\n    id: 'U1D7D0',\n    decimal: 120784,\n    character: 'ퟐ',\n    latex: '$\\\\mathbf{2}$',\n  },\n  120785: {\n    id: 'U1D7D1',\n    decimal: 120785,\n    character: 'ퟑ',\n    latex: '$\\\\mathbf{3}$',\n  },\n  120786: {\n    id: 'U1D7D2',\n    decimal: 120786,\n    character: 'ퟒ',\n    latex: '$\\\\mathbf{4}$',\n  },\n  120787: {\n    id: 'U1D7D3',\n    decimal: 120787,\n    character: 'ퟓ',\n    latex: '$\\\\mathbf{5}$',\n  },\n  120788: {\n    id: 'U1D7D4',\n    decimal: 120788,\n    character: 'ퟔ',\n    latex: '$\\\\mathbf{6}$',\n  },\n  120789: {\n    id: 'U1D7D5',\n    decimal: 120789,\n    character: 'ퟕ',\n    latex: '$\\\\mathbf{7}$',\n  },\n  120790: {\n    id: 'U1D7D6',\n    decimal: 120790,\n    character: 'ퟖ',\n    latex: '$\\\\mathbf{8}$',\n  },\n  120791: {\n    id: 'U1D7D7',\n    decimal: 120791,\n    character: 'ퟗ',\n    latex: '$\\\\mathbf{9}$',\n  },\n  120792: {\n    id: 'U1D7D8',\n    decimal: 120792,\n    character: 'ퟘ',\n    latex: '$\\\\mathbb{0}$',\n  },\n  120793: {\n    id: 'U1D7D9',\n    decimal: 120793,\n    character: 'ퟙ',\n    latex: '$\\\\mathbb{1}$',\n  },\n  120794: {\n    id: 'U1D7DA',\n    decimal: 120794,\n    character: 'ퟚ',\n    latex: '$\\\\mathbb{2}$',\n  },\n  120795: {\n    id: 'U1D7DB',\n    decimal: 120795,\n    character: 'ퟛ',\n    latex: '$\\\\mathbb{3}$',\n  },\n  120796: {\n    id: 'U1D7DC',\n    decimal: 120796,\n    character: 'ퟜ',\n    latex: '$\\\\mathbb{4}$',\n  },\n  120797: {\n    id: 'U1D7DD',\n    decimal: 120797,\n    character: 'ퟝ',\n    latex: '$\\\\mathbb{5}$',\n  },\n  120798: {\n    id: 'U1D7DE',\n    decimal: 120798,\n    character: 'ퟞ',\n    latex: '$\\\\mathbb{6}$',\n  },\n  120799: {\n    id: 'U1D7DF',\n    decimal: 120799,\n    character: 'ퟟ',\n    latex: '$\\\\mathbb{7}$',\n  },\n  120800: {\n    id: 'U1D7E0',\n    decimal: 120800,\n    character: 'ퟠ',\n    latex: '$\\\\mathbb{8}$',\n  },\n  120801: {\n    id: 'U1D7E1',\n    decimal: 120801,\n    character: 'ퟡ',\n    latex: '$\\\\mathbb{9}$',\n  },\n  120802: {\n    id: 'U1D7E2',\n    decimal: 120802,\n    character: 'ퟢ',\n    latex: '$\\\\mathsf{0}$',\n  },\n  120803: {\n    id: 'U1D7E3',\n    decimal: 120803,\n    character: 'ퟣ',\n    latex: '$\\\\mathsf{1}$',\n  },\n  120804: {\n    id: 'U1D7E4',\n    decimal: 120804,\n    character: 'ퟤ',\n    latex: '$\\\\mathsf{2}$',\n  },\n  120805: {\n    id: 'U1D7E5',\n    decimal: 120805,\n    character: 'ퟥ',\n    latex: '$\\\\mathsf{3}$',\n  },\n  120806: {\n    id: 'U1D7E6',\n    decimal: 120806,\n    character: 'ퟦ',\n    latex: '$\\\\mathsf{4}$',\n  },\n  120807: {\n    id: 'U1D7E7',\n    decimal: 120807,\n    character: 'ퟧ',\n    latex: '$\\\\mathsf{5}$',\n  },\n  120808: {\n    id: 'U1D7E8',\n    decimal: 120808,\n    character: 'ퟨ',\n    latex: '$\\\\mathsf{6}$',\n  },\n  120809: {\n    id: 'U1D7E9',\n    decimal: 120809,\n    character: 'ퟩ',\n    latex: '$\\\\mathsf{7}$',\n  },\n  120810: {\n    id: 'U1D7EA',\n    decimal: 120810,\n    character: 'ퟪ',\n    latex: '$\\\\mathsf{8}$',\n  },\n  120811: {\n    id: 'U1D7EB',\n    decimal: 120811,\n    character: 'ퟫ',\n    latex: '$\\\\mathsf{9}$',\n  },\n  120822: {\n    id: 'U1D7F6',\n    decimal: 120822,\n    character: 'ퟶ',\n    latex: '$\\\\mathtt{0}$',\n  },\n  120823: {\n    id: 'U1D7F7',\n    decimal: 120823,\n    character: 'ퟷ',\n    latex: '$\\\\mathtt{1}$',\n  },\n  120824: {\n    id: 'U1D7F8',\n    decimal: 120824,\n    character: 'ퟸ',\n    latex: '$\\\\mathtt{2}$',\n  },\n  120825: {\n    id: 'U1D7F9',\n    decimal: 120825,\n    character: 'ퟹ',\n    latex: '$\\\\mathtt{3}$',\n  },\n  120826: {\n    id: 'U1D7FA',\n    decimal: 120826,\n    character: 'ퟺ',\n    latex: '$\\\\mathtt{4}$',\n  },\n  120827: {\n    id: 'U1D7FB',\n    decimal: 120827,\n    character: 'ퟻ',\n    latex: '$\\\\mathtt{5}$',\n  },\n  120828: {\n    id: 'U1D7FC',\n    decimal: 120828,\n    character: '퟼',\n    latex: '$\\\\mathtt{6}$',\n  },\n  120829: {\n    id: 'U1D7FD',\n    decimal: 120829,\n    character: '퟽',\n    latex: '$\\\\mathtt{7}$',\n  },\n  120830: {\n    id: 'U1D7FE',\n    decimal: 120830,\n    character: '퟾',\n    latex: '$\\\\mathtt{8}$',\n  },\n  120831: {\n    id: 'U1D7FF',\n    decimal: 120831,\n    character: '퟿',\n    latex: '$\\\\mathtt{9}$',\n  },\n};\n\nexport default characters;\n","/*\n * bibliography-provider_zotero.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ZoteroCollection, ZoteroServer, kZoteroBibTeXTranslator, ZoteroCollectionSpec, ZoteroCSL } from '../zotero';\n\nimport { ParsedYaml, valueFromYamlText } from '../yaml';\nimport { suggestCiteId } from '../cite';\n\nimport {\n  BibliographyDataProvider,\n  BibliographyFile,\n  BibliographySourceWithCollections,\n  BibliographyCollection,\n} from './bibliography';\nimport { EditorUI } from '../ui';\nimport { CSL } from '../csl';\nimport { toBibTeX } from './bibDB';\n\nexport const kZoteroProviderKey = '2509FBBE-5BB0-44C4-B119-6083A81ED673';\n\nexport class BibliographyDataProviderZotero implements BibliographyDataProvider {\n  private allCollections: ZoteroCollection[] = [];\n  private allCollectionSpecs: BibliographyCollection[] = [];\n  private server: ZoteroServer;\n  private warning: string | undefined;\n  private enabled = true;\n\n  private docPath: string | undefined;\n  private zoteroConfig: boolean | string[] | undefined;\n\n  public constructor(server: ZoteroServer) {\n    this.server = server;\n  }\n\n  public name: string = 'Zotero';\n  public key: string = kZoteroProviderKey;\n  public requiresWritable: boolean = true;\n\n  public async load(\n    docPath: string,\n    _resourcePath: string,\n    yamlBlocks: ParsedYaml[],\n    refreshCollectionData: boolean,\n  ): Promise<boolean> {\n    let hasUpdates = false;\n    this.docPath = docPath;\n    this.zoteroConfig = zoteroConfig(yamlBlocks);\n    if (this.zoteroConfig) {\n      // Enabled\n      this.enabled = true;\n      try {\n        // Don't send the items back through to the server\n        const collectionSpecs = this.allCollections.map(({ items, ...rest }) => rest);\n\n        // If there is a warning, stop using the cache and force a fresh trip\n        // through the whole pipeline to be sure we're trying to clear that warning\n        const useCache = this.warning === undefined || this.warning.length === 0;\n\n        // The collection specified in the document header\n        const collections = Array.isArray(this.zoteroConfig) ? this.zoteroConfig : [];\n\n        const result = await this.server.getCollections(docPath, collections, collectionSpecs || [], useCache);\n        this.warning = result.warning;\n        if (result.status === 'ok') {\n          if (result.message) {\n            const newCollections = (result.message as ZoteroCollection[]).map(collection => {\n              const existingCollection = this.allCollections.find(col => col.name === collection.name);\n              if (useCache && existingCollection && existingCollection.version === collection.version) {\n                collection.items = existingCollection.items;\n              } else {\n                hasUpdates = true;\n              }\n              return collection;\n            });\n            hasUpdates = hasUpdates || newCollections.length !== this.collections.length;\n            this.allCollections = newCollections;\n          }\n        } else {\n          // console.log(result.status);\n        }\n      } catch (err) {\n        // console.log(err);\n      }\n\n      if (refreshCollectionData) {\n        // Lookup the collection specs\n        const specResult = await this.server.getActiveCollectionSpecs(\n          this.docPath || null,\n          Array.isArray(this.zoteroConfig) ? this.zoteroConfig : [],\n        );\n        if (specResult && specResult.status === 'ok') {\n          this.allCollectionSpecs = specResult.message.map((spec: ZoteroCollectionSpec) =>\n            this.toBibliographyCollection(spec),\n          );\n        } else {\n          this.allCollectionSpecs = [];\n        }\n      }\n    } else {\n      // Zotero is disabled, clear any already loaded bibliography\n      if (this.collections.length > 0) {\n        hasUpdates = true;\n      }\n      // Disabled\n      this.enabled = false;\n      this.allCollections = [];\n      this.allCollectionSpecs = [];\n    }\n    return hasUpdates;\n  }\n\n  // Respect enabled;\n  public isEnabled(): boolean {\n    return this.enabled && (this.allCollections.length > 0 || this.allCollectionSpecs.length > 0);\n  }\n\n  public collections(): BibliographyCollection[] {\n    return this.allCollectionSpecs || [];\n  }\n\n  private toBibliographyCollection(zoteroSpec: ZoteroCollectionSpec) {\n    return {\n      name: zoteroSpec.name,\n      key: zoteroSpec.key,\n      parentKey: zoteroSpec.parentKey,\n      provider: kZoteroProviderKey,\n    };\n  }\n\n  public items(): BibliographySourceWithCollections[] {\n    const entryArrays = this.allCollections?.map(collection => this.bibliographySources(collection)) || [];\n    const zoteroEntries = ([] as BibliographySourceWithCollections[]).concat(...entryArrays);\n    return zoteroEntries;\n  }\n\n  public itemsForCollection(collectionKey?: string): BibliographySourceWithCollections[] {\n    if (!collectionKey) {\n      return this.items();\n    }\n\n    return this.items().filter((item: any) => {\n      if (item.collectionKeys) {\n        return item.collectionKeys.includes(collectionKey);\n      }\n      return false;\n    });\n  }\n\n  public bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n    return [];\n  }\n\n  public async generateBibTeX(ui: EditorUI, id: string, csl: CSL): Promise<string | undefined> {\n    if (csl.key && ui.prefs.zoteroUseBetterBibtex()) {\n      const bibTeX = await this.server.betterBibtexExport(\n        [csl.key],\n        kZoteroBibTeXTranslator,\n        parseInt((csl as ZoteroCSL).libraryID, 10),\n      );\n      if (bibTeX) {\n        return Promise.resolve(bibTeX.message);\n      }\n    }\n    return Promise.resolve(toBibTeX(id, csl));\n  }\n\n  public warningMessage(): string | undefined {\n    return this.warning;\n  }\n\n  private bibliographySources(collection: ZoteroCollection): BibliographySourceWithCollections[] {\n    const items = collection.items?.map(item => {\n      return {\n        ...item,\n        id: item.id || suggestCiteId([], item),\n        providerKey: this.key,\n        collectionKeys: item.collectionKeys,\n      };\n    });\n    return items || [];\n  }\n}\n\n// The Zotero header allows the following:\n// zotero: true | false                           Globally enables or disables the zotero integration\n//                                                If true, uses all collections. If false uses none.\n//\n// By default, zotero integration is enabled. Add this header to disable integration\n//\nfunction zoteroConfig(parsedYamls: ParsedYaml[]): boolean | string[] {\n  // Read the values of any yaml blocks that include bibliography headers\n  // filter out blocks that don't include such headers\n  const zoteroValues = parsedYamls\n    .map(parsedYaml => {\n      return valueFromYamlText('zotero', parsedYaml.yamlCode);\n    })\n    .filter(val => val !== null);\n\n  if (zoteroValues.length > 0) {\n    // Pandoc will use the last biblography node when generating a bibliography.\n    // Take the same approach to the Zotero header and use the last node\n    const zoteroConfigValue = zoteroValues[zoteroValues.length - 1];\n    if (typeof zoteroConfigValue === 'boolean') {\n      return zoteroConfigValue;\n    } else if (typeof zoteroConfigValue === 'string') {\n      return [zoteroConfigValue];\n    } else if (Array.isArray(zoteroConfigValue)) {\n      return zoteroConfigValue.map(String);\n    } else {\n      return true;\n    }\n  }\n  return true;\n}\n","/*\n * zotero.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CSL } from './csl';\n\nexport interface ZoteroResult {\n  status:\n    | 'ok' // ok (results in 'message')\n    | 'notfound' // invalid api key\n    | 'nohost' // no internet connectivity\n    | 'error'; // unexpected error (details in 'error')\n  message: any | null;\n  warning: string;\n  error: string;\n}\n\nexport interface ZoteroCollectionSpec {\n  name: string;\n  version: number;\n  key: string;\n  parentKey: string;\n}\n\nexport interface ZoteroCollection extends ZoteroCollectionSpec {\n  items: ZoteroCSL[];\n}\n\nexport interface ZoteroCSL extends CSL {\n  libraryID: string;\n  collectionKeys: string[];\n}\n\n// https://github.com/retorquere/zotero-better-bibtex/blob/master/translators/Better%20BibTeX.json\nexport const kZoteroBibTeXTranslator = 'ca65189f-8815-4afe-8c8b-8c7c15f0edca';\n\nexport interface ZoteroServer {\n  validateWebAPIKey: (key: string) => Promise<boolean>;\n\n  getCollections: (\n    file: string | null,\n    collections: string[],\n    cached: ZoteroCollectionSpec[],\n    useCache: boolean,\n  ) => Promise<ZoteroResult>;\n\n  getLibraryNames: () => Promise<ZoteroResult>;\n\n  getActiveCollectionSpecs: (file: string | null, collections: string[]) => Promise<ZoteroResult>;\n\n  // Return status: nohost w/ warning text if it fails to\n  // communciate w/ Better BibTeX. Otherwise returns\n  // status: ok with exported text in message.\n  betterBibtexExport: (itemKeys: string[], translatorId: string, libraryId: number) => Promise<ZoteroResult>;\n}\n","/*\n * cite-completion.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\nimport uniqby from 'lodash.uniqby';\n\nimport { BibliographyManager, BibliographySource } from '../../api/bibliography/bibliography';\nimport { CompletionHandler, CompletionResult, CompletionHeaderProps } from '../../api/completion';\nimport { hasDOI } from '../../api/doi';\nimport { searchPlaceholderDecoration } from '../../api/placeholder';\nimport { EditorUI } from '../../api/ui';\nimport { CompletionItemView } from '../../api/widgets/completion';\n\nimport { PandocServer } from '../../api/pandoc';\nimport { EditorEvents } from '../../api/events';\n\nimport { BibliographyEntry, entryForSource } from './cite-bibliography_entry';\nimport { parseCitation, insertCitation as insertSingleCitation, performCiteCompletionReplacement } from './cite';\n\nimport './cite-completion.css';\n\nconst kAuthorMaxChars = 28;\nconst kMaxCitationCompletions = 100;\nconst kHeaderHeight = 20;\n\nexport const kCiteCompletionWidth = 400;\nconst kCiteCompletionItemPadding = 10;\n\nexport const kCitationCompleteScope = 'CitationScope';\n\nexport function citationCompletionHandler(\n  ui: EditorUI,\n  events: EditorEvents,\n  bibManager: BibliographyManager,\n  server: PandocServer,\n): CompletionHandler<BibliographyEntry> {\n  return {\n    id: 'AB9D4F8C-DA00-403A-AB4A-05373906FD8C',\n\n    scope: kCitationCompleteScope,\n\n    completions: citationCompletions(ui, bibManager),\n\n    filter: (entries: BibliographyEntry[], _state: EditorState, token: string) => {\n      return filterCitations(token, bibManager, entries, ui);\n    },\n\n    replace(view: EditorView, pos: number, entry: BibliographyEntry | null) {\n      if (entry && bibManager.findIdInLocalBibliography(entry.source.id)) {\n        // It's already in the bibliography, just write the id\n        const tr = view.state.tr;\n        const schema = view.state.schema;\n        const id = schema.text(entry.source.id, [schema.marks.cite_id.create()]);\n        performCiteCompletionReplacement(tr, pos, id);\n        view.dispatch(tr);\n      } else if (entry) {\n        // It isn't in the bibliography, show the insert cite dialog\n        return insertSingleCitation(\n          view,\n          entry.source.DOI || '',\n          bibManager,\n          pos,\n          ui,\n          server,\n          entry.source,\n          bibManager.providerName(entry.source.providerKey),\n        );\n      }\n      return Promise.resolve();\n    },\n\n    replacement(_schema: Schema, entry: BibliographyEntry | null): string | ProsemirrorNode | null {\n      if (entry) {\n        return entry.source.id;\n      } else {\n        return null;\n      }\n    },\n\n    view: {\n      header: () => {\n        if (bibManager.warning()) {\n          return {\n            component: CompletionWarningHeaderView,\n            height: kHeaderHeight,\n            message: bibManager.warning(),\n          };\n        }\n      },\n      component: BibliographySourceView,\n      key: entry => entry.source.id,\n      width: kCiteCompletionWidth,\n      height: 54,\n      maxVisible: 5,\n      hideNoResults: true,\n    },\n  };\n}\n\nfunction filterCitations(token: string, manager: BibliographyManager, entries: BibliographyEntry[], ui: EditorUI) {\n  // Empty query or DOI\n  if (token.trim().length === 0 || hasDOI(token)) {\n    return entries;\n  }\n\n  // Filter an exact match - if its exact match to an entry in the bibliography already, skip completion\n  // Ignore any punctuation at the end of the token\n  const tokenWithoutEndPunctuation = token.match(/.*[^\\,\\!\\?\\.\\:]/);\n  const completionId = tokenWithoutEndPunctuation ? tokenWithoutEndPunctuation[0] : token;\n  if (manager.localSources().find(source => source.id === completionId)) {\n    return [];\n  }\n\n  // Now do the regular search\n  const search = (str: string) => {\n    const results = uniqby(manager.searchAllSources(str, kMaxCitationCompletions), source => source.id).map(entry =>\n      entryForSource(entry, ui),\n    );\n    return uniqby(results, (entry: BibliographyEntry) => entry.source.id);\n  };\n  const searchResults = search(token);\n  return searchResults || [];\n}\n\nfunction citationCompletions(ui: EditorUI, manager: BibliographyManager) {\n  return (_text: string, context: EditorState | Transaction): CompletionResult<BibliographyEntry> | null => {\n\n    const parsed = parseCitation(context);\n    if (parsed) {\n      return {\n        token: parsed.token,\n        pos: parsed.pos,\n        offset: parsed.offset,\n        completions: async (_state: EditorState) => {\n          // function to retreive entries from the bib manager\n          const managerEntries = () => {\n            // Filter duplicate sources\n            const dedupedSources = uniqby(manager.allSources(), (source: BibliographySource) => source.id);\n\n            // Sort by id by default\n            const sortedSources = dedupedSources.sort((a, b) => a.id.localeCompare(b.id));\n            return sortedSources.map(source => entryForSource(source, ui));\n          };\n\n          // if we already have some completions from a previous load, then\n          // return them and kick off a refresh (new results will stream in)\n          if (manager.hasSources()) {\n            // kick off another load which we'll stream in by setting entries\n            let loadedEntries: BibliographyEntry[] | null = null;\n            manager.load(ui, context.doc).then(() => {\n              loadedEntries = managerEntries();\n            });\n\n            // return stream\n            return {\n              items: managerEntries(),\n              stream: () => loadedEntries,\n            };\n\n            // no previous load, just perform the load and return the entries\n          } else {\n            return manager.load(ui, context.doc).then(() => {\n              return managerEntries();\n            });\n          }\n        },\n        decorations:\n          parsed.token.length === 0\n            ? DecorationSet.create(context.doc, [\n                searchPlaceholderDecoration(context.selection.head, ui, ui.context.translateText('or DOI')),\n              ])\n            : undefined,\n      };\n    }\n    return null;\n  };\n}\n\n// The title may contain spans to control case specifically - consequently, we need\n// to render the title as HTML rather than as a string\nexport const BibliographySourceView: React.FC<BibliographyEntry> = entry => {\n  const authorStr = entry.authorsFormatter(entry.source.author, kAuthorMaxChars - entry.source.id.length);\n  const detail = `${authorStr} ${entry.issuedDateFormatter(entry.source.issued)}`;\n  return (\n    <CompletionItemView\n      width={kCiteCompletionWidth - kCiteCompletionItemPadding}\n      image={entry.image}\n      imageAdornment={entry.imageAdornment}\n      title={`@${entry.source.id}`}\n      subTitle={\n        entry.source.title || entry.source['short-title'] || entry.source['container-title'] || entry.source.type\n      }\n      detail={detail}\n      htmlTitle={true}\n    />\n  );\n};\n\nconst CompletionWarningHeaderView: React.FC<CompletionHeaderProps> = props => {\n  return (\n    <div className={'pm-completion-cite-warning pm-pane-border-color'}>\n      {props.ui.context.translateText(props.message || 'An unexpected warning occurred.')}\n    </div>\n  );\n};\n","/*\n * completion.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './completion.css';\n\nexport interface CompletionItemViewProps extends WidgetProps {\n  width: number;\n  image?: string;\n  imageAdornment?: string;\n  title: string;\n  detail?: string;\n  subTitle: string;\n  htmlTitle?: boolean;\n}\n\nexport const CompletionItemView: React.FC<CompletionItemViewProps> = props => {\n  const className = ['pm-completion-item'].concat(props.classes || []).join(' ');\n  const style: React.CSSProperties = {\n    width: props.width + 'px',\n    ...props.style,\n  };\n\n  return (\n    <div className={className} style={style}>\n      <div className={'pm-completion-item-type'}>\n        {props.imageAdornment ? (\n          <img\n            className={'pm-completion-image-adorn pm-block-border-color pm-background-color'}\n            src={props.imageAdornment}\n          />\n        ) : (\n          undefined\n        )}\n        <img className={'pm-completion-item-icon pm-block-border-color'} src={props.image} />\n      </div>\n      <div className={'pm-completion-item-summary'} style={{ width: props.width - 40 - 36 + 'px' }}>\n        <div className={'pm-completion-item-id'}>\n          <div className={'pm-completion-item-primary pm-completion-item-title pm-fixedwidth-font'}>{props.title}</div>\n          <div className={'pm-completion-item-primary pm-completion-item-detail'}>{props.detail}</div>\n        </div>\n        {props.htmlTitle ? (\n          <div className={'pm-completion-item-subTitle'} dangerouslySetInnerHTML={{ __html: props.subTitle || '' }} />\n        ) : (\n          <div className={'pm-completion-item-subTitle'}>{props.subTitle}</div>\n        )}\n      </div>\n    </div>\n  );\n};\n","/*\n * cite-bibliography_entry.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { BibliographySource } from '../../api/bibliography/bibliography';\nimport { EditorUI } from '../../api/ui';\nimport { CSLDate, CSLName, imageForType } from '../../api/csl';\nimport { formatAuthors, formatIssuedDate } from '../../api/cite';\nimport { kZoteroProviderKey } from '../../api/bibliography/bibliography-provider_zotero';\n\n// An entry which includes the source as well\n// additional metadata for displaying a bibliograph item\nexport interface BibliographyEntry {\n  source: BibliographySource;\n  authorsFormatter: (authors?: CSLName[], maxLength?: number) => string;\n  issuedDateFormatter: (issueDate?: CSLDate) => string;\n  image?: string;\n  imageAdornment?: string;\n}\n\nexport function entryForSource(source: BibliographySource, ui: EditorUI, forceLightMode?: boolean): BibliographyEntry {\n  const authorsFormatter = (authors?: CSLName[], maxLength?: number): string => {\n    return formatAuthors(authors, maxLength);\n  };\n\n  // Formatter used for shortening and displaying issue dates.\n  const issuedDateFormatter = (date?: CSLDate): string => {\n    if (date) {\n      return formatIssuedDate(date);\n    }\n    return '';\n  };\n\n  // Map the Bibliography Sources to Entries which include additional\n  // metadat and functions for display\n  return {\n    source,\n    authorsFormatter,\n    issuedDateFormatter,\n    image: imageForType(ui.images, source.type)[ui.prefs.darkMode() && !forceLightMode ? 1 : 0],\n    imageAdornment: source.providerKey === kZoteroProviderKey ? ui.images.citations?.zoteroOverlay : undefined,\n  };\n}\n","/*\n * cite-highlight.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\n\nimport { markHighlightPlugin, markHighlightDecorations } from '../../api/mark-highlight';\n\nconst key = new PluginKey<DecorationSet>('cite-highlight');\n\nexport function citeHighlightPlugin(schema: Schema) {\n  return markHighlightPlugin(key, schema.marks.cite, (text, _attrs, markRange) => {\n    return markHighlightDecorations(markRange, text, /([\\[\\]])/g, 'pm-link-text-color pm-fixedwidth-font');\n  });\n}\n","/*\n * cite-completion_doi.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport {\n  CompletionHandler,\n  CompletionResult,\n  performCompletionReplacement,\n  CompletionContext,\n} from '../../api/completion';\nimport { formatAuthors, formatIssuedDate } from '../../api/cite';\nimport { CSL, imageForType } from '../../api/csl';\nimport { CompletionItemDetailedView } from '../../api/widgets/completion-detailed';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\nimport { EditorServer } from '../../api/server';\nimport { DOIServer } from '../../api/doi';\n\nimport { doiFromEditingContext } from './cite-doi';\nimport { insertCitation } from './cite';\nimport { kCitationCompleteScope } from './cite-completion';\n\nconst kCompletionWidth = 400;\nconst kCompletionItemPadding = 10;\n\nexport function citationDoiCompletionHandler(\n  ui: EditorUI,\n  bibManager: BibliographyManager,\n  server: EditorServer,\n): CompletionHandler<CSLEntry> {\n  return {\n    id: '56DA14DD-6E3A-4481-93A9-938DC00393A5',\n\n    scope: kCitationCompleteScope,\n\n    completions: citationDOICompletions(ui, server.doi, bibManager),\n\n    replace(view: EditorView, pos: number, cslEntry: CSLEntry | null) {\n      if (cslEntry && cslEntry.inBibliography) {\n        // It's already in the bibliography, just write the id\n        const tr = view.state.tr;\n        const schema = view.state.schema;\n        const id = schema.text(cslEntry.id, [schema.marks.cite_id.create()]);\n        performCompletionReplacement(tr, pos, id);\n        view.dispatch(tr);\n      } else if (cslEntry) {\n        // It isn't in the bibliography, show the insert cite dialog\n        return insertCitation(view, cslEntry.csl.DOI || '', bibManager, pos, ui, server.pandoc, cslEntry.csl);\n      }\n      return Promise.resolve();\n    },\n\n    view: {\n      component: CSLSourceView,\n      key: cslEntry => cslEntry.csl.DOI,\n      width: kCompletionWidth,\n      height: 120,\n      maxVisible: 5,\n      hideNoResults: true,\n    },\n  };\n}\n\nconst kPRogressDelay = 350;\n\nfunction citationDOICompletions(ui: EditorUI, server: DOIServer, bibliographyManager: BibliographyManager) {\n  return (_text: string, context: EditorState | Transaction): CompletionResult<CSLEntry> | null => {\n    const parsedDOI = doiFromEditingContext(context);\n    if (parsedDOI) {\n      return {\n        token: parsedDOI.token,\n        pos: parsedDOI.pos,\n        offset: parsedDOI.offset,\n        completions: async (_state: EditorState, completionContext: CompletionContext) => {\n          // If we have a local source that matches this DOI, just show the\n          // completion for the entry\n          await bibliographyManager.load(ui, context.doc);\n          const source = bibliographyManager.findDoiInLocalBibliography(parsedDOI.token);\n          if (source) {\n            return [\n              {\n                id: source.id,\n                csl: source,\n                inBibliography: true,\n                image: imageForType(ui.images, source.type)[ui.prefs.darkMode() ? 1 : 0],\n                formattedAuthor: formatAuthors(source.author, 50),\n                formattedIssueDate: formatIssuedDate(source.issued),\n              },\n            ];\n          } else {\n            return [];\n          }\n        },\n      };\n    }\n    return null;\n  };\n}\n\ninterface CSLEntry {\n  id: string;\n  csl: CSL;\n  inBibliography: boolean;\n  image?: string;\n  formattedAuthor: string;\n  formattedIssueDate: string;\n}\n\nconst CSLSourceView: React.FC<CSLEntry> = cslEntry => {\n  const csl = cslEntry.csl;\n  return (\n    <CompletionItemDetailedView\n      width={kCompletionWidth - kCompletionItemPadding}\n      image={cslEntry.image}\n      heading={csl['short-container-title'] || csl.publisher || ''}\n      title={csl.title || ''}\n      subTitle={`${cslEntry.formattedAuthor} ${cslEntry.formattedIssueDate}` || ''}\n    />\n  );\n};\n","/*\n * completion-detailed.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './completion-detailed.css';\n\nexport interface CompletionItemDetailedViewProps extends WidgetProps {\n  width: number;\n  image?: string;\n  heading: string;\n  title: string;\n  subTitle: string;\n}\n\nexport const CompletionItemDetailedView: React.FC<CompletionItemDetailedViewProps> = props => {\n  const className = ['pm-completion-detailed-item'].concat(props.classes || []).join(' ');\n  const style: React.CSSProperties = {\n    width: props.width + 'px',\n    ...props.style,\n  };\n\n  return (\n    <div className={className} style={style}>\n      <div className={'pm-completion-detailed-item-type'}>\n        <img className={'pm-block-border-color'} src={props.image} />\n      </div>\n      <div className={'pm-completion-item-detailed-summary'}>\n        <div className={'pm-completion-item-detailed-heading'}>{props.heading}</div>\n        <div className={'pm-completion-item-detailed-title'}>{props.title}</div>\n        <div className={'pm-completion-item-detailed-subTitle'}>{props.subTitle}</div>\n      </div>\n    </div>\n  );\n};\n","/*\n * cite-doi.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Slice } from 'prosemirror-model';\n\nimport { findDOI } from '../../api/doi';\n\nimport { parseCitation, ParsedCitation } from './cite';\n\n// Parses the transation or state to determine whether the current position\n// represents a citation containing a DOI\nexport function doiFromEditingContext(context: EditorState | Transaction): ParsedCitation | undefined {\n  \n  const parsedCitation = parseCitation(context);\n  if (parsedCitation) {\n    const doi = findDOI(parsedCitation.token);\n    if (doi) {\n      return parsedCitation;\n    }\n    return undefined;\n  }\n}\n\n// Parses a slice to determine whether the slice contains\n// a single DOI\nexport function doiFromSlice(context: EditorState | Transaction, slice: Slice): ParsedCitation | undefined {\n  const parsedCitation = parseCitation(context);\n  if (parsedCitation) {\n    // Concatenate all the text and search for a DOI\n    let text = '';\n    slice.content.forEach(node => (text = text + node.textContent));\n    if (text.length) {\n      const doi = findDOI(text.trim());\n      if (doi) {\n        return { ...parsedCitation, token: doi };\n      }\n    }\n    return undefined;\n  }\n}\n","/*\n * cite-popup.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { Popup } from '../../api/widgets/popup';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\nimport { PandocServer } from '../../api/pandoc';\n\nimport './cite-popup.css';\nimport { urlForCitation } from '../../api/cite';\nimport { cslFromDoc } from '../../api/csl';\n\nconst kMaxWidth = 400; // also in cite-popup.css\n\nexport function citePopupPlugin(schema: Schema, ui: EditorUI, bibMgr: BibliographyManager, server: PandocServer) {\n  return textPopupDecorationPlugin({\n    key: new PluginKey<DecorationSet>('cite-popup'),\n    markType: schema.marks.cite_id,\n    maxWidth: kMaxWidth,\n    dismissOnEdit: true,\n    makeLinksAccessible: true,\n    createPopup: async (view: EditorView, target: TextPopupTarget, style: React.CSSProperties) => {\n      await bibMgr.load(ui, view.state.doc);\n\n      const csl = cslFromDoc(view.state.doc);\n      const citeId = target.text.replace(/^-@|^@/, '');\n      const source = bibMgr.findIdInLocalBibliography(citeId);\n      if (source) {\n        const previewHtml = await server.citationHTML(\n          ui.context.getDocumentPath(),\n          JSON.stringify([source]),\n          csl || null,\n        );\n        const finalHtml = ensureSafeLinkIsPresent(previewHtml, () => {\n          const url = urlForCitation(source);\n          if (url) {\n            return {\n              text: ui.context.translateText('[Link]'),\n              url,\n            };\n          }\n        });\n\n        return <CitePopup previewHtml={finalHtml} style={style} />;\n      }\n      return null;\n    },\n    specKey: (target: TextPopupTarget) => {\n      return `cite:${target.text}`;\n    },\n  });\n}\n\nconst kCiteHangingIndentClass = 'hanging-indent';\nconst kCiteLinkClassName = 'pm-cite-popup-link';\n\nfunction ensureSafeLinkIsPresent(html: string, getLinkData: () => { text: string; url: string } | undefined) {\n  const parser = new window.DOMParser();\n  const doc = parser.parseFromString(html, 'text/html');\n\n  // remove id, class, and role from main div\n  const rootDiv = doc.body.getElementsByClassName('references');\n  if (rootDiv.length > 0) {\n    const classNames = rootDiv[0].getAttribute('class');\n    const hasHangingIndent = classNames?.match(`(^|\\\\s)${kCiteHangingIndentClass}($|\\\\s)`);\n\n    rootDiv[0].removeAttribute('id');\n    rootDiv[0].removeAttribute('role');\n\n    if (hasHangingIndent && hasHangingIndent.length > 0) {\n      rootDiv[0].setAttribute('class', kCiteHangingIndentClass);\n    } else {\n      rootDiv[0].removeAttribute('class');\n    }\n  }\n\n  const linkElements = doc.body.getElementsByTagName('a');\n  if (linkElements.length === 0) {\n    const linkData = getLinkData();\n\n    // There aren't any links, we should append one\n    // (If links are present, we assume that we shouldn't add another)\n    const paragraphs = doc.body.getElementsByTagName('p');\n    if (paragraphs.length === 1 && linkData) {\n      // The paragraph containing the formatted source\n      const paragraph = paragraphs[0];\n\n      // Create a link to append\n      const linkElement = doc.createElement('a');\n      linkElement.innerText = linkData.text;\n      linkElement.setAttribute('href', linkData.url);\n      linkElement.setAttribute('class', `${kCiteLinkClassName} pm-link-text-color`);\n      setLinkTarget(linkElement);\n\n      // Append the link to the formatted source\n      paragraph.appendChild(linkElement);\n    }\n  } else {\n    // There are links, ensure all of them have appropriate target information\n    // tslint:disable-next-line: prefer-for-of\n    for (let i = 0; i < linkElements.length; i++) {\n      linkElements[i].setAttribute('class', `pm-link-text-color`);\n      setLinkTarget(linkElements[i]);\n    }\n  }\n\n  // Return the HTML omitting CR/LF - CR\n  return doc.body.innerHTML.replace(/\\r?\\n|\\r/g, '');\n}\n\nfunction setLinkTarget(linkElement: HTMLAnchorElement) {\n  linkElement.setAttribute('target', '_blank');\n  linkElement.setAttribute('rel', 'noopener noreferrer');\n}\n\ninterface CitePopupProps extends WidgetProps {\n  previewHtml: string;\n}\n\nconst CitePopup: React.FC<CitePopupProps> = props => {\n  return (\n    <Popup classes={['pm-cite-popup']} style={props.style}>\n      <div className=\"pm-cite-popup-preview\">\n        <div dangerouslySetInnerHTML={{ __html: props.previewHtml || '' }} />\n      </div>\n    </Popup>\n  );\n};\n","/*\n * cite-commands.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { EditorEvents } from '../../api/events';\nimport { EditorServer } from '../../api/server';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\n\nimport { ensureSourcesInBibliography } from './cite';\nimport { showInsertCitationDialog, InsertCitationDialogResult } from '../../behaviors/insert_citation/insert_citation';\nimport { markIsActive, getMarkRange } from '../../api/mark';\n\nexport class InsertCitationCommand extends ProsemirrorCommand {\n  private initialSelectionKey: string | undefined;\n\n  constructor(ui: EditorUI, events: EditorEvents, bibliographyManager: BibliographyManager, server: EditorServer) {\n    super(\n      EditorCommandId.Citation,\n      ['Shift-Mod-F8'],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        // enable/disable command\n        const schema = state.schema;\n        if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.cite)(state)) {\n          return false;\n        }\n\n        if (dispatch && view) {\n          showInsertCitationDialog(\n            ui,\n            state.doc,\n            bibliographyManager,\n            server,\n            async (result: InsertCitationDialogResult) => {\n              if (result) {\n                // Remember the last tree node that was selected\n                this.initialSelectionKey = result.selectionKey;\n\n                // Remember whether the citation is intext for the future\n                ui.prefs.setCitationDefaultInText(result.intextCitationStyle);\n\n                // The citations that we should insert\n                const bibliographySources = result.bibliographySources;\n\n                // The bibliography that we should insert sources into (if needed)\n                const bibliography = result.bibliography;\n\n                // The transaction that will hold all the changes we'll make\n                const tr = state.tr;\n\n                // First, be sure that we add any sources to the bibliography\n                // and that the bibliography is properly configured\n                const writeCiteId = await ensureSourcesInBibliography(\n                  tr,\n                  bibliographySources,\n                  bibliography,\n                  bibliographyManager,\n                  view,\n                  ui,\n                  server.pandoc,\n                );\n\n                if (writeCiteId) {\n                  // The starting location of this transaction\n                  const start = tr.selection.from;\n\n                  // See if we are already inside an active cite mark\n                  const alreadyInCite = markIsActive(tr, schema.marks.cite);\n                  const includeWrapper = !result.intextCitationStyle || result.bibliographySources.length > 1;\n\n                  // Insert the wrapping [] if the user wants that style citation\n                  // Note that if the use is inserting more than one citation, we ignore this and just\n                  // always perform a 'note' style citation insert\n                  // If we're already inside a cite including [], don't bother inserting wrapper\n                  if (!alreadyInCite && includeWrapper) {\n                    const wrapperText = schema.text('[]');\n                    tr.insert(tr.selection.from, wrapperText);\n\n                    // move the selection into the wrapper\n                    setTextSelection(tr.selection.from - 1)(tr);\n                  }\n\n                  // If the previous character is a part of a cite_id, advance to the end of the mark,\n                  // insert a separator, and then proceed\n                  const preCiteIdRange = getMarkRange(tr.doc.resolve(start - 1), schema.marks.cite_id);\n                  if (preCiteIdRange) {\n                    setTextSelection(preCiteIdRange.to)(tr);\n                    const separator = schema.text('; ');\n                    tr.insert(tr.selection.from, separator);\n                  }\n\n                  // insert the CiteId marks and text\n                  bibliographySources.forEach((citation, i) => {\n                    const citeIdMark = schema.marks.cite_id.create();\n                    const citeIdText = schema.text(`@${citation.id}`, [citeIdMark]);\n                    tr.insert(tr.selection.from, citeIdText);\n                    if (bibliographySources.length > 1 && i !== bibliographySources.length - 1) {\n                      tr.insert(tr.selection.from, schema.text('; ', []));\n                    }\n                  });\n\n                  // If the next character is a part of a cite_id, insert a separator (that will appear after the current citeId)\n                  const postCiteIdRange = getMarkRange(tr.doc.resolve(tr.selection.from + 1), schema.marks.cite_id);\n                  if (postCiteIdRange) {\n                    const separator = schema.text('; ');\n                    tr.insert(tr.selection.from, separator);\n                  }\n\n                  // Enclose wrapper in the cite mark (if not already in a cite)\n                  if (!alreadyInCite) {\n                    const endOfWrapper = includeWrapper ? tr.selection.from + 1 : tr.selection.from;\n                    const citeMark = schema.marks.cite.create();\n                    tr.addMark(start, endOfWrapper, citeMark);\n                    setTextSelection(endOfWrapper)(tr);\n                  }\n                }\n\n                // commit the transaction\n                dispatch(tr);\n\n                return Promise.resolve();\n              }\n            },\n            this.initialSelectionKey,\n          );\n        }\n        return true;\n      },\n      {\n        name: ui.context.translateText('Citation...'),\n        description: ui.context.translateText('Reference to a source'),\n        group: OmniInsertGroup.References,\n        priority: 1,\n        image: () => (ui.prefs.darkMode() ? ui.images.omni_insert!.citation_dark! : ui.images.omni_insert!.citation!),\n      },\n      // false\n    );\n  }\n}\n","/*\n * insert_citation_picker.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport {\n  BibliographyFile,\n  BibliographyManager,\n  bibliographyTypes,\n  bibliographyFileForPath,\n  BibliographySource,\n} from '../../api/bibliography/bibliography';\nimport { kInvalidCiteKeyChars } from '../../api/cite';\nimport { changeExtension } from '../../api/path';\nimport { EditorServer } from '../../api/server';\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { TagInput, TagItem } from '../../api/widgets/tag-input';\nimport { NavigationTreeNode, containsChild, NavigationTree } from '../../api/widgets/navigation-tree';\nimport { DialogButtons } from '../../api/widgets/dialog-buttons';\n\nimport {\n  CitationSourcePanelProps,\n  CitationSourcePanelProvider,\n  CitationListEntry,\n  CitationSourceListStatus,\n  BibliographySourceProvider,\n} from './source_panels/insert_citation-source-panel';\nimport { bibliographySourcePanel } from './source_panels/insert_citation-source-panel-bibliography';\nimport { doiSourcePanel } from './source_panels/insert_citation-source-panel-doi';\nimport { crossrefSourcePanel } from './source_panels/insert_citation-source-panel-crossref';\nimport { pubmedSourcePanel } from './source_panels/insert_citation-source-panel-pubmed';\nimport { dataciteSourcePanel } from './source_panels/insert_citation-source-panel-datacite';\nimport { CitationBibliographyPicker } from './insert_citation-bibliography-picker';\n\nimport './insert_citation.css';\nimport debounce from 'lodash.debounce';\nimport { CheckboxInput } from '../../api/widgets/checkbox-input';\n\n// When the dialog has completed, it will return this result\n// If the dialog is canceled no result will be returned\nexport interface InsertCitationDialogResult {\n  bibliographySources: BibliographySource[];\n  bibliography: BibliographyFile;\n  intextCitationStyle: boolean;\n  selectionKey?: string;\n}\n\n// Show the insert citation dialog and returns the\n// items that should be inserted, the bibliography in which to write them\n// and the last selected position in the tree\nexport async function showInsertCitationDialog(\n  ui: EditorUI,\n  doc: ProsemirrorNode,\n  bibliographyManager: BibliographyManager,\n  server: EditorServer,\n  performInsertCitations: (result: InsertCitationDialogResult) => Promise<void>,\n  initiallySelectedNodeKey?: string,\n): Promise<boolean> {\n  // The result that will be returned to the called\n  let result: InsertCitationDialogResult | undefined;\n\n  // Present the dialog\n  const performInsert = await ui.dialogs.htmlDialog(\n    'Insert Citation',\n    'Insert',\n    (\n      containerWidth: number,\n      containerHeight: number,\n      confirm: VoidFunction,\n      cancel: VoidFunction,\n      showProgress: (message: string) => void,\n      hideProgress: VoidFunction,\n    ) => {\n      const kMaxHeight = 650;\n      const kMaxWidth = 900;\n      const kMaxHeightProportion = 0.9;\n      const kdialogPaddingIncludingButtons = 70;\n\n      const windowHeight = containerHeight;\n      const windowWidth = containerWidth;\n\n      const height = Math.min(kMaxHeight, windowHeight * kMaxHeightProportion - kdialogPaddingIncludingButtons);\n      const width = Math.max(Math.min(kMaxWidth, windowWidth * 0.9), 550);\n\n      const container = window.document.createElement('div');\n      container.className = 'pm-default-theme';\n\n      // Provide the providers top the dialog and then refresh the bibliography and reload\n      // the items\n      const providersForBibliography = (writable: boolean) => {\n        return writable\n          ? [\n            bibliographySourcePanel(doc, ui, bibliographyManager),\n            doiSourcePanel(ui, server.doi, bibliographyManager),\n            crossrefSourcePanel(ui, server.crossref, server.doi, bibliographyManager),\n            dataciteSourcePanel(ui, server.datacite, server.doi, bibliographyManager),\n            pubmedSourcePanel(ui, server.pubmed, server.doi, bibliographyManager),\n          ]\n          : [bibliographySourcePanel(doc, ui, bibliographyManager)];\n      };\n\n      // Provide a configuration stream that will update after the bibliography loads\n      let updatedConfiguration: InsertCitationPanelConfiguration | undefined;\n      const configurationStream: InsertCitationPanelConfigurationStream = {\n        current: {\n          providers: providersForBibliography(bibliographyManager.allowsWrites()),\n          bibliographyFiles: bibliographyManager.bibliographyFiles(doc, ui),\n          existingIds: bibliographyManager.localSources().map(source => source.id),\n        },\n        stream: () => {\n          return updatedConfiguration || null;\n        },\n      };\n\n      // Load the bibliography and then update the configuration\n      bibliographyManager.load(ui, doc, true).then(() => {\n        updatedConfiguration = {\n          providers: providersForBibliography(bibliographyManager.allowsWrites()),\n          bibliographyFiles: bibliographyManager.bibliographyFiles(doc, ui),\n          existingIds: bibliographyManager.localSources().map(source => source.id),\n        };\n      });\n\n      // Handles the confirmation by the user\n      const onOk = async (\n        bibliographySourceProviders: BibliographySourceProvider[],\n        bibliography: BibliographyFile,\n        selectedNode: NavigationTreeNode,\n        intextCitationStyle: boolean\n      ) => {\n        // Because some bibliography entries will need to download their CSL (based upon the\n        // DOI), we need to keep the dialog alive so we can use it to show progress. As a result\n        // rather than waiting for the dialog to be dismissed and  using the result, we do the work\n        // here ahead of calling 'confirm'. But confirm also provides the validation message for the\n        // dialog, so we still call 'confirm' even if we know it isn't valid (no citations selected)\n        // so the validation message can be displayed to the user.\n        if (bibliographySourceProviders.length > 0) {\n\n          // Look through the items and see whether any will be slow\n          // If some are slow, show progress\n          const requiresProgress = bibliographySourceProviders.some(\n            sourceProvider => sourceProvider.isSlowGeneratingBibliographySource,\n          );\n          if (requiresProgress) {\n            showProgress(\n              ui.context.translateText(\n                bibliographySourceProviders.length === 1\n                  ? 'Creating bibliography entry...'\n                  : 'Creating bibliography entries...',\n              ),\n            );\n          }\n\n          // Generate bibliography sources for each of the entries\n          const bibliographySources = await Promise.all(\n            bibliographySourceProviders.map(sourceProvider => sourceProvider.toBibliographySource(sourceProvider.id)),\n          );\n          result = {\n            bibliographySources,\n            bibliography,\n            intextCitationStyle,\n            selectionKey: selectedNode.key,\n          };\n\n          // Notify the caller to perform the inseration\n          await performInsertCitations(result);\n\n          // Clear progress\n          if (requiresProgress) {\n            hideProgress();\n          }\n        }\n        // Dismiss the dialog\n        confirm();\n      };\n\n      container.style.width = width + 'px';\n      ReactDOM.render(\n        <InsertCitationPanel\n          height={height}\n          width={width}\n          configuration={configurationStream}\n          initiallySelectedNodeKey={initiallySelectedNodeKey}\n          onOk={onOk}\n          onCancel={cancel}\n          doc={doc}\n          ui={ui}\n        />,\n        container,\n      );\n      return container;\n    },\n    () => {\n      // Focus\n      // dealt with in the React Component itself\n    },\n    () => {\n      // Validation\n      // User has to select a citation, everything else we can use defaults\n      if (!result || result.bibliographySources.length === 0) {\n        return ui.context.translateText('Please select at least one citation to insert.');\n      }\n      return null;\n    },\n  );\n\n  // return the result to the caller\n  if (performInsert && result) {\n    return Promise.resolve(true);\n  } else {\n    return Promise.resolve(false);\n  }\n}\n\ninterface InsertCitationPanelConfiguration {\n  providers: CitationSourcePanelProvider[];\n  bibliographyFiles: BibliographyFile[];\n  existingIds: string[];\n}\n\ninterface InsertCitationPanelConfigurationStream {\n  current: InsertCitationPanelConfiguration;\n  stream: () => InsertCitationPanelConfiguration | null;\n}\n\n// The picker is a full featured UI for finding and selecting citation data\n// to be added to a document.\ninterface InsertCitationPanelProps extends WidgetProps {\n  ui: EditorUI;\n  doc: ProsemirrorNode;\n  height: number;\n  width: number;\n  configuration: InsertCitationPanelConfigurationStream;\n  initiallySelectedNodeKey?: string;\n  onOk: (\n    bibliographySourceProviders: BibliographySourceProvider[],\n    bibliography: BibliographyFile,\n    selectedNode: NavigationTreeNode,\n    intextCitationStyle: boolean\n  ) => void;\n  onCancel: () => void;\n}\n\ninterface InsertCitationPanelState {\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n  selectedIndex: number;\n  searchTerm: string;\n  selectedNode: NavigationTreeNode;\n  status: CitationSourceListStatus;\n  statusMessage: string;\n  existingBibliographyFile: BibliographyFile;\n  createBibliographyFile: BibliographyFile;\n  intextCitationStyle: boolean;\n}\n\ninterface InsertCitationPanelUpdateState {\n  citations?: CitationListEntry[];\n  citationsToAdd?: CitationListEntry[];\n  selectedIndex?: number;\n  searchTerm?: string;\n  selectedNode?: NavigationTreeNode;\n  status?: CitationSourceListStatus;\n  statusMessage?: string;\n  existingBibliographyFile?: BibliographyFile;\n  createBibliographyFile?: BibliographyFile;\n  intextCitationStyle?: boolean;\n}\n\nexport const InsertCitationPanel: React.FC<InsertCitationPanelProps> = props => {\n  // The configuration state of this panel\n  const [insertCitationConfiguration, setInsertCitationConfiguration] = React.useState<\n    InsertCitationPanelConfiguration\n  >(props.configuration.current);\n\n  // The source data for the tree\n  const treeSourceData = insertCitationConfiguration.providers.map(panel => panel.treeNode());\n\n  // The selected provider / panel for the dialog\n  const defaultNode = nodeForKey(treeSourceData, props.initiallySelectedNodeKey);\n  const [selectedPanelProvider, setSelectedPanelProvider] = React.useState<CitationSourcePanelProvider>(\n    panelForNode(insertCitationConfiguration.providers, defaultNode) || insertCitationConfiguration.providers[0],\n  );\n\n  // Holder of the dialog state\n  const [insertCitationPanelState, setInsertCitationPanelState] = React.useState<InsertCitationPanelState>({\n    citations: [],\n    citationsToAdd: [],\n    selectedIndex: -1,\n    searchTerm: '',\n    selectedNode: defaultNode || selectedPanelProvider.treeNode(),\n    status: CitationSourceListStatus.default,\n    statusMessage: selectedPanelProvider.placeHolderMessage || '',\n    existingBibliographyFile: props.configuration.current.bibliographyFiles[0],\n    createBibliographyFile: bibliographyFileForPath(\n      changeExtension(\n        'references.json',\n        props.ui.prefs.bibliographyDefaultType() || bibliographyTypes(props.ui)[0].extension,\n      ),\n      props.ui,\n    ),\n    intextCitationStyle: props.ui.prefs.citationDefaultInText()\n  });\n\n  // Core method to update dialog state\n  const updateState = (updatedState: InsertCitationPanelUpdateState) => {\n    const newState = {\n      ...insertCitationPanelState,\n      ...updatedState,\n    };\n    setInsertCitationPanelState(newState);\n  };\n\n  // The dialog intelligently manages and merges the selected item and the explicitly added items\n  // This is the merged set of citations based upon the explicitly chosen and currently selected citations\n  const displayedCitations = insertCitationPanelState.citations.filter(\n    citation => !insertCitationPanelState.citationsToAdd.includes(citation),\n  );\n  const selectedCitation =\n    insertCitationPanelState.selectedIndex > -1\n      ? displayedCitations[insertCitationPanelState.selectedIndex]\n      : undefined;\n  const mergedCitationsToAdd = mergeCitations(insertCitationPanelState.citationsToAdd, selectedCitation);\n  const existingCitationIds = [\n    ...insertCitationConfiguration.existingIds,\n    ...mergedCitationsToAdd.map(citation => citation.id),\n  ];\n\n  // The initial setting of focus and loading of data for the panel.\n  const panelRef = React.useRef<any>(undefined);\n\n  // When the stream of configuration changes is actually loaded, we need to refresh the search\n  // results to reflect the new configuration. The below refs basically:\n  // 1) Capture the timer itself so only timer is created and it will be properly canceled\n  // 2) Captures the up to date state in the callback that will be used to refresh the search results -\n  //    If we don't refresh it each render, it will capture the state the time it was created\n  const streamTimerId = React.useRef<NodeJS.Timeout>();\n  const refreshSearchCallback = React.useRef<VoidFunction>();\n  React.useEffect(() => {\n    refreshSearchCallback.current = () => {\n      // Once the configurations, refresh the search\n      const defaultResults = selectedPanelProvider.typeAheadSearch(\n        insertCitationPanelState.searchTerm,\n        insertCitationPanelState.selectedNode,\n        existingCitationIds,\n      );\n      if (defaultResults) {\n        updateState({\n          searchTerm: '',\n          citations: defaultResults?.citations || [],\n          status: defaultResults?.status || CitationSourceListStatus.default,\n          statusMessage: defaultResults?.statusMessage || selectedPanelProvider.placeHolderMessage,\n        });\n      }\n    };\n  });\n\n  React.useEffect(() => {\n    // Set initial focus\n    if (panelRef.current) {\n      setTimeout(() => {\n        panelRef.current.focus();\n      }, 200);\n    }\n\n    // Poll the configuration stream for updates\n    // We need to keep the Timeout to clear around as ref so\n    // it survives any renders\n    streamTimerId.current = setInterval(() => {\n      const result = props.configuration.stream();\n      if (result !== null) {\n        if (streamTimerId.current) {\n          clearInterval(streamTimerId.current);\n        }\n\n        setInsertCitationConfiguration(result);\n        const panelProvider = panelForNode(result.providers, insertCitationPanelState.selectedNode);\n        if (panelProvider) {\n          setSelectedPanelProvider(panelProvider);\n        }\n        if (refreshSearchCallback.current) {\n          refreshSearchCallback.current();\n        }\n      }\n    }, 200);\n\n    // Set the default state to initialize the first search\n    const searchResult = selectedPanelProvider.typeAheadSearch(\n      '',\n      insertCitationPanelState.selectedNode,\n      existingCitationIds,\n    );\n    updateState({\n      searchTerm: '',\n      citations: searchResult?.citations || [],\n      status: searchResult?.status || CitationSourceListStatus.default,\n      statusMessage: searchResult?.statusMessage || selectedPanelProvider.placeHolderMessage,\n    });\n  }, []);\n\n  // When the user presses the insert button\n  const onOk = () => {\n    props.onOk(\n      mergedCitationsToAdd,\n      insertCitationPanelState.existingBibliographyFile || insertCitationPanelState.createBibliographyFile,      \n      insertCitationPanelState.selectedNode,\n      insertCitationPanelState.intextCitationStyle\n    );\n  };\n\n  // Style properties\n  const style: React.CSSProperties = {\n    width: props.width + 'px',\n    ...props.style,\n  };\n\n  // Figure out the panel height (the height of the main panel less padding and other elements)\n  const panelHeight = props.height * 0.75;\n\n  // In order to debounce typeahead search, we need to memoize the callback so the same debounce function will be\n  // used even when renders happen. Be sure to pass everything that need to reflect updated state since\n  // otherwise the value will be captured when the callback is memoized.\n  const memoizedTypeaheadSearch = React.useCallback(\n    debounce(\n      (\n        searchTerm: string,\n        panelProvider: CitationSourcePanelProvider,\n        selectedNode: NavigationTreeNode,\n        existingIds: string[],\n      ) => {\n        const searchResult = panelProvider.typeAheadSearch(searchTerm, selectedNode, existingIds);\n        if (searchResult) {\n          updateState({\n            searchTerm,\n            citations: searchResult?.citations,\n            status: searchResult?.status,\n            statusMessage: searchResult?.statusMessage,\n            selectedNode,\n          });\n        }\n      },\n      30,\n    ),\n    [],\n  );\n\n  // The core props that will be passed to whatever the selected panel is\n  // This implements the connection of the panel events and data and the\n  // core dialog state\n  const citationProps: CitationSourcePanelProps = {\n    ui: props.ui,\n    height: panelHeight,\n    citations: displayedCitations,\n    citationsToAdd: mergedCitationsToAdd,\n    searchTerm: insertCitationPanelState.searchTerm,\n    onSearchTermChanged: (term: string) => {\n      updateState({ searchTerm: term });\n      memoizedTypeaheadSearch(term, selectedPanelProvider, insertCitationPanelState.selectedNode, existingCitationIds);\n    },\n    onExecuteSearch: (searchTerm: string) => {\n      searchCanceled.current = false;\n      updateState({\n        searchTerm,\n        status: CitationSourceListStatus.inProgress,\n        statusMessage: selectedPanelProvider.progressMessage,\n      });\n      selectedPanelProvider\n        .search(searchTerm, insertCitationPanelState.selectedNode, existingCitationIds)\n        .then(searchResult => {\n          if (!searchCanceled.current) {\n            updateState({\n              searchTerm,\n              citations: searchResult?.citations,\n              status: searchResult?.status,\n              statusMessage: searchResult?.statusMessage,\n              selectedIndex: -1,\n            });\n          }\n        });\n    },\n    onAddCitation: (citation: CitationListEntry) => {\n      const newCitations = [...insertCitationPanelState.citationsToAdd, citation];\n      updateState({ selectedIndex: -1, citationsToAdd: newCitations });\n    },\n    onRemoveCitation: (citation: CitationListEntry) => {\n      deleteCitation(citation.id);\n    },\n    selectedIndex: insertCitationPanelState.selectedIndex,\n    onSelectedIndexChanged: (index: number) => {\n      updateState({ selectedIndex: index });\n    },\n    onConfirm: onOk,\n    status: insertCitationPanelState.status,\n    statusMessage: insertCitationPanelState.statusMessage,\n    warningMessage: selectedPanelProvider.warningMessage || '',\n    ref: panelRef,\n  };\n\n  // Tracks whether a long running search has been canceled\n  // for example by the user navigating to another section of the dialog\n  const searchCanceled = React.useRef<boolean>(false);\n\n  // This implements the connection of the dialog (non-provider panel) events and data and the\n  // core dialog state\n  const onNodeSelected = (node: NavigationTreeNode) => {\n    const suggestedPanel = panelForNode(insertCitationConfiguration.providers, node);\n    if (suggestedPanel) {\n      searchCanceled.current = true;\n      const searchResult = suggestedPanel.typeAheadSearch('', node, existingCitationIds);\n      updateState({\n        searchTerm: '',\n        citations: searchResult?.citations || [],\n        status: searchResult?.status || CitationSourceListStatus.default,\n        statusMessage: searchResult?.statusMessage || suggestedPanel.placeHolderMessage,\n        selectedNode: node,\n      });\n\n      if (suggestedPanel?.key !== selectedPanelProvider?.key) {\n        setSelectedPanelProvider(suggestedPanel);\n      }\n    }\n  };\n\n  const deleteCitation = (id: string) => {\n    const filteredCitations = insertCitationPanelState.citationsToAdd.filter(source => source.id !== id);\n    updateState({ citationsToAdd: filteredCitations });\n  };\n\n  const onTagDeleted = (tag: TagItem) => {\n    deleteCitation(tag.key);\n  };\n\n  const onTagChanged = (key: string, text: string) => {\n    // Edit any matching entries in the citation basket\n    const targetSource = insertCitationPanelState.citationsToAdd.find(source => source.id === key);\n    if (targetSource) {\n      targetSource.id = text;\n    }\n\n    // Edit the currently selected item\n    if (insertCitationPanelState.selectedIndex > -1) {\n      const currentlySelectedCitation = insertCitationPanelState.citations[insertCitationPanelState.selectedIndex];\n      if (currentlySelectedCitation && currentlySelectedCitation.id === key) {\n        currentlySelectedCitation.id = text;\n      }\n    }\n  };\n\n  const onTagValidate = (key: string, text: string) => {\n    const invalidChars = text.match(kInvalidCiteKeyChars);\n    if (invalidChars) {\n      return props.ui.context.translateText(\n        'The citekey includes invalid characters such as a space or a special character.',\n      );\n    }\n    return null;\n  };\n\n  const onBibliographyFileChanged = (biblographyFile: BibliographyFile) => {\n    updateState({ existingBibliographyFile: biblographyFile });\n  };\n\n  const onCreateBibliographyFileNameChanged = (fileName: string) => {\n    updateState({ createBibliographyFile: bibliographyFileForPath(fileName, props.ui) });\n  };\n\n  const onCitationStyleChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n    updateState({\n      intextCitationStyle: e.target.checked\n    });\n  };\n\n  // Support keyboard shortcuts for dismissing dialog\n  const onKeyPress = (event: React.KeyboardEvent) => {\n    if (event.key === 'Enter') {\n      event.preventDefault();\n      event.stopPropagation();\n      onOk();\n    }\n  };\n\n  // Esc can cause loss of focus so catch it early\n  const onKeyDown = (event: React.KeyboardEvent) => {\n    if (event.key === 'Escape') {\n      event.stopPropagation();\n      props.onCancel();\n    }\n  };\n\n  const totalCitationCount = insertCitationPanelState.citationsToAdd.length + (insertCitationPanelState.selectedIndex > -1 ? 1 : 0);\n  \n\n  // Create the panel that should be displayed for the selected node of the tree\n  const panelToDisplay = selectedPanelProvider\n    ? React.createElement(selectedPanelProvider.panel, citationProps)\n    : undefined;\n  return (\n    <div className=\"pm-cite-panel-container\" style={style} onKeyPress={onKeyPress} onKeyDown={onKeyDown}>\n      <div className=\"pm-cite-panel-cite-selection\">\n        <div className=\"pm-cite-panel-cite-selection-sources pm-block-border-color pm-background-color\">\n          <NavigationTree\n            height={panelHeight}\n            nodes={treeSourceData}\n            selectedNode={insertCitationPanelState.selectedNode}\n            onSelectedNodeChanged={onNodeSelected}\n          />\n        </div>\n        <div className=\"pm-cite-panel-cite-selection-items\">{panelToDisplay}</div>\n      </div>\n      <div className=\"pm-cite-panel-selected-cites pm-block-border-color pm-background-color\">\n        <TagInput\n          tags={mergedCitationsToAdd.map(source => ({\n            key: source.id,\n            displayText: source.id,\n            displayPrefix: '@',\n            isEditable: source.isIdEditable,\n          }))}\n          onTagDeleted={onTagDeleted}\n          onTagChanged={onTagChanged}\n          onTagValidate={onTagValidate}\n          ui={props.ui}\n          placeholder={props.ui.context.translateText('Selected Citation Keys')}\n          maxDisplayCharacters={50}\n        />\n      </div>\n      <div className=\"pm-cite-panel-insert-inputs\">\n        <div className=\"pm-cite-panel-insert-options\">\n        {// Only show the picker if there are either no bibliographies specified, or if there are writable bibliographies\n        insertCitationConfiguration.bibliographyFiles.length === 0 ||\n        insertCitationConfiguration.bibliographyFiles.some(bibFile => bibFile?.writable) ? (\n          <CitationBibliographyPicker\n            bibliographyTypes={bibliographyTypes(props.ui)}\n            createBibliographyFileName={insertCitationPanelState.createBibliographyFile.displayPath}\n            onCreateBibliographyFileNameChanged={onCreateBibliographyFileNameChanged}\n            bibliographyFiles={insertCitationConfiguration.bibliographyFiles}\n            onBiblographyFileChanged={onBibliographyFileChanged}\n            ui={props.ui}\n          />\n        ) : (\n          <div />\n        )}\n                {\n          totalCitationCount <= 1  ? (\n          <div className='pm-cite-panel-checkbox-group'>\n            <CheckboxInput \n              id='intextStyleCheckbox'\n              checked={insertCitationPanelState.intextCitationStyle} \n              className='pm-cite-panel-checkbox' \n              onChange={onCitationStyleChanged}/>\n            <label htmlFor='intextStyleCheckbox' className='pm-cite-panel-checkbox-label'>{props.ui.context.translateText('Use in-text citation')}</label>\n          </div>\n        ) : (\n          <div/>\n        )}\n\n        </div>\n\n        <DialogButtons\n          okLabel={props.ui.context.translateText('Insert')}\n          cancelLabel={props.ui.context.translateText('Cancel')}\n          onOk={onOk}\n          onCancel={props.onCancel}\n        />\n      </div>\n    </div>\n  );\n};\n\n// Finds the panel associated with the selected tree node\nconst panelForNode = (sourcePanels: CitationSourcePanelProvider[], node?: NavigationTreeNode) => {\n  if (node) {\n    const panelItem = sourcePanels.find(panel => {\n      const panelTreeNode = panel.treeNode();\n      return containsChild(node.key, panelTreeNode);\n    });\n    return panelItem;\n  } else {\n    return undefined;\n  }\n};\n\n// Given a key, find the node associated with the key (useful for restoring a selected node from a key)\nconst nodeForKey = (nodes: NavigationTreeNode[], key?: string): NavigationTreeNode | undefined => {\n  if (!key) {\n    return undefined;\n  }\n\n  for (const node of nodes) {\n    if (node.key === key) {\n      return node;\n    }\n    const childNode = nodeForKey(node.children, key);\n    if (childNode) {\n      return childNode;\n    }\n  }\n  return undefined;\n};\n\n// Merge the selected citation into the list that is displayed for add and filter it\n// out of the citation list itself\nconst mergeCitations = (toAdd: CitationListEntry[], selected?: CitationListEntry) => {\n  if (!selected) {\n    return toAdd;\n  } else {\n    if (toAdd.map(citation => citation.id).includes(selected.id)) {\n      return toAdd;\n    } else {\n      return (toAdd || []).concat(selected);\n    }\n  }\n};\n","/*\n * tag-input.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport { EditorUI } from '../ui';\n\nimport './tag-input.css';\nimport { TextInput } from './text';\nimport { kAlertTypeError } from '../ui-dialogs';\n\n// Item representing a tag entry\n// The key remains stable even if the tag is edited\n// The displayPrefix will be displayed to the user, but removed when editing\nexport interface TagItem {\n  key: string;\n  displayText: string;\n  displayPrefix: string;\n  isEditable?: boolean;\n}\n\ninterface TagInputProps extends WidgetProps {\n  tags: TagItem[];\n  onTagDeleted: (tag: TagItem) => void;\n  onTagChanged: (key: string, text: string) => void;\n  onTagValidate?: (key: string, text: string) => string | null;\n  ui: EditorUI;\n  placeholder?: string;\n  maxDisplayCharacters?: number;\n}\n\nexport const TagInput = React.forwardRef<HTMLDivElement, TagInputProps>((props, ref) => {\n  return (\n    <div style={props.style} className=\"pm-tag-input-container\" ref={ref}>\n      {props.tags.length === 0 ? (\n        <div className=\"pm-tag-input-placeholder\">\n          <div className=\"pm-placeholder-text-color\">{props.placeholder}</div>\n        </div>\n      ) : (\n        undefined\n      )}\n      {props.tags.map(tag => (\n        <Tag\n          key={tag.key}\n          tag={tag}\n          onTagDeleted={props.onTagDeleted}\n          onTagChanged={props.onTagChanged}\n          onTagValidate={props.onTagValidate}\n          ui={props.ui}\n          maxDisplayCharacters={props.maxDisplayCharacters}\n        />\n      ))}\n    </div>\n  );\n});\n\ninterface TagProps extends WidgetProps {\n  tag: TagItem;\n  onTagDeleted: (tag: TagItem) => void;\n  onTagChanged: (key: string, text: string) => void;\n  onTagValidate?: (key: string, text: string) => string | null;\n  ui: EditorUI;\n  maxDisplayCharacters?: number;\n}\n\nconst Tag: React.FC<TagProps> = props => {\n  const [editing, setEditing] = React.useState<boolean>(false);\n  const [editingText, setEditingText] = React.useState<string>(props.tag.displayText);\n  const [displayText, setDisplayText] = React.useState<string>(props.tag.displayText);\n\n  const editImage = React.useRef<HTMLImageElement>(null);\n  const showingValidationError = React.useRef<boolean>(false);\n  const restoreFocusAfterCancel = React.useRef<boolean>(false);\n\n  // Anytime we begin editing, focus the text input\n  const editTextInput = React.useRef<HTMLInputElement>(null);\n  React.useLayoutEffect(() => {\n    if (editing) {\n      editTextInput.current?.focus();\n    } else if (restoreFocusAfterCancel.current) {\n      // Focus the edit image\n      editImage.current?.focus();\n      restoreFocusAfterCancel.current = false;\n    }\n  }, [editing]);\n\n  // Click the delete icon\n  const onDeleteClick = (e: React.MouseEvent) => {\n    props.onTagDeleted(props.tag);\n  };\n\n  // Enter or space while delete icon focused\n  const onDeleteKeyPress = (e: React.KeyboardEvent) => {\n    switch (e.key) {\n      case 'Enter':\n      case ' ':\n        e.preventDefault();\n        e.stopPropagation();\n        props.onTagDeleted(props.tag);\n        break;\n    }\n  };\n\n  // Click on the edit icon\n  const onEditClick = (e: React.MouseEvent) => {\n    if (props.tag.isEditable) {\n      setEditing(true);\n    }\n  };\n\n  // Enter or space while edit icon is focused\n  const onEditKeyPress = (e: React.KeyboardEvent) => {\n    switch (e.key) {\n      case 'Enter':\n      case ' ':\n        e.preventDefault();\n        e.stopPropagation();\n        setEditing(true);\n        break;\n    }\n  };\n\n  // Commit edits to the tag\n  const commitTagEdit = () => {\n    // Validate the input\n    if (props.onTagValidate) {\n      const validationMessage = props.onTagValidate(props.tag.key, editingText);\n      if (validationMessage !== null) {\n        showingValidationError.current = true;\n        props.ui.dialogs\n          .alert(\n            props.ui.context.translateText(validationMessage),\n            props.ui.context.translateText('Validation Error'),\n            kAlertTypeError,\n          )\n          .then(() => {\n            editTextInput.current?.focus();\n            showingValidationError.current = false;\n          });\n        return;\n      }\n    }\n\n    // Update the text\n    setDisplayText(editingText);\n\n    // Halt editing\n    setEditing(false);\n\n    // Notify of change\n    props.onTagChanged(props.tag.key, editingText);\n\n    // Focus the edit image\n    editImage.current?.focus();\n  };\n\n  const cancelTagEdit = () => {\n    // Halt editing\n    setEditing(false);\n\n    // Revert editing text\n    setEditingText(displayText);\n\n    // The editing control will lose focus, so we need to focus something else\n    restoreFocusAfterCancel.current = true;\n  };\n\n  // When editing the tag, allow enter to accept the changes\n  const handleEditKeyDown = (e: React.KeyboardEvent) => {\n    switch (e.key) {\n      case 'Enter':\n        // If we're validiating, don't commit.\n        if (showingValidationError.current) {\n          return;\n        }\n        e.preventDefault();\n        e.stopPropagation();\n        commitTagEdit();\n        break;\n      case 'Escape':\n        e.preventDefault();\n        e.stopPropagation();\n        cancelTagEdit();\n        break;\n    }\n  };\n\n  // When editing, clicking away from the tag will accept changes\n  const handleEditBlur = () => {\n    // If we're validiating, don't commit.\n    if (showingValidationError.current) {\n      return;\n    }\n    commitTagEdit();\n  };\n\n  const handleEditChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const edittedText = e.target.value;\n    setEditingText(edittedText);\n  };\n\n  return (\n    <div key={props.tag.displayText} className=\"pm-tag-input-tag pm-block-border-color\">\n      <img\n        src={props.ui.images.widgets?.tag_delete}\n        onClick={onDeleteClick}\n        onKeyPress={onDeleteKeyPress}\n        className=\"pm-tag-input-delete-image\"\n        tabIndex={0}\n      />\n      <div className={`pm-tag-input-text ${props.tag.isEditable ? 'pm-tag-input-text-edittable' : undefined}`}>\n        {!editing ? (\n          <div onClick={onEditClick} className=\"pm-tag-input-text-raw pm-text-color\">\n            {props.tag.displayPrefix}\n            {props.maxDisplayCharacters ? \n              displayText.length > props.maxDisplayCharacters ? displayText.substr(0, props.maxDisplayCharacters - 1) + '…' : displayText: \n              displayText}\n          </div>\n        ) : (\n          <TextInput\n            width={props.maxDisplayCharacters ? \n                 `${Math.min(props.maxDisplayCharacters, editingText.length)}ch` :\n                 `${editingText.length}ch`\n                }\n            ref={editTextInput}\n            className=\"pm-tag-input-text-edit\"\n            value={editingText}\n            onChange={handleEditChange}\n            onKeyDown={handleEditKeyDown}\n            onBlur={handleEditBlur}\n          />\n        )}\n      </div>\n      {props.tag.isEditable ? (\n        <img\n          src={props.ui.images.widgets?.tag_edit}\n          className=\"pm-tag-input-edit-image\"\n          onClick={onEditClick}\n          onKeyPress={onEditKeyPress}\n          tabIndex={0}\n          ref={editImage}\n        />\n      ) : (\n        undefined\n      )}\n    </div>\n  );\n};\n","/*\n * navigation-tree.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { CSSProperties } from 'react';\n\nimport { WidgetProps } from './react';\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\n\nimport './navigation-tree.css';\n\n// Individual nodes and children of the Select Tree\nexport interface NavigationTreeNode {\n  key: string;\n  image?: string;\n  name: string;\n  type: string;\n  children: NavigationTreeNode[];\n  expanded?: boolean;\n}\n\ninterface NavigationTreeProps extends WidgetProps {\n  height: number;\n  nodes: NavigationTreeNode[];\n  selectedNode: NavigationTreeNode;\n  onSelectedNodeChanged: (node: NavigationTreeNode) => void;\n}\n\ninterface NavigationTreeItemProps extends ListChildComponentProps {\n  data: {\n    nodes: NavigationTreeNode[];\n    selectedNode: NavigationTreeNode;\n    onSelectedNodeChanged: (node: NavigationTreeNode) => void;\n    showSelection: boolean;\n    preventFocus: boolean;\n  };\n}\n\n// Indent level for each level\nconst kNavigationTreeIndent = 8;\n\n// Select Tree is a single selection tree that is useful in\n// hierarchical navigation type contexts. It does not support\n// multiple selection and is generally not a well behaved tree\n// like you would use to navigate a hierarchical file system.\nexport const NavigationTree: React.FC<NavigationTreeProps> = props => {\n  const style: CSSProperties = {\n    height: props.height + 'px',\n    ...props.style,\n  };\n\n  // The currently selected node should always be expanded\n  const selectedNode = props.selectedNode;\n\n  // Ensure that all the parents of the selected node are expanded\n  const nodes = props.nodes;\n  const currentNodePath = pathToNode(selectedNode, nodes);\n  currentNodePath.forEach(node => (node.expanded = true));\n  const selNode = nodes.find(n => n.key === selectedNode.key);\n  if (selNode) {\n    selNode.expanded = true;\n  }\n  const vizNodes = visibleNodes(props.nodes, props.selectedNode);\n\n  // Ensure the item is scrolled into view\n  const fixedList = React.useRef<FixedSizeList>(null);\n  React.useEffect(() => {\n    if (props.selectedNode) {\n      vizNodes.find((value, index) => {\n        if (value.key === selectedNode.key) {\n          fixedList.current?.scrollToItem(index);\n          return true;\n        }\n      });\n    }\n  });\n\n  // Process keys to enable keyboard based navigation\n  const processKey = (e: React.KeyboardEvent) => {\n    const selected = props.selectedNode;\n    switch (e.key) {\n      case 'ArrowDown':\n        if (selected) {\n          const next = stepNode(selectedNode, props.nodes, 1);\n          props.onSelectedNodeChanged(next);\n        }\n        break;\n\n      case 'ArrowUp':\n        if (selected) {\n          const previous = stepNode(selectedNode, props.nodes, -1);\n          props.onSelectedNodeChanged(previous);\n        }\n        break;\n\n      case 'PageDown':\n        if (selected) {\n          const next = stepNode(selectedNode, props.nodes, 4);\n          props.onSelectedNodeChanged(next);\n        }\n        break;\n\n      case 'PageUp':\n        if (selected) {\n          const previous = stepNode(selectedNode, props.nodes, -4);\n          props.onSelectedNodeChanged(previous);\n        }\n        break;\n    }\n  };\n\n  return (\n    <div style={style} tabIndex={0} onKeyDown={processKey}>\n      <FixedSizeList\n        className=\"pm-navigation-tree\"\n        height={props.height}\n        width=\"100%\"\n        itemCount={vizNodes.length}\n        itemSize={28}\n        itemData={{\n          nodes: vizNodes,\n          selectedNode: props.selectedNode,\n          onSelectedNodeChanged: props.onSelectedNodeChanged,\n          showSelection: true,\n          preventFocus: true,\n        }}\n        ref={fixedList}\n      >\n        {NavigationTreeItem}\n      </FixedSizeList>\n    </div>\n  );\n};\n\n// Renders each item\nconst NavigationTreeItem = (props: NavigationTreeItemProps) => {\n  const data = props.data;\n  const node: NavigationTreeNode = props.data.nodes[props.index];\n  const path = pathToNode(node, data.nodes);\n  const depth = path.length - 1;\n\n  // Select the tree node\n  const onClick = (e: React.MouseEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    data.onSelectedNodeChanged(node);\n  };\n\n  // Whether this node is selected\n  const selected = data.selectedNode.key === node.key;\n\n  const indentLevel = depth;\n  const indentStyle = {\n    paddingLeft: indentLevel * kNavigationTreeIndent + 'px',\n  };\n\n  const selectedClassName = `${\n    selected ? 'pm-selected-navigation-tree-item' : 'pm-navigation-tree-item'\n  } pm-navigation-tree-node`;\n  return (\n    <div key={node.key} onClick={onClick} style={props.style}>\n      <div className={selectedClassName} style={indentLevel > 0 ? indentStyle : undefined}>\n        {node.image ? (\n          <div className=\"pm-navigation-tree-node-image-div\">\n            <img src={node.image} alt={node.name} className=\"pm-navigation-tree-node-image\" />\n          </div>\n        ) : null}\n        <div className=\"pm-navigation-tree-node-label-div pm-text-color\">{node.name}</div>\n      </div>\n    </div>\n  );\n};\n\n// Indicates whether a given key is the identified node or one of its\n// children\nexport function containsChild(key: string, node: NavigationTreeNode): boolean {\n  if (node.key === key) {\n    return true;\n  }\n\n  for (const childNode of node.children) {\n    const hasChild = containsChild(key, childNode);\n    if (hasChild) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// enumerate the nodes that lead to a selected node\nfunction pathToNode(node: NavigationTreeNode, nodes: NavigationTreeNode[]): NavigationTreeNode[] {\n  const path: NavigationTreeNode[] = [];\n  if (node) {\n    for (const root of nodes) {\n      if (root.key === node.key) {\n        path.push(node);\n        return path;\n      }\n\n      const childPath = pathToNode(node, root.children);\n      if (childPath.length > 0) {\n        path.push(root, ...childPath);\n        return path;\n      }\n    }\n  }\n  return path;\n}\n\n// Creates an ordered flattened list of visible nodes in the\n// tree. Useful for incrementing through visible nodes :)\nfunction visibleNodes(nodes: NavigationTreeNode[], selectedNode: NavigationTreeNode) {\n  const nodeList: NavigationTreeNode[][] = nodes.map(node => {\n    if (node.expanded || node.key === selectedNode.key) {\n      return [node].concat(visibleNodes(node.children, selectedNode));\n    } else {\n      return [node];\n    }\n  });\n  return ([] as NavigationTreeNode[]).concat(...nodeList);\n}\n\n// Get the previous node for the current node\nfunction stepNode(node: NavigationTreeNode, allNodes: NavigationTreeNode[], increment: number): NavigationTreeNode {\n  const nodes = visibleNodes(allNodes, node);\n  const currentIndex = nodes.map(n => n.key).indexOf(node.key);\n  const step = currentIndex + increment;\n  if (step >= 0 && step < nodes.length - 1) {\n    return nodes[step];\n  } else if (step < 0) {\n    return nodes[0];\n  } else {\n    return nodes[nodes.length - 1];\n  }\n}\n","/*\n * dialog-buttons.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { WidgetProps } from './react';\n\nimport { EditorUI } from '../ui';\n\nimport { TextButton } from './button';\nimport React from 'react';\n\nimport './dialog-buttons.css';\n\nexport interface DialogButtonsProps extends WidgetProps {\n  okLabel: string;\n  cancelLabel: string;\n  onOk: () => void;\n  onCancel: () => void;\n}\n\nexport const DialogButtons: React.FC<DialogButtonsProps> = props => {\n  return (\n    <div className=\"pm-dialog-buttons-panel\" style={props.style}>\n      <TextButton\n        title={props.okLabel}\n        classes={['pm-default-theme', 'pm-dialog-buttons-button', 'pm-rstudio-button']}\n        onClick={props.onOk}\n        style={{\n          fontWeight: 600,\n        }}\n      />\n\n      <TextButton\n        title={props.cancelLabel}\n        classes={['pm-default-theme', 'pm-dialog-buttons-button', 'pm-rstudio-button']}\n        onClick={props.onCancel}\n      />\n    </div>\n  );\n};\n","// Panels get a variety of information as properties to permit them to search\n\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { BibliographySource, BibliographyManager } from '../../../api/bibliography/bibliography';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { suggestCiteId, formatIssuedDate, formatAuthors } from '../../../api/cite';\n\n// citations and add them\nexport interface CitationSourcePanelProps extends WidgetProps {\n  ui: EditorUI;\n  height: number;\n\n  searchTerm: string;\n  onSearchTermChanged: (term: string) => void;\n  onExecuteSearch: (term: string) => void;\n\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n\n  onAddCitation: (citation: CitationListEntry) => void;\n  onRemoveCitation: (citation: CitationListEntry) => void;\n  onConfirm: VoidFunction;\n\n  selectedIndex: number;\n  onSelectedIndexChanged: (index: number) => void;\n\n  status: CitationSourceListStatus;\n  statusMessage: string;\n\n  warningMessage: string;\n\n  ref: React.Ref<any>;\n}\n\n// Citation Panels Providers are the core element of ths dialog. Each provider provides\n// the main panel UI as well as the tree to display when the panel is displayed.\nexport interface CitationSourcePanelProvider {\n  key: string;\n  panel: React.FC<CitationSourcePanelProps>;\n  treeNode(): NavigationTreeNode;\n  placeHolderMessage?: string;\n  progressMessage?: string;\n  warningMessage?: string;\n  typeAheadSearch: (\n    term: string,\n    selectedNode: NavigationTreeNode,\n    existingCitationIds: string[],\n  ) => CitationSourcePanelSearchResult | null;\n  search: (\n    term: string,\n    selectedNode: NavigationTreeNode,\n    existingCitationIds: string[],\n  ) => Promise<CitationSourcePanelSearchResult>;\n}\n\nexport interface CitationSourcePanelSearchResult {\n  citations: CitationListEntry[];\n  status: CitationSourceListStatus;\n  statusMessage: string;\n}\n\nexport interface CitationListEntry extends BibliographySourceProvider {\n  id: string;\n  isIdEditable: boolean;\n  image?: string;\n  imageAdornment?: string;\n  type: string;\n  title: string;\n  authors: (width: number) => string;\n  date: string;\n  journal: string | undefined;\n  doi?: string;\n}\n\nexport interface BibliographySourceProvider {\n  id: string;\n  isSlowGeneratingBibliographySource: boolean;\n  toBibliographySource: (id: string) => Promise<BibliographySource>;\n}\n\nexport enum CitationSourceListStatus {\n  default,\n  inProgress,\n  noResults,\n  error,\n}\n\nexport function errorForStatus(ui: EditorUI, status: string, providerName: string) {\n  return status === 'nohost'\n    ? ui.context.translateText(`Unable to search ${providerName}. Please check your network connection and try again.`)\n    : ui.context.translateText(`An error occurred while searching ${providerName}.`);\n}\n\n\nexport function matchExistingSourceCitationListEntry(doi: string, existingIds: string[], ui: EditorUI, bibliographyManager: BibliographyManager) {\n\n  const localSources = bibliographyManager.localSources();\n  const existingSource = localSources.find(source => {\n    if (source.DOI?.toLowerCase() === doi.toLowerCase()) {\n      return source;\n    }\n  });\n  if (existingSource) {\n    return existingSourceToCitationListEntry(existingSource, existingIds, ui);\n  }\n}\n\nfunction existingSourceToCitationListEntry(csl: CSL, existingIds: string[], ui: EditorUI): CitationListEntry {\n  const providerKey = 'pubmed';\n  return {\n    id: csl.id || suggestCiteId(existingIds, csl),\n    isIdEditable: false,\n    title: csl.title || '',\n    doi: csl.DOI,\n    type: '',\n    date: formatIssuedDate(csl.issued) || '',\n    journal: csl[\"container-title\"],\n    authors: (length: number) => {\n      return formatAuthors(csl.author || [], length);\n    },\n    image: imageForType(ui.images, csl.type)[0],\n    toBibliographySource: async (finalId: string) => {\n      // Generate CSL using the DOI\n      return { ...csl, id: finalId, providerKey };\n    },\n    isSlowGeneratingBibliographySource: true,\n  };\n}","/*\n * insert_citation-panel-bibliography.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport uniqby from 'lodash.uniqby';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { EditorUI } from '../../../api/ui';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport {\n  BibliographyManager,\n  BibliographyCollection,\n  BibliographySource,\n} from '../../../api/bibliography/bibliography';\nimport { kZoteroProviderKey } from '../../../api/bibliography/bibliography-provider_zotero';\nimport { kLocalBiliographyProviderKey } from '../../../api/bibliography/bibliography-provider_local';\nimport { formatAuthors, formatIssuedDate, createUniqueCiteId } from '../../../api/cite';\nimport {\n  CitationSourcePanelProvider,\n  CitationSourcePanelProps,\n  CitationListEntry,\n  CitationSourceListStatus,\n} from './insert_citation-source-panel';\nimport { CitationSourceTypeheadSearchPanel } from './insert_citation-source-panel-typeahead-search';\nimport { imageForType } from '../../../api/csl';\n\nimport './insert_citation-source-panel-bibliography.css';\n\nconst kAllLocalSourcesRootNodeType = 'All Local Sources';\n\nexport function bibliographySourcePanel(\n  doc: ProsemirrorNode,\n  ui: EditorUI,\n  bibliographyManager: BibliographyManager,\n): CitationSourcePanelProvider {\n  const providers = bibliographyManager.localProviders();\n  const providerNodes: { [key: string]: NavigationTreeNode } = {};\n\n  // For each of the providers, discover their collections\n  providers\n    .filter(provider => provider.isEnabled())\n    .forEach(provider => {\n      const getFolder = (prov: string, hasParent: boolean) => {\n        return folderImageForProvider(prov, hasParent, ui);\n      };\n\n      // Get the response which could be items or could be a stream\n      const collectionSpecs = provider.collections();\n      // Note the temporary collections\n      providerNodes[provider.key] = {\n        key: provider.key,\n        name: ui.context.translateText(provider.name),\n        type: provider.key,\n        image: rootImageForProvider(provider.key, ui),\n        children: toTree(provider.key, collectionSpecs, getFolder),\n        expanded: true,\n      };\n    });\n\n  return {\n    key: '17373086-77FE-410F-A319-33E314482125',\n    panel: BibligraphySourcePanel,\n    treeNode: () => {\n      return {\n        key: 'My Sources',\n        name: ui.context.translateText('My Sources'),\n        image: ui.images.citations?.local_sources,\n        type: kAllLocalSourcesRootNodeType,\n        children: Object.values(providerNodes),\n        expanded: true,\n      };\n    },\n    warningMessage: bibliographyManager.warning(),\n    typeAheadSearch: (searchTerm: string, selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n      const providerForNode = (node: NavigationTreeNode): string | undefined => {\n        // The node could be the root node, no provider\n        return node.type === kAllLocalSourcesRootNodeType ? undefined : node.type;\n      };\n\n      const collectionKeyForNode = (node: NavigationTreeNode): string | undefined => {\n        // The node could be a provider root or a collection\n        return node.type !== kAllLocalSourcesRootNodeType &&\n          node.key !== kZoteroProviderKey &&\n          node.key !== kLocalBiliographyProviderKey\n          ? node.key\n          : undefined;\n      };\n      const sources = bibliographyManager.search(\n        searchTerm,\n        providerForNode(selectedNode),\n        collectionKeyForNode(selectedNode),\n      );\n      const uniqueSources = uniqby(sources, source => source.id);\n\n      const citations = toCitationListEntries(uniqueSources, existingCitationIds, ui);\n      return {\n        citations,\n        status: citations.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n        statusMessage: citations.length > 0 ? '' : ui.context.translateText('No items'),\n      };\n    },\n    search: (_searchTerm: string, _selectedNode: NavigationTreeNode, _existingCitationIds: string[]) => {\n      return Promise.resolve({\n        citations: [],\n        status: CitationSourceListStatus.default,\n        statusMessage: '',\n      });\n    },\n  };\n}\n\nexport const BibligraphySourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n  (props: CitationSourcePanelProps, ref) => {\n    return (\n      <>\n        {props.warningMessage ? (\n          <div className=\"pm-insert-bibliography-source-panel-warning pm-block-border-color\">\n            {props.warningMessage}\n          </div>\n        ) : (\n          undefined\n        )}\n        <CitationSourceTypeheadSearchPanel\n          height={props.height}\n          citations={props.citations}\n          citationsToAdd={props.citationsToAdd}\n          searchTerm={props.searchTerm}\n          onSearchTermChanged={props.onSearchTermChanged}\n          selectedIndex={props.selectedIndex}\n          onSelectedIndexChanged={props.onSelectedIndexChanged}\n          onAddCitation={props.onAddCitation}\n          onRemoveCitation={props.onRemoveCitation}\n          onConfirm={props.onConfirm}\n          status={props.status}\n          statusMessage={props.statusMessage}\n          ui={props.ui}\n          ref={ref}\n        />\n      </>\n    );\n  },\n);\n\nfunction rootImageForProvider(providerKey: string, ui: EditorUI) {\n  switch (providerKey) {\n    case kZoteroProviderKey:\n      return ui.images.citations?.zotero_root;\n    case kLocalBiliographyProviderKey:\n      return ui.images.citations?.bibligraphy;\n  }\n}\n\nfunction folderImageForProvider(providerKey: string, hasParent: boolean, ui: EditorUI) {\n  switch (providerKey) {\n    case kZoteroProviderKey:\n      if (hasParent) {\n        return ui.images.citations?.zotero_collection;\n      } else {\n        return ui.images.citations?.zotero_library;\n      }\n    case kLocalBiliographyProviderKey:\n      return ui.images.citations?.bibligraphy_folder;\n  }\n}\n\n// Takes a flat data structure of containers and turns it into a hierarchical\n// tree structure for display as TreeNodes.\nfunction toTree(\n  type: string,\n  containers: BibliographyCollection[],\n  folderImage?: (providerKey: string, hasParent: boolean) => string | undefined,\n): NavigationTreeNode[] {\n  const treeMap: { [id: string]: NavigationTreeNode } = {};\n  const rootNodes: NavigationTreeNode[] = [];\n\n  // Sort the folder in alphabetical order at each level of the tree\n  containers\n    .sort((a, b) => {\n      // For Zotero collection, sort the 'My Library to the top always'\n      if (a.provider === kZoteroProviderKey && a.key === '1') {\n        return -1;\n      }\n      return a.name.localeCompare(b.name);\n    })\n    .forEach(container => {\n      // First see if we have an existing node for this item\n      // A node could already be there if we had to insert a 'placeholder'\n      // node to contain the node's children before we encountered the node.\n      const currentNode = treeMap[container.key] || { key: container.key, name: container.name, children: [], type };\n\n      // Always set its name to be sure we fill this in when we encounter it\n      const hasParent = container.parentKey !== undefined && container.parentKey.length > 0;\n      currentNode.name = container.name;\n      currentNode.image = folderImage ? folderImage(container.provider, hasParent) : undefined;\n\n      if (container.parentKey) {\n        let parentNode = treeMap[container.parentKey];\n        if (!parentNode) {\n          // This is a placeholder node - we haven't yet encountered this child's parent\n          // so we insert this to hold the child. Once we encounter the true parent node,\n          // we will fix up the values in this placeholder node.\n          parentNode = { key: container.parentKey, name: '', children: [], type };\n          treeMap[container.parentKey] = parentNode;\n        }\n        parentNode.children?.push(currentNode);\n      } else {\n        rootNodes.push(currentNode);\n      }\n      treeMap[container.key] = currentNode;\n    });\n  return rootNodes;\n}\n\nfunction toCitationListEntries(\n  sources: BibliographySource[],\n  existingCitationIds: string[],\n  ui: EditorUI,\n): CitationListEntry[] {\n  const useBetterBibTex = ui.prefs.zoteroUseBetterBibtex();\n  return sources.map(source => {\n    return {\n      id:\n        source.providerKey === kLocalBiliographyProviderKey || useBetterBibTex\n          ? source.id\n          : createUniqueCiteId(existingCitationIds, source.id),\n      isIdEditable: source.providerKey === kZoteroProviderKey && !useBetterBibTex,\n      type: source.type,\n      title: source.title || '',\n      providerKey: source.providerKey,\n      date: formatIssuedDate(source.issued),\n      journal: '',\n      image: imageForType(ui.images, source.type)[0],\n      imageAdornment: source.providerKey === kZoteroProviderKey ? ui.images.citations?.zoteroOverlay : undefined,\n      authors: (length: number) => {\n        return formatAuthors(source.author, length);\n      },\n      toBibliographySource: (finalId: string) => {\n        return Promise.resolve({ ...source, id: finalId, providerKey: source.providerKey });\n      },\n      isSlowGeneratingBibliographySource: false,\n    };\n  });\n}\n","/*\n * insert_citation-source-panel-typeahead-search.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\nimport { TextInput } from '../../../api/widgets/text';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport './insert_citation-source-panel-typeahead-search.css';\nimport { CitationSourceList } from './insert_citation-source-panel-list';\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\nimport { CitationSourcePanelListItem } from './insert_citation-source-panel-list-item';\n\nexport interface CitationSourceTypeaheadSearchPanelProps extends WidgetProps {\n  height: number;\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n  searchTerm: string;\n  onSearchTermChanged: (searchTerm: string) => void;\n  selectedIndex: number;\n  onSelectedIndexChanged: (index: number) => void;\n  onAddCitation: (citation: CitationListEntry) => void;\n  onRemoveCitation: (citation: CitationListEntry) => void;\n  onConfirm: VoidFunction;\n  status: CitationSourceListStatus;\n  statusMessage: string;\n  ui: EditorUI;\n}\n\n// Height of textbox including border\nconst kTextBoxHeight = 30;\n\nexport const CitationSourceTypeheadSearchPanel = React.forwardRef<\n  HTMLDivElement,\n  CitationSourceTypeaheadSearchPanelProps\n>((props: CitationSourceTypeaheadSearchPanelProps, ref) => {\n  const listContainer = React.useRef<HTMLDivElement>(null);\n\n  // Search the user search terms\n  const searchChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const search = e.target.value;\n    props.onSearchTermChanged(search);\n  };\n\n  // Perform first load tasks\n  const searchBoxRef = React.useRef<HTMLInputElement>(null);\n\n  // If the user arrows down in the search text box, advance to the list of items\n  const handleTextKeyDown = (event: React.KeyboardEvent) => {\n    switch (event.key) {\n      case 'ArrowDown':\n        listContainer.current?.focus();\n        break;\n    }\n  };\n\n  // Used to focus the search box\n  const focusSearch = () => {\n    searchBoxRef.current?.focus();\n  };\n\n  const addCitation = (citation: CitationListEntry) => {\n    // Add the citation and reset selection\n    props.onAddCitation(citation);\n    focusSearch();\n  };\n\n  // On focus, select the search term for overtype\n  const searchBoxFocused = (event: React.FocusEvent<HTMLInputElement>) => {\n    event.target.select();\n  };\n\n  return (\n    <div\n      style={props.style}\n      className=\"pm-insert-citation-panel-search pm-block-border-color pm-background-color\"\n      ref={ref}\n      tabIndex={-1}\n      onFocus={focusSearch}\n    >\n      <div className=\"pm-insert-citation-search-panel-textbox-container\">\n        <TextInput\n          width=\"100%\"\n          iconAdornment={props.ui.images.search}\n          tabIndex={0}\n          className=\"pm-insert-citation-panel-search-textbox pm-block-border-color\"\n          placeholder={props.ui.context.translateText('Search for citation')}\n          onKeyDown={handleTextKeyDown}\n          onChange={searchChanged}\n          onFocus={searchBoxFocused}\n          value={props.searchTerm}\n          ref={searchBoxRef}\n        />\n      </div>\n      <CitationSourceList\n        height={props.height - kTextBoxHeight}\n        citations={props.citations}\n        citationsToAdd={props.citationsToAdd}\n        onConfirm={props.onConfirm}\n        onAddCitation={addCitation}\n        onRemoveCitation={props.onRemoveCitation}\n        selectedIndex={props.selectedIndex}\n        onSelectedIndexChanged={props.onSelectedIndexChanged}\n        focusPrevious={focusSearch}\n        status={props.status}\n        statusMessage={props.statusMessage}\n        itemHeight={64}\n        itemProvider={CitationSourcePanelListItem}\n        ui={props.ui}\n        ref={listContainer}\n      />\n    </div>\n  );\n});\n","/*\n * insert_citation-source-panel-list.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\n\nimport { EditorUI } from '../../../api/ui';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\n\nimport './insert_citation-source-panel-list.css';\n\nexport interface CitationSourcePanelListItemData {\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n  selectedIndex: number;\n  onSelectedIndexChanged: (index: number) => void;\n  onAddCitation: (source: CitationListEntry) => void;\n  onRemoveCitation: (source: CitationListEntry) => void;\n  onConfirm: () => void;\n  ui: EditorUI;\n  showSeparator?: boolean;\n  showSelection?: boolean;\n  preventFocus?: boolean;\n}\n\nexport interface CitationSourceListProps extends WidgetProps {\n  height: number;\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n  selectedIndex: number;\n  onSelectedIndexChanged: (index: number) => void;\n  onAddCitation: (citation: CitationListEntry) => void;\n  onRemoveCitation: (citation: CitationListEntry) => void;\n  onConfirm: VoidFunction;\n  focusPrevious?: () => void;\n\n  itemProvider: (props: ListChildComponentProps) => JSX.Element;\n  itemHeight: number;\n\n  status: CitationSourceListStatus;\n  statusMessage: string;\n  ui: EditorUI;\n}\n\nexport const CitationSourceList = React.forwardRef<HTMLDivElement, CitationSourceListProps>(\n  (props: CitationSourceListProps, ref) => {\n    const fixedList = React.useRef<FixedSizeList>(null);\n\n    // Item height and consequently page height\n    const itemsPerPage = Math.floor(props.height / props.itemHeight);\n\n    // Update selected item index (this will manage bounds)\n    const handleIncrementIndex = (event: React.KeyboardEvent, increment: number, index: number) => {\n      event.stopPropagation();\n      event.preventDefault();\n      if (props.citations && index > -1) {\n        const maxIndex = props.citations.length - 1;\n        const newIndex = Math.min(Math.max(0, index + increment), maxIndex);\n        props.onSelectedIndexChanged(newIndex);\n      }\n    };\n\n    // Toggle the currently selected item as added or removed\n    const handleAddItem = (event: React.KeyboardEvent) => {\n      event.stopPropagation();\n      event.preventDefault();\n      const currentCitation = props.selectedIndex > -1 ? props.citations[props.selectedIndex] : undefined;\n      if (currentCitation) {\n        props.onAddCitation(currentCitation);\n      }\n    };\n\n    const handleListKeyDown = (event: React.KeyboardEvent) => {\n      const currentIndex = props.selectedIndex;\n      switch (event.key) {\n        case 'ArrowUp':\n          if (currentIndex === 0 && props.focusPrevious) {\n            props.focusPrevious();\n          } else {\n            handleIncrementIndex(event, -1, currentIndex);\n          }\n          break;\n\n        case 'ArrowDown':\n          handleIncrementIndex(event, 1, currentIndex);\n          break;\n\n        case 'PageDown':\n          handleIncrementIndex(event, itemsPerPage, currentIndex);\n          break;\n\n        case 'PageUp':\n          handleIncrementIndex(event, -itemsPerPage, currentIndex);\n          break;\n\n        case 'Enter':\n          handleAddItem(event);\n          props.onConfirm();\n          break;\n        case ' ':\n          handleAddItem(event);\n          break;\n      }\n    };\n\n    // Ensure the item is scrolled into view\n    React.useEffect(() => {\n      if (props.selectedIndex > -1) {\n        fixedList.current?.scrollToItem(props.selectedIndex);\n      }\n    });\n\n    // Focus / Blur are used to track whether to show selection highlighting\n    const onFocus = (event: React.FocusEvent<HTMLDivElement>) => {\n      if (props.selectedIndex < 0) {\n        props.onSelectedIndexChanged(0);\n      }\n      event.stopPropagation();\n      event.preventDefault();\n    };\n\n    const onBlur = (event: React.FocusEvent<HTMLDivElement>) => {\n      event.stopPropagation();\n      event.preventDefault();\n    };\n\n    const classes = ['pm-insert-citation-source-panel-list-container'].concat(props.classes || []).join(' ');\n    switch (props.status) {\n      case CitationSourceListStatus.default:\n        if (props.citations.length > 0) {\n          return (\n            <div\n              tabIndex={0}\n              onKeyDown={handleListKeyDown}\n              onFocus={onFocus}\n              onBlur={onBlur}\n              ref={ref}\n              className={classes}\n            >\n              <FixedSizeList\n                className=\"pm-insert-citation-source-panel-list\"\n                height={props.height}\n                width=\"100%\"\n                itemCount={props.citations.length}\n                itemSize={props.itemHeight}\n                itemData={{\n                  selectedIndex: props.selectedIndex,\n                  onSelectedIndexChanged: props.onSelectedIndexChanged,\n                  citations: props.citations,\n                  citationsToAdd: props.citationsToAdd,\n                  onAddCitation: props.onAddCitation,\n                  onRemoveCitation: props.onRemoveCitation,\n                  onConfirm: props.onConfirm,\n                  showSeparator: true,\n                  showSelection: true,\n                  preventFocus: true,\n                  ui: props.ui,\n                }}\n                ref={fixedList}\n              >\n                {props.itemProvider}\n              </FixedSizeList>\n            </div>\n          );\n        } else {\n          return (\n            <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n              <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n            </div>\n          );\n        }\n\n      case CitationSourceListStatus.inProgress:\n        return (\n          <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n            <div className=\"pm-insert-citation-source-panel-list-noresults-text\">\n              <img src={props.ui.images.search_progress} className=\"pm-insert-citation-source-panel-list-progress\" />\n              {props.statusMessage}\n            </div>\n          </div>\n        );\n\n      case CitationSourceListStatus.noResults:\n        return (\n          <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n            <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n          </div>\n        );\n\n      case CitationSourceListStatus.error:\n        return (\n          <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n            <div className=\"pm-insert-citation-source-panel-list-noresults-text\">\n              {props.statusMessage || props.ui.context.translateText('An error occurred.')}\n            </div>\n          </div>\n        );\n\n      case CitationSourceListStatus.default:\n      default:\n        if (props.citations.length > 0) {\n          return (\n            <div\n              tabIndex={0}\n              onKeyDown={handleListKeyDown}\n              onFocus={onFocus}\n              onBlur={onBlur}\n              ref={ref}\n              className={classes}\n            >\n              <FixedSizeList\n                className=\"pm-insert-citation-source-panel-list\"\n                height={props.height}\n                width=\"100%\"\n                itemCount={props.citations.length}\n                itemSize={props.itemHeight}\n                itemData={{\n                  selectedIndex: props.selectedIndex,\n                  onSelectedIndexChanged: props.onSelectedIndexChanged,\n                  citations: props.citations,\n                  citationsToAdd: props.citationsToAdd,\n                  onAddCitation: props.onAddCitation,\n                  onRemoveCitation: props.onRemoveCitation,\n                  onConfirm: props.onConfirm,\n                  showSeparator: true,\n                  showSelection: true,\n                  preventFocus: true,\n                  ui: props.ui,\n                }}\n                ref={fixedList}\n              >\n                {props.itemProvider}\n              </FixedSizeList>\n            </div>\n          );\n        } else {\n          return (\n            <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n              <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n            </div>\n          );\n        }\n    }\n  },\n);\n","/*\n * insert_citation-source-panel-list-item.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { ListChildComponentProps } from 'react-window';\n\nimport { OutlineButton } from '../../../api/widgets/button';\n\nimport { CitationSourcePanelListItemData } from './insert_citation-source-panel-list';\n\nimport './insert_citation-source-panel-list-item.css';\n\nexport const CitationSourcePanelListItem = (props: ListChildComponentProps) => {\n  const citationListData: CitationSourcePanelListItemData = props.data;\n\n  const citationEntry = citationListData.citations[props.index];\n\n  // NOTE: Could consider making this length dynamic to account for item width\n  const maxIdLength = 30;\n  const id =\n    citationEntry.id.length > maxIdLength ? `@${citationEntry.id.substr(0, maxIdLength - 1)}…` : `@${citationEntry.id}`;\n  const authorWidth = Math.max(10, 50 - id.length);\n\n  // Wheher this item is selected\n  const selected = citationListData.showSelection && props.index === citationListData.selectedIndex;\n\n  // Whether this item is already in the list of items to add\n  // If the item is selected, it is always a candidate to be added explicitly to the list\n  const alreadyAdded = citationListData.citationsToAdd.map(src => src.id).includes(citationEntry.id) && !selected;\n\n  const onButtonClick = (event: React.MouseEvent) => {\n    event.stopPropagation();\n    event.preventDefault();\n\n    if (alreadyAdded) {\n      citationListData.onRemoveCitation(citationEntry);\n    } else {\n      citationListData.onAddCitation(citationEntry);\n    }\n  };\n\n  const onItemClick = (e: React.MouseEvent) => {\n    if (e.shiftKey) {\n      citationListData.onAddCitation(citationEntry);\n    } else {\n      citationListData.onSelectedIndexChanged(props.index);\n    }\n  };\n\n  const onDoubleClick = () => {\n    citationListData.onAddCitation(citationEntry);\n    citationListData.onConfirm();\n  };\n\n  return (\n    <div\n      onMouseDown={onItemClick}\n      onDoubleClick={onDoubleClick}\n      className=\"pm-insert-citation-source-panel-item\"\n      style={props.style}\n    >\n      <div className={`pm-insert-citation-source-panel-item-border ${selected ? 'pm-list-item-selected' : ''}`}>\n        <div className=\"pm-insert-citation-source-panel-item-container\">\n          <div className=\"pm-insert-citation-source-panel-item-type\">\n            {citationEntry.imageAdornment ? (\n              <img\n                className=\"pm-insert-citation-source-panel-item-adorn pm-block-border-color pm-background-color\"\n                src={citationEntry.imageAdornment}\n              />\n            ) : (\n              undefined\n            )}\n            <img\n              className=\"pm-insert-citation-source-panel-item-icon pm-block-border-color\"\n              src={citationEntry.image}\n            />\n          </div>\n          <div className=\"pm-insert-citation-source-panel-item-summary\">\n            <div className=\"pm-insert-citation-source-panel-item-id\">\n              <div className=\"pm-insert-citation-source-panel-item-title pm-fixedwidth-font pm-text-color\">{id}</div>\n              <div className=\"pm-insert-citation-source-panel-item-detail pm-text-color\">\n                {citationEntry.authors(authorWidth)} {citationEntry.date}\n              </div>\n            </div>\n            <div className=\"pm-insert-citation-source-panel-item-subtitle-text pm-text-color\">\n              {citationEntry.title}\n            </div>\n          </div>\n          <div className=\"pm-insert-citation-source-panel-item-button\">\n            <OutlineButton\n              tabIndex={citationListData.preventFocus ? -1 : 0}\n              style={{ width: '24px', height: '24px' }}\n              title={alreadyAdded ? '-' : '+'}\n              onClick={onButtonClick}\n            />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n","/*\n * insert_citation-panel-doi.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport { suggestCiteId, formatAuthors, formatIssuedDate } from '../../../api/cite';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\n\nimport {\n  CitationSourcePanelProps,\n  CitationSourcePanelProvider,\n  CitationListEntry,\n  CitationSourceListStatus,\n  errorForStatus,\n  matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\n\nimport './insert_citation-source-panel-doi.css';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nconst kDOIType = 'DOI Search';\n\nexport function doiSourcePanel(\n  ui: EditorUI,\n  server: DOIServer,\n  bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n  return {\n    key: '76561E2A-8FB7-4D4B-B235-9DD8B8270EA1',\n    panel: DOISourcePanel,\n    treeNode: () => {\n      return {\n        key: 'DOI',\n        name: ui.context.translateText('From DOI'),\n        image: ui.images.citations?.doi,\n        type: kDOIType,\n        children: [],\n        expanded: true,\n      };\n    },\n    typeAheadSearch: (_searchTerm: string, _selectedNode: NavigationTreeNode, _existingCitationIds: string[]) => {\n      return null;\n    },\n    progressMessage: ui.context.translateText('Looking up DOI....'),\n    placeHolderMessage: ui.context.translateText('Paste or enter a DOI to find citation data.'),\n    search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n      try {\n        const result = await server.fetchCSL(searchTerm, 1000);\n        if (result.status === 'ok') {\n\n          // Form the entry\n          const doi = searchTerm;\n          const csl = result.message;\n          const citation = matchExistingSourceCitationListEntry(doi, existingCitationIds, ui, bibliographyManager) || toCitationListEntry(csl, existingCitationIds, ui);\n\n          return Promise.resolve({\n            citations: citation ? [citation] : [],\n            status: CitationSourceListStatus.default,\n            statusMessage: '',\n          });\n        } else if (result.status === 'notfound') {\n          return Promise.resolve({\n            citations: [],\n            status: CitationSourceListStatus.noResults,\n            statusMessage: ui.context.translateText('No data for this DOI could be found.'),\n          });\n        } else {\n          return Promise.resolve({\n            citations: [],\n            status: CitationSourceListStatus.error,\n            statusMessage: errorForStatus(ui, result.status, 'for this DOI'),\n          });\n        }\n      } catch (e) {\n        logException(e);\n        return Promise.resolve({\n          citations: [],\n          status: CitationSourceListStatus.error,\n          statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n        });\n      }\n    },\n  };\n}\n\nexport const DOISourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n  (props: CitationSourcePanelProps, ref) => {\n    // When rendered, be sure that the item is selected\n    React.useEffect(() => {\n      if (props.citations.length > 0 && props.selectedIndex !== 0) {\n        props.onSelectedIndexChanged(0);\n      }\n    });\n\n    // Track whether we are mounted to allow a latent search that returns after the\n    // component unmounts to nmot mutate state further\n    return (\n      <CitationSourceLatentSearchPanel\n        height={props.height}\n        citations={props.citations}\n        citationsToAdd={props.citationsToAdd}\n        searchTerm={props.searchTerm}\n        onSearchTermChanged={props.onSearchTermChanged}\n        executeSearch={props.onExecuteSearch}\n        onAddCitation={props.onAddCitation}\n        onRemoveCitation={props.onRemoveCitation}\n        selectedIndex={props.selectedIndex}\n        onSelectedIndexChanged={props.onSelectedIndexChanged}\n        onConfirm={props.onConfirm}\n        searchPlaceholderText={props.ui.context.translateText('Paste a DOI to search')}\n        status={props.status}\n        statusMessage={props.statusMessage}\n        ui={props.ui}\n        ref={ref}\n      />\n    );\n  },\n);\n\nfunction toCitationListEntry(\n  csl: CSL | undefined,\n  existingCitationIds: string[],\n  ui: EditorUI,\n): CitationListEntry | undefined {\n  if (csl) {\n    const suggestedId = suggestCiteId(existingCitationIds, csl);\n    const providerKey = 'doi';\n    return {\n      id: suggestedId,\n      isIdEditable: true,\n      type: csl.type,\n      title: csl.title || csl['short-title'] || csl['original-title'] || '',\n      date: formatIssuedDate(csl.issued),\n      journal: csl['container-title'] || csl['short-container-title'] || csl.publisher,\n      doi: csl.DOI,\n      image: imageForType(ui.images, csl.type)[0],\n      authors: (length: number) => {\n        return formatAuthors(csl.author, length);\n      },\n      toBibliographySource: (finalId: string) => {\n        return Promise.resolve({ ...csl, id: finalId, providerKey });\n      },\n      isSlowGeneratingBibliographySource: false,\n    };\n  }\n  return undefined;\n}\n","/*\n * insert_citation-source-panel-search-latent.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\nimport { TextInput } from '../../../api/widgets/text';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { CitationSourceList } from './insert_citation-source-panel-list';\nimport { TextButton } from '../../../api/widgets/button';\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\n\nimport './insert_citation-source-panel-latent-search.css';\nimport { CitationSourcePanelListItemDetailed } from './insert_citation-source-panel-list-item-detailed';\n\nexport interface CitationSourceLatentSearchPanelProps extends WidgetProps {\n  height: number;\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n  searchTerm: string;\n  onSearchTermChanged: (searchTerm: string) => void;\n  executeSearch: (searchTerm: string) => void;\n  selectedIndex: number;\n  onSelectedIndexChanged: (index: number) => void;\n  onAddCitation: (citation: CitationListEntry) => void;\n  onRemoveCitation: (citation: CitationListEntry) => void;\n  onConfirm: VoidFunction;\n  ui: EditorUI;\n  searchPlaceholderText?: string;\n  status: CitationSourceListStatus;\n  statusMessage: string;\n}\n\nconst kSearchBoxHeightWithMargin = 38;\n\nexport const CitationSourceLatentSearchPanel = React.forwardRef<HTMLDivElement, CitationSourceLatentSearchPanelProps>(\n  (props, ref) => {\n    const listContainer = React.useRef<HTMLDivElement>(null);\n    const pasted = React.useRef<boolean>(false);\n    const lastSearch = React.useRef<string>('');\n\n    const performSearch = (searchTerm: string) => {\n      props.executeSearch(searchTerm);\n      lastSearch.current = searchTerm;\n      pasted.current = false;\n    };\n\n    // Search the user search terms\n    const searchChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n      const search = e.target.value;\n      if (pasted.current) {\n        performSearch(search);\n      } else {\n        props.onSearchTermChanged(search);\n      }\n    };\n\n    // If the user arrows down in the search text box, advance to the list of items\n    const handleTextKeyDown = (event: React.KeyboardEvent) => {\n      switch (event.key) {\n        case 'ArrowDown':\n          event.preventDefault();\n          event.stopPropagation();\n          listContainer.current?.focus();\n          break;\n        case 'Enter':\n          if (lastSearch.current !== props.searchTerm || props.selectedIndex < 0) {\n            event.preventDefault();\n            event.stopPropagation();\n            performSearch(props.searchTerm);\n          }\n          break;\n      }\n    };\n\n    const handleButtonClick = () => {\n      performSearch(props.searchTerm);\n    };\n\n    const onPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n      pasted.current = true;\n    };\n\n    // Used to focus the search box\n    const searchBoxRef = React.useRef<HTMLInputElement>(null);\n\n    const focusSearch = () => {\n      searchBoxRef.current?.focus();\n    };\n\n    // Allow the search box to gain focus the first time the enclosing\n    // container div receives focus.\n    const initialFocusSet = React.useRef<boolean>(false);\n    const parentFocused = () => {\n      if (!initialFocusSet.current) {\n        focusSearch();\n        initialFocusSet.current = true;\n      }\n    };\n\n    const onAddCitation = (citation: CitationListEntry) => {\n      props.onAddCitation(citation);\n      focusSearch();\n    };\n\n    return (\n      <div\n        style={props.style}\n        className=\"pm-insert-citation-panel-latent-search\"\n        ref={ref}\n        tabIndex={-1}\n        onFocus={parentFocused}\n      >\n        <div className=\"pm-insert-citation-panel-latent-search-textbox-container\">\n          <TextInput\n            value={props.searchTerm}\n            width=\"100%\"\n            iconAdornment={props.ui.images.search}\n            tabIndex={0}\n            className=\"pm-insert-citation-panel-latent-search-textbox pm-block-border-color\"\n            placeholder={props.searchPlaceholderText}\n            onKeyDown={handleTextKeyDown}\n            onChange={searchChanged}\n            onPaste={onPaste}\n            ref={searchBoxRef}\n          />\n\n          <TextButton\n            title={props.ui.context.translateText('Search')}\n            classes={['pm-insert-citation-panel-latent-search-button']}\n            onClick={handleButtonClick}\n            disabled={props.status === CitationSourceListStatus.inProgress}\n          />\n        </div>\n\n        <div className=\"pm-insert-citation-panel-latent-search-list-container\">\n          <CitationSourceList\n            height={props.height - kSearchBoxHeightWithMargin}\n            citations={props.citations}\n            citationsToAdd={props.citationsToAdd}\n            onAddCitation={onAddCitation}\n            onRemoveCitation={props.onRemoveCitation}\n            selectedIndex={props.selectedIndex}\n            onSelectedIndexChanged={props.onSelectedIndexChanged}\n            focusPrevious={focusSearch}\n            onConfirm={props.onConfirm}\n            ui={props.ui}\n            itemHeight={100}\n            itemProvider={CitationSourcePanelListItemDetailed}\n            status={props.status}\n            statusMessage={props.statusMessage}\n            classes={['pm-insert-citation-panel-latent-search-list', 'pm-block-border-color', 'pm-background-color']}\n            ref={listContainer}\n          />\n        </div>\n      </div>\n    );\n  },\n);\n","/*\n * insert_citation-source-panel-list-item.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { ListChildComponentProps } from 'react-window';\n\nimport { OutlineButton } from '../../../api/widgets/button';\n\nimport { CitationSourcePanelListItemData } from './insert_citation-source-panel-list';\n\nimport './insert_citation-source-panel-list-item-detailed.css';\n\nexport const CitationSourcePanelListItemDetailed = (props: ListChildComponentProps) => {\n  const citationListData: CitationSourcePanelListItemData = props.data;\n\n  const citationEntry = citationListData.citations[props.index];\n\n  // Wheher this item is selected\n  const selected = citationListData.showSelection && props.index === citationListData.selectedIndex;\n\n  // Whether this item is already in the list of items to add\n  // If the item is selected, it is always a candidate to be added explicitly to the list\n  const alreadyAdded = citationListData.citationsToAdd.map(src => src.id).includes(citationEntry.id) && !selected;\n\n  const onButtonClick = (event: React.MouseEvent) => {\n    event.stopPropagation();\n    event.preventDefault();\n\n    if (alreadyAdded) {\n      citationListData.onRemoveCitation(citationEntry);\n    } else {\n      citationListData.onAddCitation(citationEntry);\n    }\n  };\n\n  const onItemClick = () => {\n    citationListData.onSelectedIndexChanged(props.index);\n  };\n\n  const onDoubleClick = () => {\n    citationListData.onAddCitation(citationEntry);\n    citationListData.onConfirm();\n  };\n\n  const secondLine = [citationEntry.date, citationEntry.journal].filter(text => text).join(', ');\n  const thirdLine = citationEntry.authors(80);\n\n  return (\n    <div\n      onMouseDown={onItemClick}\n      onDoubleClick={onDoubleClick}\n      className=\"pm-insert-citation-source-panel-item-detailed\"\n      style={props.style}\n    >\n      <div\n        className={`pm-insert-citation-source-panel-item-detailed-border ${selected ? 'pm-list-item-selected' : ''}`}\n      >\n        <div className=\"pm-insert-citation-source-panel-item-detailed-container\">\n          <div className=\"pm-insert-citation-source-panel-item-detailed-type\">\n            {citationEntry.imageAdornment ? (\n              <img\n                className=\"pm-insert-citation-source-panel-item-detailed-adorn pm-block-border-color pm-background-color\"\n                src={citationEntry.imageAdornment}\n              />\n            ) : (\n              undefined\n            )}\n            <img\n              className=\"pm-insert-citation-source-panel-item-detailed-icon pm-block-border-color\"\n              src={citationEntry.image}\n            />\n          </div>\n          <div className=\"pm-insert-citation-source-panel-item-detailed-summary\">\n            <div className=\"pm-insert-citation-source-panel-item-detailed-title pm-fixedwidth-font pm-text-color\">\n              {citationEntry.title}\n            </div>\n            <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">\n              {secondLine}\n            </div>\n            <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">{thirdLine}</div>\n            <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">\n              <a href={`https://doi.org/${citationEntry.doi}`} target=\"_new\">\n                {citationEntry.doi}\n              </a>\n            </div>\n          </div>\n          <div className=\"pm-insert-citation-source-panel-item-detailed-button\">\n            <OutlineButton\n              tabIndex={citationListData.preventFocus ? -1 : 0}\n              style={{ width: '24px', height: '24px' }}\n              title={alreadyAdded ? '-' : '+'}\n              onClick={onButtonClick}\n            />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n","/*\n * insert_citation-source-panel-crossref.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { suggestCiteId, formatAuthors, formatIssuedDate } from '../../../api/cite';\nimport { CrossrefWork, imageForCrossrefType, CrossrefServer, prettyType } from '../../../api/crossref';\nimport { sanitizeForCiteproc, CSL } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n  CitationSourcePanelProps,\n  CitationSourcePanelProvider,\n  CitationListEntry,\n  CitationSourceListStatus,\n  matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nexport function crossrefSourcePanel(\n  ui: EditorUI,\n  server: CrossrefServer,\n  doiServer: DOIServer,\n  bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n  const kCrossrefType = 'Crossref';\n  return {\n    key: 'E38370AA-78AE-450B-BBE8-878E1C817C04',\n    panel: CrossRefSourcePanel,\n    treeNode: () => {\n      return {\n        key: 'CrossRef',\n        name: ui.context.translateText('Crossref'),\n        image: ui.images.citations?.crossref,\n        type: kCrossrefType,\n        children: [],\n        expanded: true,\n      };\n    },\n    typeAheadSearch: (_searchTerm: string, _selectedNode: NavigationTreeNode, _existingCitationIds: string[]) => {\n      return null;\n    },\n    progressMessage: ui.context.translateText('Searching Crossref....'),\n    placeHolderMessage: ui.context.translateText('Enter search terms to search Crossref'),\n    search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n      try {\n        const works = await server.works(searchTerm);\n        const existingSources = bibliographyManager.localSources();\n\n        const dedupeCitationIds = existingCitationIds;\n        const citationEntries = works.items.map(work => {\n          const citationEntry = matchExistingSourceCitationListEntry(work.DOI, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(work, dedupeCitationIds, ui, doiServer);\n          if (citationEntry) {\n            // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n            dedupeCitationIds.push(citationEntry.id);\n          }\n          return citationEntry;\n        });\n\n        return Promise.resolve({\n          citations: citationEntries,\n          status: citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n          statusMessage:\n            citationEntries.length > 0 ? '' : ui.context.translateText('No results matching these search terms.'),\n        });\n      } catch (e) {\n        logException(e);\n        return Promise.resolve({\n          citations: [],\n          status: CitationSourceListStatus.error,\n          statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n        });\n      }\n    },\n  };\n}\n\nexport const CrossRefSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n  (props: CitationSourcePanelProps, ref) => {\n    return (\n      <CitationSourceLatentSearchPanel\n        height={props.height}\n        citations={props.citations}\n        citationsToAdd={props.citationsToAdd}\n        searchTerm={props.searchTerm}\n        onSearchTermChanged={props.onSearchTermChanged}\n        executeSearch={props.onExecuteSearch}\n        onAddCitation={props.onAddCitation}\n        onRemoveCitation={props.onRemoveCitation}\n        selectedIndex={props.selectedIndex}\n        onSelectedIndexChanged={props.onSelectedIndexChanged}\n        onConfirm={props.onConfirm}\n        searchPlaceholderText={props.ui.context.translateText('Search Crossref for Citations')}\n        status={props.status}\n        statusMessage={props.statusMessage}\n        ui={props.ui}\n        ref={ref}\n      />\n    );\n  },\n);\n\nfunction toCitationListEntry(\n  crossrefWork: CrossrefWork,\n  existingIds: string[],\n  ui: EditorUI,\n  doiServer: DOIServer,\n): CitationListEntry {\n  const coercedCSL = sanitizeForCiteproc((crossrefWork as unknown) as CSL);\n  const id = suggestCiteId(existingIds, coercedCSL);\n  const providerKey = 'crossref';\n  return {\n    id,\n    isIdEditable: true,\n    title: crossrefWorkTitle(crossrefWork, ui),\n    type: prettyType(ui, crossrefWork.type),\n    date: formatIssuedDate(crossrefWork.issued),\n    journal: crossrefWork['container-title'] || crossrefWork['short-container-title'] || crossrefWork.publisher,\n    image: imageForCrossrefType(ui, crossrefWork.type)[0],\n    doi: crossrefWork.DOI,\n    authors: (length: number) => {\n      return formatAuthors(coercedCSL.author, length);\n    },\n    toBibliographySource: async (finalId: string) => {\n      // Generate CSL using the DOI\n      const doiResult = await doiServer.fetchCSL(crossrefWork.DOI, -1);\n\n      const csl = doiResult.message as CSL;\n      return { ...csl, id: finalId, providerKey };\n    },\n    isSlowGeneratingBibliographySource: true,\n  };\n}\n\nfunction crossrefWorkTitle(work: CrossrefWork, ui: EditorUI) {\n  if (work.title) {\n    return work.title[0];\n  } else {\n    return ui.context.translateText('(Untitled)');\n  }\n}\n","/*\n * insert_citation-source-panel-pubmed.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\nimport { createUniqueCiteId } from '../../../api/cite';\nimport { CSL, sanitizeForCiteproc } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { PubMedServer, PubMedDocument, suggestCiteId, imageForType } from '../../../api/pubmed';\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n  CitationSourcePanelProps,\n  CitationSourcePanelProvider,\n  CitationListEntry,\n  CitationSourceListStatus,\n  errorForStatus,\n  matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\n\nexport function pubmedSourcePanel(\n  ui: EditorUI,\n  server: PubMedServer,\n  doiServer: DOIServer,\n  bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n  const kPubmedType = 'Pubmed';\n  return {\n    key: 'EF556233-05B0-4678-8216-38061908463F',\n    panel: PubmedSourcePanel,\n    treeNode: () => {\n      return {\n        key: 'PubMed',\n        name: ui.context.translateText('PubMed'),\n        image: ui.images.citations?.pubmed,\n        type: kPubmedType,\n        children: [],\n        expanded: true,\n      };\n    },\n    typeAheadSearch: (_searchTerm: string, _selectedNode: NavigationTreeNode, _existingCitationIds: string[]) => {\n      return null;\n    },\n    progressMessage: ui.context.translateText('Searching PubMed....'),\n    placeHolderMessage: ui.context.translateText('Enter a PubMed query to search for citations.'),\n    search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n      try {\n        const noResultsMessage = ui.context.translateText('No results matching these search terms.');\n\n        // Do the PubMed Search\n        const pubMedResult = await server.search(searchTerm);\n        switch (pubMedResult.status) {\n          case 'ok':\n            if (pubMedResult.message !== null) {\n              // There is a message\n              // PubMed Results and Existing Ids\n              const docs: PubMedDocument[] = pubMedResult.message;\n              const dedupeCitationIds = existingCitationIds;\n\n              // Create Citation List Entries for these PubMed docs\n              const citationEntries = docs.map(doc => {\n                const citationEntry = matchExistingSourceCitationListEntry(doc.doi, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(doc, dedupeCitationIds, ui, doiServer);\n                if (citationEntry && citationEntry.id) {\n                  // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n                  dedupeCitationIds.push(citationEntry.id);\n                }\n                return citationEntry;\n              });\n\n              // Return the search result\n              return Promise.resolve({\n                citations: citationEntries,\n                status:\n                  citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n                statusMessage: citationEntries.length > 0 ? '' : noResultsMessage,\n              });\n            } else {\n              // No message, no results\n              return Promise.resolve({\n                citations: [],\n                status: CitationSourceListStatus.noResults,\n                statusMessage: noResultsMessage,\n              });\n            }\n\n          default:\n            // Resolve with Error\n            return Promise.resolve({\n              citations: [],\n              status: CitationSourceListStatus.error,\n              statusMessage: ui.context.translateText(errorForStatus(ui, pubMedResult.status, 'PubMed')),\n            });\n        }\n      } catch (e) {\n        logException(e);\n        return Promise.resolve({\n          citations: [],\n          status: CitationSourceListStatus.error,\n          statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n        });\n      }\n    },\n  };\n}\n\nexport const PubmedSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n  (props: CitationSourcePanelProps, ref) => {\n    return (\n      <CitationSourceLatentSearchPanel\n        height={props.height}\n        citations={props.citations}\n        citationsToAdd={props.citationsToAdd}\n        searchTerm={props.searchTerm}\n        onSearchTermChanged={props.onSearchTermChanged}\n        executeSearch={props.onExecuteSearch}\n        onAddCitation={props.onAddCitation}\n        onRemoveCitation={props.onRemoveCitation}\n        selectedIndex={props.selectedIndex}\n        onSelectedIndexChanged={props.onSelectedIndexChanged}\n        onConfirm={props.onConfirm}\n        searchPlaceholderText={props.ui.context.translateText('Search PubMed for Citations')}\n        status={props.status}\n        statusMessage={props.statusMessage}\n        ui={props.ui}\n        ref={ref}\n      />\n    );\n  },\n);\n\nfunction toCitationListEntry(\n  doc: PubMedDocument,\n  existingIds: string[],\n  ui: EditorUI,\n  doiServer: DOIServer,\n): CitationListEntry {\n  const id = createUniqueCiteId(existingIds, suggestCiteId(doc));\n  const providerKey = 'pubmed';\n  return {\n    id,\n    isIdEditable: true,\n    title: doc.title || '',\n    doi: doc.doi,\n    type: '',\n    date: doc.pubDate || '',\n    journal: doc.source,\n    authors: (length: number) => {\n      return formatAuthors(doc.authors || [], length);\n    },\n    image: imageForType(ui, doc.pubTypes)[0],\n    toBibliographySource: async (finalId: string) => {\n      // Generate CSL using the DOI\n      const doiResult = await doiServer.fetchCSL(doc.doi, -1);\n      const csl = doiResult.message as CSL;\n      const sanitizedCSL = sanitizeForCiteproc(csl);\n      return { ...sanitizedCSL, id: finalId, providerKey };\n    },\n    isSlowGeneratingBibliographySource: true,\n  };\n}\n\nfunction formatAuthors(authors: string[], length: number) {\n  return authors.join(',');\n}\n","/*\n * pubmed.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUI } from './ui';\n\nexport interface PubMedResult {\n  status: 'ok' | 'notfound' | 'nohost' | 'error';\n  message: PubMedDocument[] | null;\n  error: string;\n}\n\nexport interface PubMedDocument {\n  doi: string;\n  pubTypes?: string[];\n  authors?: string[];\n  sortFirstAuthor?: string;\n  title?: string;\n  source?: string;\n  volume?: string;\n  issue?: string;\n  pubDate?: string;\n}\n\nexport interface PubMedServer {\n  search: (query: string) => Promise<PubMedResult>;\n}\n\nexport function suggestCiteId(doc: PubMedDocument): string {\n  // Try to get the last name. Prefer the sort first author,\n  // but otherwise just use the first author (if any)\n  let suggestedId = '';\n  if (doc.sortFirstAuthor) {\n    suggestedId = doc.sortFirstAuthor.split(' ')[0];\n  } else if (doc.authors && doc.authors.length > 0) {\n    suggestedId = doc.authors[0].split(' ')[0];\n  }\n\n  // Try to read the year\n  if (doc.pubDate) {\n    suggestedId = suggestedId + doc.pubDate.split(' ')[0];\n  }\n  return suggestedId;\n}\n\nexport function imageForType(ui: EditorUI, pubTypes?: string[]): [string?, string?] {\n  const type = pubTypes && pubTypes.length > 0 ? pubTypes[0] : '';\n  switch (type) {\n    case 'Journal Article':\n    case 'Historical Article':\n    case 'Classical Article':\n    case 'Introductory Journal Article':\n    case 'paper-conference':\n      return [ui.images.citations?.article, ui.images.citations?.article_dark];\n    case 'Legal Case':\n    case 'Legislation':\n      return [ui.images.citations?.legal, ui.images.citations?.legal_dark];\n    case 'Dataset':\n      return [ui.images.citations?.data, ui.images.citations?.data_dark];\n    case 'Video-Audio Media':\n      return [ui.images.citations?.movie, ui.images.citations?.movie_dark];\n    case 'Webcasts':\n      return [ui.images.citations?.web, ui.images.citations?.web_dark];\n    default:\n      return [ui.images.citations?.other, ui.images.citations?.other_dark];\n  }\n}\n","/*\n * insert_citation-source-panel-pubmed.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { createUniqueCiteId } from '../../../api/cite';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { DataCiteServer, DataCiteRecord, suggestCiteId, DataCiteCreator } from '../../../api/datacite';\nimport { DOIServer } from '../../../api/doi';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { logException } from '../../../api/log';\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n  CitationSourcePanelProps,\n  CitationSourcePanelProvider,\n  CitationListEntry,\n  CitationSourceListStatus,\n  errorForStatus,\n  matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nexport function dataciteSourcePanel(\n  ui: EditorUI,\n  server: DataCiteServer,\n  doiServer: DOIServer,\n  bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n  const kDataCiteType = 'Datacite';\n  return {\n    key: '66A6EADB-22AE-4DDD-BCD5-70BC0DEB8FB3',\n    panel: DataCiteSourcePanel,\n    treeNode: () => {\n      return {\n        key: 'DataCite',\n        name: ui.context.translateText('DataCite'),\n        image: ui.images.citations?.datacite,\n        type: kDataCiteType,\n        children: [],\n        expanded: true,\n      };\n    },\n    typeAheadSearch: (_searchTerm: string, _selectedNode: NavigationTreeNode, _existingCitationIds: string[]) => {\n      return null;\n    },\n    progressMessage: ui.context.translateText('Searching DataCite....'),\n    placeHolderMessage: ui.context.translateText('Enter search terms to search DataCite'),\n    search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n      try {\n        const dataciteResult = await server.search(searchTerm);\n        const noResultsMessage = ui.context.translateText('No results matching these search terms.');\n        switch (dataciteResult.status) {\n          case 'ok':\n            if (dataciteResult.message !== null) {\n              const records: DataCiteRecord[] = dataciteResult.message;\n              const dedupeCitationIds = existingCitationIds;\n              const citationEntries = records.map(record => {\n                const citationEntry = matchExistingSourceCitationListEntry(record.doi, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(record, dedupeCitationIds, ui, doiServer);\n                if (citationEntry) {\n                  // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n                  dedupeCitationIds.push(citationEntry.id);\n                }\n                return citationEntry;\n              });\n              return Promise.resolve({\n                citations: citationEntries,\n                status:\n                  citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n                statusMessage: citationEntries.length > 0 ? '' : noResultsMessage,\n              });\n            } else {\n              // No results\n              return Promise.resolve({\n                citations: [],\n                status: CitationSourceListStatus.noResults,\n                statusMessage: noResultsMessage,\n              });\n            }\n          default:\n            // Resolve with Error\n            return Promise.resolve({\n              citations: [],\n              status: CitationSourceListStatus.error,\n              statusMessage: ui.context.translateText(errorForStatus(ui, dataciteResult.status, 'DataCite')),\n            });\n        }\n      } catch (e) {\n        logException(e);\n        return Promise.resolve({\n          citations: [],\n          status: CitationSourceListStatus.error,\n          statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n        });\n      }\n    },\n  };\n}\n\nexport const DataCiteSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n  (props: CitationSourcePanelProps, ref) => {\n    return (\n      <CitationSourceLatentSearchPanel\n        height={props.height}\n        citations={props.citations}\n        citationsToAdd={props.citationsToAdd}\n        searchTerm={props.searchTerm}\n        onSearchTermChanged={props.onSearchTermChanged}\n        executeSearch={props.onExecuteSearch}\n        onAddCitation={props.onAddCitation}\n        onRemoveCitation={props.onRemoveCitation}\n        selectedIndex={props.selectedIndex}\n        onSelectedIndexChanged={props.onSelectedIndexChanged}\n        onConfirm={props.onConfirm}\n        searchPlaceholderText={props.ui.context.translateText('Search DataCite for Citations')}\n        status={props.status}\n        statusMessage={props.statusMessage}\n        ui={props.ui}\n        ref={ref}\n      />\n    );\n  },\n);\n\nfunction toCitationListEntry(\n  record: DataCiteRecord,\n  existingIds: string[],\n  ui: EditorUI,\n  doiServer: DOIServer,\n): CitationListEntry {\n  const id = createUniqueCiteId(existingIds, suggestCiteId(record));\n  const providerKey = 'datacite';\n  return {\n    id,\n    isIdEditable: true,\n    title: record.title || '',\n    type: record.type || '',\n    date: record.publicationYear?.toString() || '',\n    journal: record.publisher,\n    image: imageForType(ui.images, record.type || '')[0],\n    doi: record.doi,\n    authors: (length: number) => {\n      return formatAuthors(record.creators || [], length);\n    },\n    toBibliographySource: async (finalId: string) => {\n      // Generate CSL using the DOI\n      const doiResult = await doiServer.fetchCSL(record.doi, -1);\n\n      const csl = doiResult.message as CSL;\n      return { ...csl, id: finalId, providerKey };\n    },\n    isSlowGeneratingBibliographySource: true,\n  };\n}\n\nfunction formatAuthors(authors: DataCiteCreator[], length: number) {\n  return authors.map(creator => creator.fullName).join(',');\n}\n","/*\n * datacite.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface DataCiteResult {\n  status: 'ok' | 'notfound' | 'nohost' | 'error';\n  message: DataCiteRecord[] | null;\n  error: string;\n}\n\nexport interface DataCiteRecord {\n  doi: string;\n  title?: string;\n  publisher?: string;\n  publicationYear?: number;\n  creators?: DataCiteCreator[];\n  type?: string; // citeproc type\n}\n\nexport interface DataCiteCreator {\n  fullName: string;\n  familyName?: string;\n  givenName?: string;\n}\n\nexport interface DataCiteServer {\n  search: (query: string) => Promise<DataCiteResult>;\n}\n\nexport function suggestCiteId(record: DataCiteRecord): string {\n  // Try to use the last name (or the first name)\n  let suggestedId = '';\n  if (record.creators && record.creators.length > 0) {\n    suggestedId = record.creators[0].familyName || record.creators[0].fullName;\n  }\n\n  // Try to read the year\n  if (record.publicationYear) {\n    suggestedId = suggestedId + record.publicationYear;\n  }\n  return suggestedId;\n}\n","/*\n * insert_citation-picker-bibliography.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { changeExtension } from '../../api/path';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { TextInput } from '../../api/widgets/text';\nimport { SelectInput } from '../../api/widgets/select';\nimport { BibliographyFile, BibliographyType } from '../../api/bibliography/bibliography';\n\nimport './insert_citation-bibliography-picker.css';\n\nexport interface CitationBiblographyPickerProps extends WidgetProps {\n  bibliographyTypes: BibliographyType[];\n  bibliographyFiles: BibliographyFile[];\n  onBiblographyFileChanged: (file: BibliographyFile) => void;\n  createBibliographyFileName: string;\n  onCreateBibliographyFileNameChanged: (fileName: string) => void;\n  ui: EditorUI;\n}\n\nexport const CitationBibliographyPicker: React.FC<CitationBiblographyPickerProps> = props => {\n  // Selection of file from list\n  const onChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n    const index = e.target.selectedIndex;\n    props.onBiblographyFileChanged(props.bibliographyFiles[index]);\n  };\n\n  // Change to the file we should create\n  const onTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const text = e.target.value;\n    props.onCreateBibliographyFileNameChanged(text);\n  };\n\n  // File type change\n  const onTypeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n    const index = e.target.selectedIndex;\n    const type = props.bibliographyTypes[index];\n    const newPath = changeExtension(props.createBibliographyFileName, type.extension);\n    props.onCreateBibliographyFileNameChanged(newPath);\n    props.ui.prefs.setBibliographyDefaultType(type.extension);\n  };\n\n  return (\n    <div className=\"pm-citation-bibliography-picker-container\" style={props.style}>\n      <div className=\"pm-citation-bibliography-picker-label pm-text-color\">\n        {props.bibliographyFiles.length > 0\n          ? props.ui.context.translateText('Add to bibliography:')\n          : props.ui.context.translateText('Create bibliography:')}\n      </div>\n      {props.bibliographyFiles.length > 0 ? (\n        <SelectInput onChange={onChange}>\n          {props.bibliographyFiles.map(file => (\n            <option key={file.fullPath} value={file.fullPath}>\n              {file.displayPath}\n            </option>\n          ))}\n        </SelectInput>\n      ) : (\n        <div className=\"pm-citation-bibliography-picker-create-controls\">\n          <TextInput\n            width=\"100\"\n            tabIndex={0}\n            className=\"pm-citation-bibliography-picker-textbox pm-block-border-color\"\n            placeholder={props.ui.context.translateText('Bibligraphy file name')}\n            value={props.createBibliographyFileName}\n            onChange={onTextChange}\n          />\n          <div className=\"pm-citation-bibliography-format-label pm-text-color\">\n            {props.ui.context.translateText('Format:')}\n          </div>\n          <SelectInput\n            onChange={onTypeChange}\n            defaultValue={props.bibliographyTypes.find(bibType => bibType.default)?.extension}\n          >\n            {props.bibliographyTypes.map(bibType => (\n              <option key={bibType.extension} value={bibType.extension}>\n                {bibType.displayName}\n              </option>\n            ))}\n          </SelectInput>\n        </div>\n      )}\n    </div>\n  );\n};\n","/*\n * text.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, KeyboardEventHandler, FocusEventHandler, ClipboardEventHandler } from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './text.css';\n\nexport interface CheckboxInputProps extends WidgetProps {\n  id?: string;\n  tabIndex?: number;\n  className?: string;\n  checked?: boolean;\n  onChange?: ChangeEventHandler;\n}\n\nexport const CheckboxInput= React.forwardRef<HTMLInputElement, CheckboxInputProps>((props, ref) => {\n  const style: React.CSSProperties = {\n    ...props.style,\n  };\n\n  return (\n      <input\n        id={props.id} \n        type=\"checkbox\"\n        className={`\n          pm-input-checkbox\n          pm-text-color \n          pm-background-color \n          ${props.className}`}\n        checked={props.checked}\n        onChange={props.onChange}\n        tabIndex={props.tabIndex}\n        ref={ref}\n      />\n  );\n});\n\n\n","/*\n * span.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Fragment, Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ExtensionContext } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { EditorUI } from '../api/ui';\nimport { markIsActive, getMarkAttrs, getSelectionMarkRange } from '../api/mark';\nimport { PandocOutput, PandocTokenType, PandocToken } from '../api/pandoc';\nimport {\n  pandocAttrSpec,\n  pandocAttrReadAST,\n  pandocAttrParseDom,\n  pandocAttrToDomAttr,\n  kSpanAttr,\n  kSpanChildren,\n} from '../api/pandoc_attr';\n\nconst extension = (context: ExtensionContext) => {\n  const { pandocExtensions, ui } = context;\n\n  if (!pandocExtensions.bracketed_spans && !pandocExtensions.native_spans) {\n    return null;\n  }\n\n  return {\n    marks: [\n      {\n        name: 'span',\n        spec: {\n          group: 'formatting',\n          attrs: pandocAttrSpec,\n          inclusive: false,\n          parseDOM: [\n            {\n              tag: 'span[data-span=\"1\"]',\n              getAttrs(dom: Node | string) {\n                const attrs: {} = { 'data-span': 1 };\n                return {\n                  ...attrs,\n                  ...pandocAttrParseDom(dom as Element, attrs),\n                };\n              },\n            },\n          ],\n          toDOM(mark: Mark): DOMOutputSpec {\n            const attr = {\n              'data-span': '1',\n              ...pandocAttrToDomAttr({\n                ...mark.attrs,\n                classes: [...mark.attrs.classes, 'pm-span pm-span-background-color'],\n              }),\n            };\n            return ['span', attr];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Span,\n              mark: 'span',\n              getAttrs: (tok: PandocToken) => {\n                return pandocAttrReadAST(tok, kSpanAttr);\n              },\n              getChildren: (tok: PandocToken) => tok.c[kSpanChildren],\n            },\n          ],\n          writer: {\n            priority: 11,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              output.writeToken(PandocTokenType.Span, () => {\n                output.writeAttr(mark.attrs.id, mark.attrs.classes, mark.attrs.keyvalue);\n                output.writeArray(() => {\n                  output.writeInlines(parent);\n                });\n              });\n            },\n          },\n        },\n      },\n    ],\n\n    commands: (_schema: Schema) => {\n      return [new SpanCommand(ui)];\n    },\n  };\n};\n\nclass SpanCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI) {\n    super(EditorCommandId.Span, [], (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n      const schema = state.schema;\n\n      // if there is no contiguous selection and no existing span mark active\n      // then the command should be disabled (unknown what the span target is)\n      if (!markIsActive(state, schema.marks.span) && state.selection.empty) {\n        return false;\n      }\n\n      // if the current node doesn't allow this mark return false\n      if (!state.selection.$from.node().type.allowsMarkType(schema.marks.span)) {\n        return false;\n      }\n\n      async function asyncEditSpan() {\n        if (dispatch) {\n          let attr: { [key: string]: any } = { id: null, classes: [], keyvalue: [] };\n          if (markIsActive(state, schema.marks.span)) {\n            attr = getMarkAttrs(state.doc, state.selection, schema.marks.span);\n          }\n          const result = await ui.dialogs.editSpan(attr);\n          if (result) {\n            const tr = state.tr;\n            const range = getSelectionMarkRange(state.selection, schema.marks.span);\n            tr.removeMark(range.from, range.to, schema.marks.span);\n            if (result.action === 'edit') {\n              const mark = schema.marks.span.create(result.attr);\n              tr.addMark(range.from, range.to, mark);\n            }\n            dispatch(tr);\n          }\n        }\n        if (view) {\n          view.focus();\n        }\n      }\n      asyncEditSpan();\n\n      return true;\n    });\n  }\n}\n\nexport default extension;\n","/*\n * xref.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode, Mark, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Transform } from 'prosemirror-transform';\n\nimport { setTextSelection, findChildren, findChildrenByMark } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { detectAndApplyMarks, removeInvalidatedMarks, getMarkRange } from '../../api/mark';\nimport { MarkTransaction, trTransform } from '../../api/transaction';\nimport { FixupContext } from '../../api/fixup';\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { fragmentText } from '../../api/fragment';\nimport { PandocOutput } from '../../api/pandoc';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { xrefCompletionHandler } from './xref-completion';\nimport { xrefPopupPlugin } from './xref-popup';\n\nconst kRefRegExDetectAndApply = /(?:^|[^`])(\\\\?@ref\\([ A-Za-z0-9:-]*\\))/g;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, format, ui, navigation, server } = context;\n\n  if (!format.rmdExtensions.bookdownXRef) {\n    return null;\n  }\n\n  return {\n    marks: [\n      {\n        name: 'xref',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          inclusive: false,\n          excludes: 'formatting',\n          attrs: {},\n          parseDOM: [\n            {\n              tag: \"span[class*='xref']\",\n            },\n          ],\n          toDOM(_mark: Mark) {\n            return ['span', { class: 'xref pm-link-text-color pm-fixedwidth-font' }];\n          },\n        },\n        pandoc: {\n          readers: [],\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              // alias xref (may need to transform it to deal with \\ prefix)\n              let xref = parent;\n\n              // if it starts with a \\ then don't write the slash (pandoc will\n              // either create one automatically or we'll write one explicitly\n              // if pandoc won't b/c it doesn't have all_symbols_escapable)\n              if (fragmentText(xref).startsWith('\\\\')) {\n                xref = xref.cut(1, xref.size);\n              }\n\n              // if all symbols aren't escapable then we need an explicit \\\n              // (because pandoc won't automatically escape the \\)\n              if (!pandocExtensions.all_symbols_escapable) {\n                output.writeRawMarkdown('\\\\');\n              }\n\n              // write xref\n              output.writeInlines(xref);\n            },\n          },\n        },\n      },\n    ],\n\n    fixups: (schema: Schema) => {\n      return [\n        (tr: Transaction, fixupContext: FixupContext) => {\n          if (fixupContext === FixupContext.Load) {\n            // apply marks\n            const markType = schema.marks.xref;\n            const predicate = (node: ProsemirrorNode) => {\n              return node.isTextblock && node.type.allowsMarkType(markType);\n            };\n            const markTr = new MarkTransaction(tr);\n            findChildren(tr.doc, predicate).forEach(nodeWithPos => {\n              const { pos } = nodeWithPos;\n              detectAndApplyMarks(\n                markTr,\n                tr.doc.nodeAt(pos)!,\n                pos,\n                kRefRegExDetectAndApply,\n                markType,\n                () => ({}),\n                () => true,\n                match => match[1],\n              );\n            });\n\n            // remove leading \\ as necessary (this would occur if the underlying format includes\n            // a \\@ref and doesn't have all_symbols_escapable, e.g. blackfriday)\n            trTransform(tr, stripRefBackslashTransform);\n          }\n          return tr;\n        },\n      ];\n    },\n\n    appendMarkTransaction: (schema: Schema) => {\n      return [\n        {\n          name: 'xref-marks',\n          filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.xref),\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            removeInvalidatedMarks(tr, node, pos, kRefRegExDetectAndApply, node.type.schema.marks.xref);\n            detectAndApplyMarks(\n              tr,\n              tr.doc.nodeAt(pos)!,\n              pos,\n              kRefRegExDetectAndApply,\n              node.type.schema.marks.xref,\n              () => ({}),\n              () => true,\n              match => match[1],\n            );\n          },\n        },\n      ];\n    },\n\n    inputRules: (_schema: Schema) => {\n      return [atRefInputRule(), ...(format.rmdExtensions.bookdownXRefUI ? [refPrefixInputRule()] : [])];\n    },\n\n    plugins: (schema: Schema) => [xrefPopupPlugin(schema, ui, server)],\n\n    completionHandlers: () => [xrefCompletionHandler(ui, server.xref)],\n\n    commands: (schema: Schema) => {\n      if (format.rmdExtensions.bookdownXRefUI) {\n        return [\n          new ProsemirrorCommand(\n            EditorCommandId.CrossReference,\n            [],\n            (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n              // enable/disable command\n              if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.xref)(state)) {\n                return false;\n              }\n              if (dispatch) {\n                const tr = state.tr;\n                insertRef(tr);\n                dispatch(tr);\n              }\n              return true;\n            },\n            {\n              name: ui.context.translateText('Cross Reference'),\n              description: ui.context.translateText('Reference to related content'),\n              group: OmniInsertGroup.References,\n              priority: 0,\n              image: () =>\n                ui.prefs.darkMode()\n                  ? ui.images.omni_insert!.cross_reference_dark!\n                  : ui.images.omni_insert!.cross_reference!,\n            },\n          ),\n        ];\n      } else {\n        return [];\n      }\n    },\n  };\n};\n\nfunction atRefInputRule() {\n  return new InputRule(/(^|[^`])(\\\\?@ref\\()$/, (state: EditorState, match: string[], start: number, end: number) => {\n    // if this completes an xref at this position then stand down\n    const kRefLen = 4;\n    const { parent, parentOffset } = state.selection.$head;\n    const before = parent.textContent.slice(parentOffset - kRefLen, parentOffset);\n    const after = parent.textContent.slice(parentOffset);\n    const potentialXRef = before + '(' + after;\n    if (/^@ref\\([A-Za-z0-9:-]*\\).*$/.test(potentialXRef)) {\n      return null;\n    }\n\n    // insert the xref\n    const tr = state.tr;\n    tr.delete(start + match[1].length, end);\n    insertRef(tr);\n    return tr;\n  });\n}\n\nfunction refPrefixInputRule() {\n  return new InputRule(\n    /(^|[^`])(Chapter|Section|Figure|Table|Equation) $/,\n    (state: EditorState, match: string[], start: number, end: number) => {\n      const tr = state.tr;\n      tr.insertText(' ');\n      let prefix = '';\n      if (match[2] === 'Figure') {\n        prefix = 'fig:';\n      } else if (match[2] === 'Table') {\n        prefix = 'tab:';\n      } else if (match[2] === 'Equation') {\n        prefix = 'eq:';\n      }\n      insertRef(tr, prefix);\n      setTextSelection(tr.selection.head - 1)(tr);\n      return tr;\n    },\n  );\n}\n\nfunction insertRef(tr: Transaction, prefix = '') {\n  const schema = tr.doc.type.schema;\n  const selection = tr.selection;\n  const refText = `@ref(${prefix})`;\n  tr.replaceSelectionWith(schema.text(refText, schema.marks.xref.create()), false);\n  setTextSelection(tr.mapping.map(selection.head) - 1)(tr);\n}\n\nfunction stripRefBackslashTransform(tr: Transform) {\n  const markType = tr.doc.type.schema.marks.xref;\n  findChildrenByMark(tr.doc, markType).forEach(markedNode => {\n    const pos = tr.mapping.map(markedNode.pos);\n    if (markType.isInSet(markedNode.node.marks)) {\n      const markRange = getMarkRange(tr.doc.resolve(pos), markType);\n      if (markRange) {\n        const text = tr.doc.textBetween(markRange.from, markRange.to);\n        if (text.startsWith('\\\\')) {\n          tr.deleteRange(markRange.from, markRange.from + 1);\n        }\n      }\n    }\n  });\n}\n\nexport default extension;\n","/*\n * xref-completion.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { DecorationSet } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport Fuse from 'fuse.js';\nimport uniqby from 'lodash.uniqby';\n\nimport { EditorUI } from '../../api/ui';\nimport { CompletionHandler, CompletionResult } from '../../api/completion';\nimport { XRef, XRefServer, xrefKey } from '../../api/xref';\nimport { markIsActive } from '../../api/mark';\nimport { searchPlaceholderDecoration } from '../../api/placeholder';\nimport { CompletionItemView } from '../../api/widgets/completion';\n\nimport './xref-completion.css';\n\nconst kMaxResults = 20;\n\nexport function xrefCompletionHandler(ui: EditorUI, server: XRefServer): CompletionHandler<XRef> {\n  const index = new FuseIndex();\n\n  return {\n    id: 'BAACC160-56BE-4322-B079-54477A880623',\n\n    enabled: (context: EditorState | Transaction) => {\n      return markIsActive(context, context.doc.type.schema.marks.xref);\n    },\n\n    completions: xrefCompletions(ui, server, index),\n\n    filter: (completions: XRef[], _state: EditorState, token: string) => {\n      if (token.length > 0) {\n        return index.search(token, kMaxResults);\n      } else {\n        return completions.slice(0, kMaxResults);\n      }\n    },\n\n    replacement(schema: Schema, xref: XRef | null): string | ProsemirrorNode | null {\n      if (xref) {\n        return xrefKey(xref);\n      } else {\n        return null;\n      }\n    },\n\n    view: {\n      component: xrefView(ui),\n      key: xref => xrefKey(xref),\n      height: 52,\n      width: 350,\n      maxVisible: 5,\n      hideNoResults: true,\n    },\n  };\n}\n\nclass FuseIndex {\n  private fuse: Fuse<XRef, Fuse.IFuseOptions<XRef>>;\n\n  private keys: Fuse.FuseOptionKeyObject[] = [\n    { name: 'id', weight: 20 },\n    { name: 'type', weight: 1 },\n    { name: 'title', weight: 1 },\n  ];\n\n  constructor() {\n    this.fuse = this.createIndex([]);\n  }\n\n  public update(xrefs: XRef[]) {\n    this.fuse = this.createIndex(xrefs);\n  }\n\n  public search(query: string, limit: number) {\n    // see if we have an explicit type\n    let type: string | null = null;\n    let typeQuery: string | null = null;\n    const colonLoc = query.indexOf(':');\n    if (colonLoc !== -1) {\n      const prefix = query.slice(0, colonLoc);\n      if (kXRefTypes.hasOwnProperty(prefix)) {\n        type = prefix;\n        if (query.length > type.length + 1) {\n          typeQuery = query.slice(colonLoc + 1);\n        }\n      }\n    }\n\n    // search options\n    const options = {\n      isCaseSensitive: false,\n      shouldSort: true,\n      minMatchCharLength: 2,\n      limit,\n      keys: this.keys,\n    };\n\n    // perform query (use type if we have one)\n    const results = type\n      ? typeQuery\n        ? this.fuse.search({ $and: [{ type }, { $or: [{ id: typeQuery }, { title: typeQuery }] }] }, options)\n        : this.fuse.search({ type }, options)\n      : this.fuse.search(query, options);\n\n    // return results (eliminating duplicates)\n    return uniqby(\n      results.map((result: { item: XRef }) => result.item),\n      xrefKey,\n    );\n  }\n\n  private createIndex(xrefs: XRef[]) {\n    const options = {\n      keys: this.keys.map(key => key.name),\n    };\n    const index = Fuse.createIndex(options.keys, xrefs);\n    return new Fuse(xrefs, options, index);\n  }\n}\n\nfunction xrefCompletions(ui: EditorUI, server: XRefServer, index: FuseIndex) {\n  const kXRefCompletionRegEx = /(@ref\\()([ A-Za-z0-9:-]*)$/;\n  return (text: string, context: EditorState | Transaction): CompletionResult<XRef> | null => {\n    const match = text.match(kXRefCompletionRegEx);\n    if (match) {\n      const pos = context.selection.head - match[2].length;\n      const token = match[2];\n      return {\n        pos,\n        offset: -match[1].length + 1,\n        token,\n        completions: async () => {\n          const docPath = ui.context.getDocumentPath();\n          if (docPath) {\n            await ui.context.withSavedDocument();\n            const xrefs = await server.indexForFile(docPath);\n            index.update(xrefs.refs);\n            return xrefs.refs;\n          } else {\n            index.update([]);\n            return Promise.resolve([]);\n          }\n        },\n        decorations:\n          token.length === 0 ? DecorationSet.create(context.doc, [searchPlaceholderDecoration(pos, ui)]) : undefined,\n      };\n    } else {\n      return null;\n    }\n  };\n}\n\nfunction xrefView(ui: EditorUI): React.FC<XRef> {\n  return (xref: XRef) => {\n    const type = kXRefTypes[xref.type];\n    const image = type?.image(ui) || ui.images.omni_insert?.generic!;\n\n    return (\n      <CompletionItemView\n        width={350}\n        classes={['pm-xref-completion-item']}\n        image={image}\n        title={xrefKey(xref)}\n        subTitle={xref.title || ''}\n        detail={xref.file}\n      />\n    );\n  };\n}\n\nconst kGenericType = {\n  image: (ui: EditorUI) => ui.images.omni_insert?.generic!,\n};\n\nconst kEqType = {\n  image: (ui: EditorUI) =>\n    ui.prefs.darkMode() ? ui.images.omni_insert?.math_display_dark : ui.images.omni_insert?.math_display,\n};\n\nconst kXRefTypes: { [key: string]: { image: (ui: EditorUI) => string | undefined } } = {\n  h1: {\n    image: (ui: EditorUI) =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.heading1_dark : ui.images.omni_insert?.heading1,\n  },\n  h2: {\n    image: (ui: EditorUI) =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.heading2_dark : ui.images.omni_insert?.heading2,\n  },\n  h3: {\n    image: (ui: EditorUI) =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.heading3_dark : ui.images.omni_insert?.heading3,\n  },\n  h4: {\n    image: (ui: EditorUI) =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.heading4_dark : ui.images.omni_insert?.heading4,\n  },\n  fig: {\n    image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.omni_insert?.image_dark : ui.images.omni_insert?.image),\n  },\n  tab: {\n    image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.omni_insert?.table_dark : ui.images.omni_insert?.table),\n  },\n  eq: kEqType,\n  thm: kEqType,\n  lem: kEqType,\n  cor: kEqType,\n  prp: kEqType,\n  cnj: kEqType,\n  def: kEqType,\n  exm: kGenericType,\n  exr: kGenericType,\n};\n","/*\n * xref-popup.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { Popup } from '../../api/widgets/popup';\nimport { EditorServer } from '../../api/server';\nimport { XRef, xrefKey } from '../../api/xref';\nimport { LinkButton } from '../../api/widgets/button';\n\nimport './xref-popup.css';\n\nconst kMaxWidth = 350; // also in xref-popup.css\n\nexport function xrefPopupPlugin(schema: Schema, ui: EditorUI, server: EditorServer) {\n  return textPopupDecorationPlugin({\n    key: new PluginKey<DecorationSet>('xref-popup'),\n    markType: schema.marks.xref,\n    maxWidth: kMaxWidth,\n    dismissOnEdit: true,\n    createPopup: async (view: EditorView, target: TextPopupTarget, style: React.CSSProperties) => {\n      // lookup xref on server\n      const docPath = ui.context.getDocumentPath();\n      if (docPath) {\n        const kXRefRegEx = /^@ref\\(([A-Za-z0-9:-]*)\\)$/;\n        const match = target.text.match(kXRefRegEx);\n        if (match && match[1].length) {\n          await ui.context.withSavedDocument();\n          const xrefs = await server.xref.xrefForId(docPath, match[1]);\n          if (xrefs.refs.length) {\n            const xref = xrefs.refs[0];\n\n            // click handler\n            const onClick = () => {\n              const file = xrefs.baseDir + '/' + xref.file;\n              ui.display.navigateToXRef(file, xref);\n            };\n\n            return <XRefPopup xref={xref} onClick={onClick} style={style} />;\n          }\n        }\n      }\n      return null;\n    },\n    specKey: (target: TextPopupTarget) => {\n      return `xref:${target.text}`;\n    },\n  });\n}\n\ninterface XRefPopupProps extends WidgetProps {\n  xref: XRef;\n  onClick: VoidFunction;\n  style: React.CSSProperties;\n}\n\nconst XRefPopup: React.FC<XRefPopupProps> = props => {\n  return (\n    <Popup classes={['pm-xref-popup']} style={props.style}>\n      <div>\n        <LinkButton\n          text={xrefKey(props.xref)}\n          onClick={props.onClick}\n          maxWidth={kMaxWidth - 20}\n          classes={['pm-xref-popup-key pm-fixedwidth-font']}\n        />\n      </div>\n      <div className=\"pm-xref-popup-file\">{props.xref.file}</div>\n    </Popup>\n  );\n};\n","/*\n * raw_html-comment.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, TextSelection, EditorState } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { EditorCommandId, ProsemirrorCommand, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { ProsemirrorWriter, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { EditorUI } from '../../api/ui';\nimport { MarkTransaction } from '../../api/transaction';\nimport { removeInvalidatedMarks, detectAndApplyMarks } from '../../api/mark';\nimport { matchPandocFormatComment } from '../../api/pandoc_format';\nimport { kHTMLCommentRegEx, isHTMLComment } from '../../api/html';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport './raw_html_comment-styles.css';\n\nconst kHTMLEditingCommentRegEx = /^<!--# ([\\s\\S]*?)-->$/;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { options, ui } = context;\n\n  return {\n    marks: [\n      {\n        name: 'raw_html_comment',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          attrs: {\n            editing: { default: false },\n            format: { default: false },\n          },\n          inclusive: false,\n          excludes: 'formatting',\n          parseDOM: [\n            {\n              tag: \"span[class*='raw-html-comment']\",\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                return {\n                  editing: el.getAttribute('data-editing') === '1',\n                  format: el.getAttribute('data-format') === '1',\n                };\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            const attr: any = {\n              class:\n                'raw-html-comment pm-fixedwidth-font ' +\n                (mark.attrs.editing ? 'pm-comment-color pm-comment-background-color' : 'pm-light-text-color') +\n                (mark.attrs.format && options.hideFormatComment ? ' pm-comment-hidden' : ''),\n              'data-editing': mark.attrs.editing ? '1' : '0',\n              'data-format': mark.attrs.format ? '1' : '0',\n            };\n            return ['span', attr];\n          },\n        },\n        pandoc: {\n          readers: [],\n          inlineHTMLReader: (schema: Schema, html: string, writer?: ProsemirrorWriter) => {\n            const isComment = isHTMLComment(html);\n            if (!isComment) {\n              return false;\n            }\n\n            if (writer) {\n              const mark = schema.marks.raw_html_comment.create(commentMarkAttribs(html));\n              writer.openMark(mark);\n              writer.writeText(html);\n              writer.closeMark(mark);\n            }\n\n            return isComment;\n          },\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              output.writeRawMarkdown(parent);\n            },\n          },\n        },\n      },\n    ],\n\n    appendMarkTransaction: (schema: Schema) => {\n      const markType = schema.marks.raw_html_comment;\n      const kHTMLCommentMarkRegEx = new RegExp(kHTMLCommentRegEx.source, 'g');\n      return [\n        {\n          name: 'html-editing-comment-marks',\n          filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(markType),\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            removeInvalidatedMarks(tr, node, pos, kHTMLCommentRegEx, markType);\n            detectAndApplyMarks(\n              tr,\n              tr.doc.nodeAt(pos)!,\n              pos,\n              kHTMLCommentMarkRegEx,\n              markType,\n              match => commentMarkAttribs(match[1]),\n              () => true,\n              match => match[1],\n            );\n          },\n        },\n      ];\n    },\n\n    // insert command\n    commands: (schema: Schema) => {\n      return [new InsertHTMLCommentCommand(schema, ui)];\n    },\n  };\n};\n\nexport class InsertHTMLCommentCommand extends ProsemirrorCommand {\n  constructor(schema: Schema, ui: EditorUI) {\n    super(\n      EditorCommandId.HTMLComment,\n      ['Shift-Mod-c'],\n      (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n        // make sure we can insert a text node here\n        if (!canInsertNode(state, schema.nodes.text)) {\n          return false;\n        }\n\n        // make sure we can apply this mark here\n        if (!toggleMarkType(schema.marks.raw_html)(state)) {\n          return false;\n        }\n\n        // make sure the end of the selection (where we will insert the comment)\n        // isn't already in a mark of this type\n        if (state.doc.rangeHasMark(state.selection.to, state.selection.to + 1, schema.marks.raw_html)) {\n          return false;\n        }\n\n        if (dispatch) {\n          const tr = state.tr;\n\n          // set the selection to the end of the current selection (comment 'on' the selection)\n          setTextSelection(tr.selection.to)(tr);\n\n          // if we have a character right before us then insert a space\n          const { parent, parentOffset } = tr.selection.$to;\n          const charBefore = parent.textContent.slice(parentOffset - 1, parentOffset);\n          if (charBefore.length && charBefore !== ' ') {\n            tr.insertText(' ');\n          }\n\n          // insert the comment\n          const comment = '<!--#  -->';\n          const mark = schema.marks.raw_html_comment.create({ editing: true });\n          tr.insert(tr.selection.to, schema.text(comment, [mark]));\n\n          // set the selection to the middle of the comment\n          tr.setSelection(new TextSelection(tr.doc.resolve(tr.selection.to - (comment.length / 2 - 1))));\n\n          // dispatch\n          dispatch(tr);\n        }\n\n        return true;\n      },\n      {\n        name: ui.context.translateText('Comment'),\n        description: ui.context.translateText('Editing comment'),\n        group: OmniInsertGroup.Content,\n        priority: 3,\n        image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.comment_dark! : ui.images.omni_insert?.comment!),\n      },\n    );\n  }\n}\n\nfunction commentMarkAttribs(comment: string) {\n  return {\n    editing: !!comment.match(kHTMLEditingCommentRegEx),\n    format: !!matchPandocFormatComment(comment),\n  };\n}\n\nexport default extension;\n","/*\n * shortcode.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode, Mark, Fragment } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\n\nimport { findChildren } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { detectAndApplyMarks, removeInvalidatedMarks } from '../api/mark';\nimport { MarkTransaction } from '../api/transaction';\nimport { FixupContext } from '../api/fixup';\nimport { kShortcodeRegEx } from '../api/shortcode';\nimport { PandocOutput } from '../api/pandoc';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { format } = context;\n\n  if (!format.hugoExtensions.shortcodes) {\n    return null;\n  }\n\n  return {\n    marks: [\n      {\n        name: 'shortcode',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          inclusive: false,\n          excludes: 'formatting',\n          attrs: {},\n          parseDOM: [\n            {\n              tag: \"span[class*='shortcode']\",\n            },\n          ],\n          toDOM(_mark: Mark) {\n            return ['span', { class: 'shortcode pm-markup-text-color pm-fixedwidth-font' }];\n          },\n        },\n        pandoc: {\n          readers: [],\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              output.writeRawMarkdown(parent);\n            },\n          },\n        },\n      },\n    ],\n\n    fixups: (schema: Schema) => {\n      return [\n        (tr: Transaction, fixupContext: FixupContext) => {\n          if (fixupContext === FixupContext.Load) {\n            // apply marks\n            const markType = schema.marks.shortcode;\n            const predicate = (node: ProsemirrorNode) => {\n              return node.isTextblock && node.type.allowsMarkType(markType);\n            };\n            const markTr = new MarkTransaction(tr);\n            findChildren(tr.doc, predicate).forEach(nodeWithPos => {\n              const { pos } = nodeWithPos;\n              detectAndCreateShortcodes(schema, markTr, pos);\n            });\n          }\n          return tr;\n        },\n      ];\n    },\n\n    appendMarkTransaction: (schema: Schema) => {\n      return [\n        {\n          name: 'shortcode-marks',\n          filter: (node: ProsemirrorNode) =>\n            node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.shortcode),\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            removeInvalidatedMarks(tr, node, pos, kShortcodeRegEx, node.type.schema.marks.shortcode);\n            detectAndCreateShortcodes(node.type.schema, tr, pos);\n          },\n        },\n      ];\n    },\n  };\n};\n\nfunction detectAndCreateShortcodes(schema: Schema, tr: MarkTransaction, pos: number) {\n  // apply marks wherever they belong\n  detectAndApplyMarks(\n    tr,\n    tr.doc.nodeAt(pos)!,\n    pos,\n    kShortcodeRegEx,\n    schema.marks.shortcode,\n    () => ({}),\n    () => true,\n    match => match[1],\n  );\n}\n\nexport default extension;\n","/*\n * footnote.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, NodeType, DOMOutputSpec } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport {\n  findChildrenByType,\n  findParentNodeOfType,\n  findSelectedNodeOfType,\n  NodeWithPos,\n  findChildren,\n} from 'prosemirror-utils';\n\nimport { ExtensionContext } from '../../api/extension';\nimport { uuidv4 } from '../../api/util';\nimport { PandocOutput, PandocTokenType, ProsemirrorWriter, PandocToken } from '../../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport {\n  footnoteEditorKeyDownHandler,\n  footnoteEditorActivationPlugin,\n  footnoteEditorNodeViews,\n} from './footnote-editor';\nimport {\n  footnoteAppendTransaction,\n  footnoteFilterTransaction,\n  footnoteSelectNoteAppendTransaction,\n} from './footnote-transaction';\n\nimport './footnote-styles.css';\n\nconst plugin = new PluginKey('footnote');\n\nconst extension = (context: ExtensionContext) => {\n  const { pandocExtensions, ui } = context;\n\n  if (!pandocExtensions.footnotes) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'footnote',\n        spec: {\n          inline: true,\n          attrs: {\n            number: { default: 1 },\n            ref: {},\n            content: { default: '' },\n          },\n          group: 'inline',\n          // atom: true,\n          parseDOM: [\n            {\n              tag: \"span[class*='footnote']\",\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                return {\n                  ref: el.getAttribute('data-ref'),\n                  content: el.getAttribute('data-content'),\n                };\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode): DOMOutputSpec {\n            return [\n              'span',\n              { class: 'footnote pm-footnote', 'data-ref': node.attrs.ref, 'data-content': node.attrs.content },\n              node.attrs.number.toString(),\n            ];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Note,\n              handler: writePandocNote,\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeNote(node);\n          },\n        },\n      },\n    ],\n\n    appendTransaction: (_schema: Schema) => {\n      return [footnoteAppendTransaction()];\n    },\n\n    plugins: (_schema: Schema) => {\n      return [\n        footnoteEditorActivationPlugin(),\n\n        new Plugin({\n          key: plugin,\n\n          // footnote editor\n          props: {\n            handleKeyDown: footnoteEditorKeyDownHandler(),\n            nodeViews: footnoteEditorNodeViews(),\n          },\n\n          // footnote transactions (fixups, etc.)\n          filterTransaction: footnoteFilterTransaction(),\n          appendTransaction: footnoteSelectNoteAppendTransaction(),\n        }),\n      ];\n    },\n\n    commands: () => {\n      return [\n        new ProsemirrorCommand(EditorCommandId.Footnote, ['Shift-Mod-F7'], footnoteCommandFn(), footnoteOmniInsert(ui)),\n      ];\n    },\n  };\n};\n\nfunction writePandocNote(schema: Schema) {\n  return (writer: ProsemirrorWriter, tok: PandocToken) => {\n    // generate unique id\n    const ref = uuidv4();\n\n    // add note to notes collection (will be handled specially by closeNode b/c it\n    // has schema.nodes.node type)\n    writer.openNoteNode(ref);\n    writer.writeTokens(tok.c);\n    const noteNode = writer.closeNode();\n\n    // store json version of node in an attribute of the footnote (we can copy/paste)\n    // between different documents\n    const content = JSON.stringify(noteNode.content.toJSON());\n\n    // add inline node to the body\n    writer.addNode(schema.nodes.footnote, { ref, number: noteNode.attrs.number, content }, []);\n  };\n}\n\nfunction footnoteCommandFn() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    if (!canInsertFootnote(state)) {\n      return false;\n    }\n    if (dispatch) {\n      const tr = state.tr;\n      insertFootnote(tr);\n      dispatch(tr);\n    }\n    return true;\n  };\n}\n\nfunction footnoteOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Footnote'),\n    description: ui.context.translateText('Note placed at the bottom of the page'),\n    group: OmniInsertGroup.References,\n    priority: 2,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.footnote_dark! : ui.images.omni_insert?.footnote!),\n  };\n}\n\nfunction canInsertFootnote(state: EditorState) {\n  return (\n    canInsertNode(state, state.schema.nodes.footnote) && !findParentNodeOfType(state.schema.nodes.note)(state.selection)\n  );\n}\n\nfunction insertFootnote(\n  tr: Transaction,\n  edit = true,\n  content?: Fragment | ProsemirrorNode | ProsemirrorNode[] | undefined,\n): string {\n  // resolve content\n  const schema = tr.doc.type.schema;\n  if (!content) {\n    content = schema.nodes.paragraph.create();\n  }\n\n  // generate note id\n  const ref = uuidv4();\n\n  // insert empty note\n  const notes = findChildrenByType(tr.doc, schema.nodes.notes, true)[0];\n  const note = schema.nodes.note.createAndFill({ ref }, content);\n  tr.insert(notes.pos + 1, note as ProsemirrorNode);\n\n  // insert footnote linked to note\n  const footnote = schema.nodes.footnote.create({ ref });\n  tr.replaceSelectionWith(footnote, false);\n\n  // open note editor\n  if (edit) {\n    const noteNode = findNoteNode(tr.doc, ref);\n    if (noteNode) {\n      tr.setSelection(TextSelection.create(tr.doc, noteNode.pos + 1));\n    }\n  }\n\n  // return ref\n  return ref;\n}\n\nexport function selectedFootnote(selection: Selection): NodeWithPos | undefined {\n  const schema = selection.$head.node().type.schema;\n  return findSelectedNodeOfType(schema.nodes.footnote)(selection);\n}\n\nexport function selectedNote(selection: Selection): NodeWithPos | undefined {\n  const schema = selection.$head.node().type.schema;\n  return findParentNodeOfType(schema.nodes.note)(selection);\n}\n\nexport function findNoteNode(doc: ProsemirrorNode, ref: string): NodeWithPos | undefined {\n  return findNodeOfTypeWithRef(doc, doc.type.schema.nodes.note, ref);\n}\n\nexport function findFootnoteNode(doc: ProsemirrorNode, ref: string): NodeWithPos | undefined {\n  return findNodeOfTypeWithRef(doc, doc.type.schema.nodes.footnote, ref);\n}\n\nfunction findNodeOfTypeWithRef(doc: ProsemirrorNode, type: NodeType, ref: string): NodeWithPos | undefined {\n  const foundNode = findChildren(doc, node => node.type === type && node.attrs.ref === ref, true);\n  if (foundNode.length) {\n    return foundNode[0];\n  } else {\n    return undefined;\n  }\n}\n\nexport default extension;\n","/*\n * shortcode.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kShortcodePattern = '(?:^|[^`])({{([%<])\\\\s+.*?[%>]}})';\nexport const kShortcodeRegEx = new RegExp(kShortcodePattern, 'g');\n","/*\n * footnote-editor.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView, DecorationSet, NodeView } from 'prosemirror-view';\nimport { findParentNodeOfType, NodeWithPos, findChildrenByType, findChildren } from 'prosemirror-utils';\nimport { EditorState, TextSelection, Plugin, PluginKey, Transaction } from 'prosemirror-state';\n\nimport { nodeDecoration } from '../../api/decoration';\nimport { firstNode, lastNode } from '../../api/node';\nimport { selectionIsWithin } from '../../api/selection';\nimport { scrollIntoView } from '../../api/scroll';\n\nimport { findFootnoteNode, selectedFootnote, selectedNote } from './footnote';\n\nconst key = new PluginKey<DecorationSet>('footnote-editor-activate');\n\nexport function footnoteEditorActivationPlugin() {\n  return new Plugin<DecorationSet>({\n    key,\n    state: {\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return DecorationSet.empty;\n      },\n\n      // whenever an edit affecting this mark type occurs then update the decorations\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        if (selectedFootnote(newState.selection) || selectedNote(newState.selection)) {\n          // if we are in the same note selection as before just return the set\n          if (oldState.selection.$head.node() === newState.selection.$head.node()) {\n            return set.map(tr.mapping, tr.doc);\n          } else {\n            return footnoteEditorDecorations(newState);\n          }\n        } else {\n          return DecorationSet.empty;\n        }\n      },\n    },\n    props: {\n      decorations(state: EditorState) {\n        return key.getState(state);\n      },\n    },\n\n    view: () => ({\n      // scroll footnote into view (if necessary) when note editor is active\n      update: (view: EditorView) => {\n        const note = selectedNote(view.state.selection);\n        if (note) {\n          const footnote = findFootnoteNode(view.state.doc, note.node.attrs.ref);\n          if (footnote) {\n            scrollIntoView(view, footnote.pos, false, 0, 30);\n          }\n        }\n      },\n    }),\n  });\n}\n\n// selection-driven decorations (mostly css classes) required to activate the footnote editor\nfunction footnoteEditorDecorations(state: EditorState) {\n  const schema = state.schema;\n\n  // see if either a footnote node or note (footnote editor) node has the selection\n  let footnoteNode = selectedFootnote(state.selection);\n  let noteNode = selectedNote(state.selection);\n\n  // if they do then we need to enable footnote editing/behavior by\n  // using decorators to inject appropriate css classes\n  if (footnoteNode || noteNode) {\n    // get body and notes nodes\n    const bodyNode = findChildrenByType(state.doc, schema.nodes.body)[0];\n    const notesNode = findChildrenByType(state.doc, schema.nodes.notes)[0];\n\n    // resolve the specific footnote node or specific note node\n    if (footnoteNode) {\n      const ref = footnoteNode.node.attrs.ref;\n      const matching = findChildren(notesNode.node, node => node.attrs.ref === ref);\n      if (matching.length) {\n        noteNode = matching[0];\n        noteNode.pos = notesNode.pos + 1 + noteNode.pos;\n      }\n    } else if (noteNode) {\n      const ref = noteNode.node.attrs.ref;\n      const matching = findChildren(\n        state.doc,\n        node => node.type === schema.nodes.footnote && node.attrs.ref === ref,\n        true,\n      );\n      if (matching.length) {\n        footnoteNode = matching[0];\n      }\n    }\n\n    if (footnoteNode && noteNode) {\n      return DecorationSet.create(state.doc, [\n        // make notes node visible\n        nodeDecoration(noteNode, { class: 'active' }),\n\n        // paint outline over footnote\n        nodeDecoration(footnoteNode, { class: 'active pm-selected-node-outline-color' }),\n\n        // position body and notes nodes for footnote editing\n        nodeDecoration(bodyNode, { class: 'editing-footnote pm-pane-border-color' }),\n        nodeDecoration(notesNode, { class: 'editing-footnote pm-pane-border-color' }),\n      ]);\n    } else {\n      return DecorationSet.empty;\n    }\n  } else {\n    return DecorationSet.empty;\n  }\n}\n\n// node view that display the note number alongside the note content\nexport function footnoteEditorNodeViews() {\n  return {\n    note(node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) {\n      return new NoteEditorView(node, view, getPos as () => number);\n    },\n  };\n}\n\nclass NoteEditorView implements NodeView {\n  public readonly dom: HTMLElement;\n  public readonly contentDOM: HTMLElement;\n\n  private readonly node: ProsemirrorNode;\n  private readonly view: EditorView;\n  private readonly getPos: () => number;\n\n  constructor(node: ProsemirrorNode, view: EditorView, getPos: () => number) {\n    this.node = node;\n    this.view = view;\n    this.getPos = getPos;\n\n    this.dom = window.document.createElement('div');\n    this.dom.setAttribute('data-ref', this.node.attrs.ref);\n    this.dom.classList.add('note');\n\n    const label = window.document.createElement('div');\n    label.classList.add('note-label');\n    label.contentEditable = 'false';\n    label.innerHTML = `<p>${this.node.attrs.number}:</p>`;\n    this.dom.appendChild(label);\n\n    const content = window.document.createElement('div');\n    content.classList.add('note-content');\n    this.contentDOM = content;\n    this.dom.appendChild(content);\n  }\n}\n\n// custom handling for arrow keys that cause selection to escape the editor\nexport function footnoteEditorKeyDownHandler() {\n  return (view: EditorView, event: KeyboardEvent) => {\n    // alias schema & selection\n    const schema = view.state.schema;\n    const selection = view.state.selection;\n\n    // pass if the selection isn't in a note\n    const noteNode: NodeWithPos | undefined = findParentNodeOfType(schema.nodes.note)(selection);\n    if (!noteNode) {\n      return false;\n    }\n\n    // function to find and move selection to associated footnote\n    // will call this from Escape, ArrowLeft, and ArrowUp handlers below\n    const selectFootnote = (before = true) => {\n      const footnoteNode = findFootnoteNode(view.state.doc, noteNode.node.attrs.ref);\n      if (footnoteNode) {\n        const tr = view.state.tr;\n        tr.setSelection(TextSelection.near(tr.doc.resolve(footnoteNode.pos + (before ? 0 : 1))));\n        view.dispatch(tr);\n      }\n    };\n\n    // if this is the Escape key then close the editor\n    if (event.key === 'Escape') {\n      selectFootnote();\n      return true;\n    }\n\n    // ...otherwise check to see if the user is attempting to arrow out of the footnote\n\n    // get first and last text block nodes (bail if we aren't in either)\n    const firstTextBlock = firstNode(noteNode, node => node.isTextblock);\n    const lastTextBlock = lastNode(noteNode, node => node.isTextblock);\n    if (!firstTextBlock && !lastTextBlock) {\n      return false;\n    }\n\n    // exiting from first text block w/ left or up arrow?\n    if (firstTextBlock) {\n      if (selectionIsWithin(selection, firstTextBlock)) {\n        switch (event.key) {\n          case 'ArrowLeft':\n            if (selection.anchor === firstTextBlock.pos + 1) {\n              selectFootnote(true);\n              return true;\n            }\n            break;\n          case 'ArrowUp': {\n            if (view.endOfTextblock('up')) {\n              selectFootnote(true);\n              return true;\n            }\n            break;\n          }\n        }\n      }\n    }\n\n    // exiting from last text block with right or down arrow?\n    if (lastTextBlock) {\n      if (selectionIsWithin(selection, lastTextBlock)) {\n        switch (event.key) {\n          case 'ArrowRight':\n            if (selection.anchor === lastTextBlock.pos + lastTextBlock.node.nodeSize - 1) {\n              selectFootnote(false);\n              return true;\n            }\n            break;\n          case 'ArrowDown': {\n            if (view.endOfTextblock('down')) {\n              selectFootnote(false);\n              return true;\n            }\n            break;\n          }\n        }\n      }\n    }\n\n    return false;\n  };\n}\n","/*\n * footnote-transaction.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, EditorState, TextSelection } from 'prosemirror-state';\nimport {\n  findChildrenByType,\n  NodeWithPos,\n  findSelectedNodeOfType,\n  ContentNodeWithPos,\n  findParentNodeOfType,\n} from 'prosemirror-utils';\nimport { Transform } from 'prosemirror-transform';\n\nimport { uuidv4 } from '../../api/util';\n\nimport { findNoteNode, selectedNote } from './footnote';\nimport { trTransform } from '../../api/transaction';\n\n// examine transactions and filter out attempts to place foonotes within note bodies\n// (this is not allowed by pandoc markdown)\nexport function footnoteFilterTransaction() {\n  return (tr: Transaction, state: EditorState) => {\n    const noteWithPos = selectedNote(tr.selection);\n    if (noteWithPos && findChildrenByType(noteWithPos.node, state.schema.nodes.footnote).length) {\n      return false;\n    }\n    return true;\n  };\n}\n\n// examine editor transactions and append a transaction that handles fixup of footnote numbers,\n// importing of pasted footnotes, selection propagation to the footnote editor, etc.\nexport function footnoteAppendTransaction() {\n  const footnoteChange = (node: ProsemirrorNode) => {\n    const schema = node.type.schema;\n    return node.type === schema.nodes.footnote || node.type === schema.nodes.note;\n  };\n\n  return {\n    name: 'footnote-renumber',\n    nodeFilter: footnoteChange,\n    append: (tr: Transaction) => {\n      const schema = tr.doc.type.schema;\n      const activeNote = findParentNodeOfType(schema.nodes.note)(tr.selection);\n      trTransform(tr, footnoteFixupTransform(activeNote));\n    },\n  };\n}\n\nfunction footnoteFixupTransform(activeNote: ContentNodeWithPos | undefined) {\n  return (tr: Transform) => {\n    // query for notes and footnotes. note that since these are computed at the beginning\n    // before any steps are applied, we always need to map their positions before using them\n    const schema = tr.doc.type.schema;\n    const footnotes = findAllFootnotes(tr.doc);\n    const allNotes = findAllNotes(tr.doc);\n\n    // iterate through footnotes in the newState\n    const refs = new Set<string>();\n    footnotes.forEach((footnote, index) => {\n      // map position\n      footnote.pos = tr.mapping.map(footnote.pos);\n\n      // footnote number\n      const number = index + 1;\n\n      // alias ref and content (either or both may be updated)\n      let { ref, content } = footnote.node.attrs;\n\n      // we may be creating a new note to append\n      let newNote: any;\n\n      // get reference to note (if any)\n      const note = allNotes.find(noteWithPos => noteWithPos.node.attrs.ref === ref);\n\n      // matching note found\n      if (note) {\n        // map position since we scanned for all of the notes at the top and we may\n        // have called tr.insert for a new note below which would have invalidated\n        // the positions\n        note.pos = tr.mapping.map(note.pos);\n\n        // update content if this is a note edit (used to propagate user edits back to data-content)\n        if (activeNote && activeNote.node.attrs.ref === ref) {\n          content = JSON.stringify(note.node.content.toJSON());\n        }\n\n        // if we've already processed this ref then it's a duplicate, make a copy w/ a new ref/id\n        if (refs.has(ref)) {\n          // create a new unique id and change the ref to it\n          ref = uuidv4();\n\n          // create and insert new note with this id\n          newNote = schema.nodes.note.createAndFill({ ref, number }, note.node.content);\n\n          // otherwise update the note with the correct number (if necessary)\n        } else {\n          if (note.node.attrs.number !== number) {\n            tr.setNodeMarkup(note.pos, schema.nodes.note, {\n              ...note.node.attrs,\n              number,\n            });\n          }\n        }\n\n        // if there is no note then create one using the content attr\n        // (this can happen for a copy/paste operation from another document)\n      } else if (content) {\n        newNote = schema.nodes.note.createAndFill({ ref, number }, Fragment.fromJSON(schema, JSON.parse(content)));\n      }\n\n      // insert newNote if necessary\n      if (newNote) {\n        const notesContainer = findNotesContainer(tr.doc);\n        tr.insert(notesContainer.pos + 1, newNote as ProsemirrorNode);\n      }\n\n      // indicate that we've seen this ref\n      refs.add(ref);\n\n      // set new footnote markup if necessary\n      const attrs = footnote.node.attrs;\n      if (ref !== attrs.ref || content !== attrs.content || number !== attrs.number) {\n        tr.setNodeMarkup(footnote.pos, schema.nodes.footnote, {\n          ...footnote.node.attrs,\n          ref,\n          content,\n          number,\n        });\n      }\n    });\n\n    // remove ophraned notes\n    for (let i = allNotes.length - 1; i >= 0; i--) {\n      const note = allNotes[i];\n      note.pos = tr.mapping.map(note.pos);\n      const footnote = footnotes.find(fn => fn.node.attrs.ref === note.node.attrs.ref);\n      if (!footnote) {\n        tr.delete(note.pos, note.pos + note.node.nodeSize);\n      }\n    }\n  };\n}\n\nexport function footnoteSelectNoteAppendTransaction() {\n  return (_transactions: Transaction[], _oldState: EditorState, newState: EditorState) => {\n    const schema = newState.schema;\n    const footnoteNode: NodeWithPos | undefined = findSelectedNodeOfType(schema.nodes.footnote)(newState.selection);\n    if (footnoteNode) {\n      const tr = newState.tr;\n      const ref = footnoteNode.node.attrs.ref;\n      const noteNode = findNoteNode(tr.doc, ref);\n      if (noteNode) {\n        tr.setSelection(TextSelection.near(tr.doc.resolve(noteNode.pos)));\n      }\n      return tr;\n    }\n  };\n}\n\nfunction findAllFootnotes(doc: ProsemirrorNode) {\n  const schema = doc.type.schema;\n  return findChildrenByType(doc, schema.nodes.footnote, true);\n}\n\nfunction findAllNotes(doc: ProsemirrorNode) {\n  const schema = doc.type.schema;\n  const notesContainer = findNotesContainer(doc);\n  const offset = notesContainer.pos + 1;\n  const notes = findChildrenByType(notesContainer.node, schema.nodes.note, false);\n  return notes.map(note => ({ ...note, pos: note.pos + offset }));\n}\n\nfunction findNotesContainer(doc: ProsemirrorNode) {\n  return findChildrenByType(doc, doc.type.schema.nodes.notes, false)[0];\n}\n","/*\n * raw_block.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, NodeType } from 'prosemirror-model';\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { setBlockType } from 'prosemirror-commands';\n\nimport { findParentNode } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../api/extension';\n\nimport {\n  PandocOutput,\n  PandocToken,\n  PandocTokenType,\n  ProsemirrorWriter,\n  kRawBlockContent,\n  kRawBlockFormat,\n} from '../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\n\nimport { EditorUI } from '../api/ui';\nimport { isSingleLineHTML } from '../api/html';\nimport { kHTMLFormat, kTexFormat, editRawBlockCommand, isRawHTMLFormat } from '../api/raw';\nimport { isSingleLineTex } from '../api/tex';\nimport { OmniInsert, OmniInsertGroup } from '../api/omni_insert';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, pandocCapabilities, ui } = context;\n\n  const rawAttribute = pandocExtensions.raw_attribute;\n\n  return {\n    nodes: [\n      {\n        name: 'raw_block',\n        spec: {\n          content: 'text*',\n          group: 'block',\n          marks: '',\n          code: true,\n          defining: true,\n          isolating: true,\n          attrs: {\n            format: {},\n          },\n          parseDOM: [\n            {\n              tag: \"div[class*='raw-block']\",\n              preserveWhitespace: 'full',\n              getAttrs: (node: Node | string) => {\n                const el = node as Element;\n                return {\n                  format: el.getAttribute('data-format'),\n                };\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return [\n              'div',\n              {\n                class: 'raw-block pm-fixedwidth-font pm-code-block pm-markup-text-color',\n                'data-format': node.attrs.format,\n              },\n              0,\n            ];\n          },\n        },\n\n        code_view: {\n          lang: (node: ProsemirrorNode) => {\n            return node.attrs.format;\n          },\n          attrEditFn: rawAttribute ? editRawBlockCommand(ui, pandocCapabilities.output_formats) : undefined,\n          borderColorClass: 'pm-raw-block-border',\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.raw_block,\n          tags: (node: ProsemirrorNode) => [node.attrs.format],\n          editFn: rawAttribute\n            ? () => editRawBlockCommand(ui, pandocCapabilities.output_formats)\n            : () => (state: EditorState) => false,\n        }),\n\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.RawBlock,\n              block: 'raw_block',\n            },\n          ],\n\n          // ensure that usethis badges comment ends up in it's own block\n          preprocessor: (markdown: string) => {\n            return markdown.replace(/([^\\n])(\\n^<!-- badges: end -->$)/gm, (_match, p1, p2) => {\n              return p1 + '\\n' + p2;\n            });\n          },\n\n          // we define a custom blockReader here so that we can convert html and tex blocks with\n          // a single line of code into paragraph with a raw inline\n          blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n            if (tok.t === PandocTokenType.RawBlock) {\n              readPandocRawBlock(schema, tok, writer);\n              return true;\n            } else if (isParagraphWrappingMultilineRaw(tok)) {\n              const rawTok = tok.c[0];\n              const format = rawTok.c[kRawBlockFormat];\n              const content = rawTok.c[kRawBlockContent];\n              writer.addNode(schema.nodes.raw_block, { format }, [schema.text(content)]);\n              return true;\n            } else {\n              return false;\n            }\n          },\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            if (!pandocExtensions.raw_attribute || node.textContent.trim() === '<!-- -->') {\n              output.writeToken(PandocTokenType.Para, () => {\n                output.writeRawMarkdown(node.textContent);\n              });\n            } else {\n              output.writeToken(PandocTokenType.RawBlock, () => {\n                output.write(node.attrs.format);\n                output.write(node.textContent);\n              });\n            }\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      const commands: ProsemirrorCommand[] = [];\n\n      commands.push(\n        new FormatRawBlockCommand(EditorCommandId.HTMLBlock, kHTMLFormat, schema.nodes.raw_block, {\n          name: ui.context.translateText('HTML Block'),\n          description: ui.context.translateText('Raw HTML content'),\n          group: OmniInsertGroup.Blocks,\n          priority: 6,\n          image: () =>\n            ui.prefs.darkMode() ? ui.images.omni_insert?.html_block_dark! : ui.images.omni_insert?.html_block!,\n        }),\n      );\n\n      if (pandocExtensions.raw_tex) {\n        commands.push(\n          new FormatRawBlockCommand(EditorCommandId.TexBlock, kTexFormat, schema.nodes.raw_block, {\n            name: ui.context.translateText('TeX Block'),\n            description: ui.context.translateText('Raw TeX content'),\n            group: OmniInsertGroup.Blocks,\n            priority: 5,\n            image: () =>\n              ui.prefs.darkMode() ? ui.images.omni_insert?.tex_block_dark! : ui.images.omni_insert?.tex_block!,\n          }),\n        );\n      }\n\n      if (rawAttribute) {\n        commands.push(new RawBlockCommand(ui, pandocCapabilities.output_formats));\n      }\n\n      return commands;\n    },\n  };\n};\n\nfunction readPandocRawBlock(schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) {\n  // single lines of html should be read as inline html (allows for\n  // highlighting and more seamless editing experience)\n  const format = tok.c[kRawBlockFormat];\n  const text = tok.c[kRawBlockContent] as string;\n  const textTrimmed = text.trimRight();\n  if (isRawHTMLFormat(format) && isSingleLineHTML(textTrimmed) && writer.hasInlineHTMLWriter(textTrimmed)) {\n    writer.openNode(schema.nodes.paragraph, {});\n    writer.writeInlineHTML(textTrimmed);\n    writer.closeNode();\n\n    // similarly, single lines of tex should be read as inline tex\n  } else if (format === kTexFormat && isSingleLineTex(textTrimmed)) {\n    writer.openNode(schema.nodes.paragraph, {});\n    const rawTexMark = schema.marks.raw_tex.create();\n    writer.openMark(rawTexMark);\n    writer.writeText(textTrimmed);\n    writer.closeMark(rawTexMark);\n    writer.closeNode();\n  } else {\n    writer.openNode(schema.nodes.raw_block, { format });\n    writer.writeText(text);\n    writer.closeNode();\n  }\n}\n\nfunction isParagraphWrappingMultilineRaw(tok: PandocToken) {\n  return isSingleChildParagraph(tok) && \n         tok.c[0].t === PandocTokenType.RawInline &&\n         isMultilineString(tok.c[0].c[kRawBlockContent]);\n}\n\nfunction isSingleChildParagraph(tok: PandocToken) {\n  return tok.t === PandocTokenType.Para && tok.c && tok.c.length === 1;\n}\n\nfunction isMultilineString(str: string) {\n  return str.indexOf('\\n') !== -1;\n}\n\n// base class for format specific raw block commands (e.g. html/tex)\nclass FormatRawBlockCommand extends ProsemirrorCommand {\n  private format: string;\n  private nodeType: NodeType;\n\n  constructor(id: EditorCommandId, format: string, nodeType: NodeType, omniInsert?: OmniInsert) {\n    super(\n      id,\n      [],\n      (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n        if (!this.isActive(state) && !setBlockType(this.nodeType, { format })(state)) {\n          return false;\n        }\n\n        if (dispatch) {\n          const schema = state.schema;\n          if (this.isActive(state)) {\n            setBlockType(schema.nodes.paragraph)(state, dispatch);\n          } else {\n            setBlockType(this.nodeType, { format })(state, dispatch);\n          }\n        }\n\n        return true;\n      },\n      omniInsert,\n    );\n    this.format = format;\n    this.nodeType = nodeType;\n  }\n\n  public isActive(state: EditorState) {\n    return !!findParentNode(node => node.type === this.nodeType && node.attrs.format === this.format)(state.selection);\n  }\n}\n\n// generic raw block command (shows dialog to allow choosing from among raw formats)\nclass RawBlockCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI, outputFormats: string[]) {\n    super(EditorCommandId.RawBlock, [], editRawBlockCommand(ui, outputFormats), {\n      name: ui.context.translateText('Raw Block...'),\n      description: ui.context.translateText('Raw content block'),\n      group: OmniInsertGroup.Blocks,\n      priority: 4,\n      image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.raw_block_dark! : ui.images.omni_insert?.raw_block!),\n    });\n  }\n}\n\nexport default extension;\n","/*\n * yaml_metadata.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, DOMOutputSpec, ParseRule } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { ExtensionContext, Extension } from '../../api/extension';\nimport { PandocOutput, PandocTokenType } from '../../api/pandoc';\nimport { EditorUI } from '../../api/ui';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { codeNodeSpec } from '../../api/code';\nimport { selectionIsBodyTopLevel } from '../../api/selection';\nimport { yamlMetadataTitlePlugin } from './yaml_metadata-title';\nimport { yamlMetadataBlockCapsuleFilter } from './yaml_metadata-capsule';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { fragmentText } from '../../api/fragment';\nimport { stripYamlDelimeters } from '../../api/yaml';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { ui } = context;\n\n  return {\n    nodes: [\n      {\n        name: 'yaml_metadata',\n\n        spec: {\n          ...codeNodeSpec(),\n          attrs: {\n            navigation_id: { default: null },\n          },\n          parseDOM: [\n            {\n              tag: \"div[class*='yaml-block']\",\n              preserveWhitespace: 'full',\n            } as ParseRule,\n          ],\n          toDOM(node: ProsemirrorNode): DOMOutputSpec {\n            return ['div', { class: 'yaml-block pm-code-block' }, 0];\n          },\n        },\n\n        code_view: {\n          lang: () => 'yaml-frontmatter',\n          classes: ['pm-metadata-background-color', 'pm-yaml-metadata-block'],\n        },\n\n        pandoc: {\n          blockCapsuleFilter: yamlMetadataBlockCapsuleFilter(),\n\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Para, () => {\n              const yaml = '---\\n' + stripYamlDelimeters(fragmentText(node.content)) + '\\n---';\n              output.writeRawMarkdown(yaml);\n            });\n          },\n        },\n      },\n    ],\n\n    commands: () => {\n      return [new YamlMetadataCommand(ui)];\n    },\n\n    plugins: () => [yamlMetadataTitlePlugin()],\n  };\n};\n\nclass YamlMetadataCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI) {\n    super(\n      EditorCommandId.YamlMetadata,\n      [],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        const schema = state.schema;\n\n        if (!canInsertNode(state, schema.nodes.yaml_metadata)) {\n          return false;\n        }\n\n        // only allow inserting at the top level\n        if (!selectionIsBodyTopLevel(state.selection)) {\n          return false;\n        }\n\n        // create yaml metadata text\n        if (dispatch) {\n          const tr = state.tr;\n          const kYamlLeading = '---\\n';\n          const kYamlTrailing = '\\n---';\n          const yamlText = schema.text(kYamlLeading + kYamlTrailing);\n          const yamlNode = schema.nodes.yaml_metadata.create({}, yamlText);\n          tr.replaceSelectionWith(yamlNode);\n          setTextSelection(tr.mapping.map(state.selection.from) - kYamlTrailing.length - 1)(tr);\n          dispatch(tr);\n        }\n\n        return true;\n      },\n      {\n        name: ui.context.translateText('YAML'),\n        description: ui.context.translateText('YAML metadata block'),\n        group: OmniInsertGroup.Blocks,\n        priority: 3,\n        selectionOffset: 4,\n        image: () =>\n          ui.prefs.darkMode() ? ui.images.omni_insert?.yaml_block_dark! : ui.images.omni_insert?.yaml_block!,\n      },\n    );\n  }\n}\n\nexport default extension;\n","/*\n * yaml_metadata-capsule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { ProsemirrorWriter } from '../../api/pandoc';\nimport { uuidv4 } from '../../api/util';\nimport {\n  encodedBlockCapsuleRegex,\n  blockCapsuleSourceWithoutPrefix,\n  PandocBlockCapsule,\n  blockCapsuleParagraphTokenHandler,\n  blockCapsuleTextHandler,\n} from '../../api/pandoc_capsule';\n\nconst kYamlBlocksRegex = /(^)(---[ \\t]*\\n(?![ \\t]*\\n)[\\W\\w]*?\\n(?:---|\\.\\.\\.))([ \\t]*)$/gm;\n\nconst kYamlDiscardRegex = /^([\\t >]*)`{3,}/m;\n\nexport function yamlMetadataBlockCapsuleFilter() {\n  const kYamlMetadataCapsuleType = 'E1819605-0ACD-4FAE-8B99-9C1B7BD7C0F1'.toLowerCase();\n\n  return {\n    type: kYamlMetadataCapsuleType,\n\n    match: kYamlBlocksRegex,\n\n    // if there was an unterminated yaml block inside a code block (followed by more yaml,\n    // perhaps in yet another code block) then the main regex eats the code block boundary.\n    // provide a discard expression that excludes any yaml block that has what appears\n    // to be a fenced code block boundary\n    discard: kYamlDiscardRegex,\n\n    // add a newline to ensure that if the metadata block has text right\n    // below it we still end up in our own pandoc paragarph block\n    enclose: (capsuleText: string) => capsuleText + '\\n',\n    // globally replace any instances of our block capsule found in text\n    handleText: blockCapsuleTextHandler(\n      kYamlMetadataCapsuleType,\n      encodedBlockCapsuleRegex(undefined, '\\\\n', 'gm'),\n      (text: string) => text.substring(0, text.length - 1), // trim off newline\n    ),\n\n    // we are looking for a paragraph token consisting entirely of a\n    // block capsule of our type. if find that then return the block\n    // capsule text\n    handleToken: blockCapsuleParagraphTokenHandler(kYamlMetadataCapsuleType),\n\n    // write as yaml_metadata\n    writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n      writer.openNode(schema.nodes.yaml_metadata, {\n        navigation_id: uuidv4(),\n        md_index: capsule.position,\n      });\n      // write the lines w/o the source-level prefix\n      writer.writeText(blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix));\n      writer.closeNode();\n    },\n  };\n}\n","/*\n * rmd_chunk.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocOutput, PandocTokenType } from '../../api/pandoc';\n\nimport { codeNodeSpec } from '../../api/code';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\n\nimport { EditorUI } from '../../api/ui';\nimport { kBookdownDocType } from '../../api/format';\nimport { rmdChunk, insertRmdChunk } from '../../api/rmd';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { RmdChunkImagePreviewPlugin } from './rmd_chunk-image';\nimport { rmdChunkBlockCapsuleFilter } from './rmd_chunk-capsule';\n\nimport './rmd_chunk-styles.css';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { ui, options, format } = context;\n\n  if (!format.rmdExtensions.codeChunks) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'rmd_chunk',\n        spec: {\n          ...codeNodeSpec(),\n          attrs: {\n            navigation_id: { default: null },\n            md_index: { default: 0 },\n          },\n          parseDOM: [\n            {\n              tag: \"div[class*='rmd-chunk']\",\n              preserveWhitespace: 'full',\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return ['div', { class: 'rmd-chunk pm-code-block' }, 0];\n          },\n        },\n\n        code_view: {\n          firstLineMeta: true,\n          lineNumbers: true,\n          lineNumberFormatter: (lineNumber: number, lineCount?: number, line?: string) => {\n            if (lineNumber === 1) {\n              return '';\n            } else {\n              return lineNumber - 1 + '';\n            }\n          },\n          bookdownTheorems: format.docTypes.includes(kBookdownDocType),\n          classes: ['pm-chunk-background-color'],\n          lang: (_node: ProsemirrorNode, content: string) => {\n            const match = content.match(/^\\{([a-zA-Z0-9_]+)/);\n            if (match) {\n              return match[1];\n            } else {\n              return null;\n            }\n          },\n          createFromPastePattern: /^\\{([a-zA-Z0-9_]+).*}.*?\\n/m,\n        },\n\n        pandoc: {\n          blockCapsuleFilter: rmdChunkBlockCapsuleFilter(),\n\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Para, () => {\n              const parts = rmdChunk(node.textContent);\n              if (parts) {\n                output.writeRawMarkdown('```{' + parts.meta + '}\\n' + parts.code + '```\\n');\n              }\n            });\n          },\n        },\n      },\n    ],\n\n    commands: (_schema: Schema) => {\n      const commands = [\n        new RChunkCommand(ui),\n        new PythonChunkCommand(ui),\n        new BashChunkCommand(ui),\n        new RcppChunkCommand(ui),\n        new SQLChunkCommand(ui),\n        new D3ChunkCommand(ui),\n        new StanChunkCommand(ui),\n      ];\n      return commands;\n    },\n\n    plugins: (_schema: Schema) => {\n      if (options.rmdImagePreview) {\n        return [new RmdChunkImagePreviewPlugin(ui.context)];\n      } else {\n        return [];\n      }\n    },\n  };\n};\n\nclass RmdChunkCommand extends ProsemirrorCommand {\n  constructor(\n    ui: EditorUI,\n    id: EditorCommandId,\n    keymap: string[],\n    priority: number,\n    lang: string,\n    placeholder: string,\n    image: () => string,\n    rowOffset = 1,\n    colOffset = 0,\n    selectionOffset?: number,\n  ) {\n    super(id, keymap, insertRmdChunk(placeholder, rowOffset, colOffset), {\n      name: `${lang} ${ui.context.translateText('Code Chunk')}`,\n      description: `${ui.context.translateText('Executable')} ${lang} ${ui.context.translateText('chunk')}`,\n      group: OmniInsertGroup.Chunks,\n      priority,\n      selectionOffset: selectionOffset || colOffset || placeholder.length,\n      image,\n    });\n  }\n}\n\nclass RChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(ui, EditorCommandId.RCodeChunk, ['Mod-Alt-i'], 10, 'R', '{r}\\n', () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert!.r_chunk_dark! : ui.images.omni_insert!.r_chunk!,\n    );\n  }\n}\n\nclass PythonChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(\n      ui,\n      EditorCommandId.PythonCodeChunk,\n      [],\n      8,\n      'Python',\n      '{python}\\n',\n      () => ui.images.omni_insert!.python_chunk!,\n    );\n  }\n}\n\nclass BashChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(ui, EditorCommandId.BashCodeChunk, [], 7, 'Bash', '{bash}\\n', () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert!.bash_chunk_dark! : ui.images.omni_insert!.bash_chunk!,\n    );\n  }\n}\n\nclass RcppChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(ui, EditorCommandId.RcppCodeChunk, [], 6, 'Rcpp', '{Rcpp}\\n', () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert!.rcpp_chunk_dark! : ui.images.omni_insert!.rcpp_chunk!,\n    );\n  }\n}\n\nclass SQLChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(\n      ui,\n      EditorCommandId.SQLCodeChunk,\n      [],\n      5,\n      'SQL',\n      '{sql connection=}\\n',\n      () => ui.images.omni_insert!.sql_chunk!,\n      0,\n      16,\n    );\n  }\n}\n\nclass D3ChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(ui, EditorCommandId.D3CodeChunk, [], 4, 'D3', '{d3 data=}\\n', () => ui.images.omni_insert!.d3_chunk!, 0, 9);\n  }\n}\n\nclass StanChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(\n      ui,\n      EditorCommandId.StanCodeChunk,\n      [],\n      7,\n      'Stan',\n      '{stan output.var=}\\n',\n      () => ui.images.omni_insert!.stan_chunk!,\n      0,\n      17,\n    );\n  }\n}\n\nexport default extension;\n","/*\n * rmd_chunk-image.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { findChildrenByType, setTextSelection } from 'prosemirror-utils';\n\nimport { transactionsAreTypingChange, transactionsHaveChange } from '../../api/transaction';\nimport { EditorUIContext } from '../../api/ui';\nimport { stripQuotes } from '../../api/text';\nimport { onElementRemoved } from '../../api/dom';\n\nconst key = new PluginKey<DecorationSet>('rmd-chunk-image-preview');\n\nexport class RmdChunkImagePreviewPlugin extends Plugin<DecorationSet> {\n  constructor(uiContext: EditorUIContext) {\n    super({\n      key,\n      state: {\n        init: (_config: { [key: string]: any }, state: EditorState) => {\n          return imagePreviewDecorations(state, uiContext);\n        },\n        apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n          const transactions = [tr];\n\n          // doc didn't change, return existing decorations\n          if (!tr.docChanged) {\n            return old.map(tr.mapping, tr.doc);\n\n            // non-typing change, do a full rescan\n          } else if (!transactionsAreTypingChange(transactions)) {\n            return imagePreviewDecorations(newState, uiContext);\n\n            // change that affects a rmd chunk block, do a full rescan\n          } else if (transactionsHaveChange(transactions, oldState, newState, isRmdChunkNode)) {\n            return imagePreviewDecorations(newState, uiContext);\n          }\n\n          // otherwise return the existing set (mapped)\n          else {\n            return old.map(tr.mapping, tr.doc);\n          }\n        },\n      },\n      props: {\n        decorations: (state: EditorState) => {\n          return key.getState(state);\n        },\n      },\n    });\n  }\n}\n\nfunction imagePreviewDecorations(state: EditorState, uiContext: EditorUIContext) {\n  // find all rmd code chunks with knitr::include_graphics\n  const decorations: Decoration[] = [];\n  findChildrenByType(state.doc, state.schema.nodes.rmd_chunk).forEach(rmdChunk => {\n    // look for a line with knitr::include_graphics\n    const match = rmdChunk.node.textContent.match(/^(knitr::)?include_graphics\\((['\"])([^\\2]+)\\2/m);\n    if (match) {\n      // see if we can also find an out.width on the first line\n      let width = '';\n      const firstLine = rmdChunk.node.textContent.split(/\\r?\\n/)[0];\n      const widthMatch = firstLine.match(/^\\s*\\{[r|R][, ].*out\\.width\\s*=\\s*([^ ,$]+).*}/);\n      if (widthMatch) {\n        width = stripQuotes(widthMatch[1].trim());\n        // revert if they are using out.width = NULL\n        if (width === 'NULL') {\n          width = '';\n        }\n      }\n\n      // see if we can find fig.align='center'\n      const alignCenter = !!firstLine.match(/^\\s*\\{[r|R][, ].*fig\\.align\\s*=\\s*['\"]?center['\"]?/);\n\n      const imagePath = match[3];\n      const decoration = Decoration.widget(\n        rmdChunk.pos + rmdChunk.node.nodeSize,\n        (view: EditorView, getPos: () => number) => {\n          const container = window.document.createElement('div');\n          container.style.marginTop = '-1.5em'; // to bridge back to the codemirror block\n          // which has a margin-block-end of 1em\n          container.classList.add('pm-image-preview');\n          container.classList.add('pm-block-border-color');\n          const img = window.document.createElement('img');\n          if (alignCenter) {\n            img.classList.add('pm-image-centered');\n          }\n\n          img.src = uiContext.mapResourceToURL(imagePath);\n\n          // watch for changes to the file\n          const unsubscribe = uiContext.watchResource(imagePath, () => {\n            img.src = uiContext.mapResourceToURL(imagePath);\n          });\n          onElementRemoved(view.dom, container, unsubscribe);\n\n          if (width) {\n            img.setAttribute('width', width);\n          }\n          img.draggable = false;\n          img.onload = () => {\n            img.alt = '';\n          };\n          img.onerror = () => {\n            img.alt = ` ${uiContext.translateText('Image not found')}: ${imagePath}`;\n          };\n          // select rmd_chunk for clicks on the preview image\n          img.onclick = () => {\n            const tr = view.state.tr;\n            setTextSelection(getPos() - 1)(tr);\n            view.dispatch(tr);\n          };\n          container.append(img);\n          return container;\n        },\n        { key: imagePath + 'width:' + width + 'center:' + alignCenter },\n      );\n      decorations.push(decoration);\n    }\n  });\n\n  // return decorations\n  return DecorationSet.create(state.doc, decorations);\n}\n\nfunction isRmdChunkNode(node: ProsemirrorNode) {\n  return node.type === node.type.schema.nodes.rmd_chunk;\n}\n","/*\n * rmd_chunk-capsule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { PandocBlockCapsule, parsePandocBlockCapsule, blockCapsuleSourceWithoutPrefix } from '../../api/pandoc_capsule';\nimport { PandocToken, PandocTokenType, ProsemirrorWriter } from '../../api/pandoc';\nimport { pandocAttrReadAST, kCodeBlockAttr, PandocAttr, kCodeBlockText } from '../../api/pandoc_attr';\nimport { uuidv4 } from '../../api/util';\n\nexport function rmdChunkBlockCapsuleFilter() {\n  // (note that this constant is also defined in VisualMode.java)\n  const kBlockCapsuleType = 'F3175F2A-E8A0-4436-BE12-B33925B6D220'.toLowerCase();\n  const kBlockCapsuleTextRegEx = new RegExp('```' + kBlockCapsuleType + '\\\\n[ \\\\t>]*([^`]+)\\\\n[ \\\\t>]*```', 'g');\n\n  return {\n    type: kBlockCapsuleType,\n\n    match: /^([\\t >]*)(```+\\s*\\{[a-zA-Z0-9_]+(?: *[ ,].*?)?\\}[ \\t]*\\n(?:[\\t >]*```+|[\\W\\w]*?\\n[\\t >]*```+))([ \\t]*)$/gm,\n\n    // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n    // (in this case a code block). we use the capsule prefix here to make sure that the code block's\n    // content and end backticks match the indentation level of the first line correctly\n    enclose: (capsuleText: string, capsule: PandocBlockCapsule) =>\n      '```' + kBlockCapsuleType + '\\n' + capsule.prefix + capsuleText + '\\n' + capsule.prefix + '```',\n    // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n    // and if we find it, parse and return the original source code\n    handleText: (text: string, tok: PandocToken) => {\n      // if this is a code block then we need to strip the prefix\n      const stripPrefix = tok.t === PandocTokenType.CodeBlock;\n\n      return text.replace(kBlockCapsuleTextRegEx, (_match, p1) => {\n        const capsuleText = p1;\n        const capsule = parsePandocBlockCapsule(capsuleText);\n        if (stripPrefix) {\n          return blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n        } else {\n          return capsule.source;\n        }\n      });\n    },\n\n    // look for a block capsule of our type within a code block (indicated by the\n    // presence of a special css class)\n    handleToken: (tok: PandocToken) => {\n      if (tok.t === PandocTokenType.CodeBlock) {\n        const attr = pandocAttrReadAST(tok, kCodeBlockAttr) as PandocAttr;\n        if (attr.classes.includes(kBlockCapsuleType)) {\n          return tok.c[kCodeBlockText];\n        }\n      }\n      return null;\n    },\n\n    // write the node as an rmd_chunk, being careful to remove the backticks\n    // preserved as part of the source, and striping out the base indentation\n    // level implied by the prefix\n    writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n      // open node\n      writer.openNode(schema.nodes.rmd_chunk, {\n        navigation_id: uuidv4(),\n        md_index: capsule.position,\n      });\n\n      // source still has leading and trailing backticks, remove them\n      const source = capsule.source.replace(/^```+/, '').replace(/\\n[\\t >]*```+$/, '');\n\n      // write the lines w/o the source-level prefix\n      writer.writeText(blockCapsuleSourceWithoutPrefix(source, capsule.prefix));\n\n      // all done\n      writer.closeNode();\n    },\n  };\n}\n","/*\n * div.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec, ResolvedPos } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfType, ContentNodeWithPos, findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\nimport { wrapIn } from 'prosemirror-commands';\nimport { GapCursor } from 'prosemirror-gapcursor';\nimport { liftTarget } from 'prosemirror-transform';\n\nimport { ExtensionContext, Extension } from '../api/extension';\nimport {\n  pandocAttrSpec,\n  pandocAttrToDomAttr,\n  pandocAttrParseDom,\n  pandocAttrReadAST,\n  pandocAttrFrom,\n  pandocAttrAvailable,\n  PandocAttr,\n} from '../api/pandoc_attr';\nimport { PandocOutput, PandocTokenType, PandocToken } from '../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId, toggleWrap } from '../api/command';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup, OmniInsert } from '../api/omni_insert';\nimport { markIsActive } from '../api/mark';\nimport { BaseKey } from '../api/basekeys';\nimport { attrInputToProps } from '../api/ui-dialogs';\n\nimport './div-styles.css';\n\nconst DIV_ATTR = 0;\nconst DIV_CHILDREN = 1;\n\nconst extension = (context: ExtensionContext) : Extension | null => {\n  const { pandocExtensions, ui } = context;\n\n  if (!pandocExtensions.fenced_divs && !pandocExtensions.native_divs) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'div',\n        spec: {\n          attrs: {\n            ...pandocAttrSpec,\n          },\n          defining: true,\n          content: 'block+',\n          group: 'block list_item_block',\n          parseDOM: [\n            {\n              tag: 'div[data-div=\"1\"]',\n              getAttrs(dom: Node | string) {\n                const attrs: {} = { 'data-div': 1 };\n                return {\n                  ...attrs,\n                  ...pandocAttrParseDom(dom as Element, attrs),\n                };\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode): DOMOutputSpec {\n            const attr = {\n              'data-div': '1',\n              ...pandocAttrToDomAttr({\n                ...node.attrs,\n                classes: [...node.attrs.classes, 'pm-div', 'pm-div-background-color'],\n              }),\n            };\n            return ['div', attr, 0];\n          },\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.div,\n          editFn: () => divCommand(ui, true),\n          offset: {\n            top: 3,\n            right: 0\n          }\n        }),\n\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Div,\n              block: 'div',\n              getAttrs: (tok: PandocToken) => ({\n                ...pandocAttrReadAST(tok, DIV_ATTR),\n              }),\n              getChildren: (tok: PandocToken) => tok.c[DIV_CHILDREN],\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Div, () => {\n              output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n              output.writeArray(() => {\n                output.writeNodes(node);\n              });\n            });\n          },\n        },\n      },\n    ],\n\n    baseKeys: () => {\n      return [\n        { key: BaseKey.Enter, command: divInputRuleEnter() },\n      ];\n    },\n\n    commands: () => {\n      return [\n        // turn current block into a div\n        new DivCommand(EditorCommandId.Div, ui, true),\n\n        // insert a div\n        new DivCommand(EditorCommandId.InsertDiv, ui, false, {\n          name: ui.context.translateText('Div...'),\n          description: ui.context.translateText('Block containing other content'),\n          group: OmniInsertGroup.Blocks,\n          priority: 1,\n          image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.div_dark! : ui.images.omni_insert?.div!),\n        }),\n      ];\n    },\n  };\n};\n\n\nfunction divCommand(ui: EditorUI, allowEdit: boolean) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    // two different modes:\n    //  - editing attributes of an existing div\n    //  - wrapping (a la blockquote)\n    const schema = state.schema;\n    const div = allowEdit ? findParentNodeOfType(schema.nodes.div)(state.selection) : undefined;\n    if (!div && !toggleWrap(schema.nodes.div)(state)) {\n      return false;\n    }\n\n    async function asyncEditDiv() {\n      if (dispatch) {\n        // selecting nothing or entire div means edit, selecting text outside of a\n        // div or a subset of an existing div means create new one\n        const editMode = div && (state.selection.empty || isFullDivSelection(div, state));\n        if (editMode) {\n          await editDiv(ui, state, dispatch, div!);\n        } else {\n          await createDiv(ui, state, dispatch);\n        }\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncEditDiv();\n\n    return true;\n  };\n}\n\nclass DivCommand extends ProsemirrorCommand {\n  constructor(id: EditorCommandId, ui: EditorUI, allowEdit: boolean, omniInsert?: OmniInsert) {\n    super(id, [], divCommand(ui, allowEdit), omniInsert);\n  }\n}\n\nasync function editDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void, div: ContentNodeWithPos) {\n  const attr = pandocAttrFrom(div.node.attrs);\n  const result = await ui.dialogs.editDiv(attr, pandocAttrAvailable(attr));\n  if (result) {\n    const tr = state.tr;\n    if (result.action === 'edit') {\n      tr.setNodeMarkup(div.pos, div.node.type, result.attr);\n      dispatch(tr);\n    } else if (result.action === 'remove') {\n      const fromPos = tr.doc.resolve(div.pos + 1);\n      const toPos = tr.doc.resolve(div.pos + div.node.nodeSize - 1);\n      const nodeRange = fromPos.blockRange(toPos);\n      if (nodeRange) {\n        const targetLiftDepth = liftTarget(nodeRange);\n        if (targetLiftDepth || targetLiftDepth === 0) {\n          tr.lift(nodeRange, targetLiftDepth);\n        }\n      }\n      dispatch(tr);\n    }\n  }\n}\n\nasync function createDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void) {\n  const result = await ui.dialogs.editDiv({}, false);\n  if (result) {\n    wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n      const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n      tr.setNodeMarkup(div.pos, div.node.type, result.attr);\n      dispatch(tr);\n    });\n  }\n}\n\nfunction isFullDivSelection(div: ContentNodeWithPos, state: EditorState) {\n  const divStart = div.pos;\n  const divEnd = div.pos + div.node.nodeSize;\n  return state.selection.from - 2 === divStart && state.selection.to + 2 === divEnd;\n}\n\nfunction divInputRuleEnter() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // see if the parent consist of a pending code block input rule\n    const schema = state.schema;\n\n    // selection must be empty\n    if (!state.selection.empty) {\n      return false;\n    }\n\n    // full text of parent must meet the pattern\n    // eslint-disable-next-line no-useless-escape\n    const match = state.selection.$head.parent.textContent.match(/^:{3,}(\\s+({.*?}|\\S+)?[\\s:]*)?$/);\n    if (!match) {\n      return false;\n    }\n\n    // no inline code marks\n    if (markIsActive(state, schema.marks.code)) {\n      return false;\n    }\n\n    // must be able to perform the replacement\n    if (!canApplyDivInputRule(state)) {\n      return false;\n    }\n\n    // execute\n    if (dispatch) {\n      // if it's just followed by whitespace then don't do it\n      if (match[1] && match[1].trim().length === 0) {\n        return false;\n      }\n\n      // parse attributes\n      const attrs: PandocAttr = pandocAttrFrom({});\n      const attribMatch = match[2];\n      if (attribMatch) {\n        const bracesMatch = attribMatch.match(/^{(.*?)}$/);\n        if (bracesMatch) {\n          const pandocAttrsText = bracesMatch[1];\n          const pandocAttrsMatch = pandocAttrsText.match(/^\\s*(#\\S+)?\\s*((?:\\.\\S+\\s*)*)?(.*)?$/);\n          if (pandocAttrsMatch) {\n            const attrProps = attrInputToProps({ id: pandocAttrsMatch[1], classes: pandocAttrsMatch[2] });\n            attrs.id = attrProps.id || '';\n            attrs.classes = attrProps.classes || [];\n          }\n        } else {\n          attrs.classes = [attribMatch];\n        }\n      }\n\n      wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n        const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n        tr.setNodeMarkup(div.pos, div.node.type, attrs);\n        const $head = tr.selection.$head;\n        const start = $head.start();\n        const end = start + $head.parent.textContent.length;\n        tr.deleteRange(start, end);\n        dispatch(tr);\n      });\n    }\n\n    return true;\n  };\n}\n\nfunction canReplaceNodeWithDiv(schema: Schema, $pos: ResolvedPos) {\n  return $pos.node(-1).canReplaceWith($pos.index(-1), $pos.indexAfter(-1), schema.nodes.div);\n}\n\nfunction canApplyDivInputRule(state: EditorState) {\n  const schema = state.schema;\n  const { $head } = state.selection;\n  return canReplaceNodeWithDiv(schema, $head);\n}\n\nexport default extension;\n","/*\n * line_block.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType, PandocToken } from '../api/pandoc';\n\nimport { EditorCommandId, WrapCommand } from '../api/command';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nimport './line_block-styles.css';\n\nconst extension = (context: ExtensionContext) => {\n  const { pandocExtensions, ui } = context;\n\n  if (!pandocExtensions.line_blocks) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'line_block',\n        spec: {\n          content: 'paragraph+',\n          group: 'block',\n          defining: true,\n          parseDOM: [\n            {\n              tag: \"div[class*='line-block']\",\n            },\n          ],\n          toDOM(): DOMOutputSpec {\n            return ['div', { class: 'line-block pm-line-block pm-block-border-color pm-margin-bordered' }, 0];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.LineBlock,\n              block: 'line_block',\n              getChildren: (tok: PandocToken) => {\n                return tok.c.map((line: PandocToken[]) => ({ t: PandocTokenType.Para, c: line }));\n              },\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.withOption('writeSpaces', false, () => {\n              output.writeToken(PandocTokenType.LineBlock, () => {\n                node.forEach(line => {\n                  output.writeArray(() => {\n                    output.writeInlines(line.content);\n                  });\n                });\n              });\n            });\n          },\n        },\n      },\n    ],\n    commands: (schema: Schema) => {\n      return [\n        new WrapCommand(\n          EditorCommandId.LineBlock,\n          [],\n          schema.nodes.line_block,\n          {},\n          {\n            name: ui.context.translateText('Line Block'),\n            description: ui.context.translateText('Preserve leading spaces and line breaks'),\n            group: OmniInsertGroup.Blocks,\n            priority: 2,\n            image: () =>\n              ui.prefs.darkMode() ? ui.images.omni_insert?.line_block_dark! : ui.images.omni_insert?.line_block!,\n          },\n        ),\n      ];\n    },\n  };\n};\n\nexport default extension;\n","/*\n * table.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { Transaction } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\nimport { tableEditing, columnResizing, goToNextCell, deleteColumn, deleteRow } from 'prosemirror-tables';\n\nimport { findChildrenByType } from 'prosemirror-utils';\n\nimport { EditorUI } from '../../api/ui';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocExtensions } from '../../api/pandoc';\nimport { BaseKey } from '../../api/basekeys';\nimport { ProsemirrorCommand, EditorCommandId, exitNode } from '../../api/command';\nimport { TableCapabilities } from '../../api/table';\nimport { trTransform } from '../../api/transaction';\nimport { PandocCapabilities } from '../../api/pandoc_capabilities';\n\nimport {\n  insertTable,\n  deleteTable,\n  deleteTableCaption,\n  addRows,\n  addColumns,\n  TableColumnAlignmentCommand,\n  TableRowCommand,\n  TableColumnCommand,\n  TableToggleHeaderCommand,\n  TableToggleCaptionCommand,\n  CssAlignment,\n  insertTableOmniInsert,\n} from './table-commands';\n\nimport {\n  tableContainerNode,\n  tableNode,\n  tableCaptionNode,\n  tableCellNode,\n  tableHeaderNode,\n  tableRowNode,\n} from './table-nodes';\n\nimport { fixupTableWidths } from './table-columns';\nimport { TableContextMenuPlugin } from './table-contextmenu';\nimport { tablePaste } from './table-paste';\n\nimport 'prosemirror-tables/style/tables.css';\nimport './table-styles.css';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, ui } = context;\n\n  // not enabled if there are no tables enabled\n  if (\n    !pandocExtensions.grid_tables &&\n    !pandocExtensions.pipe_tables &&\n    !pandocExtensions.simple_tables &&\n    !pandocExtensions.multiline_tables\n  ) {\n    return null;\n  }\n\n  // define table capabilities\n  const capabilities: TableCapabilities = {\n    captions: pandocExtensions.table_captions,\n    headerOptional: pandocExtensions.grid_tables,\n    multiline: pandocExtensions.multiline_tables || pandocExtensions.grid_tables,\n  };\n\n  return {\n    nodes: [\n      tableContainerNode,\n      tableNode,\n      tableCaptionNode,\n      tableCellNode(pandocExtensions.grid_tables),\n      tableHeaderNode,\n      tableRowNode,\n    ],\n\n    commands: (_schema: Schema) => {\n      const commands = [\n        new ProsemirrorCommand(\n          EditorCommandId.TableInsertTable,\n          ['Alt-Mod-t'],\n          insertTable(capabilities, ui),\n          insertTableOmniInsert(ui),\n        ),\n        new ProsemirrorCommand(EditorCommandId.TableNextCell, ['Tab'], goToNextCell(1)),\n        new ProsemirrorCommand(EditorCommandId.TablePreviousCell, ['Shift-Tab'], goToNextCell(-1)),\n        new TableColumnCommand(EditorCommandId.TableAddColumnAfter, [], addColumns(true)),\n        new TableColumnCommand(EditorCommandId.TableAddColumnBefore, [], addColumns(false)),\n        new TableColumnCommand(EditorCommandId.TableDeleteColumn, [], deleteColumn),\n        new TableRowCommand(EditorCommandId.TableAddRowAfter, [], addRows(true)),\n        new TableRowCommand(EditorCommandId.TableAddRowBefore, [], addRows(false)),\n        new TableRowCommand(EditorCommandId.TableDeleteRow, [], deleteRow),\n        new ProsemirrorCommand(EditorCommandId.TableDeleteTable, [], deleteTable()),\n        new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnLeft, CssAlignment.Left),\n        new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnRight, CssAlignment.Right),\n        new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnCenter, CssAlignment.Center),\n        new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnDefault, null),\n      ];\n      if (capabilities.captions) {\n        commands.push(new TableToggleCaptionCommand());\n      }\n      if (capabilities.headerOptional) {\n        commands.push(new TableToggleHeaderCommand());\n      }\n      return commands;\n    },\n\n    plugins: (schema: Schema) => {\n      return [\n        columnResizing({\n          handleWidth: 5,\n        }),\n        tableEditing(),\n        tablePaste(),\n        new TableContextMenuPlugin(schema, ui),\n      ];\n    },\n\n    baseKeys: (schema: Schema) => {\n      // core keys\n      const keys = [\n        { key: BaseKey.Backspace, command: deleteTableCaption() },\n        { key: BaseKey.Enter, command: exitNode(schema.nodes.table_caption, -2, false) },\n        { key: BaseKey.Tab, command: goToNextCell(1) },\n        { key: BaseKey.ShiftTab, command: goToNextCell(-1) },\n      ];\n\n      // turn enter key variations into tab if we don't support multi-line\n      if (!capabilities.multiline) {\n        keys.push({ key: BaseKey.Enter, command: goToNextCell(1) });\n        keys.push({ key: BaseKey.ShiftEnter, command: goToNextCell(-11) });\n        keys.push({ key: BaseKey.ModEnter, command: goToNextCell(1) });\n      }\n\n      return keys;\n    },\n\n    fixups: (_schema: Schema, view: EditorView) => {\n      return [fixupTableWidths(view)];\n    },\n\n    appendTransaction: (_schema: Schema) => {\n      return [\n        {\n          name: 'table-repair',\n          nodeFilter: node => node.type === node.type.schema.nodes.table,\n          append: (tr: Transaction) => {\n            trTransform(tr, tableRepairTransform);\n          },\n        },\n      ];\n    },\n  };\n};\n\nfunction tableRepairTransform(tr: Transform) {\n  const schema = tr.doc.type.schema;\n  const tables = findChildrenByType(tr.doc, schema.nodes.table);\n  tables.forEach(table => {\n    // map the position\n    const pos = tr.mapping.map(table.pos);\n\n    // get containing node (pos is right before the table)\n    const containingNode = tr.doc.resolve(pos).node();\n\n    // table with no container\n    if (containingNode.type !== schema.nodes.table_container) {\n      // add the container\n      const caption = schema.nodes.table_caption.createAndFill({ inactive: true }, undefined)!;\n      const container = schema.nodes.table_container.createAndFill({}, [table.node, caption])!;\n      tr.replaceWith(pos, pos + table.node.nodeSize, container);\n    }\n\n    // table with no content (possible w/ half caption leftover)\n    else if (table.node.firstChild && table.node.firstChild.childCount === 0) {\n      // delete the table (and container if necessary)\n      const hasContainer = containingNode.type === schema.nodes.table_container;\n      if (hasContainer) {\n        tr.deleteRange(pos - 1, pos - 1 + containingNode.nodeSize);\n      } else {\n        tr.deleteRange(pos, table.node.nodeSize);\n      }\n    }\n  });\n}\n\nexport default extension;\n","/*\n * table-commands.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { Node as ProsemirrorNode, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNodeOfType, setTextSelection, findChildrenByType } from 'prosemirror-utils';\nimport {\n  isInTable,\n  Rect,\n  TableMap,\n  selectionCell,\n  CellSelection,\n  toggleHeader,\n  addRow,\n  addColumn,\n} from 'prosemirror-tables';\n\nimport { EditorUI } from '../../api/ui';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { TableCapabilities } from '../../api/table';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport function insertTable(capabilities: TableCapabilities, ui: EditorUI) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    const schema = state.schema;\n\n    // can we insert?\n    if (!canInsertNode(state, schema.nodes.table_container)) {\n      return false;\n    }\n\n    // is the selection inside a table caption? if it is then we can't insert\n    // as it will \"split\" the table_container in such a way that an invalid\n    // table will be created\n    if (findParentNodeOfType(schema.nodes.table_caption)(state.selection)) {\n      return false;\n    }\n\n    async function asyncInsertTable() {\n      if (dispatch) {\n        const result = await ui.dialogs.insertTable(capabilities);\n        if (result) {\n          // create cells\n          const numRows = result.rows + (result.header ? 1 : 0);\n          const rows: ProsemirrorNode[] = [];\n          for (let r = 0; r < numRows; r++) {\n            const cells: ProsemirrorNode[] = [];\n            const cellType = r === 0 && result.header ? schema.nodes.table_header : schema.nodes.table_cell;\n            for (let c = 0; c < result.cols; c++) {\n              const content =\n                cellType === schema.nodes.table_header\n                  ? schema.text(`${ui.context.translateText('Col')}${c + 1}`)\n                  : Fragment.empty;\n              cells.push(cellType.createAndFill({}, schema.nodes.paragraph.createAndFill({}, content)!)!);\n            }\n            rows.push(schema.nodes.table_row.createAndFill({}, cells)!);\n          }\n\n          // create table\n          const table = schema.nodes.table.createAndFill({}, rows)!;\n          const tableCaption = schema.nodes.table_caption.createAndFill(\n            { inactive: !result.caption },\n            result.caption ? schema.text(result.caption) : undefined,\n          )!;\n          const tableContainer = schema.nodes.table_container.createAndFill({}, [table, tableCaption])!;\n\n          // insert\n          const tr = state.tr;\n          tr.replaceSelectionWith(tableContainer);\n\n          // select first cell\n          const selectionPos = tr.mapping.map(state.selection.from, -1);\n          setTextSelection(selectionPos)(tr).scrollIntoView();\n\n          // dispatch & focus\n          dispatch(tr);\n        }\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncInsertTable();\n\n    return true;\n  };\n}\n\nexport function insertTableOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Table'),\n    description: ui.context.translateText('Content in rows and columns'),\n    group: OmniInsertGroup.Lists,\n    priority: 1,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.table_dark! : ui.images.omni_insert?.table!),\n  };\n}\n\nexport function deleteTable() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    const schema = state.schema;\n    const container = findParentNodeOfType(schema.nodes.table_container)(state.selection);\n    if (container) {\n      if (dispatch) {\n        const tr = state.tr;\n        tr.delete(container.pos, container.pos + container.node.nodeSize);\n        dispatch(tr.scrollIntoView());\n      }\n      return true;\n    }\n    return false;\n  };\n}\n\nexport function deleteTableCaption() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // must be a selection within an empty table caption\n    const schema = state.schema;\n    const { $head } = state.selection;\n    if ($head.parent.type !== schema.nodes.table_caption || $head.parent.childCount !== 0) {\n      return false;\n    }\n\n    if (dispatch) {\n      // set the caption to inactive\n      const tr = state.tr;\n      const caption = $head.parent;\n      tr.setNodeMarkup($head.pos - 1, schema.nodes.table_caption, {\n        ...caption.attrs,\n        inactive: true,\n      });\n      setTextSelection($head.pos - 1, -1)(tr);\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nexport function addColumns(after: boolean) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    if (!isInTable(state)) {\n      return false;\n    }\n    if (dispatch) {\n      let tr = state.tr;\n      const rect = selectedRect(state);\n      const columns = rect.right - rect.left;\n      for (let i = 0; i < columns; i++) {\n        tr = addColumn(tr, rect, after ? rect.right : rect.left);\n      }\n      dispatch(tr);\n    }\n    return true;\n  };\n}\n\nexport function addRows(after: boolean) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    if (!isInTable(state)) {\n      return false;\n    }\n    if (dispatch) {\n      // add the rows\n      let tr = state.tr;\n      const rect = selectedRect(state);\n      const rows = rect.bottom - rect.top;\n      for (let i = 0; i < rows; i++) {\n        tr = addRow(tr, rect, after ? rect.bottom : rect.top);\n      }\n\n      // sync column alignments for table\n      const table = findParentNodeOfType(state.schema.nodes.table)(tr.selection);\n      if (table) {\n        const alignments = new Array<CssAlignment | null>(rect.map.width);\n        table.node.forEach((rowNode, rowOffset, rowIndex) => {\n          rowNode.forEach((cellNode, cellOffset, colIndex) => {\n            const cellPos = table.pos + 1 + rowOffset + 1 + cellOffset;\n            if (rowIndex === 0) {\n              const cell = tr.doc.nodeAt(cellPos);\n              alignments[colIndex] = cell?.attrs.align || null;\n            } else {\n              tr.setNodeMarkup(cellPos, cellNode.type, {\n                ...cellNode.attrs,\n                align: alignments[colIndex] || null,\n              });\n            }\n          });\n        });\n      }\n\n      dispatch(tr);\n    }\n    return true;\n  };\n}\n\nexport class TableToggleHeaderCommand extends ProsemirrorCommand {\n  constructor() {\n    super(EditorCommandId.TableToggleHeader, [], toggleHeader('row'));\n  }\n\n  public isActive(state: EditorState): boolean {\n    if (!isInTable(state)) {\n      return false;\n    }\n    const { table } = selectedRect(state);\n    const firstCell = table.firstChild!.firstChild!;\n    return firstCell.type === state.schema.nodes.table_header;\n  }\n}\n\nexport class TableToggleCaptionCommand extends ProsemirrorCommand {\n  constructor() {\n    super(\n      EditorCommandId.TableToggleCaption,\n      [],\n      (state: EditorState, dispatch?: (tr: Transaction<any>, view?: EditorView) => void) => {\n        if (!isInTable(state)) {\n          return false;\n        }\n        const caption = this.tableCaptionNode(state);\n        if (!caption) {\n          return false;\n        }\n\n        if (dispatch) {\n          const focus = caption.node.attrs.inactive;\n          const tr = state.tr;\n          tr.setNodeMarkup(caption.pos + 1, state.schema.nodes.table_caption, {\n            ...caption.node.attrs,\n            inactive: !caption.node.attrs.inactive,\n          });\n          if (focus) {\n            setTextSelection(caption.pos + 1)(tr).scrollIntoView();\n          }\n          dispatch(tr);\n        }\n\n        return true;\n      },\n    );\n  }\n\n  public isActive(state: EditorState): boolean {\n    if (!isInTable(state)) {\n      return false;\n    }\n\n    const caption = this.tableCaptionNode(state);\n    if (!caption) {\n      return false;\n    }\n\n    return !caption.node.attrs.inactive;\n  }\n\n  private tableCaptionNode(state: EditorState) {\n    const container = findParentNodeOfType(state.schema.nodes.table_container)(state.selection);\n    if (container) {\n      const caption = findChildrenByType(container.node, state.schema.nodes.table_caption);\n      return {\n        node: caption[0].node,\n        pos: container.pos + caption[0].pos,\n      };\n    } else {\n      return undefined;\n    }\n  }\n}\n\nexport enum CssAlignment {\n  Left = 'left',\n  Right = 'right',\n  Center = 'center',\n}\n\nexport class TableRowCommand extends ProsemirrorCommand {\n  public plural(state: EditorState) {\n    if (!isInTable(state)) {\n      return 1;\n    }\n\n    const rect = selectedRect(state);\n    return rect.bottom - rect.top;\n  }\n}\n\nexport class TableColumnCommand extends ProsemirrorCommand {\n  public plural(state: EditorState) {\n    if (!isInTable(state)) {\n      return 1;\n    }\n\n    const rect = selectedRect(state);\n    return rect.right - rect.left;\n  }\n}\n\nexport class TableColumnAlignmentCommand extends ProsemirrorCommand {\n  private readonly align: CssAlignment | null;\n\n  constructor(id: EditorCommandId, align: CssAlignment | null) {\n    super(id, [], (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n      if (!isInTable(state)) {\n        return false;\n      }\n\n      if (dispatch) {\n        const { table, tableStart, left, right } = selectedRect(state);\n        const tr = state.tr;\n        table.forEach((rowNode, rowOffset) => {\n          rowNode.forEach((cellNode, cellOffset, i) => {\n            if (i >= left && i < right) {\n              const cellPos = tableStart + 1 + rowOffset + cellOffset;\n              tr.setNodeMarkup(cellPos, cellNode.type, {\n                ...cellNode.attrs,\n                align,\n              });\n            }\n          });\n        });\n        dispatch(tr);\n      }\n\n      return true;\n    });\n    this.align = align;\n  }\n\n  public isActive(state: EditorState): boolean {\n    if (!isInTable(state)) {\n      return false;\n    }\n    const { table, top, left } = selectedRect(state);\n    const cell = table.child(top).child(left);\n    return cell.attrs.align === this.align;\n  }\n}\n\n// from: https://github.com/ProseMirror/prosemirror-tables/blob/master/src/commands.js\n\ninterface SelectedRect extends Rect {\n  tableStart: number;\n  map: TableMap;\n  table: ProsemirrorNode;\n}\n\nfunction selectedRect(state: EditorState): SelectedRect {\n  const sel = state.selection;\n  const $pos = selectionCell(state)!;\n  const table = $pos.node(-1);\n  const tableStart = $pos.start(-1);\n  const map = TableMap.get(table);\n  let rect: Rect;\n  if (sel instanceof CellSelection) {\n    rect = map.rectBetween(sel.$anchorCell.pos - tableStart, sel.$headCell.pos - tableStart);\n  } else {\n    rect = map.findCell($pos.pos - tableStart);\n  }\n  return {\n    ...rect,\n    tableStart,\n    map,\n    table,\n  };\n}\n","/*\n * table-nodes.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { tableNodes } from 'prosemirror-tables';\nimport { Node as ProsemirrorNode, DOMOutputSpec } from 'prosemirror-model';\n\nimport { PandocTokenType } from '../../api/pandoc';\n\nimport {\n  readPandocTable,\n  writePandocTableContainer,\n  writePandocTable,\n  writePandocTableCaption,\n  writePandocTableNodes,\n  writePandocTableHeaderNodes,\n} from './table-pandoc';\nimport { tableColumnWidths } from './table-columns';\nimport { tableBlockCapsuleFilter } from './table-capsule';\n\nexport const kDefaultCellClasses = 'pm-table-cell pm-block-border-color';\n\nconst nodes = tableNodes({\n  tableGroup: 'block',\n  cellContent: 'block+',\n  cellAttributes: {\n    align: {\n      default: null,\n      getFromDOM(dom: Element) {\n        return (dom as HTMLElement).style.textAlign || null;\n      },\n      setDOMAttr(value, attrs) {\n        if (value) {\n          attrs.style = (attrs.style || '') + `text-align: ${value};`;\n        }\n      },\n    },\n    className: {\n      default: kDefaultCellClasses,\n      getFromDOM(dom: Element) {\n        return (dom as HTMLElement).className;\n      },\n      setDOMAttr(value, attrs) {\n        attrs.class = kDefaultCellClasses;\n      },\n    },\n  },\n});\n\nexport const tableContainerNode = {\n  name: 'table_container',\n  spec: {\n    content: 'table table_caption',\n    group: 'block',\n    parseDOM: [{ tag: \"div[class*='table-container']\" }],\n    toDOM(node: ProsemirrorNode): DOMOutputSpec {\n      return ['div', { class: 'table-container pm-table-container' }, 0];\n    },\n  },\n  pandoc: {\n    readers: [\n      {\n        token: PandocTokenType.Table,\n        handler: readPandocTable,\n      },\n    ],\n    writer: writePandocTableContainer,\n    blockCapsuleFilter: tableBlockCapsuleFilter(),\n  },\n};\n\nexport const tableNode = {\n  name: 'table',\n  spec: {\n    ...nodes.table,\n    attrs: {\n      ...nodes.table.attrs,\n      width: { default: null },\n      colpercents: { default: null },\n    },\n    parseDOM: [\n      {\n        tag: 'table',\n        getAttrs: (dom: Node | string) => {\n          const el = dom as HTMLElement;\n\n          // shared colpercents\n          let colpercents: number[] | null = null;\n\n          // if we have a colgroup w/ widths then read percents from there\n          // <colgroup><col style=\"width: 44%\" /><col style=\"width: 11%\" /></colgroup>\n          const colgroup = el.getElementsByTagName('colgroup');\n          if (colgroup.length) {\n            const cols = colgroup[0].childElementCount;\n            colpercents = new Array<number>(cols).fill(0);\n            for (let i = 0; i < cols; i++) {\n              const col = colgroup[0].children.item(i) as HTMLElement;\n              if (col.style.width) {\n                colpercents[i] = (parseInt(col.style.width, 10) || 0) / 100;\n              }\n            }\n            if (colpercents.every(value => !!value)) {\n              return {\n                colpercents,\n              };\n            }\n          }\n\n          // otherwise read from data-colwidth\n          let width: number | null = null;\n          const rows = el.getElementsByTagName('tr');\n          if (rows.length) {\n            const firstRow = rows.item(0)!;\n            const numCells = firstRow.cells.length;\n            const colWidths = new Array<number>(numCells).fill(0);\n            for (let i = 0; i < numCells; i++) {\n              const cell = firstRow.cells.item(i)!;\n              const colWidth = cell.getAttribute('data-colwidth');\n              if (colWidth) {\n                colWidths[i] = Number(colWidth);\n              }\n            }\n            if (colWidths.every(colWidth => colWidth > 0)) {\n              width = colWidths.reduce((total, value) => total + value, 0);\n              colpercents = colWidths.map(colWidth => colWidth / width!);\n            }\n          }\n\n          return {\n            width,\n            colpercents,\n          };\n        },\n      },\n    ],\n    toDOM(node: ProsemirrorNode): DOMOutputSpec {\n      const attrs: any = {};\n      if (node.attrs.width) {\n        attrs['data-width'] = node.attrs.width.toString();\n      }\n      attrs['data-colpercents'] = tableColumnWidths(node).join(',');\n      return ['table', attrs, ['tbody', 0]];\n    },\n  },\n  pandoc: {\n    writer: writePandocTable,\n  },\n};\n\nexport const tableCaptionNode = {\n  name: 'table_caption',\n  spec: {\n    attrs: {\n      inactive: { default: false },\n    },\n    content: 'inline*',\n    parseDOM: [\n      {\n        tag: \"p[class*='table-caption']\",\n        getAttrs(dom: Node | string) {\n          return {\n            inactive: (dom as HTMLElement).classList.contains('table-caption-inactive'),\n          };\n        },\n      },\n    ],\n    toDOM(node: ProsemirrorNode): DOMOutputSpec {\n      const classes = ['table-caption', 'pm-node-caption'];\n      if (node.attrs.inactive) {\n        classes.push('table-caption-inactive');\n      }\n      return ['p', { class: classes.join(' ') }, 0];\n    },\n  },\n  pandoc: {\n    writer: writePandocTableCaption,\n  },\n};\n\nexport const tableRowNode = {\n  name: 'table_row',\n  spec: nodes.table_row,\n  pandoc: {\n    writer: writePandocTableNodes,\n  },\n};\n\nexport const tableCellNode = (blocks: boolean) => ({\n  name: 'table_cell',\n  spec: {\n    ...nodes.table_cell,\n    content: blocks ? 'block+' : 'paragraph',\n  },\n  pandoc: {\n    writer: writePandocTableNodes,\n  },\n});\n\nexport const tableHeaderNode = {\n  name: 'table_header',\n  spec: nodes.table_header,\n  pandoc: {\n    writer: writePandocTableHeaderNodes,\n  },\n};\n","/*\n * table-pandoc.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, NodeType, Node as ProsemirrorNode, Fragment } from 'prosemirror-model';\n\nimport { ProsemirrorWriter, PandocToken, PandocTokenType, PandocOutput } from '../../api/pandoc';\n\nimport { CssAlignment } from './table-commands';\nimport { tableColumnAlignments, tableColumnWidths } from './table-columns';\n\n// attributes\nconst kTableAttr = 0;\n\n// caption\nconst kTableCaption = 1;\nconst kTableCaptionShort = 0; // [Inline]\nconst kTableCaptionFull = 1;  // [Block]\n\n// columdefs\nconst kTableColSpec = 2;\nconst kTableColSpecAlign = 0;\nconst kTableColSpecWidth = 1;\n\n// table head\nconst kTableHead = 3;\nconst kTableHeadAttr = 0;\nconst kTableHeadRows = 1; // [Row]\n\n// table body\nconst kTableBody = 4;\nconst kTableBodyAttr = 0;\nconst kTableBodyRowHeadNumColumns = 1;\nconst kTableBodyRowHead = 2;\nconst kTableBodyRows = 3; // [Row]\n\n// table foot\nconst kTableFoot = 5;\nconst kTableFootAttr = 0;\nconst kTableFootRows = 1; // [Row]\n\n// table row\nconst kTableRowAttr = 0;\nconst kTableRowCells = 1; // [Cell]\n\n// table cell\nconst kTableCellAttr = 0;\nconst kTableCellAlignments = 1;\nconst kTableCellRowSpan = 2;\nconst kTableCellColSpan = 3;\nconst KTableCellContents = 4; // [Block]\n\n\nexport function readPandocTable(schema: Schema) {\n  return (writer: ProsemirrorWriter, tok: PandocToken) => {\n    // get alignments and columns widths\n    const alignments = columnCssAlignments(tok);\n    const colpercents = columnPercents(tok);\n\n    // helper function to parse a table row\n    const parseRow = (row: any[], cellType: NodeType) => {\n      const cells: any[] = row[kTableRowCells];\n      if (cells.length) {\n        writer.openNode(schema.nodes.table_row, {});\n        cells.forEach((cell: any[], i) => {\n          writer.openNode(cellType, { align: alignments[i] });\n          writer.writeTokens(cell[KTableCellContents]);\n          writer.closeNode();\n        });\n        writer.closeNode();\n      }\n    };\n\n    // open table container node\n    writer.openNode(schema.nodes.table_container, {});\n\n    // open table node\n    writer.openNode(schema.nodes.table, { colpercents });\n\n    // parse column headers\n    const head = tok.c[kTableHead] as any[];\n    const firstRow = head[kTableHeadRows][0];\n    if (firstRow && firstRow[kTableRowCells].some((cell: any[]) => cell[KTableCellContents].length > 0)) {\n      parseRow(firstRow, schema.nodes.table_header);\n    }\n\n    // parse table rows\n    const body = tok.c[kTableBody][0] as any[];\n    body[kTableBodyRows].forEach((row: any[]) => {\n      parseRow(row, schema.nodes.table_cell);\n    });\n\n    // close table node\n    writer.closeNode();\n\n    // read caption\n    const caption = tok.c[kTableCaption][kTableCaptionFull];\n    const captionBlock: PandocToken[] = caption.length ? caption[0].c : [];\n    writer.openNode(schema.nodes.table_caption, { inactive: captionBlock.length === 0 });\n    writer.writeTokens(captionBlock);\n    writer.closeNode();\n\n    // close table container node\n    writer.closeNode();\n  };\n}\n\nexport function writePandocTableContainer(output: PandocOutput, node: ProsemirrorNode) {\n  const caption = node.lastChild!;\n  const table = node.firstChild!;\n\n  output.writeToken(PandocTokenType.Table, () => {\n\n    // write empty attributes\n    output.writeAttr();\n\n    // write caption\n    output.writeNode(caption);\n\n    // write table\n    output.writeNode(table);\n  });\n}\n\nexport function writePandocTable(output: PandocOutput, node: ProsemirrorNode) {\n  const firstRow = node.firstChild!;\n\n  // get alignments and column widths\n  const alignments = tableColumnAlignments(node);\n  const widths = tableColumnWidths(node);\n\n  // write colspcs\n  // TODO: Columns are coming out ColWidthDefault\n  output.writeArray(() => {\n    alignments.forEach((align, i) => {\n      output.writeArray(() => {\n        output.writeToken(align);\n        if (widths[i] === 0) {\n          output.writeToken(PandocTokenType.ColWidthDefault);\n        } else {\n          output.writeToken(PandocTokenType.ColWidth, widths[i]);\n        }\n      });\n    });\n  });\n\n\n  // write header row if necessary\n  const headerCut = firstRow.firstChild!.type === node.type.schema.nodes.table_header ? 1 : 0;\n  output.writeArray(() => {\n    output.writeAttr();\n    output.writeArray(() => {\n      writePandocTableRow(output, firstRow, headerCut === 0);\n    });\n  });\n\n  // write table body\n  output.writeArray(() => {\n    output.writeArray(() => {\n      output.writeAttr();\n      output.write(0);\n      output.writeArray(() => { /* */ });\n      // write rows\n      output.writeArray(() => {\n        for (let i = headerCut; i < node.childCount; i++) {\n          writePandocTableRow(output, node.content.child(i));\n        }\n      });\n    });\n  });\n\n  // write table footer\n  output.writeArray(() => {\n    output.writeAttr();\n    output.writeArray(() => { /* */ });\n  });\n\n\n}\n\nexport function writePandocTableCaption(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeArray(() => {\n    output.write(null);\n    output.writeArray(() => {\n      if (!node.attrs.inactive && node.childCount > 0) {\n        output.writeToken(PandocTokenType.Plain, () => {\n          output.writeInlines(node.content);\n        });\n      }\n    });\n  });\n}\n\nexport function writePandocTableNodes(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeArray(() => {\n    output.writeNodes(node);\n  });\n}\n\nexport function writePandocTableHeaderNodes(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeArray(() => {\n    if (node.textContent.length > 0) {\n      output.writeNodes(node);\n    } else {\n      // write a paragraph containing a space (this is an attempt to fix an issue where\n      // empty headers don't get correct round-tripping)\n      output.writeToken(PandocTokenType.Para, () => {\n        output.writeRawMarkdown(' ');\n      });\n    }\n  });\n}\n\nfunction writePandocTableRow(output: PandocOutput, node: ProsemirrorNode, empty = false) {\n  output.writeArray(() => {\n    output.writeAttr();\n    output.writeArray(() => {\n      node.forEach((cellNode) => {\n        output.writeArray(() => {\n          output.writeAttr();\n          output.writeToken(PandocTokenType.AlignDefault);\n          output.write(1);\n          output.write(1);\n          if (!empty) {\n            output.writeNode(cellNode);\n          } else {\n            output.writeArray(() => {\n              output.writeInlines(Fragment.empty);\n            });\n          }\n        });\n      });\n    });\n  });\n}\n\n\nfunction columnCssAlignments(tableToken: PandocToken) {\n  return tableToken.c[kTableColSpec].map((spec: any) => {\n    const alignment = spec[kTableColSpecAlign];\n    switch (alignment.t) {\n      case PandocTokenType.AlignLeft:\n        return CssAlignment.Left;\n      case PandocTokenType.AlignRight:\n        return CssAlignment.Right;\n      case PandocTokenType.AlignCenter:\n        return CssAlignment.Center;\n      case PandocTokenType.AlignDefault:\n      default:\n        return null;\n    }\n  });\n}\n\nfunction columnPercents(tableToken: PandocToken): number[] {\n  return tableToken.c[kTableColSpec].map((spec: any) => {\n    const width = spec[kTableColSpecWidth];\n    return width.t === PandocTokenType.ColWidth ? width.c : 0;\n  });\n}\n","/*\n * table-columns.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { Transaction } from 'prosemirror-state';\nimport { findChildrenByType } from 'prosemirror-utils';\n\nimport { PandocTokenType } from '../../api/pandoc';\n\nimport { CssAlignment } from './table-commands';\n\nexport function tableColumnAlignments(node: ProsemirrorNode) {\n  // get the first row (schema requires at least 1 row)\n  const firstRow = node.firstChild!;\n\n  // determine # of columns\n  const cols = firstRow.childCount;\n\n  // return alignments\n  const alignments = new Array<PandocTokenType>(cols);\n  for (let i = 0; i < cols; i++) {\n    const cell = firstRow.child(i);\n    const align: CssAlignment = cell.attrs.align;\n    switch (align) {\n      case CssAlignment.Left:\n        alignments[i] = PandocTokenType.AlignLeft;\n        break;\n      case CssAlignment.Right:\n        alignments[i] = PandocTokenType.AlignRight;\n        break;\n      case CssAlignment.Center:\n        alignments[i] = PandocTokenType.AlignCenter;\n        break;\n      case null:\n      default:\n        alignments[i] = PandocTokenType.AlignDefault;\n        break;\n    }\n  }\n  return alignments;\n}\n\nexport function tableColumnWidths(node: ProsemirrorNode) {\n  // get the first row (schema requires at least 1 row)\n  const firstRow = node.firstChild!;\n\n  // determine # of columns\n  const cols = firstRow.childCount;\n\n  // width percentages\n  let widths = new Array<number>(cols).fill(0);\n\n  // take note of explicitly sized columns\n  const totalWidth = node.attrs.width;\n  let availableWidth = totalWidth;\n  let colsWithWidth = 0;\n  for (let i = 0; i < cols; i++) {\n    const col = firstRow.child(i);\n    if (col.attrs.colwidth && col.attrs.colwidth[0]) {\n      widths[i] = col.attrs.colwidth[0];\n      colsWithWidth++;\n      availableWidth -= widths[i];\n    }\n  }\n\n  // allocate remaining widths if we have at least 1 sized columns (otherwise\n  // we leave all of the widths at 0 which results in no sizing)\n  if (colsWithWidth > 0) {\n    if (availableWidth > 0) {\n      const defaultWidth = availableWidth / (cols - colsWithWidth);\n      for (let i = 0; i < cols; i++) {\n        const col = firstRow.child(i);\n        if (!col.attrs.colwidth || !col.attrs.colwidth[0]) {\n          widths[i] = defaultWidth;\n        }\n      }\n    }\n\n    // convert widths to percentages\n    widths = widths.map(width => width / totalWidth);\n  }\n\n  return widths;\n}\n\nexport function fixupTableWidths(view: EditorView) {\n  return (tr: Transaction) => {\n    const schema = tr.doc.type.schema;\n\n    // don't do fixup if we aren't connected to the DOM\n    if (!view.dom || !view.dom.isConnected) {\n      return tr;\n    }\n\n    const tables = findChildrenByType(tr.doc, schema.nodes.table);\n    for (const table of tables) {\n      // get table width\n      const el = view.domAtPos(table.pos).node as HTMLElement;\n      const containerWidth = table.node.attrs.width || el.clientWidth;\n      if (containerWidth === 0) {\n        continue;\n      }\n\n      // resolve colpercents (read by tokenzier)\n      const colpercents = table.node.attrs.colpercents;\n      if (colpercents) {\n        // for each row\n        table.node.forEach((rowNode, rowOffset, r) => {\n          // for each cell\n          rowNode.forEach((cellNode, cellOffset, c) => {\n            const cellPos = table.pos + 1 + rowOffset + 1 + cellOffset;\n            const colWidth = [colpercents[c] * containerWidth];\n            if (colWidth !== cellNode.attrs.colwidth) {\n              tr.setNodeMarkup(cellPos, cellNode.type, {\n                ...cellNode.attrs,\n                colwidth: colWidth,\n              });\n            }\n          });\n        });\n      }\n\n      if (containerWidth !== table.node.attrs.width || colpercents) {\n        tr.setNodeMarkup(table.pos, schema.nodes.table, {\n          ...table.node.attrs,\n          width: containerWidth,\n          colpercents: null,\n        });\n      }\n    }\n    return tr;\n  };\n}\n","/*\n * table-capsule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMParser } from 'prosemirror-model';\n\nimport {\n  PandocBlockCapsuleFilter,\n  PandocBlockCapsule,\n  blockCapsuleParagraphTokenHandler,\n  encodedBlockCapsuleRegex,\n  blockCapsuleTextHandler,\n  blockCapsuleSourceWithoutPrefix,\n  parsePandocBlockCapsule,\n} from '../../api/pandoc_capsule';\nimport { ProsemirrorWriter, PandocToken, PandocTokenType } from '../../api/pandoc';\nimport { kHTMLFormat } from '../../api/raw';\n\nexport function tableBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n  const kTableBlockCapsuleType = '8EF5A772-DD63-4622-84BF-AF1995A1B2B9'.toLowerCase();\n  const pagraphTokenCapsuleHandler = blockCapsuleParagraphTokenHandler(kTableBlockCapsuleType);\n  const tokenRegex = encodedBlockCapsuleRegex('^', '$');\n\n  return {\n    type: kTableBlockCapsuleType,\n\n    match: /^([\\t >]*)(<table[\\W\\w]*?<\\/table>)([ \\t]*)$/gm,\n\n    // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n    // (in this case we don't do anything because pandoc would have written this table as a\n    // semantically standalone block)\n    enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n      return capsuleText;\n    },\n\n    // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n    // and if we find it, parse and return the original source code\n    handleText: blockCapsuleTextHandler(kTableBlockCapsuleType, encodedBlockCapsuleRegex(undefined, undefined, 'gm')),\n\n    // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n    // if find that then return the block capsule text\n    handleToken: (tok: PandocToken) => {\n      // first check for a paragraph\n      const capsuleText = pagraphTokenCapsuleHandler(tok);\n      if (capsuleText) {\n        return capsuleText;\n      }\n\n      // now look for a definition list (which is what a table with a caption parses as)\n      if (tok.t === PandocTokenType.DefinitionList) {\n        if (tok.c.length === 1) {\n          const definition = tok.c[0];\n          if (definition[0][0].t === PandocTokenType.Str) {\n            const term = definition[0][0].c as string;\n            const match = term.match(tokenRegex);\n            if (match) {\n              const capsuleRecord = parsePandocBlockCapsule(term);\n              if (capsuleRecord.type === kTableBlockCapsuleType) {\n                return term;\n              }\n            }\n          }\n        }\n      }\n\n      return null;\n    },\n\n    // write the node as a table (parse the html)\n    writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n      // remove the source prefix\n      const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n      // fallback to write as raw html\n      const writeAsRawHTML = () => {\n        writer.openNode(schema.nodes.raw_block, { format: kHTMLFormat });\n        writer.writeText(source);\n        writer.closeNode();\n      };\n\n      // parse the table from the string\n      const parser = new window.DOMParser();\n      const doc = parser.parseFromString(capsule.source, 'text/html');\n      if (doc.body && doc.body.firstChild instanceof HTMLTableElement) {\n        // get prosemirror dom parser\n        const prosemirrorDomParser = DOMParser.fromSchema(schema);\n\n        // get unparsed (by prosemirror) table\n        const unparsedTable = doc.body.firstChild;\n\n        // ensure that table cells all have content\n        const ensureCellContent = (tag: string) => {\n          const cells = unparsedTable.getElementsByTagName(tag);\n          for (let i = 0; i < cells.length; i++) {\n            const cell = cells.item(i)!;\n            if (cell.children.length === 0) {\n              cell.append(window.document.createElement('p'));\n            }\n          }\n        };\n        ensureCellContent('td');\n        ensureCellContent('th');\n\n        // extract caption element\n        let captionElement: HTMLTableCaptionElement | null = null;\n        const captionCollection = unparsedTable.getElementsByTagName('caption');\n        if (captionCollection.length) {\n          captionElement = captionCollection.item(0);\n          if (captionElement) {\n            captionElement.remove();\n          }\n        }\n\n        // determine caption (either empty or parsed from element)\n        let caption = schema.nodes.table_caption.create({ inactive: true });\n        if (captionElement) {\n          const captionSlice = prosemirrorDomParser.parseSlice(captionElement);\n          caption = schema.nodes.table_caption.createAndFill({ inactive: false }, captionSlice.content)!;\n        }\n\n        // parse the prosemirror table element\n        const slice = prosemirrorDomParser.parseSlice(doc.body);\n        if (slice.content.firstChild && slice.content.firstChild.type === schema.nodes.table) {\n          const table = slice.content.firstChild;\n          writer.addNode(schema.nodes.table_container, {}, [table, caption]);\n        } else {\n          writeAsRawHTML();\n        }\n\n        // fallback to writing as raw_html (round-trip unmodified)\n      } else {\n        writeAsRawHTML();\n      }\n    },\n  };\n}\n","/*\n * table-contextmenu.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\nimport { isInTable } from 'prosemirror-tables';\n\nimport { EditorUI } from '../../api/ui';\nimport { EditorCommandId } from '../../api/command';\n\nexport class TableContextMenuPlugin extends Plugin {\n  private menuVisible = false;\n\n  constructor(_schema: Schema, ui: EditorUI) {\n    super({\n      key: new PluginKey('table-contextmenu'),\n\n      props: {\n        handleDOMEvents: {\n          contextmenu: (view: EditorView, event: Event) => {\n            // only trigger when in table\n            if (!isInTable(view.state)) {\n              return false;\n            }\n\n            const asyncShowTableContextMenu = async () => {\n              const menu = [\n                { command: EditorCommandId.TableAddRowBefore },\n                { command: EditorCommandId.TableAddRowAfter },\n                { separator: true },\n                { command: EditorCommandId.TableAddColumnBefore },\n                { command: EditorCommandId.TableAddColumnAfter },\n                { separator: true },\n                { command: EditorCommandId.TableDeleteRow },\n                { command: EditorCommandId.TableDeleteColumn },\n                { separator: true },\n                { command: EditorCommandId.TableDeleteTable },\n                { separator: true },\n                {\n                  text: ui.context.translateText('Align Column'),\n                  subMenu: {\n                    items: [\n                      { command: EditorCommandId.TableAlignColumnLeft },\n                      { command: EditorCommandId.TableAlignColumnCenter },\n                      { command: EditorCommandId.TableAlignColumnRight },\n                      { separator: true },\n                      { command: EditorCommandId.TableAlignColumnDefault },\n                    ],\n                  },\n                },\n                { separator: true },\n                { command: EditorCommandId.TableToggleHeader },\n                { command: EditorCommandId.TableToggleCaption },\n              ];\n\n              const { clientX, clientY } = event as MouseEvent;\n              await ui.display.showContextMenu!(menu, clientX, clientY);\n              this.menuVisible = false;\n            };\n\n            if (ui.display.showContextMenu) {\n              this.menuVisible = true;\n              asyncShowTableContextMenu();\n              event.stopPropagation();\n              event.preventDefault();\n              return true;\n            } else {\n              return false;\n            }\n          },\n        },\n      },\n\n      // prevent selection while the context menu is visible (the right-click\n      // that invokes the context menu ends up resetting the selection, which\n      // makes the selection-based commands behave incorrectly when multiple\n      // rows or columns are selected)\n      filterTransaction: (tr: Transaction, state: EditorState) => {\n        if (this.menuVisible && isInTable(state)) {\n          return !(tr.selectionSet && !tr.docChanged && !tr.storedMarksSet);\n        } else {\n          return true;\n        }\n      },\n    });\n  }\n}\n","/*\n * table-paste.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { Slice, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { sliceHasNode } from '../../api/slice';\n\nimport { fixupTableWidths } from './table-columns';\nimport { forChangedNodes } from '../../api/transaction';\n\nimport { kDefaultCellClasses } from './table-nodes';\n\nexport function tablePaste() {\n  return new Plugin({\n    key: new PluginKey('table-paste'),\n    props: {\n      handlePaste: (view: EditorView, _event: Event, slice: Slice) => {\n        // if the slice contains a table then we handle it\n        if (sliceHasNode(slice, node => node.type === node.type.schema.nodes.table)) {\n          // based on https://github.com/ProseMirror/prosemirror-view/blob/fb799aae4e9dd5cfc256708a6845d76aaaf145bf/src/input.js#L503-L510\n          const tr = view.state.tr.replaceSelection(slice);\n          view.dispatch(\n            tr\n              .scrollIntoView()\n              .setMeta('paste', true)\n              .setMeta('tablePaste', true)\n              .setMeta('uiEvent', 'paste'),\n          );\n          view.dispatch(fixupTableWidths(view)(view.state.tr));\n          return true;\n        } else {\n          return false;\n        }\n      },\n    },\n    appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n      // alias schema\n      const schema = newState.schema;\n\n      // only process table paste transactions\n      if (!transactions.some(transaction => transaction.getMeta('tablePaste'))) {\n        return null;\n      }\n\n      // cleanup table by converting the first row to header cells, ensuring that column alignments\n      // are derived from the alignment of the first row, and applying the standard cell class names\n      const tr = newState.tr;\n      forChangedNodes(\n        oldState,\n        newState,\n        node => node.type === node.type.schema.nodes.table,\n        (node, pos) => {\n          let firstRow: ProsemirrorNode;\n          let currentColumn = 0;\n          const columnAlignments: string[] = [];\n\n          node.descendants((childNode, childPos, parent) => {\n            // if this is a row then reset the current column to 0\n            if (childNode.type === schema.nodes.table_row) {\n              currentColumn = 0;\n            }\n\n            // first thing we will encounter in traveral is the first row, note that and move along to cells\n            if (!firstRow) {\n              // note first row\n              firstRow = childNode;\n\n              // children of the first row are the headers\n            } else if (parent === firstRow) {\n              // collect alignment (will be applied below to cells in this column)\n              columnAlignments.push(childNode.attrs.align);\n\n              // convert to a table header w/ default class\n              const headerPos = pos + 1 + childPos;\n              tr.setNodeMarkup(headerPos, schema.nodes.table_header, {\n                ...childNode.attrs,\n                className: kDefaultCellClasses,\n              });\n\n              // normal cell - apply the requisite alignment and give it the default class\n            } else if (childNode.type === schema.nodes.table_cell) {\n              // determine alignment\n              const align = columnAlignments[currentColumn] || null;\n\n              // apply markup\n              const cellPos = pos + 1 + childPos;\n              tr.setNodeMarkup(cellPos, schema.nodes.table_cell, {\n                ...childNode.attrs,\n                align,\n                className: kDefaultCellClasses,\n              });\n            }\n\n            // if this is a cell then advance the current column\n            if (childNode.type === schema.nodes.table_header || childNode.type === schema.nodes.table_cell) {\n              currentColumn++;\n            }\n          });\n        },\n      );\n\n      if (tr.docChanged) {\n        return tr;\n      }\n    },\n  });\n}\n","/*\n * definition_list.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { PandocTokenType } from '../../api/pandoc';\nimport { ExtensionContext } from '../../api/extension';\nimport { BaseKey } from '../../api/basekeys';\n\nimport { InsertDefinitionList, InsertDefinitionDescription, InsertDefinitionTerm } from './definition_list-commands';\n\nimport {\n  definitionListEnter,\n  definitionListBackspace,\n  definitionListTab,\n  definitionListShiftTab,\n} from './definition-list-keys';\n\nimport { definitionInputRule } from './definition_list-inputrule';\n\nimport { insertDefinitionListAppendTransaction } from './definition_list-insert';\nimport {\n  readPandocDefinitionList,\n  writePandocDefinitionList,\n  writePandocDefinitionListTerm,\n  writePandocDefinitionListDescription,\n} from './definition_list-pandoc';\n\nimport './definition_list-styles.css';\nimport { emptyNodePlaceholderPlugin } from '../../api/placeholder';\n\nconst extension = (context: ExtensionContext) => {\n  const { pandocExtensions, ui } = context;\n\n  if (!pandocExtensions.definition_lists) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'definition_list_term',\n        spec: {\n          content: 'inline*',\n          isolating: true,\n          parseDOM: [{ tag: 'dt' }],\n          toDOM(): DOMOutputSpec {\n            return ['dt', { class: 'pm-definition-term' }, 0];\n          },\n        },\n        pandoc: {\n          writer: writePandocDefinitionListTerm,\n        },\n      },\n      {\n        name: 'definition_list_description',\n        spec: {\n          content: 'block+',\n          parseDOM: [{ tag: 'dd' }],\n          toDOM(): DOMOutputSpec {\n            return ['dd', { class: 'pm-definition-description pm-block-border-color pm-margin-bordered' }, 0];\n          },\n        },\n        pandoc: {\n          writer: writePandocDefinitionListDescription,\n        },\n      },\n      {\n        name: 'definition_list',\n        spec: {\n          content: '(definition_list_term definition_list_description*)+',\n          group: 'block',\n          defining: true,\n          parseDOM: [{ tag: 'dl' }],\n          toDOM(): DOMOutputSpec {\n            return ['dl', { class: 'pm-definition-list' }, 0];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.DefinitionList,\n              handler: readPandocDefinitionList,\n            },\n          ],\n\n          writer: writePandocDefinitionList,\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [\n        new InsertDefinitionList(ui),\n        new InsertDefinitionTerm(schema, ui),\n        new InsertDefinitionDescription(schema),\n      ];\n    },\n\n    baseKeys: (_schema: Schema) => {\n      return [\n        { key: BaseKey.Enter, command: definitionListEnter() },\n        { key: BaseKey.Backspace, command: definitionListBackspace() },\n        { key: BaseKey.Tab, command: definitionListTab() },\n        { key: BaseKey.ShiftTab, command: definitionListShiftTab() },\n      ];\n    },\n\n    inputRules: (_schema: Schema) => {\n      return [definitionInputRule()];\n    },\n\n    appendTransaction: (_schema: Schema) => {\n      return [insertDefinitionListAppendTransaction()];\n    },\n\n    plugins: (schema: Schema) => {\n      return [emptyNodePlaceholderPlugin(schema.nodes.definition_list_term, () => ui.context.translateText('Term'))];\n    },\n  };\n};\n\nexport default extension;\n","/*\n * definition_list-commands.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nimport { canInsertNode } from '../../api/node';\nimport { insertDefinitionList } from './definition_list-insert';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport class InsertDefinitionList extends ProsemirrorCommand {\n  constructor(ui: EditorUI) {\n    super(\n      EditorCommandId.DefinitionList,\n      [],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        const schema = state.schema;\n\n        if (\n          findParentNodeOfType(schema.nodes.definition_list)(state.selection) ||\n          !canInsertNode(state, schema.nodes.definition_list)\n        ) {\n          return false;\n        }\n\n        // new definition list\n        if (dispatch) {\n          const tr = state.tr;\n\n          // create new list\n          const termText = insertTermText(ui);\n          const term = schema.text(termText);\n          insertDefinitionList(tr, [\n            schema.nodes.definition_list_term.createAndFill({}, term),\n            createDefinitionDescription(schema),\n          ]);\n          const start = state.selection.from;\n          tr.setSelection(TextSelection.create(tr.doc, start, start + termText.length + 1)).scrollIntoView();\n          dispatch(tr);\n        }\n        return true;\n      },\n      // omni insert\n      {\n        name: ui.context.translateText('Definition List'),\n        description: ui.context.translateText('List with a definition for each item'),\n        group: OmniInsertGroup.Lists,\n        priority: 3,\n        image: () =>\n          ui.prefs.darkMode() ? ui.images.omni_insert?.definition_list_dark! : ui.images.omni_insert?.definition_list!,\n      },\n    );\n  }\n}\n\nclass InsertDefinitionListItemCommand extends ProsemirrorCommand {\n  constructor(id: EditorCommandId, createFn: () => ProsemirrorNode) {\n    super(id, [], (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n      const schema = state.schema;\n\n      if (!findParentNodeOfType(schema.nodes.definition_list)(state.selection)) {\n        return false;\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n        const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n        const parent = findParentNodeOfType(dlTypes)(state.selection)!;\n        const insertPos = parent.pos + parent.node.nodeSize;\n        const insertNode = createFn();\n        tr.insert(insertPos, insertNode);\n        if (insertNode.textContent.length > 1) {\n          tr.setSelection(TextSelection.create(tr.doc, insertPos, insertPos + insertNode.textContent.length + 1));\n        } else {\n          setTextSelection(insertPos, 1)(tr);\n        }\n        tr.scrollIntoView();\n\n        dispatch(tr);\n      }\n\n      return true;\n    });\n  }\n}\n\nexport class InsertDefinitionTerm extends InsertDefinitionListItemCommand {\n  constructor(schema: Schema, ui: EditorUI) {\n    super(EditorCommandId.DefinitionTerm, () => {\n      const term = schema.text(insertTermText(ui));\n      return schema.nodes.definition_list_term.createAndFill({}, term)!;\n    });\n  }\n}\n\nexport class InsertDefinitionDescription extends InsertDefinitionListItemCommand {\n  constructor(schema: Schema) {\n    super(EditorCommandId.DefinitionDescription, () => {\n      return createDefinitionDescription(schema);\n    });\n  }\n}\n\nfunction insertTermText(ui: EditorUI) {\n  return ui.context.translateText('term');\n}\n\nfunction createDefinitionDescription(schema: Schema) {\n  return schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!;\n}\n","/*\n * definition_list-insert.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\nimport { setTextSelection } from 'prosemirror-utils';\nimport { findChildrenByType } from 'prosemirror-utils';\nimport { trTransform } from '../../api/transaction';\nimport { Transform } from 'prosemirror-transform';\n\nexport function insertDefinitionList(tr: Transaction, items: ProsemirrorNode[]) {\n  const schema = items[0].type.schema;\n  const definitionList = schema.nodes.definition_list.createAndFill({}, items)!;\n  const prevCursor = tr.selection.to;\n  tr.replaceSelectionWith(definitionList);\n  setTextSelection(tr.mapping.map(prevCursor) - 1, -1)(tr).scrollIntoView();\n  return tr;\n}\n\nexport function insertDefinitionListAppendTransaction() {\n  return {\n    name: 'definition-list-join',\n    nodeFilter: (node: ProsemirrorNode) => node.type === node.type.schema.nodes.definition_list,\n    append: (tr: Transaction) => {\n      // if a transaction creates 2 adjacent definition lists then join them\n      trTransform(tr, joinDefinitionListsTransform);\n    },\n  };\n}\n\nfunction joinDefinitionListsTransform(tr: Transform) {\n  const nodeType = tr.doc.type.schema.nodes.definition_list;\n  const lists = findChildrenByType(tr.doc, nodeType, true);\n  for (const list of lists) {\n    // NOTE: no mapping (checking for deletion + getting the updated\n    // position) is required here because we only ever do one transform\n    // (see return after tr.join below)\n    const listPos = tr.doc.resolve(list.pos + 1);\n    const listIndex = listPos.index(listPos.depth - 1);\n    const listParent = listPos.node(listPos.depth - 1);\n    if (listIndex + 1 < listParent.childCount) {\n      const nextNode = listParent.child(listIndex + 1);\n      if (nextNode.type === nodeType) {\n        tr.join(list.pos + list.node.nodeSize);\n        return;\n      }\n    }\n  }\n}\n","/*\n * definition_list-keys.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport {\n  findParentNodeOfType,\n  findParentNodeOfTypeClosestToPos,\n  setTextSelection,\n  hasParentNodeOfType,\n  ContentNodeWithPos,\n} from 'prosemirror-utils';\n\nimport { isLastChild, isOnlyChild } from '../../api/position';\n\nexport function definitionListEnter() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // process if we are within a definition list\n    const schema = state.schema;\n    const parentDL = findParentNodeOfType(schema.nodes.definition_list)(state.selection);\n    if (!parentDL) {\n      return false;\n    }\n\n    // handle only empty selections\n    if (!state.selection.empty) {\n      return false;\n    }\n\n    // handle enter in either a term or definition\n    const parentTerm = findParentNodeOfType(schema.nodes.definition_list_term)(state.selection);\n    if (parentTerm) {\n      return termEnter(parentTerm, state, dispatch);\n\n      // enter in trailing empty description paragraph (append a term)\n    } else if (isTrailingEmptyParagraph(state)) {\n      if (dispatch) {\n        endOfDescriptionEnter(state, dispatch);\n      }\n      return true;\n    } else {\n      return false;\n    }\n  };\n}\n\nexport function definitionListBackspace() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // process if we are within a definition item\n    const schema = state.schema;\n    const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n    const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n    if (!parentTerm) {\n      return false;\n    }\n\n    if (parentTerm.node.type === schema.nodes.definition_list_term) {\n      // if it's empty\n      if (parentTerm.node.childCount === 0) {\n        if (dispatch) {\n          emptyTermBackspace(state, dispatch);\n        }\n        return true;\n      }\n    } else {\n      // if the enclosing description is empty then delete it\n      if (parentTerm.node.textContent.length === 0) {\n        if (dispatch) {\n          emptyDescriptionBackspace(parentTerm, state, dispatch);\n        }\n\n        return true;\n      }\n    }\n\n    return false;\n  };\n}\n\nexport function definitionListTab() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // process if we are within a definition_term\n    const schema = state.schema;\n    const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n    const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n    if (!parentTerm) {\n      return false;\n    }\n\n    // advance past node\n    if (dispatch) {\n      const tr = state.tr;\n      const advancePos = parentTerm.pos + parentTerm.node.nodeSize;\n      setTextSelection(advancePos, 1)(tr).scrollIntoView();\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nexport function definitionListShiftTab() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // process if we are within a definition_term\n    const schema = state.schema;\n    const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n    const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n    if (!parentTerm) {\n      return false;\n    }\n\n    if (dispatch) {\n      const tr = state.tr;\n      const backwardPos = state.doc.resolve(parentTerm.pos - 1);\n      const prevNode = findParentNodeOfTypeClosestToPos(backwardPos, dlTypes);\n      if (prevNode) {\n        setTextSelection(prevNode.start, 1)(tr).scrollIntoView();\n      } else {\n        const listNode = findParentNodeOfType(schema.nodes.definition_list)(tr.selection)!;\n        setTextSelection(listNode.pos, -1)(tr).scrollIntoView();\n      }\n\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nfunction termEnter(term: ContentNodeWithPos, state: EditorState, dispatch?: (tr: Transaction) => void) {\n  const schema = state.schema;\n  const $head = state.selection.$head;\n\n  // only handle empty selections\n  if (!state.selection.empty) {\n    return false;\n  }\n\n  // if we are empty then it's an exit (delete the term)\n  const isEmpty = term.node.textContent.length === 0;\n  if (isEmpty) {\n    if (dispatch) {\n      const tr = state.tr;\n      tr.deleteRange(term.pos, term.pos + term.node.nodeSize);\n      tr.replaceSelectionWith(schema.nodes.paragraph.create());\n      setTextSelection(tr.mapping.map(state.selection.from), 1)(tr);\n      dispatch(tr);\n    }\n    return true;\n\n    // variable handling for non-empty\n  } else {\n    // selection at the beginning means insert another term above\n    if ($head.parentOffset === 0) {\n      if (dispatch) {\n        const tr = state.tr;\n        const insertPos = tr.selection.$head.before($head.depth);\n        tr.insert(insertPos, schema.nodes.definition_list_term.create());\n        dispatch(tr);\n      }\n      return true;\n\n      // selection at the end means insert a description below\n    } else if ($head.parentOffset === term.node.textContent.length) {\n      if (dispatch) {\n        const tr = state.tr;\n        const insertPos = tr.selection.$head.after($head.depth);\n        tr.insert(\n          insertPos,\n          schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n        );\n        setTextSelection(insertPos, 1)(tr).scrollIntoView();\n        dispatch(tr);\n      }\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction emptyTermBackspace(state: EditorState, dispatch: (tr: Transaction) => void) {\n  const { $head } = state.selection;\n  const tr = state.tr;\n  // if it's the only child then delete the entire list\n  if (isOnlyChild($head)) {\n    const start = $head.start($head.depth - 1) - 1;\n    tr.deleteRange(start, start + $head.node($head.depth - 1).nodeSize);\n  } else {\n    const start = $head.start($head.depth) - 1;\n    tr.deleteRange(start, start + $head.node($head.depth).nodeSize);\n  }\n  dispatch(tr);\n}\n\nfunction endOfDescriptionEnter(state: EditorState, dispatch: (tr: Transaction) => void) {\n  const schema = state.schema;\n  const { $head } = state.selection;\n  const selectionNode = $head.node($head.depth);\n\n  const tr = state.tr;\n\n  // if the parent description is empty then delete it\n  let start = null;\n  const descriptionNode = $head.node($head.depth - 1);\n  if (descriptionNode.textContent.trim().length === 0) {\n    start = $head.start($head.depth - 1) - 1;\n    tr.deleteRange(start, start + descriptionNode.nodeSize);\n\n    // only if at very end\n    if (isLastChild($head, 2)) {\n      const insertPos = tr.mapping.map($head.after($head.depth - 2));\n      tr.insert(insertPos, schema.nodes.paragraph.create());\n      setTextSelection(insertPos, 1)(tr).scrollIntoView();\n    }\n\n    // otherwise just delete the paragraph and insert a term\n  } else {\n    start = $head.start($head.depth) - 1;\n    tr.deleteRange(start, start + selectionNode.nodeSize);\n    start = tr.mapping.map(start);\n    tr.insert(start + 1, schema.nodes.definition_list_term.create());\n    setTextSelection(start, 1)(tr).scrollIntoView();\n  }\n\n  dispatch(tr);\n}\n\nfunction emptyDescriptionBackspace(\n  description: ContentNodeWithPos,\n  state: EditorState,\n  dispatch: (tr: Transaction) => void,\n) {\n  const tr = state.tr;\n  tr.deleteRange(description.pos, description.pos + description.node.nodeSize);\n  dispatch(tr);\n}\n\nfunction isTrailingEmptyParagraph(state: EditorState) {\n  const { $head } = state.selection;\n  const selectionNode = $head.node($head.depth);\n  const isParagraph = selectionNode.type === state.schema.nodes.paragraph;\n  const isEmpty = selectionNode.textContent.trim().length === 0;\n  return isParagraph && isEmpty && isLastChild($head);\n}\n\n// eslint-disable-next-line\nfunction selectionCrossesListBoundary(state: EditorState) {\n  const { $head, $anchor } = state.selection;\n  const headInDL = hasParentNodeOfType(state.schema.nodes.definition_list)(TextSelection.near($head));\n  const anchorInDL = hasParentNodeOfType(state.schema.nodes.definition_list)(TextSelection.near($anchor));\n  return headInDL !== anchorInDL;\n}\n","/*\n * definition_list-inputrule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\nimport { setTextSelection, findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nimport { insertDefinitionList } from './definition_list-insert';\n\nexport function definitionInputRule() {\n  return new InputRule(/^:[ ]+$/, (state: EditorState, match: string[], start: number, end: number) => {\n    const schema = state.schema;\n\n    // if we are inside a definiition list description this means start a new description\n    const { $head } = state.selection;\n    const container = $head.node($head.depth - 1);\n    const parent = $head.node($head.depth);\n\n    // must be just ': '\n    if (parent.textContent.trim() !== ':') {\n      return null;\n    }\n\n    // check for : within a definition list description\n    if (container.type === schema.nodes.definition_list_description && parent.type === schema.nodes.paragraph) {\n      const tr = state.tr;\n      const startPos = $head.start($head.depth) - 1;\n      tr.deleteRange(startPos, startPos + $head.node($head.depth).nodeSize);\n      const insertPos = tr.mapping.map(startPos) + 1;\n      tr.insert(\n        insertPos,\n        schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n      );\n      setTextSelection(insertPos, 1)(tr).scrollIntoView();\n      return tr;\n\n      // check for : in a paragraph immediately after another paragraph\n    } else if (container.type !== schema.nodes.definition_list_description && isParagraphAfterParagraph(state)) {\n      const prevPara = findParentNodeOfTypeClosestToPos(state.doc.resolve(start - 2), schema.nodes.paragraph);\n      if (prevPara) {\n        const tr = state.tr;\n        tr.deleteRange(prevPara.start, end);\n        insertDefinitionList(tr, [\n          schema.nodes.definition_list_term.createAndFill({}, prevPara.node.content)!,\n          schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n        ]);\n        return tr;\n      } else {\n        return null;\n      }\n    } else {\n      return null;\n    }\n  });\n}\n\nfunction isParagraphAfterParagraph(state: EditorState) {\n  const schema = state.schema;\n  const { $head } = state.selection;\n\n  // check if the selection is in a paragraph\n  const selectionInParagraph = $head.node($head.depth).type === schema.nodes.paragraph;\n  if (!selectionInParagraph) {\n    return false;\n  }\n\n  // check if the previous node is a paragraph\n  const parent = $head.node($head.depth - 1);\n  const parentIndex = $head.index($head.depth - 1);\n  return parentIndex > 0 && parent.child(parentIndex - 1).type === schema.nodes.paragraph;\n}\n","/*\n * position.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos } from 'prosemirror-model';\n\nexport function isOnlyChild(pos: ResolvedPos, depthOffset = 1) {\n  return pos.node(pos.depth - depthOffset).childCount === 1;\n}\n\nexport function isLastChild(pos: ResolvedPos, depthOffset = 1) {\n  return pos.index(pos.depth - depthOffset) === pos.node(pos.depth - depthOffset).childCount - 1;\n}\n","/*\n * definition_list-pandoc.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ProsemirrorWriter, PandocToken, PandocOutput, PandocTokenType } from '../../api/pandoc';\n\nexport function readPandocDefinitionList(schema: Schema) {\n  return (writer: ProsemirrorWriter, tok: PandocToken) => {\n    writer.openNode(schema.nodes.definition_list, {});\n\n    const definitions = tok.c;\n    definitions.forEach((definition: [PandocToken[], PandocToken[][]]) => {\n      const term = definition[0];\n      writer.openNode(schema.nodes.definition_list_term, {});\n      writer.writeTokens(term);\n      writer.closeNode();\n\n      const descriptions = definition[1];\n      descriptions.forEach(description => {\n        writer.openNode(schema.nodes.definition_list_description, {});\n        writer.writeTokens(description);\n        writer.closeNode();\n      });\n    });\n    writer.closeNode();\n  };\n}\n\nexport function writePandocDefinitionList(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeToken(PandocTokenType.DefinitionList, () => {\n    // collect terms and descriptions\n    const currentDefinition: {\n      term?: ProsemirrorNode;\n      descriptions: ProsemirrorNode[];\n    } = { descriptions: new Array<ProsemirrorNode>() };\n\n    // functions to manipulate current definition\n    function writeCurrent() {\n      if (currentDefinition.term) {\n        output.writeArray(() => {\n          output.writeNode(currentDefinition.term!);\n          output.writeArray(() => {\n            currentDefinition.descriptions.forEach(description => {\n              output.writeNode(description);\n            });\n          });\n        });\n      }\n    }\n\n    // write the list\n    node.forEach(child => {\n      if (child.type === child.type.schema.nodes.definition_list_term) {\n        writeCurrent();\n        currentDefinition.term = child;\n        currentDefinition.descriptions = [];\n      } else {\n        currentDefinition.descriptions.push(child);\n      }\n    });\n    writeCurrent();\n  });\n}\n\nexport function writePandocDefinitionListTerm(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeArray(() => {\n    output.writeInlines(node.content);\n  });\n}\n\nexport function writePandocDefinitionListDescription(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeArray(() => {\n    output.writeNodes(node);\n  });\n}\n","/*\n * shortcode_block.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocOutput, PandocTokenType, PandocToken, stringifyTokens, ProsemirrorWriter } from '../api/pandoc';\n\nimport { kHugoDocType } from '../api/format';\n\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { codeNodeSpec } from '../api/code';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { canInsertNode } from '../api/node';\nimport { kShortcodeRegEx } from '../api/shortcode';\nimport {\n  PandocBlockCapsuleFilter,\n  blockCapsuleParagraphTokenHandler,\n  encodedBlockCapsuleRegex,\n  PandocBlockCapsule,\n  blockCapsuleTextHandler,\n  blockCapsuleSourceWithoutPrefix,\n} from '../api/pandoc_capsule';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { format } = context;\n\n  // return null if no shortcodes\n  if (!format.hugoExtensions.shortcodes) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'shortcode_block',\n\n        spec: {\n          ...codeNodeSpec(),\n          attrs: {},\n          parseDOM: [\n            {\n              tag: \"div[class*='shortcode-block']\",\n              preserveWhitespace: 'full',\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return ['div', { class: 'shortcode-block pm-fixedwidth-font pm-code-block pm-markup-text-color' }, 0];\n          },\n        },\n\n        code_view: {\n          lang: () => 'text',\n          borderColorClass: 'pm-raw-block-border',\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.shortcode_block,\n          tags: () => ['shortcode'],\n          editFn: () => () => false,\n        }),\n\n        pandoc: {\n          // unroll shortcode from paragraph with single shortcode\n          blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n            if (isParaWrappingShortcode(tok)) {\n              const text = stringifyTokens(tok.c);\n              writer.addNode(schema.nodes.shortcode_block, {}, [schema.text(text)]);\n              return true;\n            } else {\n              return false;\n            }\n          },\n\n          // capture shortcuts w/ begin/end tags\n          blockCapsuleFilter: shortcodeBlockCapsuleFilter(),\n\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Para, () => {\n              output.writeRawMarkdown(node.content);\n            });\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      // only create command for hugo doc types\n      if (!format.docTypes.includes(kHugoDocType)) {\n        return [];\n      }\n\n      return [\n        new ProsemirrorCommand(\n          EditorCommandId.Shortcode,\n          [],\n          (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n            // enable/disable command\n            if (!canInsertNode(state, schema.nodes.shortcode_block)) {\n              return false;\n            }\n            if (dispatch) {\n              const tr = state.tr;\n              const shortcode = '{{<  >}}';\n              const shortcodeNode = schema.nodes.shortcode_block.create({}, schema.text(shortcode));\n              tr.replaceSelectionWith(shortcodeNode);\n              setTextSelection(tr.mapping.map(state.selection.from) - shortcode.length / 2 - 1)(tr);\n              dispatch(tr);\n            }\n            return true;\n          },\n        ),\n      ];\n    },\n  };\n};\n\nfunction isParaWrappingShortcode(tok: PandocToken) {\n  if (tok.t === PandocTokenType.Para) {\n    // qualify that this paragraph has text that begins with {{< (so that\n    // we don't end up scanning every token of every paragraph )\n    const children: PandocToken[] = tok.c;\n    if (tok.c.length > 1) {\n      const [first, second] = tok.c;\n      const firstText = first.t === PandocTokenType.Str ? first.c : second.c;\n      if (typeof firstText === 'string' && firstText.startsWith('{{<')) {\n        const text = stringifyTokens(children);\n        return !!text.match(kShortcodeRegEx);\n      }\n    }\n  }\n  return false;\n}\n\nexport function shortcodeBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n  const kShortcodeBlockCapsuleType = 'B65B58FD-D707-4C30-8C97-3D99ACF9A157'.toLowerCase();\n\n  return {\n    type: kShortcodeBlockCapsuleType,\n\n    // eslint-disable-next-line no-useless-escape\n    match: /^([\\t >]*)(\\{\\{<\\s+([^\\/][^\\t ]+).*?>\\}\\}[ \\t]*\\n(?![ \\t]*\\n)[\\W\\w]*?\\n[\\t >]*\\{\\{<\\s+\\/\\3\\s+>\\}\\})([ \\t]*)$/gm,\n\n    extract: (_match: string, p1: string, p2: string, _p3: string, p4: string) => {\n      return {\n        prefix: p1,\n        source: p2,\n        suffix: p4,\n      };\n    },\n\n    // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n    // (in this case we don't do anything because pandoc would have written this table as a\n    // semantically standalone block)\n    enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n      return capsuleText;\n    },\n\n    // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n    // and if we find it, parse and return the original source code\n    handleText: blockCapsuleTextHandler(\n      kShortcodeBlockCapsuleType,\n      encodedBlockCapsuleRegex(undefined, undefined, 'gm'),\n    ),\n\n    // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n    // if find that then return the block capsule text\n    handleToken: blockCapsuleParagraphTokenHandler(kShortcodeBlockCapsuleType),\n\n    // write the node\n    writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n      // remove the source prefix\n      const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n      // write the node\n      writer.addNode(schema.nodes.shortcode_block, {}, [schema.text(source)]);\n    },\n  };\n}\n\nexport default extension;\n","/*\n * html_preserve.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { PandocOutput, PandocTokenType, ProsemirrorWriter } from '../api/pandoc';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { codeNodeSpec } from '../api/code';\n\nimport {\n  PandocBlockCapsuleFilter,\n  blockCapsuleParagraphTokenHandler,\n  encodedBlockCapsuleRegex,\n  PandocBlockCapsule,\n  blockCapsuleTextHandler,\n  blockCapsuleSourceWithoutPrefix,\n} from '../api/pandoc_capsule';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { format } = context;\n\n  return {\n    nodes: [\n      {\n        name: 'html_preserve',\n\n        spec: {\n          ...codeNodeSpec(),\n          attrs: {},\n          parseDOM: [\n            {\n              tag: \"div[class*='pm-html-preserve']\",\n              preserveWhitespace: 'full',\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return ['div', { class: 'pm-html-preserve pm-fixedwidth-font pm-code-block pm-markup-text-color' }, 0];\n          },\n        },\n\n        code_view: {\n          lang: () => 'html',\n          borderColorClass: 'pm-raw-block-border',\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.html_preserve,\n          tags: () => ['html_preserve'],\n          editFn: () => () => false,\n        }),\n\n        pandoc: {\n          // capture shortcuts w/ begin/end tags\n          blockCapsuleFilter: htmlPreserveBlockCapsuleFilter(),\n\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Para, () => {\n              output.writeRawMarkdown(node.content);\n            });\n          },\n        },\n      },\n    ],\n  };\n};\n\nexport function htmlPreserveBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n  const kHtmlPreserveBlockCapsuleType = '83CFCBF3-0429-4822-AAC6-D6F31591AEA8'.toLowerCase();\n\n  return {\n    type: kHtmlPreserveBlockCapsuleType,\n\n    // eslint-disable-next-line no-useless-escape\n    match: /^([\\t >]*)(<!--html_preserve-->[\\W\\w]*?<!--\\/html_preserve-->)([ \\t]*)$/gm,\n\n    extract: (_match: string, p1: string, p2: string, p3: string) => {\n      return {\n        prefix: p1,\n        source: p2,\n        suffix: p3,\n      };\n    },\n\n    // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n    // (in this case we don't do anything because pandoc would have written this as a\n    // semantically standalone block)\n    enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n      return capsuleText;\n    },\n\n    // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n    // and if we find it, parse and return the original source code\n    handleText: blockCapsuleTextHandler(\n      kHtmlPreserveBlockCapsuleType,\n      encodedBlockCapsuleRegex(undefined, undefined, 'gm'),\n    ),\n\n    // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n    // if find that then return the block capsule text\n    handleToken: blockCapsuleParagraphTokenHandler(kHtmlPreserveBlockCapsuleType),\n\n    // write the node\n    writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n      // remove the source prefix\n      const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n      // write the node\n      writer.addNode(schema.nodes.html_preserve, {}, [schema.text(source)]);\n    },\n  };\n}\n\nexport default extension;\n","/*\n * ace.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport {\n  Plugin,\n  PluginKey,\n  TextSelection,\n  EditorState,\n  Transaction,\n  Selection,\n  NodeSelection,\n} from 'prosemirror-state';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView, NodeView, Decoration } from 'prosemirror-view';\nimport { undo, redo } from 'prosemirror-history';\nimport { exitCode } from 'prosemirror-commands';\nimport { keymap } from 'prosemirror-keymap';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport { CodeViewOptions, editingRootNode } from '../../api/node';\nimport { insertParagraph } from '../../api/paragraph';\nimport { createImageButton } from '../../api/widgets/widgets';\nimport { EditorUI, ChunkEditor } from '../../api/ui';\nimport { EditorOptions } from '../../api/options';\nimport { EditorEvents } from '../../api/events';\nimport { kPlatformMac } from '../../api/platform';\nimport { rmdChunk, previousExecutableRmdChunks, mergeRmdChunks } from '../../api/rmd';\nimport { ExtensionContext } from '../../api/extension';\nimport { DispatchEvent, ResizeEvent, ScrollEvent } from '../../api/event-types';\nimport { verticalArrowCanAdvanceWithinTextBlock } from '../../api/basekeys';\nimport { handleArrowToAdjacentNode } from '../../api/cursor';\n\nimport { selectAll } from '../../behaviors/select_all';\nimport { findPluginState } from '../../behaviors/find';\n\nimport { AceRenderQueue } from './ace-render-queue';\nimport { AcePlaceholder } from './ace-placeholder';\nimport { AceNodeViews } from './ace-node-views';\n\nimport zenscroll from 'zenscroll';\n\nimport './ace.css';\n\nconst plugin = new PluginKey('ace');\n\nexport function acePlugins(codeViews: { [key: string]: CodeViewOptions }, context: ExtensionContext): Plugin[] {\n  // shared services\n  const aceRenderQueue = new AceRenderQueue(context.events);\n  const aceNodeViews = new AceNodeViews();\n\n  // build nodeViews\n  const nodeTypes = Object.keys(codeViews);\n  const nodeViews: {\n    [name: string]: (node: ProsemirrorNode<any>, view: EditorView<any>, getPos: boolean | (() => number)) => NodeView;\n  } = {};\n  nodeTypes.forEach(name => {\n    nodeViews[name] = (node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) => {\n      return new AceNodeView(\n        node,\n        view,\n        getPos as () => number,\n        context,\n        codeViews[name],\n        aceRenderQueue,\n        aceNodeViews,\n      );\n    };\n  });\n\n  return [\n    new Plugin({\n      key: plugin,\n      props: {\n        nodeViews,\n        handleDOMEvents: {\n          click: aceNodeViews.handleClick.bind(aceNodeViews),\n        },\n      },\n    }),\n    // arrow in and out of editor\n    keymap({\n      ArrowLeft: arrowHandler('left', nodeTypes),\n      ArrowRight: arrowHandler('right', nodeTypes),\n      ArrowUp: arrowHandler('up', nodeTypes),\n      ArrowDown: arrowHandler('down', nodeTypes),\n    }),\n  ];\n}\n\n/**\n * Represents a selection that was applied prior to the editor rendering (needs\n * to be applied when the editor rendering completes)\n */\nclass QueuedSelection {\n  constructor(public readonly anchor: number, public readonly head: number) {}\n}\n\nexport class AceNodeView implements NodeView {\n  public readonly getPos: () => number;\n  public node: ProsemirrorNode;\n  public readonly dom: HTMLElement;\n\n  private readonly view: EditorView;\n  private readonly ui: EditorUI;\n  private readonly nodeViews: AceNodeViews;\n  private readonly renderQueue: AceRenderQueue;\n  private chunk?: ChunkEditor;\n  private aceEditor?: AceAjax.Editor;\n  private editSession?: AceAjax.IEditSession;\n  private readonly editorOptions: EditorOptions;\n  private readonly options: CodeViewOptions;\n  private readonly events: EditorEvents;\n\n  private updating: boolean;\n  private escaping: boolean;\n  private gapCursorPending: boolean;\n  private mouseDown: boolean;\n  private mode: string;\n  private findMarkers: number[];\n  private selectionMarker: number | null;\n  private queuedSelection: QueuedSelection | null;\n  private resizeTimer: number;\n  private renderedWidth: number;\n  private scrollRow: number;\n  private cursorDirty: boolean;\n\n  private readonly subscriptions: VoidFunction[];\n\n  constructor(\n    node: ProsemirrorNode,\n    view: EditorView,\n    getPos: () => number,\n    context: ExtensionContext,\n    options: CodeViewOptions,\n    renderQueue: AceRenderQueue,\n    nodeViews: AceNodeViews,\n  ) {\n    // context\n    const ui = context.ui;\n    const editorOptions = context.options;\n\n    // Store for later\n    this.node = node;\n    this.view = view;\n    this.ui = context.ui;\n    this.events = context.events;\n    this.getPos = getPos;\n\n    // Initialize values\n    this.mode = '';\n    this.escaping = false;\n    this.gapCursorPending = false;\n    this.findMarkers = [];\n    this.selectionMarker = null;\n    this.renderQueue = renderQueue;\n    this.nodeViews = nodeViews;\n    this.queuedSelection = null;\n    this.subscriptions = [];\n    this.resizeTimer = 0;\n    this.renderedWidth = 0;\n    this.scrollRow = -1;\n    this.cursorDirty = false;\n    this.mouseDown = false;\n\n    // options\n    this.editorOptions = editorOptions;\n    this.options = options;\n\n    // The editor's outer node is our DOM representation\n    this.dom = document.createElement('div');\n    this.dom.classList.add('pm-code-editor');\n    this.dom.classList.add('pm-ace-editor');\n    this.dom.classList.add('pm-ace-editor-inactive');\n    this.dom.classList.add(options.borderColorClass || 'pm-block-border-color');\n    if (this.options.classes) {\n      this.options.classes.forEach(className => this.dom.classList.add(className));\n    }\n\n    // Create a preview of the text (will be shown until editor is fully initialized)\n    const preview = new AcePlaceholder(node.textContent);\n    this.dom.appendChild(preview.getElement());\n\n    // Style the first line differently if requested\n    if (options.firstLineMeta) {\n      this.dom.classList.add('pm-ace-first-line-meta');\n    }\n\n    // update mode\n    this.updateMode();\n\n    // observe all editor dispatches\n    this.subscriptions.push(\n      this.events.subscribe(DispatchEvent, (tr: Transaction | undefined) => {\n        if (tr) {\n          this.onEditorDispatch(tr);\n        }\n      }),\n    );\n\n    // This flag is used to avoid an update loop between the outer and\n    // inner editor\n    this.updating = false;\n\n    if (renderQueue.isRenderCompleted()) {\n      // All editors have been rendered and the queue is empty; initialize\n      // directly (this happens when e.g., inserting code chunks interactively\n      // after the document is fully rendered)\n      this.initEditor();\n    } else {\n      // Rendering is not complete; add to the queue\n      renderQueue.add(this);\n    }\n\n    // add ourselves to the list of all ace node views\n    this.nodeViews.add(this);\n  }\n\n  public destroy() {\n    // Unsubscribe from events\n    this.subscriptions.forEach(unsub => unsub());\n\n    // Clean up attached editor instance when it's removed from the DOM\n    if (this.chunk) {\n      this.chunk.destroy();\n    }\n\n    // remove ourselves from the list of all ace node views\n    this.nodeViews.remove(this);\n  }\n\n  public update(node: ProsemirrorNode, _decos: Decoration[]) {\n    if (node.type !== this.node.type) {\n      return false;\n    }\n    if (!this.editSession) {\n      return false;\n    }\n    this.node = node;\n    this.updateMode();\n\n    const AceRange = window.require('ace/range').Range;\n    const doc = this.editSession.getDocument();\n\n    const change = computeChange(this.editSession.getValue(), node.textContent);\n    if (change) {\n      this.updating = true;\n      const range = AceRange.fromPoints(doc.indexToPosition(change.from, 0), doc.indexToPosition(change.to, 0));\n      this.editSession.replace(range, change.text);\n      this.updating = false;\n    }\n\n    // Clear any previously rendered find markers\n    this.findMarkers.forEach(id => {\n      if (this.editSession) {\n        this.editSession.removeMarker(id);\n      }\n    });\n    this.findMarkers = [];\n\n    // Get all of the find results inside this node\n    const decorations = findPluginState(this.view.state);\n    if (decorations) {\n      const decos = decorations?.find(this.getPos(), this.getPos() + node.nodeSize - 1);\n\n      // If we got results, render them\n      if (decos) {\n        decos.forEach((deco: any) => {\n          if (!this.editSession) {\n            return;\n          }\n\n          // Calculate from/to position for result marker (adjust for zero based column)\n          const markerFrom = doc.indexToPosition(deco.from - this.getPos(), 0);\n          markerFrom.column--;\n          const markerTo = doc.indexToPosition(deco.to - this.getPos(), 0);\n          markerTo.column--;\n          const range = AceRange.fromPoints(markerFrom, markerTo);\n\n          // Create the search result marker and add it to the rendered set\n          const markerId = this.editSession.addMarker(range, deco.type.attrs.class, 'result', true);\n          this.findMarkers.push(markerId);\n        });\n      }\n    }\n\n    return true;\n  }\n\n  public setSelection(anchor: number, head: number) {\n    // We haven't drawn the editor yet, so queue the selection until we can\n    // apply it.\n    if (!this.aceEditor || !this.editSession) {\n      this.queuedSelection = new QueuedSelection(anchor, head);\n      return;\n    }\n    if (!this.escaping && !this.gapCursorPending) {\n      this.aceEditor.focus();\n    }\n    this.updating = true;\n    const doc = this.editSession.getDocument();\n    const AceRange = window.require('ace/range').Range;\n    const range = AceRange.fromPoints(doc.indexToPosition(anchor, 0), doc.indexToPosition(head, 0));\n    this.editSession.getSelection().setSelectionRange(range);\n    this.updating = false;\n  }\n\n  public setGapCursorPending(pending: boolean) {\n    this.gapCursorPending = pending;\n  }\n\n  public selectNode() {\n    if (this.aceEditor) {\n      this.aceEditor.focus();\n    }\n  }\n\n  public stopEvent() {\n    return true;\n  }\n\n  public ignoreMutation(_mutation: MutationRecord | { type: 'selection'; target: Element }) {\n    return true;\n  }\n\n  private onEditorDispatch(tr: Transaction) {\n    if (!tr.docChanged && tr.selectionSet) {\n      this.highlightSelectionAcross(tr.selection);\n    }\n  }\n\n  private forwardSelection() {\n    // ignore if we don't have focus\n    if (!this.chunk || !this.chunk.element.contains(window.document.activeElement)) {\n      return;\n    }\n\n    const state = this.view.state;\n    const selection = this.asProseMirrorSelection(state.doc);\n    if (selection && !selection.eq(state.selection)) {\n      this.view.dispatch(state.tr.setSelection(selection));\n    }\n  }\n\n  private asProseMirrorSelection(doc: ProsemirrorNode) {\n    if (!this.editSession) {\n      return null;\n    }\n    const offset = this.getPos() + 1;\n    const session = this.editSession;\n    const range = session.getSelection().getRange();\n    const anchor = session.getDocument().positionToIndex(range.start, 0) + offset;\n    const head = session.getDocument().positionToIndex(range.end, 0) + offset;\n    return TextSelection.create(doc, anchor, head);\n  }\n\n  // detect the entire editor being selected across, in which case we add an ace marker\n  // visually indicating that the text is selected\n  private highlightSelectionAcross(selection: Selection) {\n    if (!this.aceEditor || !this.editSession) {\n      return;\n    }\n\n    // clear any existing selection marker\n    if (this.selectionMarker !== null) {\n      this.editSession.removeMarker(this.selectionMarker);\n      this.selectionMarker = null;\n    }\n\n    // check for selection spanning us\n    const pos = this.getPos();\n    if (selection.from < pos && selection.to > pos + this.node.nodeSize) {\n      const doc = this.editSession.getDocument();\n      const AceRange = window.require('ace/range').Range;\n      const range = AceRange.fromPoints(doc.indexToPosition(0, 0), doc.indexToPosition(this.node.nodeSize - 1, 0));\n      this.selectionMarker = this.editSession.addMarker(range, 'pm-selected-text', 'selection', true);\n    }\n  }\n\n  private valueChanged() {\n    const change = computeChange(this.node.textContent, this.getContents());\n    if (change) {\n      // update content\n      const start = this.getPos() + 1;\n      if (!isNaN(start)) {\n        const tr = this.view.state.tr.replaceWith(\n          start + change.from,\n          start + change.to,\n          change.text ? this.node.type.schema.text(change.text) : null,\n        );\n        this.view.dispatch(tr);\n      }\n    }\n    this.updateMode();\n  }\n\n  /**\n   * Scrolls a child of the editor chunk into view.\n   *\n   * @param ele The child to scroll.\n   */\n  private scrollIntoView(ele: HTMLElement) {\n    const editingRoot = editingRootNode(this.view.state.selection);\n    if (editingRoot) {\n      const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n      const scroller = zenscroll.createScroller(container);\n\n      // Since the element we want to scroll into view is not a direct child of\n      // the scrollable container, do a little math to figure out the\n      // destination scroll position.\n      const top = ele.offsetTop + this.dom.offsetTop;\n      const bottom = top + ele.offsetHeight;\n      const viewTop = container.scrollTop;\n      const viewBottom = container.scrollTop + container.offsetHeight;\n\n      // Scroll based on element's current position and size\n      if (top > viewTop && bottom < viewBottom) {\n        // Element is already fully contained in the viewport\n        return;\n      } else if (ele.offsetHeight > container.offsetHeight) {\n        // Element is taller than the viewport, so show the first part of it\n        scroller.toY(top);\n      } else if (top < viewTop) {\n        // Element is above viewport, so scroll it into view\n        scroller.toY(top);\n      } else if (bottom > viewBottom) {\n        // Part of the element is beneath the viewport, so scroll just enough to\n        // bring it into view\n        scroller.toY(container.scrollTop - (viewBottom - bottom));\n      }\n    }\n  }\n\n  /**\n   * Initializes the editing surface by creating and injecting an Ace editor\n   * instance from the host.\n   */\n  public initEditor() {\n    // skip if we're already initialized\n    if (this.aceEditor) {\n      return;\n    }\n\n    // call host factory to instantiate editor\n    this.chunk = this.ui.chunks.createChunkEditor('ace', this.node.attrs.md_index, {\n      getPos: () => this.getPos(),\n      scrollIntoView: ele => this.scrollIntoView(ele),\n      scrollCursorIntoView: () => this.scrollCursorIntoView(),\n    });\n\n    // populate initial contents\n    this.aceEditor = this.chunk.editor as AceAjax.Editor;\n    this.updating = true;\n    this.aceEditor.setValue(this.node.textContent);\n    this.updating = false;\n\n    this.aceEditor.clearSelection();\n\n    // cache edit session for convenience; most operations happen on the session\n    this.editSession = this.aceEditor.getSession();\n\n    // remove the preview and recreate chunk toolbar\n    this.dom.innerHTML = '';\n    this.dom.appendChild(this.chunk.element);\n\n    // Propagate updates from the code editor to ProseMirror\n    this.aceEditor.on('changeSelection', () => {\n      if (!this.updating) {\n        this.forwardSelection();\n      }\n    });\n    this.aceEditor.on('change', () => {\n      if (!this.updating) {\n        this.valueChanged();\n      }\n    });\n\n    // Forward selection we we receive it\n    this.aceEditor.on('focus', () => {\n      this.dom.classList.remove('pm-ace-editor-inactive');\n      this.forwardSelection();\n    });\n\n    this.aceEditor.on('blur', () => {\n      // Add a class to editor; this class contains CSS rules that hide editor\n      // components that Ace cannot hide natively (such as the cursor,\n      // matching bracket indicator, and active selection)\n      this.dom.classList.add('pm-ace-editor-inactive');\n    });\n\n    // If the cursor moves and we're in focus, ensure that the cursor is\n    // visible. Ace's own cursor visiblity mechanisms don't work in embedded\n    // editors.\n    this.aceEditor.getSelection().on('changeCursor', () => {\n      if (this.dom.contains(document.activeElement) && !this.mouseDown) {\n        this.cursorDirty = true;\n      }\n    });\n\n    this.aceEditor.renderer.on('afterRender', () => {\n      // If the cursor position is dirty and the mouse is not down, scroll the\n      // cursor into view. Don't scroll while the mouse is down, as it will be\n      // treated as a click-and-drag by Ace.\n      if (this.cursorDirty && !this.mouseDown) {\n        this.scrollCursorIntoView();\n        this.cursorDirty = false;\n      }\n    });\n\n    // Add custom escape commands for movement keys (left/right/up/down); these\n    // will check to see whether the movement should leave the editor, and if\n    // so will do so instead of moving the cursor.\n    this.aceEditor.commands.addCommand({\n      name: 'leftEscape',\n      bindKey: 'Left',\n      exec: () => {\n        this.arrowMaybeEscape('char', -1, 'gotoleft');\n      },\n    });\n    this.aceEditor.commands.addCommand({\n      name: 'rightEscape',\n      bindKey: 'Right',\n      exec: () => {\n        this.arrowMaybeEscape('char', 1, 'gotoright');\n      },\n    });\n    this.aceEditor.commands.addCommand({\n      name: 'upEscape',\n      bindKey: 'Up',\n      exec: () => {\n        this.arrowMaybeEscape('line', -1, 'golineup');\n      },\n    });\n    this.aceEditor.commands.addCommand({\n      name: 'downEscape',\n      bindKey: 'Down',\n      exec: () => {\n        this.arrowMaybeEscape('line', 1, 'golinedown');\n      },\n    });\n\n    // Pressing Backspace in the editor when it's empty should delete it.\n    this.aceEditor.commands.addCommand({\n      name: 'backspaceDeleteNode',\n      bindKey: 'Backspace',\n      exec: () => {\n        this.backspaceMaybeDeleteNode();\n      },\n    });\n\n    // Handle undo/redo in ProseMirror\n    this.aceEditor.commands.addCommand({\n      name: 'undoProsemirror',\n      bindKey: {\n        win: 'Ctrl-Z',\n        mac: 'Command-Z',\n      },\n      exec: () => {\n        if (undo(this.view.state, this.view.dispatch)) {\n          this.view.focus();\n        }\n      },\n    });\n    this.aceEditor.commands.addCommand({\n      name: 'redoProsemirror',\n      bindKey: {\n        win: 'Ctrl-Shift-Z|Ctrl-Y',\n        mac: 'Command-Shift-Z|Command-Y',\n      },\n      exec: () => {\n        if (redo(this.view.state, this.view.dispatch)) {\n          this.view.focus();\n        }\n      },\n    });\n\n    // Handle Select All in ProseMirror\n    this.aceEditor.commands.addCommand({\n      name: 'selectAllProsemirror',\n      bindKey: {\n        win: 'Ctrl-A',\n        mac: 'Command-A',\n      },\n      exec: () => {\n        if (selectAll(this.view.state, this.view.dispatch, this.view)) {\n          this.view.focus();\n        }\n      },\n    });\n\n    // Handle shortcuts for moving focus out of the code editor and into\n    // ProseMirror\n    this.aceEditor.commands.addCommand({\n      name: 'exitCodeBlock',\n      bindKey: 'Shift-Enter',\n      exec: () => {\n        if (exitCode(this.view.state, this.view.dispatch)) {\n          this.view.focus();\n        }\n      },\n    });\n\n    // Create a command for inserting paragraphs from the code editor\n    this.aceEditor.commands.addCommand({\n      name: 'insertParagraph',\n      bindKey: {\n        win: 'Ctrl-\\\\',\n        mac: 'Command-\\\\',\n      },\n      exec: () => {\n        if (insertParagraph(this.view.state, this.view.dispatch)) {\n          this.view.focus();\n        }\n      },\n    });\n\n    // Line-by-line execution\n    this.aceEditor.commands.addCommand({\n      name: 'executeSelection',\n      bindKey: {\n        win: 'Ctrl-Enter',\n        mac: 'Ctrl-Enter|Command-Enter',\n      },\n      exec: () => {\n        if (this.chunk && this.aceEditor) {\n          // Record the position prior to execution\n          const pos = this.aceEditor.getCursorPosition();\n\n          // Execute the selection\n          this.chunk.executeSelection();\n\n          // If the cursor stayed on the last line, step out of the code block\n          // if we're not at the end of the doc (this is a no-op when not on the\n          // last line, and mirrors the behavior when stepping past the end of\n          // chunks in the code editor)\n          if (pos.row === this.aceEditor.getCursorPosition().row) {\n            this.arrowMaybeEscape('line', 1);\n          }\n        }\n      },\n    });\n\n    // If an attribute editor function was supplied, bind it to F4\n    if (this.options.attrEditFn) {\n      this.aceEditor.commands.addCommand({\n        name: 'editAttributes',\n        bindKey: 'F4',\n        exec: () => {\n          this.options.attrEditFn!(this.view.state, this.view.dispatch, this.view);\n        },\n      });\n    }\n\n    // Apply editor mode\n    if (this.mode) {\n      this.chunk.setMode(this.mode);\n    }\n\n    // Disconnect font metrics system after render loop\n    (this.aceEditor.renderer as any).on('afterRender', () => {\n      // Update known rendered width\n      if (this.chunk) {\n        this.renderedWidth = this.chunk.element.offsetWidth;\n      }\n\n      window.setTimeout(() => {\n        if (this.aceEditor) {\n          const metrics = (this.aceEditor.renderer as any).$fontMetrics;\n          if (metrics && metrics.$observer) {\n            metrics.$observer.disconnect();\n          }\n        }\n      }, 0);\n    });\n\n    // Hook up the container to the render queue\n    const editingRoot = editingRootNode(this.view.state.selection)!;\n    const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n    if (container.parentElement) {\n      this.renderQueue.setContainer(container);\n    }\n\n    // Forward selection, if we have one (this can be set while the editor is\n    // waiting to render)\n    if (this.queuedSelection) {\n      this.setSelection(this.queuedSelection.anchor, this.queuedSelection.head);\n      this.queuedSelection = null;\n    }\n\n    // Subscribe to resize event; will reflow the editor to wrap properly at the\n    // new width\n    this.subscriptions.push(\n      this.events.subscribe(ResizeEvent, () => {\n        this.debounceResize();\n      }),\n    );\n\n    // Subscribe to scroll event; invalidates the row we're scrolled to so\n    // scrollback will be triggered if necessary (after e.g., typing after\n    // scrolling offscreen)\n    this.subscriptions.push(\n      this.events.subscribe(ScrollEvent, () => {\n        this.scrollRow = -1;\n      }),\n    );\n\n    // Keep track of mouse state so we can avoid e.g., autoscrolling while the\n    // mouse is down\n    this.dom.addEventListener(\"mousedown\", (evt) => {\n      this.mouseDown = true;\n    });\n    this.dom.addEventListener(\"mouseup\", (evt) => {\n      this.mouseDown = false;\n    });\n    this.dom.addEventListener(\"mouseleave\", (evt) => {\n      // Treat mouse exit as an up since it will cause us to miss the up event\n      this.mouseDown = false;\n    });\n  }\n\n  /**\n   * Debounced version of editor resize; ensures we don't aggressively resize\n   * while size is still changing.\n   */\n  private debounceResize() {\n    // Clear any previously running resize timer\n    if (this.resizeTimer !== 0) {\n      window.clearTimeout(this.resizeTimer);\n    }\n\n    // Create a new resize timer\n    this.resizeTimer = window.setTimeout(() => {\n      if (this.chunk && this.aceEditor) {\n        // If the width we last rendered is different than our current width,\n        // trigger an Ace resize event (causes editor to reflow wrapped text)\n        if (this.renderedWidth !== this.chunk.element.offsetWidth) {\n          this.aceEditor.resize();\n        }\n      }\n      this.resizeTimer = 0;\n    }, 500);\n  }\n\n  private updateMode() {\n    // get lang\n    const lang = this.options.lang(this.node, this.getContents());\n\n    if (lang !== null && this.mode !== lang) {\n      if (this.chunk) {\n        this.chunk.setMode(lang);\n      }\n      this.mode = lang;\n    }\n  }\n\n  private backspaceMaybeDeleteNode() {\n    // if the node is empty and we execute a backspace then delete the node\n    if (this.node.childCount === 0) {\n      // if there is an input rule we just executed then use this to undo it\n      if (undoInputRule(this.view.state)) {\n        undoInputRule(this.view.state, this.view.dispatch);\n        this.view.focus();\n      } else {\n        const tr = this.view.state.tr;\n        tr.delete(this.getPos(), this.getPos() + this.node.nodeSize);\n        tr.setSelection(TextSelection.near(tr.doc.resolve(this.getPos()), -1));\n        this.view.dispatch(tr);\n        this.view.focus();\n      }\n    } else if (this.aceEditor) {\n      this.aceEditor.execCommand('backspace');\n    }\n  }\n\n  // Checks to see whether an arrow key should escape the editor or not. If so,\n  // sends the focus to the right node; if not, executes the given Ace command\n  // (to perform the arrow key's usual action)\n  private arrowMaybeEscape(unit: string, dir: number, command?: string) {\n    if (!this.aceEditor || !this.editSession) {\n      return;\n    }\n    const pos = this.aceEditor.getCursorPosition();\n    const lastrow = this.editSession.getLength() - 1;\n    if (\n      !this.aceEditor.getSelection().isEmpty() ||\n      pos.row !== (dir < 0 ? 0 : lastrow) ||\n      (unit === 'char' && pos.column !== (dir < 0 ? 0 : this.editSession.getDocument().getLine(pos.row).length))\n    ) {\n      // this movement is happening inside the editor itself. don't escape\n      // the editor; just execute the underlying command\n      if (command) {\n        this.aceEditor.execCommand(command);\n      }\n      return;\n    }\n\n    // the cursor is about to leave the editor region; flag this to avoid side\n    // effects\n    this.escaping = true;\n\n    // ensure we are focused\n    this.view.focus();\n\n    // handle arrow key\n    handleArrowToAdjacentNode(this.getPos(), dir, this.view.state, this.view.dispatch);\n\n    // set focus\n    this.view.focus();\n    this.escaping = false;\n  }\n\n  private getContents(): string {\n    if (this.editSession) {\n      return this.editSession.getValue();\n    } else {\n      return this.dom.innerText;\n    }\n  }\n\n  /**\n   * Ensures that the Ace cursor is visible in the scrollable region of the document.\n   */\n  private scrollCursorIntoView(): void {\n    // No need to try to enforce cursor position if we're already scrolled to\n    // this row\n    if (this.editSession && this.editSession.getSelection().getCursor().row === this.scrollRow) {\n      return;\n    }\n\n    // Ensure we still have focus before proceeding\n    if (this.dom.contains(document.activeElement)) {\n\n      // Find the element containing the rendered virtual cursor \n      const cursor = this.dom.querySelector(\".ace_cursor\");\n      if (cursor === null) {\n        return;\n      }\n\n      // Ace doesn't actually move the cursor but uses CSS translations to\n      // make it appear in the right place, so we need to use the somewhat\n      // expensive getBoundingClientRect call to get a resolved position.\n      // (The alternative would be parse the translate: transform(10px 20px))\n      // call from the style property.)\n      const editingRoot = editingRootNode(this.view.state.selection)!;\n      const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n      const containerRect = container.getBoundingClientRect();\n      const cursorRect = cursor.getBoundingClientRect();\n\n      // Scrolling down?\n      const down = cursorRect.bottom + 10 - containerRect.bottom;\n      if (down > 0) {\n        container.scrollTop += down;\n      } else {\n        // Scrolling up?\n        const up = containerRect.top + 10 - cursorRect.top;\n        if (up > 0) {\n          container.scrollTop -= up;\n        }\n      }\n\n      // Update cached scroll row so we don't unnecessarily redo these\n      // computations\n      if (this.editSession) {\n        this.scrollRow = this.editSession.getSelection().getCursor().row;\n      }\n    }\n  }\n}\n\nfunction computeChange(oldVal: string, newVal: string) {\n  if (oldVal === newVal) {\n    return null;\n  }\n  let start = 0;\n  let oldEnd = oldVal.length;\n  let newEnd = newVal.length;\n  while (start < oldEnd && oldVal.charCodeAt(start) === newVal.charCodeAt(start)) {\n    ++start;\n  }\n  while (oldEnd > start && newEnd > start && oldVal.charCodeAt(oldEnd - 1) === newVal.charCodeAt(newEnd - 1)) {\n    oldEnd--;\n    newEnd--;\n  }\n  return {\n    from: start,\n    to: oldEnd,\n    text: newVal.slice(start, newEnd),\n  };\n}\n\nfunction arrowHandler(dir: 'up' | 'down' | 'left' | 'right', nodeTypes: string[]) {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    if (state.selection.empty && !(state.selection instanceof GapCursor) && view && view.endOfTextblock(dir)) {\n      const side = dir === 'left' || dir === 'up' ? -1 : 1;\n      const $head = state.selection.$head;\n      const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n      if (nextPos.$head && nodeTypes.includes(nextPos.$head.parent.type.name)) {\n        // check for e.g. math where you can advance across embedded newlines\n        if ((dir === 'up' || dir === 'down') && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n          return false;\n        }\n        if (dispatch) {\n          dispatch(state.tr.setSelection(nextPos));\n        }\n        return true;\n      }\n    }\n    return false;\n  };\n}\n","/*\n * cursor.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection, Selection } from 'prosemirror-state';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nexport function handleArrowToAdjacentNode(\n  nodePos: number,\n  dir: number,\n  state: EditorState,\n  dispatch?: (tr: Transaction<any>) => void,\n): boolean {\n  // resolve the node and position\n  const node = state.doc.nodeAt(nodePos);\n  if (!node) {\n    return false;\n  }\n  const $pos = state.doc.resolve(nodePos);\n\n  // helpers to figure out the nature of prev/next nodes\n  const prevNodeSelectable = () => {\n    return $pos.nodeBefore && $pos.nodeBefore.type.spec.selectable;\n  };\n  const nextNodeSelectable = () => {\n    const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n    return nextNode?.type.spec.selectable;\n  };\n  const prevNodeTextBlock = () => {\n    return $pos.nodeBefore && $pos.nodeBefore.isTextblock;\n  };\n  const nextNodeTextBlock = () => {\n    const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n    return nextNode?.isTextblock;\n  };\n  const prevNodeCode = () => {\n    return $pos.nodeBefore && !!$pos.nodeBefore.type.spec.code;\n  };\n  const nextNodeCode = () => {\n    const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n    return !!nextNode?.type.spec.code;\n  };\n\n  // see if we can get a new selection\n  const tr = state.tr;\n  let selection: Selection | undefined;\n\n  // if we are going backwards and there is no previous position, then return a gap cursor\n  if (dir < 0 && !$pos.nodeBefore) {\n    selection = new GapCursor(tr.doc.resolve(nodePos), tr.doc.resolve(nodePos));\n\n    // if we are going forwards and there is no next position, then return a gap cursor\n  } else if (dir > 0 && !$pos.nodeAfter) {\n    const cursorPos = nodePos + node.nodeSize;\n    selection = new GapCursor(tr.doc.resolve(cursorPos), tr.doc.resolve(cursorPos));\n\n    // if we are going backwards and the previous node can take node selections then select it\n  } else if (dir < 0 && prevNodeSelectable()) {\n    const prevNodePos = nodePos - $pos.nodeBefore!.nodeSize;\n    selection = NodeSelection.create(tr.doc, prevNodePos);\n\n    // if we are going forwards and the next node can take node selections then select it\n  } else if (dir >= 0 && nextNodeSelectable()) {\n    const nextNodePos = nodePos + node.nodeSize;\n    selection = NodeSelection.create(tr.doc, nextNodePos);\n\n    // if we are going backwards and the previous node is not a text block then create a gap cursor\n  } else if (dir < 0 && (!prevNodeTextBlock() || prevNodeCode())) {\n    selection = new GapCursor(tr.doc.resolve(nodePos), tr.doc.resolve(nodePos));\n\n    // if we are going forwards and the next node is not a text block then create a gap cursor\n  } else if (dir >= 0 && (!nextNodeTextBlock() || nextNodeCode())) {\n    const endPos = nodePos + node.nodeSize;\n    selection = new GapCursor(tr.doc.resolve(endPos), tr.doc.resolve(endPos));\n\n    // otherwise use text selection handling (handles forward/backward text selections)\n  } else {\n    const targetPos = nodePos + (dir < 0 ? 0 : node.nodeSize);\n    const targetNode = tr.doc.nodeAt(targetPos);\n    if (targetNode) {\n      selection = Selection.near(tr.doc.resolve(targetPos), dir);\n    }\n  }\n\n  if (selection) {\n    if (dispatch) {\n      tr.setSelection(selection);\n      dispatch(tr);\n    }\n    return true;\n  } else {\n    return false;\n  }\n}\n","/*\n * ace-render-queue.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { AceNodeView } from './ace';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent, UpdateEvent } from '../../api/event-types';\n\n/**\n * Represents a queue of Ace editor instances that are rendered asynchronously.\n */\nexport class AceRenderQueue {\n  private readonly renderQueue: AceNodeView[] = [];\n\n  private renderCompleted: boolean = false;\n  private renderTimer: number = 0;\n  private updateTimer: number = 0;\n  private container?: HTMLElement;\n  private needsSort: boolean = true;\n  private bypass: number = 5;\n  private observer?: IntersectionObserver;\n  private visible: boolean = true;\n  private readonly subscriptions: VoidFunction[] = [];\n\n  constructor(private events: EditorEvents) {\n    // Begin listening for scroll and update events so we can manage the queue\n    // accordingly\n    this.subscriptions.push(\n      events.subscribe(ScrollEvent, () => {\n        this.onScroll();\n      }),\n    );\n    this.subscriptions.push(\n      events.subscribe(UpdateEvent, () => {\n        this.onUpdate();\n      }),\n    );\n  }\n\n  /**\n   * Sets (or replaces) the scroll container hosting the render queue. The\n   * scroll container is used to prioritize the queue (i.e. objects in the\n   * viewport or close to it are to be given more priority).\n   *\n   * @param container The HTML element of the scroll container\n   */\n  public setContainer(container: HTMLElement) {\n    // Skip if we're already looking at this container\n    if (this.container === container) {\n      return;\n    }\n\n    // Clean up observer on any previous container\n    if (this.observer) {\n      this.observer.disconnect();\n    }\n\n    // Save reference to container\n    this.container = container;\n\n    // Create intersection observer to ensure that we don't needlessly churn\n    // through renders while offscreen.\n    this.observer = new IntersectionObserver(\n      (entries: IntersectionObserverEntry[]) => {\n        for (const entry of entries) {\n          if (entry.isIntersecting && !this.visible) {\n            // We just became visible; process the render queue now.\n            this.visible = true;\n            this.processRenderQueue();\n          }\n          if (!entry.isIntersecting && this.visible) {\n            // We just lost visibility; end processing of the render queue. (Note\n            // that we only do this when connected to the DOM as another reason\n            // the element can become invisible is ProseMirror swapping it out\n            // internally.)\n            if (this.container?.parentElement) {\n              this.visible = false;\n              this.cancelTimer();\n            }\n          }\n        }\n      },\n      {\n        root: null,\n      },\n    );\n\n    // Begin observing intersection events in container\n    this.observer.observe(container);\n  }\n\n  /**\n   * Invoke when the editor surface is scrolled\n   */\n  private onScroll() {\n    // Whenever a scroll event occurs, we need to re-sort the queue so that\n    // objects in or closest to the viewport are given priority.\n    this.needsSort = true;\n\n    // If we don't think we're visible but we're scrolling and have height,\n    // then we are in fact visible. (This catches a case where the\n    // intsersection observer created below doesn't fire for visiblity\n    // changes.)\n    if (!this.visible && this.container && this.container.offsetHeight > 0) {\n      this.visible = true;\n      this.processRenderQueue();\n    }\n  }\n\n  /**\n   * Invoke when the document has changed\n   */\n  private onUpdate() {\n    // Debounce update timer. This timer is used to prevent the CPU intensive\n    // editor rendering from happening while the user is actively updating the\n    // document.\n    if (this.updateTimer !== 0) {\n      window.clearTimeout(this.updateTimer);\n    }\n    this.updateTimer = window.setTimeout(() => {\n      this.updateTimer = 0;\n      // Process queue immediately if we have one\n      this.scheduleRender(0);\n    }, 1000);\n  }\n\n  /**\n   * Indicates whether the render queue has a scroll container defined\n   */\n  public hasContainer(): boolean {\n    if (this.container) {\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Indicates whether the rendering is finished.\n   */\n  public isRenderCompleted(): boolean {\n    return this.renderCompleted;\n  }\n\n  /**\n   * Adds a node view to the render queue\n   */\n  public add(view: AceNodeView) {\n    // We allow the first few code blocks to render synchronously instead of\n    // being dumped into the queue for later processing. This slightly increases\n    // startup time but prevents the flicker that would otherwise occur as\n    // editors render one by one.\n    if (this.bypass > 0) {\n      this.bypass--;\n      view.initEditor();\n      return;\n    }\n\n    this.renderQueue.push(view);\n\n    // Defer/debounce rendering of editors until event loop finishes\n    if (this.renderTimer === 0) {\n      this.scheduleRender(0);\n    }\n  }\n\n  /**\n   * Processes the queue of editor instances that need to be rendered.\n   */\n  private processRenderQueue() {\n    // No work to do if queue is empty\n    if (this.renderQueue.length === 0) {\n      return;\n    }\n\n    // Don't render while hidden; it wastes resources plus can result in\n    // incorrect sizing calculations\n    if (!this.visible) {\n      return;\n    }\n\n    // Don't render while the user is actively updating the document (it makes\n    // the interface sluggish)\n    if (this.updateTimer !== 0) {\n      return;\n    }\n\n    // Compute offset for sorting (based on scroll position)\n    let offset = 0;\n    if (this.container) {\n      offset = this.container.scrollTop;\n    }\n\n    // Sort the queue if required\n    if (this.needsSort) {\n      // Sort the render queue based on distance from the top of the viewport\n      this.renderQueue.sort((a, b) => {\n        return Math.abs(a.dom.offsetTop - offset) - Math.abs(b.dom.offsetTop - offset);\n      });\n\n      // Clear flag so we don't sort the queue on every render\n      this.needsSort = false;\n    }\n\n    // Pop the next view (editor instance) to be rendered off the stack.\n    // Fast-forward past instances that no longer have a position; these can\n    // accumulate when NodeViews are added to the render queue but replaced\n    // (by a document rebuild) before they have a chance to render.\n    let view: AceNodeView | undefined;\n    while ((view === null || view === undefined || view.getPos() === undefined) &&\n           this.renderQueue.length > 0) {\n      view = this.renderQueue.shift();\n    }\n\n    // Render this view\n    if (view) {\n      view.initEditor();\n    }\n\n    if (this.renderQueue.length > 0) {\n      // There are still remaining editors to be rendered, so process again on\n      // the next event loop.\n      //\n      // If these editors are near the viewport, render them as soon as\n      // possible; otherwise, let the render proceed at a slower pace to\n      // increase responsiveness.\n      let delayMs = 1000;\n      if (this.container) {\n        const distance = Math.abs(this.renderQueue[0].dom.offsetTop - offset);\n        if (distance < this.container.offsetHeight * 2) {\n          // Container is near the viewport, so render it ASAP\n          delayMs = 0;\n        }\n      }\n      this.scheduleRender(delayMs);\n    } else {\n      // No remaining editors; we're done.\n      this.renderCompleted = true;\n      this.destroy();\n    }\n  }\n\n  /**\n   * Cancels the timer that is responsible for triggering the processing of the\n   * next unit in the render queue.\n   */\n  private cancelTimer() {\n    if (this.renderTimer !== 0) {\n      window.clearTimeout(this.renderTimer);\n      this.renderTimer = 0;\n    }\n  }\n\n  /**\n   * Reschedules a pending render, or schedules a new one.\n   */\n  private scheduleRender(delayMs: number) {\n    this.cancelTimer();\n    this.renderTimer = window.setTimeout(() => {\n      this.processRenderQueue();\n      this.renderTimer = 0;\n    }, delayMs);\n  }\n\n  /**\n   * Cleans up the render queue instance\n   */\n  private destroy() {\n    // Cancel any pending renders\n    this.cancelTimer();\n\n    // Clear any pending update timer\n    if (this.updateTimer !== 0) {\n      window.clearTimeout(this.updateTimer);\n    }\n\n    // Remove event subscriptions\n    this.subscriptions.forEach(unsub => unsub());\n\n    // Clean up resize observer\n    if (this.observer) {\n      this.observer.disconnect();\n    }\n  }\n}\n","/*\n * ace-placeholder.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n/**\n * Represents a placeholder (preview) rendering of an Ace editor. Since Ace\n * editors are somewhat expensive to draw, this placeholder is used in place\n * of a real editor instance to make code visible and allow for correct height\n * computations.\n */\nexport class AcePlaceholder {\n  private readonly element: HTMLElement;\n\n  constructor(content: string) {\n    const ele = document.createElement('pre');\n    ele.innerText = content;\n    ele.className = 'ace_editor';\n    this.element = ele;\n  }\n\n  public getElement() {\n    return this.element;\n  }\n}\n","/*\n * ace-node-views.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { GapCursor } from 'prosemirror-gapcursor';\nimport { AceNodeView } from './ace';\nimport { EditorView } from 'prosemirror-view';\n\n/**\n * Track all Ace node view instances to implement additional behavior\n * (e.g. gap cursor for clicks between editor instances)\n */\n\nexport class AceNodeViews {\n  private nodeViews: AceNodeView[];\n\n  constructor() {\n    this.nodeViews = [];\n  }\n  public add(nodeView: AceNodeView) {\n    this.nodeViews.push(nodeView);\n  }\n\n  public remove(nodeView: AceNodeView) {\n    const index = this.nodeViews.indexOf(nodeView);\n    if (index >= 0) {\n      this.nodeViews.splice(index, 1);\n    }\n  }\n\n  public handleClick(view: EditorView, event: Event): boolean {\n    // alias to mouseEvent\n    const mouseEvent = event as MouseEvent;\n\n    // see if the click is between 2 contiguously located node views\n    for (const nodeView of this.nodeViews) {\n      // gap cursor we might detect\n      let gapCursor: GapCursor | null = null;\n\n      // get the position\n      const pos = nodeView.getPos();\n      const $pos = view.state.doc.resolve(pos);\n\n      // if the previous node is code, see if the click is between the 2 nodes\n      if ($pos.nodeBefore && $pos.nodeBefore.type.spec.code) {\n        // get our bounding rect\n        const dom = nodeView.dom;\n        const nodeViewRect = dom.getBoundingClientRect();\n\n        // get the previous node's bounding rect\n        const prevNodePos = pos - $pos.nodeBefore!.nodeSize;\n        const prevNodeView = this.nodeViews.find(nv => nv.getPos() === prevNodePos);\n        if (prevNodeView) {\n          const prevNodeRect = prevNodeView.dom.getBoundingClientRect();\n\n          // check for a click between the two nodes\n          const mouseY = mouseEvent.clientY;\n          if (mouseY > prevNodeRect.top + prevNodeRect.height && mouseY < nodeViewRect.top) {\n            gapCursor = new GapCursor($pos, $pos);\n          }\n        }\n\n        // if there is no previous node and the click is above us then gap cursor above\n        // (only do this if the cursor is within 150 pixels of the left edge)\n      } else if (\n        !$pos.nodeBefore &&\n        $pos.depth === 1 &&\n        mouseEvent.clientY < nodeView.dom.getBoundingClientRect().top &&\n        Math.abs(mouseEvent.clientX - nodeView.dom.getBoundingClientRect().left) < 150\n      ) {\n        gapCursor = new GapCursor($pos, $pos);\n      }\n\n      // return gapCursor if we found one\n      if (gapCursor) {\n        const tr = view.state.tr;\n\n        // notify the node views that we are setting a gap cursor\n        this.nodeViews.forEach(ndView => ndView.setGapCursorPending(true));\n\n        // ensure the view is focused\n        view.focus();\n\n        // set the selection\n        tr.setSelection(gapCursor);\n        view.dispatch(tr);\n\n        // notify the node views that we are done setting the gap cursor\n        this.nodeViews.forEach(ndView => ndView.setGapCursorPending(false));\n\n        // prevent default event handling\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        return true;\n      }\n    }\n\n    return false;\n  }\n}\n","/*\n * attr_edit.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { EditorUI } from '../../api/ui';\nimport { pandocAttrEnabled } from '../../api/pandoc_attr';\n\nimport { AttrEditCommand } from './attr_edit-command';\nimport { AttrEditOptions } from '../../api/attr_edit';\nimport { PandocExtensions } from '../../api/pandoc';\nimport { AttrEditDecorationPlugin } from './attr_edit-decoration';\nimport { Extension } from '../../api/extension';\nimport { hasFencedCodeBlocks } from '../../api/pandoc_format';\n\nexport const kEditAttrShortcut = 'F4';\n\nexport function attrEditExtension(\n  pandocExtensions: PandocExtensions,\n  ui: EditorUI,\n  editors: AttrEditOptions[],\n): Extension {\n  const hasAttr = pandocAttrEnabled(pandocExtensions) || hasFencedCodeBlocks(pandocExtensions);\n\n  return {\n    commands: (_schema: Schema) => {\n      if (hasAttr) {\n        return [new AttrEditCommand(ui, pandocExtensions, editors)];\n      } else {\n        return [];\n      }\n    },\n\n    plugins: (_schema: Schema) => {\n      if (hasAttr) {\n        return [new AttrEditDecorationPlugin(ui, pandocExtensions, editors)];\n      } else {\n        return [];\n      }\n    },\n  };\n}\n","/*\n * attr_edit-command.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Mark, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { findParentNodeOfType, NodeWithPos } from 'prosemirror-utils';\n\nimport { EditorUI } from '../../api/ui';\nimport { pandocAttrInSpec } from '../../api/pandoc_attr';\nimport { getSelectionMarkRange } from '../../api/mark';\nimport { EditorCommandId, ProsemirrorCommand } from '../../api/command';\n\nimport { kEditAttrShortcut } from './attr_edit';\nimport { AttrEditOptions } from '../../api/attr_edit';\nimport { pandocAutoIdentifier, gfmAutoIdentifier } from '../../api/pandoc_id';\nimport { PandocExtensions } from '../../api/pandoc';\nimport { fragmentText } from '../../api/fragment';\n\nexport class AttrEditCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI, pandocExtensions: PandocExtensions, editors: AttrEditOptions[]) {\n    super(EditorCommandId.AttrEdit, [kEditAttrShortcut], attrEditCommandFn(ui, pandocExtensions, editors));\n  }\n}\n\nexport function attrEditCommandFn(\n  ui: EditorUI, \n  pandocExtensions: PandocExtensions, \n  editors: AttrEditOptions[]\n) {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    // see if there is an active mark with attrs or a parent node with attrs\n    const marks = state.storedMarks || state.selection.$head.marks();\n    const mark = marks.find((m: Mark) => pandocAttrInSpec(m.type.spec));\n\n    let node: ProsemirrorNode | null = null;\n    let pos: number = 0;\n    // node selection of node with attributes\n    if (state.selection instanceof NodeSelection && pandocAttrInSpec(state.selection.node.type.spec)) {\n      node = state.selection.node;\n      pos = state.selection.$anchor.pos;\n    } else {\n      // selection inside node with editable attributes\n      const nodeTypes = editors.map(editor => editor.type(state.schema));\n      const parentWithAttrs = findParentNodeOfType(nodeTypes)(state.selection);\n      if (parentWithAttrs) {\n        node = parentWithAttrs.node;\n        pos = parentWithAttrs.pos;\n      }\n    }\n\n    // return false (disabled) for no targets\n    if (!mark && !node) {\n      return false;\n    }\n\n    // if this is a node and we have a custom attribute editor then just delegate to that\n    if (node) {\n      const editor = editors.find(ed => ed.type(state.schema) === node!.type)!;\n      if (editor && editor.editFn) {\n        return editor.editFn()(state, dispatch, view);\n      }\n    }\n\n    // edit attributes\n    async function asyncEditAttrs() {\n      if (dispatch) {\n        if (mark) {\n          await editMarkAttrs(mark, state, dispatch, ui);\n        } else {\n          await editNodeAttrs(node!, pos, state, dispatch, ui, pandocExtensions);\n        }\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncEditAttrs();\n\n    // return true\n    return true;\n  };\n}\n\nexport function attrEditNodeCommandFn(nodeWithPos: NodeWithPos, \n                                      ui: EditorUI, \n                                      pandocExtensions: PandocExtensions, \n                                      editors: AttrEditOptions[]) {\n  \n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n\n    // alias\n    const { node, pos } = nodeWithPos;\n\n    // registered editor\n    const editor = editors.find(ed => ed.type(state.schema) === node!.type)!;\n    if (editor && editor.editFn) {\n      return editor.editFn()(state, dispatch, view);\n    }\n\n    // generic editor\n    async function asyncEditAttrs() {\n      if (dispatch) {\n        await editNodeAttrs(node!, pos, state, dispatch, ui, pandocExtensions);\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncEditAttrs();\n\n    // return true\n    return true;\n  };\n}\n\nasync function editMarkAttrs(\n  mark: Mark,\n  state: EditorState,\n  dispatch: (tr: Transaction<any>) => void,\n  ui: EditorUI,\n): Promise<void> {\n  const attrs = mark.attrs;\n  const markType = mark.type;\n  const result = await ui.dialogs.editAttr({ ...attrs });\n  if (result) {\n    const tr = state.tr;\n    const range = getSelectionMarkRange(state.selection, markType);\n    tr.removeMark(range.from, range.to, markType);\n    tr.addMark(\n      range.from,\n      range.to,\n      markType.create({\n        ...attrs,\n        ...result.attr,\n      }),\n    );\n    dispatch(tr);\n  }\n}\n\nasync function editNodeAttrs(\n  node: ProsemirrorNode,\n  pos: number,\n  state: EditorState,\n  dispatch: (tr: Transaction<any>) => void,\n  ui: EditorUI,\n  pandocExtensions: PandocExtensions,\n): Promise<void> {\n  const attrs = node.attrs;\n  const result = await ui.dialogs.editAttr({ ...attrs }, idHint(node, pandocExtensions));\n  if (result) {\n    dispatch(\n      state.tr.setNodeMarkup(pos, node.type, {\n        ...attrs,\n        ...result.attr,\n      }),\n    );\n  }\n}\n\nfunction idHint(node: ProsemirrorNode, pandocExtensions: PandocExtensions) {\n  if (node.type === node.type.schema.nodes.heading) {\n    const unemoji = pandocExtensions.gfm_auto_identifiers;\n    const text = fragmentText(node.content, unemoji);\n\n    if (pandocExtensions.gfm_auto_identifiers) {\n      return gfmAutoIdentifier(text, pandocExtensions.ascii_identifiers);\n    } else {\n      return pandocAutoIdentifier(text, pandocExtensions.ascii_identifiers);\n    }\n  } else {\n    return undefined;\n  }\n}\n","/*\n * attr_edit-decoration.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { DecorationSet, EditorView, Decoration } from 'prosemirror-view';\n\nimport * as React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { AttrEditOptions } from '../../api/attr_edit';\nimport { ImageButton } from '../../api/widgets/button';\nimport { CommandFn } from '../../api/command';\nimport { AttrProps } from '../../api/ui-dialogs';\nimport { WidgetProps, reactRenderForEditorView } from '../../api/widgets/react';\nimport { PandocExtensions } from '../../api/pandoc';\n\nimport { kEditAttrShortcut } from './attr_edit';\nimport { attrEditNodeCommandFn } from './attr_edit-command';\n\nimport './attr_edit-decoration.css';\n\ninterface AttrEditDecorationProps extends WidgetProps {\n  tags: string[];\n  attrs: AttrProps;\n  editFn: CommandFn;\n  view: EditorView;\n  ui: EditorUI;\n}\n\nconst AttrEditDecoration: React.FC<AttrEditDecorationProps> = props => {\n  const buttonTitle = `${props.ui.context.translateText('Edit Attributes')} (${kEditAttrShortcut})`;\n\n  const onClick = () => {\n    props.editFn(props.view.state, props.view.dispatch, props.view);\n  };\n\n  return (\n    <div className=\"pm-attr-edit-decoration pm-surface-widget-text-color \" style={props.style}>\n      {props.tags.length\n        ? props.tags.map(tag => {\n            return (\n              <span\n                key={tag}\n                className=\"attr-edit-tag attr-edit-widget pm-block-border-color pm-border-background-color\"\n                onClick={onClick}\n              >\n                {tag}\n              </span>\n            );\n          })\n        : null}\n      {props.editFn(props.view.state) ? (\n        <ImageButton\n          classes={['attr-edit-button']}\n          image={props.ui.prefs.darkMode() ? props.ui.images.properties_deco_dark! : props.ui.images.properties_deco!}\n          title={buttonTitle}\n          tabIndex={-1}\n          onClick={onClick}\n        />\n      ) : null}\n    </div>\n  );\n};\n\nconst key = new PluginKey<DecorationSet>('attr_edit_decoration');\n\nexport class AttrEditDecorationPlugin extends Plugin<DecorationSet> {\n  constructor(ui: EditorUI, pandocExtensions: PandocExtensions, editors: AttrEditOptions[]) {\n    super({\n      key,\n      state: {\n        init: (_config: { [key: string]: any }) => {\n          return DecorationSet.empty;\n        },\n        apply: (tr: Transaction, old: DecorationSet, _oldState: EditorState, newState: EditorState) => {\n          // node types\n          const schema = newState.schema;\n          const nodeTypes = editors.map(ed => ed.type(schema));\n\n          // decorations to return\n          const decorations: Decoration[] = [];\n\n          // start from current selection\n          const $head = tr.selection.$head;\n\n          for (let i=1; i<=$head.depth; i++) {\n\n            const parentWithAttrs = { node: $head.node(i), pos: $head.before(i) };\n            if (!nodeTypes.includes(parentWithAttrs.node.type)) {\n              continue;\n            }\n\n            // get editor\n            const editor = editors.find(ed => ed.type(schema) === parentWithAttrs.node.type)!;\n\n            // screen for noDecorator\n            if (editor.noDecorator) {\n              continue;\n            }\n\n            // provide some editor defaults\n            editor.tags =\n              editor.tags ||\n              (editorNode => {\n                const attrTags = [];\n                if (editorNode.attrs.id) {\n                  attrTags.push(`#${editorNode.attrs.id}`);\n                }\n                if (editorNode.attrs.classes && editorNode.attrs.classes.length) {\n                  attrTags.push(`${editorNode.attrs.classes.map((clz: string) => '.' + clz).join(' ')}`);\n                }\n                return attrTags;\n              });\n            editor.offset = editor.offset || { top: 0, right: 0 };\n\n            // get editFn\n            const editFn = (editorUI: EditorUI) => attrEditNodeCommandFn(parentWithAttrs, editorUI, pandocExtensions, editors);\n\n            // get attrs/tags\n            const node = parentWithAttrs.node;\n            const attrs = node.attrs;\n            const tags = editor.tags(node);\n\n            // attr_edit controls\n            const attrEditDecoration = Decoration.widget(\n              parentWithAttrs.pos,\n              (view: EditorView, getPos: () => number) => {\n                // does the offsetParent have any right padding we need to offset for?\n                // we normally use right: 5px for positioning but that is relative to\n                // the edge of the offsetParent. However, some offset parents (e.g. a\n                // td or a nested div) have their own internal padding to account for\n                // so we look for it here\n                let rightPaddingOffset = 0;\n                const attrsNode = view.nodeDOM(getPos());\n                if (attrsNode) {\n                  const attrsEl = attrsNode as HTMLElement;\n                  if (attrsEl.offsetParent) {\n                    const offsetParentStyle = window.getComputedStyle(attrsEl.offsetParent);\n                    rightPaddingOffset = -parseInt(offsetParentStyle.paddingRight!, 10) || 0;\n                  }\n                }\n\n                // cacculate position offsets\n                const baseOffset = editor.offset || { top: 0, right: 0 };\n                const xOffset = baseOffset.right + rightPaddingOffset;\n                const yOffset = baseOffset.top + 6;\n                const cssProps: React.CSSProperties = {\n                  transform: `translate(${xOffset}px,-${yOffset}px)`,\n                };\n\n                // create attr edit react component\n                const attrEdit = (\n                  <AttrEditDecoration\n                    tags={tags}\n                    attrs={attrs}\n                    editFn={editFn(ui)}\n                    view={view}\n                    ui={ui}\n                    style={cssProps}\n                  />\n                );\n\n                // create decorator and render attr editor into it\n                const decoration = window.document.createElement('div');\n                reactRenderForEditorView(attrEdit, decoration, view);\n\n                return decoration;\n              },\n              {\n                // re-use existing instance for same tags\n                key: `tags:${tags.join('/')}`,\n                ignoreSelection: true,\n                stopEvent: () => {\n                  return true;\n                },\n              },\n            );\n\n            decorations.push(attrEditDecoration);\n          }\n\n         \n          // return decorations\n          return DecorationSet.create(tr.doc, decorations);\n        },\n      },\n      props: {\n        decorations: (state: EditorState) => {\n          return key.getState(state);\n        },\n      },\n    });\n  }\n}\n","/*\n * editor-theme.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface EditorTheme {\n  darkMode: boolean;\n  solarizedMode: boolean;\n  cursorColor: string;\n  selectionColor: string;\n  nodeSelectionColor: string;\n  backgroundColor: string;\n  metadataBackgroundColor: string;\n  chunkBackgroundColor: string;\n  spanBackgroundColor: string;\n  divBackgroundColor: string;\n  commentColor: string;\n  commentBackgroundColor: string;\n  gutterBackgroundColor: string;\n  gutterTextColor: string;\n  textColor: string;\n  lightTextColor: string;\n  placeholderTextColor: string;\n  invisibleTextColor: string;\n  linkTextColor: string;\n  surfaceWidgetTextColor: string;\n  markupTextColor: string;\n  findTextBackgroundColor: string;\n  findTextBorderColor: string;\n  borderBackgroundColor: string;\n  blockBorderColor: string;\n  focusOutlineColor: string;\n  paneBorderColor: string;\n  fixedWidthFont: string;\n  fixedWidthFontSizePt: number;\n  proportionalFont: string;\n  proportionalFontSizePt: number;\n  code: CodeTheme;\n}\n\nexport interface CodeTheme {\n  keywordColor: string;\n  atomColor: string;\n  numberColor: string;\n  variableColor: string;\n  defColor: string;\n  operatorColor: string;\n  commentColor: string;\n  stringColor: string;\n  metaColor: string;\n  builtinColor: string;\n  bracketColor: string;\n  tagColor: string;\n  attributeColor: string;\n  hrColor: string;\n  linkColor: string;\n  errorColor: string;\n}\n\nexport function defaultTheme(): EditorTheme {\n  return {\n    darkMode: false,\n    solarizedMode: false,\n    cursorColor: 'black',\n    selectionColor: '#8cf',\n    nodeSelectionColor: 'rgb(102,155,243)',\n    backgroundColor: 'white',\n    metadataBackgroundColor: 'rgb(255, 255, 255)',\n    chunkBackgroundColor: 'rgb(251,251,251)',\n    spanBackgroundColor: '#fff8dc',\n    divBackgroundColor: 'rgb(243, 243, 243)',\n    commentColor: '#3c4c72',\n    commentBackgroundColor: '#FFECCB',\n    gutterBackgroundColor: '#f0f0f0',\n    gutterTextColor: '#333',\n    textColor: 'black',\n    surfaceWidgetTextColor: 'rgba(0,0,0,0.5)',\n    lightTextColor: 'rgb(60, 76, 114)',\n    linkTextColor: '#106ba3',\n    placeholderTextColor: 'gray',\n    invisibleTextColor: 'rgb(191, 191, 191)',\n    markupTextColor: 'rgb(185, 6, 144)',\n    findTextBackgroundColor: 'rgb(250, 250, 255)',\n    findTextBorderColor: 'rgb(200, 200, 250)',\n    borderBackgroundColor: '#ddd',\n    blockBorderColor: '#ddd',\n    focusOutlineColor: '#5d84cd',\n    paneBorderColor: 'silver',\n    fixedWidthFont: 'monospace, monospace',\n    fixedWidthFontSizePt: 9,\n    proportionalFont: '\"Lucida Sans\", \"DejaVu Sans\", \"Lucida Grande\", \"Segoe UI\", Verdana, Helvetica, sans-serif',\n    proportionalFontSizePt: 10,\n    code: {\n      keywordColor: 'rgb(0, 0, 255)',\n      atomColor: 'rgb(88, 92, 246)',\n      numberColor: 'rgb(0, 0, 205)',\n      variableColor: 'rgb(0, 0, 0)',\n      defColor: 'rgb(0, 0, 0)',\n      operatorColor: 'rgb(104, 118, 135)',\n      commentColor: 'rgb(76, 136, 107)',\n      stringColor: 'rgb(3, 106, 7)',\n      metaColor: 'rgb(0, 0, 0)',\n      builtinColor: 'rgb(0, 0, 0)',\n      bracketColor: 'rgb(104, 118, 135)',\n      tagColor: 'rgb(0, 22, 142)',\n      attributeColor: 'rgb(0, 0, 0)',\n      hrColor: 'rgb(0, 0, 0)',\n      linkColor: 'rgb(0, 0, 255)',\n      errorColor: 'rgb(197, 6, 11)',\n    },\n  };\n}\n\nexport function applyTheme(theme: EditorTheme) {\n  // merge w/ defaults\n  const defaults = defaultTheme();\n  theme = {\n    ...defaults,\n    ...theme,\n    code: {\n      ...defaults.code,\n      ...theme.code,\n    },\n  };\n\n  // generate theme css\n  const themeCss = `\n    .pm-default-theme .pm-background-color {\n      background-color: ${defaults.backgroundColor} !important;\n    }\n    .pm-default-theme .pm-text-color {\n      color: ${defaults.textColor} !important;\n    }\n    .pm-default-theme .pm-border-background-color {\n      background-color: ${defaults.borderBackgroundColor} !important;\n    }\n    .pm-default-theme .pm-input-text {\n      border-color: ${defaults.paneBorderColor} !important\n    }\n    .pm-default-theme .pm-block-border-color {\n      border-color: ${defaults.blockBorderColor} !important;\n    }\n    .pm-default-theme .pm-input-outline-button {\n      color: ${defaults.textColor};\n      border-color: ${defaults.textColor};\n      background-color: ${defaults.backgroundColor};\n    }\n    .pm-default-theme .pm-selected-navigation-tree-item {\n      background-color: ${defaults.findTextBackgroundColor} !important;\n      border-color: ${defaults.findTextBorderColor} !important;\n    }\n    .pm-default-theme .pm-navigation-tree-item {\n      border-color: ${defaults.backgroundColor} !important;\n    }\n    .pm-default-theme .pm-block-border-color {\n      border-color: ${defaults.blockBorderColor} !important;\n    }\n    .pm-default-theme .pm-focus-outline-color {\n      border-color: ${defaults.focusOutlineColor} !important;\n    }\n    .pm-default-theme .pm-input-button {\n      border-color: ${defaults.borderBackgroundColor};\n      background-color: ${defaults.backgroundColor};\n    }\n    .pm-default-theme .pm-placeholder-text-color {\n      color: ${defaults.placeholderTextColor} !important;\n    }\n    .pm-default-theme .pm-background-color *::selection {\n      background-color: ${defaults.selectionColor} !important;\n    }\n    .pm-default-theme .pm-find-text,\n    .pm-default-theme .pm-list-item-selected,\n    .pm-default-theme .pm-grid-item-selected {\n      background-color: ${defaults.findTextBackgroundColor} !important;\n      box-shadow: 0 0 0 1px ${defaults.findTextBorderColor}; \n      border-radius: 3px;\n    }\n    .pm-default-theme .pm-rstudio-button {\n      border-color: DarkGray !important;\n    }\n    .pm-cursor-color {\n      caret-color: ${theme.cursorColor}\n    }\n    .pm-background-color {\n      background-color: ${theme.backgroundColor} !important;\n    }\n    .pm-metadata-background-color {\n      background-color: ${theme.metadataBackgroundColor} !important;\n    }\n    .pm-chunk-background-color {\n      background-color: ${theme.chunkBackgroundColor} !important;\n    }\n    .pm-span-background-color {\n      background-color: ${theme.spanBackgroundColor} !important;\n    }\n    .pm-div-background-color {\n      background-color: ${theme.divBackgroundColor} !important;\n    }\n    .pm-nbsp-background-color {\n      background-color: ${theme.spanBackgroundColor} !important;\n    }\n    .pm-comment-color {\n      color: ${theme.commentColor} !important;\n    }\n    .pm-comment-background-color {\n      background-color: ${theme.commentBackgroundColor} !important;\n    }\n    .pm-text-color {\n      color: ${theme.textColor} !important;\n    }\n    .pm-surface-widget-text-color {\n      color: ${theme.surfaceWidgetTextColor} !important;\n    }\n    .pm-light-text-color {\n      color: ${theme.lightTextColor} !important;\n    }\n    .pm-placeholder-text-color {\n      color: ${theme.placeholderTextColor} !important;\n    }\n    .pm-invisible-text-color {\n      color: ${theme.invisibleTextColor} !important;\n    }\n    .pm-link-text-color {\n      color: ${theme.linkTextColor} !important;\n    }\n    .pm-markup-text-color {\n      color: ${theme.markupTextColor} !important;\n    }\n    .pm-find-text,\n    .pm-list-item-selected,\n    .pm-grid-item-selected {\n      background-color: ${theme.findTextBackgroundColor} !important;\n      box-shadow: 0 0 0 1px ${theme.findTextBorderColor}; \n      border-radius: 3px;\n    }\n    .pm-selected-text {\n      background-color: ${theme.selectionColor} !important;\n    }\n    .pm-selected-list-item {\n      background-color: ${theme.findTextBackgroundColor} !important;\n      border: 1px solid ${theme.findTextBorderColor} !important;\n      border-radius: 3px;\n    }\n    .pm-dark-mode .pm-selected-list-item {\n      background-color: ${theme.chunkBackgroundColor} !important;\n      border: 1px solid transparent !important;\n    }\n    .pm-navigation-tree-item {\n      border: 1px solid ${theme.backgroundColor} !important;\n      border-radius: 3px;\n      margin-left: 2px;\n      margin-right: 2px;\n    }\n    .pm-selected-navigation-tree-item {\n      background-color: ${theme.findTextBackgroundColor} !important;\n      border: 1px solid ${theme.findTextBorderColor} !important;\n      border-radius: 3px;\n      margin-left: 2px;\n      margin-right: 2px;\n    }\n    .pm-border-background-color {\n      background-color: ${theme.borderBackgroundColor}!important;\n    }\n    .pm-block-border-color {\n      border-color: ${theme.blockBorderColor} !important;\n    }\n    .pm-focus-outline-color {\n      border-color: ${theme.focusOutlineColor} !important;\n    }\n    .pm-pane-border-color {\n      border-color: ${theme.paneBorderColor} !important;\n    }\n    .pm-div .pm-div {\n      border-color: ${theme.focusOutlineColor} !important;\n    }\n    .pm-raw-block-border {\n      border-color: ${theme.markupTextColor} !important;\n    }\n    .pm-popup {\n      box-shadow: 0 1px 3px ${theme.blockBorderColor} !important;\n    }\n    .pm-selected-node-outline-color,\n    .ProseMirror-selectednode {\n      outline-color: ${theme.nodeSelectionColor} !important;\n    }\n    .pm-selected-node-border-color {\n      border-color: ${theme.nodeSelectionColor} !important;\n    }\n    .pm-dark-mode .pm-selected-node-outline-color,\n    .pm-dark-mode .ProseMirror-selectednode {\n      outline-color: ${theme.nodeSelectionColor} !important;\n    }\n    .pm-dark-mode .pm-selected-node-border-color {\n      border-color: ${theme.nodeSelectionColor} !important;\n    }\n    .pm-background-color *::selection {\n      background-color: ${theme.selectionColor} !important;\n    }\n    .pm-background-color *::-moz-selection {\n      background-color: ${theme.selectionColor} !important;\n    }\n    .pm-fixedwidth-font {\n      font-family: ${theme.fixedWidthFont} !important;\n      font-size: ${theme.fixedWidthFontSizePt}pt !important;\n    }\n    .pm-proportional-font {\n      font-family: ${theme.proportionalFont} !important;\n      font-size: ${theme.proportionalFontSizePt}pt !important;\n    }\n    .pm-emoji-font {\n      font-family: ${theme.fixedWidthFont} !important;\n    }\n    .pm-input-text {\n      border-color: ${theme.paneBorderColor};\n    }\n    .pm-input-button {\n      border-color: ${theme.borderBackgroundColor};\n      background-color: ${theme.backgroundColor};\n    }\n    .pm-input-outline-button {\n      color: ${theme.textColor};\n      border-color: ${theme.textColor};\n      background-color: ${theme.backgroundColor};\n    }\n    .pm-ace-first-line-meta .ace_text-layer .ace_line_group:first-child,\n    .pm-ace-first-line-meta .ace_text-layer .ace_line_group:first-child span {\n      color: ${theme.lightTextColor} !important;\n    }\n    .ProseMirror-gapcursor:after {\n      border-top: 1px solid ${theme.textColor};\n    }\n  `;\n\n  // set style\n  setStyleElement('pm-editor-theme-styles-id', themeCss);\n}\n\nexport function applyPadding(padding: string) {\n  const paddingCss = `\n    .pm-editing-root-node {\n      padding-left: ${padding} !important;\n      padding-right: ${padding} !important;\n    }\n  `;\n  setStyleElement('pm-editor-padding-styles-id', paddingCss);\n}\n\nfunction setStyleElement(id: string, css: string) {\n  // get access to style element (create if necessary)\n  let styleEl = window.document.getElementById(id);\n  if (styleEl === null) {\n    styleEl = window.document.createElement('style');\n    styleEl.setAttribute('id', id);\n    styleEl.setAttribute('type', 'text/css');\n    window.document.head.appendChild(styleEl);\n  }\n\n  // set css\n  styleEl.innerHTML = css;\n}\n","/*\n * editor-images.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUIImages } from '../api/ui-images';\n\nimport copyImage from './images/copy.png';\nimport propertiesImage from './images/properties.png';\nimport propertiesDecoImage from './images/properties_deco.png';\nimport propertiesDecoDarkImage from './images/properties_deco_dark.png';\nimport removelinkImage from './images/removelink.png';\nimport runchunkImage from './images/runchunk.png';\nimport runprevchunksImage from './images/runprevchunks.png';\nimport searchImage from './images/search.png';\nimport searchProgressImage from './images/search_progress.gif';\n\nimport omniInsertGenericImage from './images/omni_insert/generic.png';\nimport heading1Image from './images/omni_insert/heading1.png';\nimport heading1DarkImage from './images/omni_insert/heading1_dark.png';\nimport heading2Image from './images/omni_insert/heading2.png';\nimport heading2DarkImage from './images/omni_insert/heading2_dark.png';\nimport heading3Image from './images/omni_insert/heading3.png';\nimport heading3DarkImage from './images/omni_insert/heading3_dark.png';\nimport heading4Image from './images/omni_insert/heading4.png';\nimport heading4DarkImage from './images/omni_insert/heading4_dark.png';\nimport bulletListImage from './images/omni_insert/bullet_list.png';\nimport bulletListDarkImage from './images/omni_insert/bullet_list_dark.png';\nimport orderedListImage from './images/omni_insert/ordered_list.png';\nimport orderedListDarkImage from './images/omni_insert/ordered_list_dark.png';\nimport blockquoteImage from './images/omni_insert/blockquote.png';\nimport blockquoteDarkImage from './images/omni_insert/blockquote_dark.png';\nimport mathInlineImage from './images/omni_insert/math_inline.png';\nimport mathInlineDarkImage from './images/omni_insert/math_inline_dark.png';\nimport mathDisplayImage from './images/omni_insert/math_display.png';\nimport mathDisplayDarkImage from './images/omni_insert/math_display_dark.png';\nimport htmlBlockImage from './images/omni_insert/html_block.png';\nimport htmlBlockDarkImage from './images/omni_insert/html_block_dark.png';\nimport lineBlockImage from './images/omni_insert/line_block.png';\nimport lineBlockDarkImage from './images/omni_insert/line_block_dark.png';\nimport emojiImage from './images/omni_insert/emoji.png';\nimport emojiDarkImage from './images/omni_insert/emoji_dark.png';\nimport commentImage from './images/omni_insert/comment.png';\nimport commentDarkImage from './images/omni_insert/comment_dark.png';\nimport divImage from './images/omni_insert/div.png';\nimport divDarkImage from './images/omni_insert/div_dark.png';\nimport codeBlockImage from './images/omni_insert/code_block.png';\nimport codeBlockDarkImage from './images/omni_insert/code_block_dark.png';\nimport footnoteImage from './images/omni_insert/footnote.png';\nimport footnoteDarkImage from './images/omni_insert/footnote_dark.png';\nimport citationImage from './images/omni_insert/citation.png';\nimport citationDarkImage from './images/omni_insert/citation_dark.png';\nimport crossReferenceImage from './images/omni_insert/cross_reference.png';\nimport crossReferenceDarkImage from './images/omni_insert/cross_reference_dark.png';\nimport symbolImage from './images/omni_insert/symbol.png';\nimport symbolDarkImage from './images/omni_insert/symbol_dark.png';\nimport tableImage from './images/omni_insert/table.png';\nimport tableDarkImage from './images/omni_insert/table_dark.png';\nimport definitionListImage from './images/omni_insert/definition_list.png';\nimport definitionListDarkImage from './images/omni_insert/definition_list_dark.png';\nimport horizontalRuleImage from './images/omni_insert/horizontal_rule.png';\nimport horizontalRuleDarkImage from './images/omni_insert/horizontal_rule_dark.png';\nimport imgImage from './images/omni_insert/image.png';\nimport imgDarkImage from './images/omni_insert/image_dark.png';\nimport linkImage from './images/omni_insert/link.png';\nimport linkDarkImage from './images/omni_insert/link_dark.png';\nimport paragraphImage from './images/omni_insert/paragraph.png';\nimport paragraphDarkImage from './images/omni_insert/paragraph_dark.png';\nimport rawBlockImage from './images/omni_insert/raw_block.png';\nimport rawBlockDarkImage from './images/omni_insert/raw_block_dark.png';\nimport rawInlineImage from './images/omni_insert/raw_inline.png';\nimport rawInlineDarkImage from './images/omni_insert/raw_inline_dark.png';\nimport texBlockImage from './images/omni_insert/tex_block.png';\nimport texBlockDarkImage from './images/omni_insert/tex_block_dark.png';\nimport yamlBlockImage from './images/omni_insert/yaml_block.png';\nimport yamlBlockDarkImage from './images/omni_insert/yaml_block_dark.png';\nimport pythonChunkImage from './images/omni_insert/python_chunk.png';\nimport sqlChunkImage from './images/omni_insert/sql_chunk.png';\nimport d3ChunkImage from './images/omni_insert/d3_chunk.png';\nimport stanChunkImage from './images/omni_insert/stan_chunk.png';\nimport bashChunkImage from './images/omni_insert/bash_chunk.png';\nimport bashChunkDarkImage from './images/omni_insert/bash_chunk_dark.png';\nimport rChunkImage from './images/omni_insert/r_chunk.png';\nimport rChunkDarkImage from './images/omni_insert/r_chunk_dark.png';\nimport rcppChunkImage from './images/omni_insert/rcpp_chunk.png';\nimport rcppChunkDarkImage from './images/omni_insert/rcpp_chunk_dark.png';\n\nimport articleImage from './images/citations/article.png';\nimport articleDarkImage from './images/citations/article_dark.png';\nimport bookImage from './images/citations/book.png';\nimport bookDarkImage from './images/citations/book_dark.png';\nimport broadcastImage from './images/citations/broadcast.png';\nimport broadcastDarkImage from './images/citations/broadcast_dark.png';\nimport dataImage from './images/citations/data.png';\nimport dataDarkImage from './images/citations/data_dark.png';\nimport entryImage from './images/citations/entry.png';\nimport entryDarkImage from './images/citations/entry_dark.png';\nimport imageImage from './images/citations/image.png';\nimport imageDarkImage from './images/citations/image_dark.png';\nimport legalImage from './images/citations/legal.png';\nimport legalDarkImage from './images/citations/legal_dark.png';\nimport mapImage from './images/citations/map.png';\nimport mapDarkImage from './images/citations/map_dark.png';\nimport movieImage from './images/citations/movie.png';\nimport movieDarkImage from './images/citations/movie_dark.png';\nimport otherImage from './images/citations/other.png';\nimport otherDarkImage from './images/citations/other_dark.png';\nimport songImage from './images/citations/song.png';\nimport songDarkImage from './images/citations/song_dark.png';\nimport webImage from './images/citations/web.png';\nimport webDarkImage from './images/citations/web_dark.png';\nimport zoteroOverlayImage from './images/citations/zotero-overlay.png';\nimport localSourcesImage from './images/citations/insert/local-sources.png';\nimport bibliographyImage from './images/citations/insert/bibliography.png';\nimport bibliographyFolderImage from './images/citations/insert/bibliography-folder.png';\nimport zoteroRootImage from './images/citations/insert/zotero-root.png';\nimport zoteroLibraryImage from './images/citations/insert/zotero-library.png';\nimport zoteroCollectionImage from './images/citations/insert/zotero-collection.png';\nimport doiImage from './images/citations/insert/doi.png';\nimport crossRefImage from './images/citations/insert/crossref.png';\nimport pubmedImage from './images/citations/insert/pubmed.png';\nimport dataciteImage from './images/citations/insert/datacite.png';\n\nimport tagDelete from './images/widgets/tag-delete.png';\nimport tagEdit from './images/widgets/tag-edit.png';\n\nexport function defaultEditorUIImages(): EditorUIImages {\n  return {\n    copy: copyImage,\n    properties: propertiesImage,\n    properties_deco: propertiesDecoImage,\n    properties_deco_dark: propertiesDecoDarkImage,\n    removelink: removelinkImage,\n    runchunk: runchunkImage,\n    runprevchunks: runprevchunksImage,\n    search: searchImage,\n    search_progress: searchProgressImage,\n    omni_insert: {\n      generic: omniInsertGenericImage,\n      heading1: heading1Image,\n      heading1_dark: heading1DarkImage,\n      heading2: heading2Image,\n      heading2_dark: heading2DarkImage,\n      heading3: heading3Image,\n      heading3_dark: heading3DarkImage,\n      heading4: heading4Image,\n      heading4_dark: heading4DarkImage,\n      bullet_list: bulletListImage,\n      bullet_list_dark: bulletListDarkImage,\n      ordered_list: orderedListImage,\n      ordered_list_dark: orderedListDarkImage,\n      blockquote: blockquoteImage,\n      blockquote_dark: blockquoteDarkImage,\n      math_inline: mathInlineImage,\n      math_inline_dark: mathInlineDarkImage,\n      math_display: mathDisplayImage,\n      math_display_dark: mathDisplayDarkImage,\n      html_block: htmlBlockImage,\n      html_block_dark: htmlBlockDarkImage,\n      line_block: lineBlockImage,\n      line_block_dark: lineBlockDarkImage,\n      emoji: emojiImage,\n      emoji_dark: emojiDarkImage,\n      comment: commentImage,\n      comment_dark: commentDarkImage,\n      div: divImage,\n      div_dark: divDarkImage,\n      code_block: codeBlockImage,\n      code_block_dark: codeBlockDarkImage,\n      footnote: footnoteImage,\n      footnote_dark: footnoteDarkImage,\n      citation: citationImage,\n      citation_dark: citationDarkImage,\n      cross_reference: crossReferenceImage,\n      cross_reference_dark: crossReferenceDarkImage,\n      symbol: symbolImage,\n      symbol_dark: symbolDarkImage,\n      table: tableImage,\n      table_dark: tableDarkImage,\n      definition_list: definitionListImage,\n      definition_list_dark: definitionListDarkImage,\n      horizontal_rule: horizontalRuleImage,\n      horizontal_rule_dark: horizontalRuleDarkImage,\n      image: imgImage,\n      image_dark: imgDarkImage,\n      link: linkImage,\n      link_dark: linkDarkImage,\n      paragraph: paragraphImage,\n      paragraph_dark: paragraphDarkImage,\n      raw_block: rawBlockImage,\n      raw_block_dark: rawBlockDarkImage,\n      raw_inline: rawInlineImage,\n      raw_inline_dark: rawInlineDarkImage,\n      tex_block: texBlockImage,\n      tex_block_dark: texBlockDarkImage,\n      yaml_block: yamlBlockImage,\n      yaml_block_dark: yamlBlockDarkImage,\n      python_chunk: pythonChunkImage,\n      sql_chunk: sqlChunkImage,\n      d3_chunk: d3ChunkImage,\n      stan_chunk: stanChunkImage,\n      bash_chunk: bashChunkImage,\n      bash_chunk_dark: bashChunkDarkImage,\n      r_chunk: rChunkImage,\n      r_chunk_dark: rChunkDarkImage,\n      rcpp_chunk: rcppChunkImage,\n      rcpp_chunk_dark: rcppChunkDarkImage,\n    },\n    citations: {\n      article: articleImage,\n      article_dark: articleDarkImage,\n      book: bookImage,\n      book_dark: bookDarkImage,\n      broadcast: broadcastImage,\n      broadcast_dark: broadcastDarkImage,\n      data: dataImage,\n      data_dark: dataDarkImage,\n      entry: entryImage,\n      entry_dark: entryDarkImage,\n      image: imageImage,\n      image_dark: imageDarkImage,\n      legal: legalImage,\n      legal_dark: legalDarkImage,\n      map: mapImage,\n      map_dark: mapDarkImage,\n      movie: movieImage,\n      movie_dark: movieDarkImage,\n      other: otherImage,\n      other_dark: otherDarkImage,\n      song: songImage,\n      song_dark: songDarkImage,\n      web: webImage,\n      web_dark: webDarkImage,\n      zoteroOverlay: zoteroOverlayImage,\n      local_sources: localSourcesImage,\n      bibligraphy: bibliographyImage,\n      bibligraphy_folder: bibliographyFolderImage,\n      zotero_library: zoteroLibraryImage,\n      zotero_collection: zoteroCollectionImage,\n      zotero_root: zoteroRootImage,\n      doi: doiImage,\n      crossref: crossRefImage,\n      pubmed: pubmedImage,\n      datacite: dataciteImage,\n    },\n    widgets: {\n      tag_delete: tagDelete,\n      tag_edit: tagEdit,\n    },\n  };\n}\n","/*\n * editor-menus.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorMenuItem, EditorUI } from '../api/ui';\nimport { tableMenu } from '../api/table';\nimport { EditorCommandId, EditorCommand } from '../api/command';\nimport { Editor } from './editor';\n\nexport interface EditorMenus {\n  format: EditorMenuItem[];\n  insert: EditorMenuItem[];\n  table: EditorMenuItem[];\n}\n\nexport function editorMenus(ui: EditorUI, commands: EditorCommand[]) {\n  return {\n    format: formatMenu(ui, commands),\n    insert: insertMenu(ui, commands),\n    table: tableMenu(true, ui),\n  };\n}\n\nfunction formatMenu(ui: EditorUI, commands: EditorCommand[]) {\n  return [\n    { command: EditorCommandId.Strong },\n    { command: EditorCommandId.Em },\n    { command: EditorCommandId.Underline },\n    { command: EditorCommandId.Code },\n    {\n      text: ui.context.translateText('Text'),\n      subMenu: {\n        items: [\n          { command: EditorCommandId.Strikeout },\n          { command: EditorCommandId.Superscript },\n          { command: EditorCommandId.Subscript },\n          { command: EditorCommandId.Smallcaps },\n        ],\n      },\n    },\n    { separator: true },\n    {\n      text: ui.context.translateText('Bullets & Numbering'),\n      subMenu: {\n        items: [\n          { command: EditorCommandId.BulletList },\n          { command: EditorCommandId.OrderedList },\n          { separator: true },\n          { command: EditorCommandId.TightList },\n          { separator: true },\n          { command: EditorCommandId.ListItemCheck },\n          { command: EditorCommandId.ListItemCheckToggle },\n          { separator: true },\n          { command: EditorCommandId.ListItemSink },\n          { command: EditorCommandId.ListItemLift },\n          { separator: true },\n          { command: EditorCommandId.EditListProperties },\n        ],\n      },\n    },\n    { separator: true },\n    { command: codeBlockCommand(commands) },\n    { command: EditorCommandId.Blockquote },\n    { command: EditorCommandId.LineBlock },\n    { separator: haveAnyOf(commands, EditorCommandId.Div, EditorCommandId.Span) },\n    { command: EditorCommandId.Div },\n    { command: EditorCommandId.Span },\n    { separator: true },\n    {\n      text: ui.context.translateText('Raw'),\n      subMenu: {\n        items: [\n          { command: EditorCommandId.HTMLInline },\n          { command: EditorCommandId.HTMLBlock },\n          { separator: true },\n          { command: EditorCommandId.TexInline },\n          { command: EditorCommandId.TexBlock },\n          { separator: true },\n          { command: EditorCommandId.RawInline },\n          { command: EditorCommandId.RawBlock },\n        ],\n      },\n    },\n    { separator: true },\n    { command: EditorCommandId.ClearFormatting },\n    { separator: true },\n    { command: EditorCommandId.AttrEdit },\n  ];\n}\n\nfunction insertMenu(ui: EditorUI, commands: EditorCommand[]) {\n  return [\n    { command: EditorCommandId.OmniInsert },\n    ...(haveAnyOf(commands, EditorCommandId.RCodeChunk, EditorCommandId.PythonCodeChunk)\n      ? [\n          { separator: true },\n          {\n            text: ui.context.translateText('Code Chunk'),\n            subMenu: {\n              items: [\n                { command: EditorCommandId.RCodeChunk },\n                { separator: true },\n                { command: EditorCommandId.PythonCodeChunk },\n                { command: EditorCommandId.BashCodeChunk },\n                { command: EditorCommandId.RcppCodeChunk },\n                { command: EditorCommandId.SQLCodeChunk },\n                { command: EditorCommandId.D3CodeChunk },\n                { command: EditorCommandId.StanCodeChunk },\n              ],\n            },\n          },\n        ]\n      : []),\n    { separator: true },\n    { command: EditorCommandId.Citation },\n    { command: EditorCommandId.CrossReference },\n    { command: EditorCommandId.Footnote },\n    { separator: true },\n    { command: EditorCommandId.Image },\n    { command: EditorCommandId.Link },\n    { command: EditorCommandId.HorizontalRule },\n    ...(haveAnyOf(commands, EditorCommandId.DefinitionList)\n      ? [\n          { separator: true },\n          {\n            text: ui.context.translateText('Definition'),\n            subMenu: {\n              items: [\n                { command: EditorCommandId.DefinitionList },\n                { separator: true },\n                { command: EditorCommandId.DefinitionTerm },\n                { command: EditorCommandId.DefinitionDescription },\n              ],\n            },\n          },\n        ]\n      : []),\n    { separator: true },\n    { command: EditorCommandId.InlineMath },\n    { command: EditorCommandId.DisplayMath },\n    { separator: true },\n    {\n      text: ui.context.translateText('Special Characters'),\n      subMenu: {\n        items: [\n          { command: EditorCommandId.Emoji },\n          { command: EditorCommandId.Symbol },\n          { separator: true },\n          { command: EditorCommandId.EnDash },\n          { command: EditorCommandId.EmDash },\n          { separator: true },\n          { command: EditorCommandId.NonBreakingSpace },\n          { separator: true },\n          { command: EditorCommandId.HardLineBreak },\n        ],\n      },\n    },\n    { separator: true },\n    { command: EditorCommandId.ParagraphInsert },\n    { command: EditorCommandId.CodeBlockFormat },\n    { command: EditorCommandId.InsertDiv },\n    { command: EditorCommandId.YamlMetadata },\n    { separator: true },\n    { command: EditorCommandId.Shortcode },\n    { separator: true },\n    { command: EditorCommandId.HTMLComment },\n  ];\n}\n\nfunction haveAnyOf(commands: EditorCommand[], ...ids: EditorCommandId[]) {\n  for (const command of commands) {\n    if (ids.includes(command.id)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction codeBlockCommand(commands: EditorCommand[]) {\n  return haveAnyOf(commands, EditorCommandId.CodeBlockFormat)\n    ? EditorCommandId.CodeBlockFormat\n    : EditorCommandId.CodeBlock;\n}\n","/*\n * table.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorCommandId } from './command';\nimport { EditorUI } from './ui';\n\nexport interface TableCapabilities {\n  captions: boolean;\n  headerOptional: boolean;\n  multiline: boolean;\n}\n\nexport function tableMenu(insert: boolean, ui: EditorUI) {\n  return [\n    ...(insert ? [{ command: EditorCommandId.TableInsertTable }] : []),\n    { command: EditorCommandId.TableAddRowBefore },\n    { command: EditorCommandId.TableAddRowAfter },\n    { separator: true },\n    { command: EditorCommandId.TableAddColumnBefore },\n    { command: EditorCommandId.TableAddColumnAfter },\n    { separator: true },\n    { command: EditorCommandId.TableDeleteRow },\n    { command: EditorCommandId.TableDeleteColumn },\n    { separator: true },\n    { command: EditorCommandId.TableDeleteTable },\n    { separator: true },\n    {\n      text: ui.context.translateText('Align Column'),\n      subMenu: {\n        items: [\n          { command: EditorCommandId.TableAlignColumnLeft },\n          { command: EditorCommandId.TableAlignColumnCenter },\n          { command: EditorCommandId.TableAlignColumnRight },\n          { separator: true },\n          { command: EditorCommandId.TableAlignColumnDefault },\n        ],\n      },\n    },\n    { separator: true },\n    { command: EditorCommandId.TableToggleHeader },\n    { command: EditorCommandId.TableToggleCaption },\n  ];\n}\n","/*\n * editor-schema.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, NodeSpec, MarkSpec, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ExtensionManager } from './editor-extensions';\nimport { PandocNode } from '../api/node';\nimport { PandocMark } from '../api/mark';\n\nexport function editorSchema(extensions: ExtensionManager): Schema {\n  // build in doc node + nodes from extensions\n  const nodes: { [name: string]: NodeSpec } = {\n    doc: {\n      attrs: {\n        initial: { default: false },\n      },\n      content: 'body notes',\n    },\n\n    body: {\n      content: 'block+',\n      isolating: true,\n      parseDOM: [{ tag: 'div[class*=\"body\"]' }],\n      toDOM() {\n        return [\n          'div',\n          { class: 'body pm-cursor-color pm-text-color pm-background-color pm-editing-root-node' },\n          ['div', { class: 'pm-content' }, 0],\n        ];\n      },\n    },\n\n    notes: {\n      content: 'note*',\n      parseDOM: [{ tag: 'div[class*=\"notes\"]' }],\n      toDOM() {\n        return [\n          'div',\n          { class: 'notes pm-cursor-color pm-text-color pm-background-color pm-editing-root-node' },\n          ['div', { class: 'pm-content' }, 0],\n        ];\n      },\n    },\n\n    note: {\n      content: 'block+',\n      attrs: {\n        ref: {},\n        number: { default: 1 },\n      },\n      isolating: true,\n      parseDOM: [\n        {\n          tag: 'div[class*=\"note\"]',\n          getAttrs(dom: Node | string) {\n            const el = dom as Element;\n            return {\n              ref: el.getAttribute('data-ref'),\n            };\n          },\n        },\n      ],\n      toDOM(node: ProsemirrorNode) {\n        return [\n          'div',\n          { 'data-ref': node.attrs.ref, class: 'note pm-footnote-body', 'data-number': node.attrs.number },\n          0,\n        ];\n      },\n    },\n  };\n  extensions.pandocNodes().forEach((node: PandocNode) => {\n    nodes[node.name] = node.spec;\n  });\n\n  // marks from extensions\n  const marks: { [name: string]: MarkSpec } = {};\n  extensions.pandocMarks().forEach((mark: PandocMark) => {\n    marks[mark.name] = mark.spec;\n  });\n\n  // allow code to exclude marks that don't support input rules\n  // (e.g. marks that denote a special escape sequences from markdown,\n  // like raw_tex, raw_html, shortcodes, xrefs, math, etc.)\n  if (marks.code) {\n    const excludeInCode = extensions\n      .pandocMarks()\n      .filter(mark => mark.noInputRules && mark.name !== 'code')\n      .map(mark => mark.name)\n      .join(' ');\n    marks.code.excludes = excludeInCode;\n  }\n\n  // return schema\n  return new Schema({\n    nodes,\n    marks,\n  });\n}\n"]}
\ No newline at end of file
+{"version":3,"sources":["src/polyfill/index.ts","src/polyfill/isconnected.ts","src/index.ts","src/polyfill/custom-event.ts","src/editor/editor.ts","src/api/cite.ts","src/api/doi.ts","src/api/ui-dialogs.ts","src/api/pandoc_attr.ts","src/api/extension.ts","src/api/pandoc_capabilities.ts","src/api/pandoc.ts","src/api/quote.ts","src/api/math.ts","src/api/code.ts","src/api/node.ts","src/api/link.ts","src/api/html.ts","src/api/events.ts","src/api/event-types.ts","src/api/pandoc_format.ts","src/api/yaml.ts","src/api/format.ts","src/api/object.ts","src/api/log.ts","src/api/basekeys.ts","src/api/selection.ts","src/api/transaction.ts","src/api/slice.ts","src/api/platform.ts","src/api/outline.ts","src/api/rmd.ts","src/api/mark.ts","src/api/text.ts","src/api/list.ts","src/api/command.ts","src/api/location.ts","src/api/ui.ts","src/api/util.ts","src/api/dom.ts","src/api/scroll.ts","src/api/navigation.ts","src/api/xref.ts","src/api/pandoc_id.ts","src/api/raw.ts","src/api/image.ts","src/api/fixup.ts","src/api/css.ts","src/api/change.ts","src/api/input_rule.ts","src/api/wrap.ts","src/nodes/yaml_metadata/yaml_metadata-title.ts","src/behaviors/outline.ts","src/behaviors/find.ts","src/behaviors/omni_insert/omni_insert.ts","src/api/completion.ts","src/behaviors/omni_insert/omni_insert-completion.tsx","src/api/omni_insert.ts","src/api/placeholder.ts","src/behaviors/completion/completion.ts","src/behaviors/completion/completion-popup.tsx","src/api/widgets/popup.tsx","src/api/promise.ts","src/behaviors/spelling/spelling-interactive.ts","src/behaviors/spelling/spelling.ts","src/api/spelling.ts","src/behaviors/spelling/spelling-realtime.ts","src/pandoc/pandoc_converter.ts","src/api/pandoc_capsule.ts","src/api/base64.ts","src/pandoc/pandoc_to_prosemirror.ts","src/pandoc/pandoc_from_prosemirror.ts","src/api/fragment.ts","src/editor/editor-extensions.ts","src/nodes/text.ts","src/nodes/paragraph.ts","src/api/paragraph.ts","src/nodes/heading.ts","src/nodes/blockquote.ts","src/nodes/code_block.ts","src/nodes/list/list.ts","src/nodes/list/list-commands.ts","src/nodes/list/list-checked.ts","src/nodes/list/list-pandoc.ts","src/nodes/image/image.ts","src/nodes/image/image-dialog.ts","src/nodes/image/image-util.ts","src/nodes/image/image-textsel.ts","src/nodes/image/figure.ts","src/api/decoration.ts","src/nodes/image/image-view.ts","src/nodes/image/image-resize.ts","src/api/widgets/widgets.ts","src/nodes/image/figure-keys.ts","src/nodes/image/image-events.ts","src/nodes/hr.ts","src/nodes/hard_break.ts","src/nodes/null.ts","src/marks/em.ts","src/marks/strong.ts","src/marks/code.ts","src/marks/link/link.ts","src/marks/link/link-command.ts","src/marks/link/link-auto.ts","src/api/clipboard.ts","src/marks/link/link-headings.ts","src/marks/link/link-popup.tsx","src/api/widgets/tooltip.ts","src/api/widgets/button.tsx","src/api/text-popup.ts","src/api/widgets/react.ts","src/api/widgets/decoration.ts","src/behaviors/select_all.ts","src/behaviors/history.ts","src/behaviors/cursor.ts","src/behaviors/clear_formatting.ts","src/behaviors/smarty.ts","src/behaviors/attr_duplicate_id.ts","src/behaviors/trailing_p.ts","src/behaviors/empty_mark.ts","src/behaviors/escape_mark.ts","src/behaviors/code_block_input.ts","src/behaviors/paste_text.ts","src/behaviors/bottom_padding.ts","src/behaviors/insert_symbol/insert_symbol-plugin-symbol.tsx","src/api/unicode.ts","src/behaviors/insert_symbol/insert_symbol-plugin.tsx","src/behaviors/insert_symbol/insert_symbol-popup.tsx","src/api/focus.ts","src/api/widgets/select.tsx","src/api/widgets/text.tsx","src/behaviors/insert_symbol/insert_symbol-grid.tsx","src/behaviors/insert_symbol/insert_symbol-grid-cell.tsx","src/behaviors/insert_symbol/insert_symbol-grid-preview.tsx","src/behaviors/insert_symbol/symbols.ts","src/behaviors/insert_symbol/insert_symbol-plugin-emoji.tsx","src/api/emoji.ts","src/api/emojis-all.ts","src/marks/emoji/emoji.ts","src/marks/emoji/emoji-completion.tsx","src/behaviors/insert_symbol/insert_symbol-emoji-skintone.tsx","src/behaviors/insert_symbol/insert_special_characters.ts","src/behaviors/nbsp.ts","src/behaviors/remove_section.ts","src/marks/strikeout.ts","src/marks/superscript.ts","src/marks/subscript.ts","src/marks/smallcaps.ts","src/marks/underline.ts","src/marks/raw_inline/raw_inline.ts","src/marks/raw_inline/raw_tex.ts","src/api/mark-highlight.ts","src/api/tex.ts","src/marks/raw_inline/raw_html.ts","src/marks/math/math.ts","src/marks/math/math-commands.ts","src/marks/math/math-transaction.ts","src/marks/math/math-highlight.ts","src/marks/math/math-popup.ts","src/marks/math/math-view.ts","src/marks/cite/cite.ts","src/api/bibliography/bibliography.ts","src/api/bibliography/bibliography-provider_local.ts","src/api/path.ts","src/api/bibliography/bibDB.ts","src/api/csl.ts","src/api/crossref.ts","src/api/csl-text.ts","src/api/bibtex/bibtex.ts","src/api/bibtex/fields.ts","src/api/bibtex/language.ts","src/api/bibtex/types.ts","src/api/bibtex/formatting.ts","src/api/bibtex/characters.ts","src/api/bibliography/bibliography-provider_zotero.ts","src/api/zotero.ts","src/marks/cite/cite-completion.tsx","src/api/widgets/completion.tsx","src/marks/cite/cite-bibliography_entry.ts","src/marks/cite/cite-highlight.ts","src/marks/cite/cite-completion_doi.tsx","src/api/widgets/completion-detailed.tsx","src/marks/cite/cite-doi.ts","src/marks/cite/cite-popup.tsx","src/marks/cite/cite-commands.ts","src/behaviors/insert_citation/insert_citation.tsx","src/api/widgets/tag-input.tsx","src/api/widgets/navigation-tree.tsx","src/api/widgets/dialog-buttons.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel.ts","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-bibliography.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-typeahead-search.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list-item.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-doi.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-latent-search.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list-item-detailed.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-crossref.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-pubmed.tsx","src/api/pubmed.ts","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-datacite.tsx","src/api/datacite.ts","src/behaviors/insert_citation/insert_citation-bibliography-picker.tsx","src/api/widgets/checkbox-input.tsx","src/marks/span.ts","src/marks/xref/xref.ts","src/marks/xref/xref-completion.tsx","src/marks/xref/xref-popup.tsx","src/marks/raw_inline/raw_html_comment.ts","src/marks/shortcode.ts","src/nodes/footnote/footnote.ts","src/api/shortcode.ts","src/nodes/footnote/footnote-editor.ts","src/nodes/footnote/footnote-transaction.ts","src/nodes/raw_block.ts","src/nodes/yaml_metadata/yaml_metadata.ts","src/nodes/yaml_metadata/yaml_metadata-capsule.ts","src/nodes/rmd_chunk/rmd_chunk.ts","src/nodes/rmd_chunk/rmd_chunk-image.ts","src/nodes/rmd_chunk/rmd_chunk-capsule.ts","src/nodes/div.ts","src/nodes/line_block.ts","src/nodes/table/table.ts","src/nodes/table/table-commands.ts","src/nodes/table/table-nodes.ts","src/nodes/table/table-pandoc.ts","src/nodes/table/table-columns.ts","src/nodes/table/table-capsule.ts","src/nodes/table/table-contextmenu.ts","src/nodes/table/table-paste.ts","src/nodes/definition_list/definition_list.ts","src/nodes/definition_list/definition_list-commands.ts","src/nodes/definition_list/definition_list-insert.ts","src/nodes/definition_list/definition-list-keys.ts","src/nodes/definition_list/definition_list-inputrule.ts","src/api/position.ts","src/nodes/definition_list/definition_list-pandoc.ts","src/nodes/shortcode_block.ts","src/nodes/html_preserve.ts","src/optional/ace/ace.ts","src/api/cursor.ts","src/optional/ace/ace-render-queue.ts","src/optional/ace/ace-placeholder.ts","src/optional/ace/ace-node-views.ts","src/behaviors/attr_edit/attr_edit.ts","src/behaviors/attr_edit/attr_edit-command.ts","src/behaviors/attr_edit/attr_edit-decoration.tsx","src/editor/editor-theme.ts","src/editor/editor-images.ts","src/editor/editor-menus.ts","src/api/table.ts","src/editor/editor-schema.ts"],"names":["_c944","f","r","id","cached","m","exports","Object","isFrozen","input","default","module","editor_1","Editor","UITools","mod","__esModule","value","custom_event_1","__importDefault","isconnected_1","t","_","label","ops","push","op","pop","trys","body","call","thisArg","e","y","done","__spreadArrays","this","s","i","il","arguments","length","Array","k","a","j","jl","defineProperty","prosemirror_inputrules_1","prosemirror_keymap_1","prosemirror_model_1","prosemirror_state_1","prosemirror_view_1","prosemirror_utils_1","cite_1","ui_dialogs_1","find_1","completion_1","spelling_interactive_1","spelling_realtime_1","pandoc_converter_1","EditorCommands","command_1","EditorCommandId","attr","propsToInput","attrPropsToInput","inputToProps","attrInputToProps","pandocAutoIdentifier","text","pandoc_id_1","image","validUnits","percentUnit","css_1","kPercentUnit","unitToPixels","image_1","pixelsToUnit","roundUnit","format","parseFormatConfig","pandoc_format_1","pandocFormatConfigFromCode","citation","citeUI","PluginKey","parent","context","options","pandocFormat","pandocCapabilities","_this","maxContentWidth","events","events_1","DOMEditorEvents","keybindings","initExtensions","editorSchema","extensions","EditorState","create","initialDoc","attributes","dispatchTransaction","bind","EditorDOMParser","schema","view","dom","add","editor_theme_1","defaultTheme","PandocConverter","server","pandoc","setAttribute","addEventListener","event_types_1","ScrollEvent","pandocFmt","editor","_a","spellCheck","codeEditor","rmdImagePreview","hideFormatComment","className","codeChunks","bookdownXRef","bookdownPart","blogdownMathInCode","rmdExtensions","hugoExtensions","__assign","shortcodes","docTypes","ui","images","defaultImages","omni_insert","sent","resolve","event","handler","subscribe","eventName","title","setTitle","state","setMarkdown","markdown","emitUpdate","Promise","doc","line_wrapping","unrecognized","unparsed_meta","loc","tr_1","i_1","getMarkdownTr","canonical","location","pandocConverter","toProsemirror","result","isInitialDoc","plugins","updateState","getEditingLocation","pos","nodeSize","dispatch","applyFixups","fixup_1","FixupContext","Load","emitEvent","StateChangeEvent","tr","getMarkdownCode","prototype","attrs","initial","getMarkdown","__generator","code","outline_1","getEditingOutlineLocation","getHTML","getTitle","getSelection","navigation_id","navigationIdForSelection","setEditingLocation","outlineLocation","previousLocation","getOutline","getFindReplace","selectCurrent","selectFirst","selectNext","selectPrevious","replace","getSpellingDoc","pandocMarks","spelling","spellingInvalidateAllWords","invalidateAllWords","spellingInvalidateWord","word","invalidateWord","extensionFixups","getSelectedText","replaceSelection","marks","selection","$from","replaceSelectionWith","trSetSel","setSelection","sel","getYamlFrontMatter","nodes","yaml_metadata","yaml_1","yamlFrontMatter","applyYamlFrontMatter","yaml","focus","blur","insertChunk","chunkPlaceholder","rowOffset","colOffset","navigate","type","recordCurrent","animate","NavigateEvent","nav","resize","applyFixupsOnResize","ResizeEvent","initFn","getMenus","commands","commandKeys","map","command","keymap","isActive","isEnabled","plural","execute","keepFocus","applyTheme","theme","classList","toggle","darkMode","setMaxContentWidth","maxWidth","minPadding","minContentPadding","syncContentWidth","setKeybindings","keyBindings","reconfigure","createPlugins","getEditorFormat","getPandocFormat","getPandocFormatConfig","isRmd","pandocFormatConfigFromDoc","lastTrSelectionOnly","selectionSet","docChanged","apply","storedMarksSet","getMeta","transaction_1","kFixupTransaction","UpdateEvent","outline_2","previousOutline","OutlineChangeEvent","DispatchEvent","eventType","detail","emit","editor_extensions_1","pandocExtensions","navigation","registerCompletionExtension","register","omni_insert_1","omniInsertExtension","omniInserters","markFilter","registerRealtimeSpelling","registerPlugins","realtimeSpellingPlugin","baseKeysPlugin","baseKeys","appendTransactionsPlugin","appendTransactions","hooks","Plugin","inputRulesPlugin","input_rule_1","markInputRuleFilter","plugin","inputRules","rules","handleTextInput","props","from","to","domEventsPlugin","key","handleDOMEvents","FocusEvent","keydown","prefs","tabKeyMoveFocus","pluginKeys","forEach","keys","ctrlKeyCodes","keyCombo","match","keyCode","toUpperCase","prosemirrorKeydownHandler","keydownHandler","keybindingsPlugin","keyEvent","ctrlKey","keyCommand","defaultKeys","clientWidth","applyPadding","LayoutEvent","fixups","fixup","nodeFromJSON","content","__awaiter","fromProsemirror","outlineNode","reverse","find","node","_super","DOMParser","fromSchema","parse","parseSlice","preserveWhitespace","kInvalidCiteKeyChars","createUniqueCiteId","existingIds","baseId","charCodeAt","char","asciiOnlyBaseId","includes","proposedId","count","safeBaseId","String","fromCharCode","suggestCiteId","csl","citeIdLeading","author","family","literal","shortTitle","substr","Math","min","issued","yearIssued","datePart","formatForPreview","pairs","name","undefined","dateParts","formatIssuedDate","containerTitle","volume","page","cslAny","charAt","slice","URL","DOI","doi_1","urlForDOI","formatAuthors","authors","maxLength","_b","_c","_d","previous","endsWith","index","current","substring","array","addAuthorOrEtAl","previousAuthorStr","newAuthorStr","authorStr","etAlStr","lastSpace","lastIndexOf","etAl","date","singleDatePart","citeProps","suggestedId","previewFields","kCrossrefMatches","findDOI","token","regex","hasDOI","doi","asPandocClass","clz","asHtmlId","startsWith","asHtmlClass","kAlertTypeInfo","kAlertTypeWarning","keyvalue","classes","split","style","pandoc_attr_1","pandocAttrKeyvalueFromText","kv","join","kPandocAttrId","kPandocAttrClasses","kPandocAttrKeyvalue","separator","convertedText","inQuotes","ch","trim","line","parts","kWidthAttrib","kHeightAttrib","kStyleAttrib","kCodeBlockText","kSpanAttr","kSpanChildren","pandocAttrSpec","pandocAttrFrom","pandocAttr","pandocAttrInSpec","spec","tok","c","pandocAttrToDomAttr","marker","domAttr","el","forceAttrs","excludedNames","includedNames","hasAttribute","getAttribute","filter","val","resolveCurrent","remainder","partitioned","partition","base","extension_1","extensionIfEnabled","extension","kPandocAttrExtensions","extensionEnabled","getPandocCapabilities","getCapabilities","version","api_version","output_formats","pandoc_1","parsePandocListOutput","highlight_languages","PandocTokenType","quote_1","math_1","code_1","link_1","tokens","hasOwnProperty","isArray","mapValue","mapToken","mappedTok","tokenHasChildren","imageAttributesAvailable","link_attributes","raw_html","output","entry","kRawBlockFormat","stringifyTokens","unemoji","elem","Str","Space","SoftBreak","LineBreak","kLinkChildren","Span","Quoted","kQuoteType","stringifyMath","Code","kCodeText","forEachToken","mapTokens","tokenTextEscaped","marksByPriority","markWriters","aPriority","priority","QuoteType","DoubleQuote","quotesForType","kSingleQuotes","SingleQuote","kSingleQuoteRegEx","RegExp","begin","end","kDoubleQuotes","fancyQuotesToSimple","Inline","MathType","typeset","math","isConnected","then","timerId_1","setInterval","clearInterval","kMathType","clipboardTextParser","$context","_i","codeViews","codeViewType","codeView","createFromPastePattern","test","textNode","codeNode","nodeType","createAndFill","Slice","Fragment","n","p","canInsertNode","canInsertNodeAtPos","asSelection","$pos","d","depth","canReplaceWith","findTopLevelBodyNodes","predicate","findNodeOfTypeInSelection","foundNode","lastNode","last","nodeIsActive","findSelectedNodeOfType","findParentNode","kLinkTarget","LinkType","ids","headings","findChildren","findChildrenByType","heading","level","textContent","escapeHTMLAttribute","div","appendChild","innerHTML","kHTMLCommentRegEx","isHTMLComment","html","noEmptyAttribs","tag","attribs","selfClosing","DOMSerializer","serializeNode","generateHTML","matchPandocFormatComment","pandocFormatConfigFromYamlInCode","firstYamlBlock","object_1","findValue","yamlMarkdownOptions","yamlFormatConfig","readPandocFormatConfig","mdExtensions","formatConfig","pandocFormatConfigFromCommentInCode","keyValueRegEx","field","fields","keyValueMatch","variables_1","source","obj","toString","mode","asString","rmd_extensions","doctype","str","references","references_location","references_prefix","prefix","toLowerCase","asBoolean","parseExtensions","re","enabled","exec","splitPandocFormatString","optionsPos","indexOf","commonmarkExtensions","rawHTML","format_1","kHugoDocType","kMarkdownGithubFormat","kGfmFormat","kCommonmarkFormat","kCommonmarkXFormat","yamlMetadataNodes","pandocFormatConfigFromYamlInDoc","foundFirstRawInline","config","pandocFormatConfigFromCommentInDoc","warnings","baseName","formatOptions","variant","validOptionNames","fullName","includeTexMathDollars","invalidFormat","invalidOptions","pandocMode","kMarkdownMmdFormat","kMarkdownStrictFormat","kMarkdownVariants","listExtensions","option","pandocFormatWith","hasFencedCodeBlocks","backtick_code_blocks","fenced_code_blocks","isYamlMetadataNode","kYamlMetadataTitleRegex","firstYaml","firstYamlNode","yamlText","updatedYaml","replaceRangeWith","updatedYamlNode","insert","titleFromYamlMetadataNode","titleMatch","yamlMetadataNameValueRegex","valueMatch","parseYaml","kFirstYamlBlockRegex","yamlCode","js_yaml_1","safeLoad","onWarning","log_1","logException","stripYamlDelimeters","yamlParsed","safeDump","object","some","ignoreKey","homeKey","editingNode","head","coordsAtPos","beginDocPos","isOnPreviousLine","setTextSelection","endKey","node_1","editingRootNode","start","endDocPos","top","bottom","arrowBodyNodeBoundary","dir","endOfTextblock","selection_1","selectionIsBodyTopLevel","side","$head","nextRootNode","editingRootNodeClosestToPos","nextPos","currentRootNode","BaseKey","Enter","prosemirror_commands_1","splitBlock","liftEmptyBlock","createParagraphNear","Backspace","selectNodeBackward","joinBackward","deleteSelection","Tab","ShiftTab","Delete","selectNodeForward","joinForward","platform_1","kPlatformMac","Home","End","ArrowLeft","ArrowUp","ArrowDown","ModArrowDown","endTopLevelBodyNodeBoundary","undoInputRule","x","commandMap","baseKey","unshift","values","_e","isTextblock","cursorOffset","parentOffset","nodeText","prosemirror_gapcursor_1","selectionIsWithinRange","range","anchor","nodeWithPos","selectionHasRange","parentNode","GapCursor","NodeSelection","selectionIsEmptyParagraph","slice_1","kPasteTransaction","kSetMarkdownTransaction","kNavigationTransaction","kInsertSymbolTransaction","kInsertCompletionTransaction","MarkTransaction","addMark","mark","removeStoredMark","insertText","transactionsDocChanged","transactions","transaction","transactionsChangeSet","oldState","newState","transactions_1","changeSet","addSteps","mapping","maps","complete","oldSize","old","childCount","curSize","cur","outer","scan","offset","child","sameMarkup","nodesBetween","size","step","sliceContentLength","handlers","handlers_1","nodeAt","nodeFilter","haveChange","changes","change","fromA","toA","checkForChange","append","_loop_1","handlers_2","trTransform","prosemirror_transform_1","Transform","transactionsAreTypingChange","hasNode","descendants","navigator","platform","outlineNodes","bodyNodes","bodyNode","bullet_list","ordered_list","list_item","listItemNode","rmd_chunk","rmdChunkNode","isOutlineNode","kYamlMetadataOutlineItemType","itemsWithPos","getDocumentOutline","item","active","position","kRmdchunkOutlineItemType","chunk","rmd_1","rmdChunkEngineAndLabel","kHeadingOutlineItemType","foundActive","items","getOutlineNodes","findParentNodeOfType","table","activeRmdChunk","rmdNode","rmdChunk","previousRmdChunks","chunks","rmdChunkNodes_1","lines","trimLeft","meta","matchLang","lang","idx","canInsertRmdChunk","insertRmdChunk","toggleBlockType","paragraph","list_1","precedingListItemInsertPos","offsetChars","reduce","rmdText","util_1","uuidv4","prevListItemPos","precedingListItemInsert","selPos","activeChunk","localeCompare","sensitivity","kEvalFalseRegEx","haveTableCellsWithInlineRcode","table_cell","table_header","cell","rangeHasMark","markedNode","markedRange","mark_1","getMarkRange","textBetween","text_1","link","startIndex","startPos","endIndex","isInSet","endPos","markIsActive","empty","storedMarks","markItem","markType","findChildrenByMark","removeMark","validLength","nd","markRange","detectAndApplyMarks","mergedTextNodes","_node","_pos","allowsMarkType","refText","lastIndex","textNodes","nodeIndex","isText","str1","str2","ListType","extendStatics","__extends","b","setPrototypeOf","__proto__","__","constructor","assign","prosemirror_schema_list_1","ui_1","ProsemirrorCommand","omniInsert","MarkCommand","toggleMarkType","NodeCommand","BlockCommand","blockType","toggleType","WrapCommand","wrapType","toggleWrap","scrollIntoView","InsertCharacterCommand","codeRange","defaultToggleMark","pandocAttrAvailable","wrapIn","listType","itemType","blockRange","$to","parentList","isList","validContent","setNodeMarkup","tight","listSpacing","kListSpacingTight","exitNode","sameParent","$anchor","allowKey","endCaptionPos","above","after","abs","dom_1","outlineItemSimillarToNode","outlineItem","docOutlneNode","nodeA","nodeB","scrollTop","docOutlineLocationNode","documentOutline","docOutlineNode","locationIsBetweenDocOutlineNodes","restoreSelection","scroll_1","scrollToPos","cs","getComputedStyle","asNumber","parseFloat","paddingX","paddingLeft","paddingRight","paddingY","paddingTop","paddingBottom","borderY","borderTopWidth","borderBottomWidth","width","offsetWidth","borderX","height","offsetHeight","onElementRemoved","container","onRemoved","mutationsList","mutation","removedNodes","center","parentDiv","findParentNodeOfTypeClosestToPos","resultPos","before","resultNode","nodeDOM","scroller","zenscroll_1","createScroller","containerEl","duration","onDone","intoView","HTMLElement","editingRoot","xref_1","navigateToId","navigateToHref","href","navigateToXRef","xref","xrefPosition","xrefPos","prevPos","max","dest","parentElement","navigateToPos","NavigationType","navigateTo","Pos","Id","Href","navigateToHeading","XRef","raw_1","xrefKey","suffix","colonPos","xrefTypeAndId","xrefInfo","id_1","locator_1","xrefPositionLocators","markType_1","hasXRef","h2","headingLocator","h3","h4","h5","h6","fig","nodeTypes","rmdChunkHasXRef","tab","kTexFormat","cnj","thereomLocator","def","engine","pattern","pandocAsciify","newch","chars","len","asciify","gfmAutoIdentifier","editRawBlockCommand","raw_block","setBlockType","action","rawBlock","raw","prevSel","createRawNode","asyncEditRawBlock","containerWidth","kPixelUnit","ImageType","isValidImageSizeUnit","unit","kValidUnits","imageSizePropWithUnit","prop","isNaturalAspectRatio","dims","defaultValue","naturalWidth","naturalHeight","pixels","round","attrib","_match","p1","p2","removeStyleAttrib","extractSizeStyles","keyvalues","newKeyvalues","getValue","pair","_attrib","setProperty","replaceClassWithStyle","contains","remove","removeAttribute","children_1","children","EditorChangeType","diff_match_patch_1","diffChars","timeout","dmp","diff_match_patch","Diff_Timeout","diff_main","diff","DIFF_INSERT","Insert","DIFF_EQUAL","DIFF_DELETE","regexp","getAttrs","InputRule","Function","textStart","delete","markInputRule","delimiterMarkInputRule","prefixMask","delim","contentPattern","textEnd","maskOffset","noInputRules","marksWithNoInputRules","marksInRange_1","maskedMarkTypes","maskedMarkTypes_1","conditionalWrappingInputRule","wrappingRule","wrappingInputRule","joinPredicate","wrapSentencesTransform","sentence","hardBreak","hardBreakPos","wrapSentences","titleFromState","yamlNodes_2","yamlMetadataTitlePlugin","init","_config","foundTitle","titleLine","yamlNode","hasOutlineIdsTransaction","Set","usedIds","outlineId","setMeta","GoToPreviousSection","goToSectionCommand","editorOutline","transactionsHaveChange","transactionsAffectOutline","outline","target","navigation_1","sequence","Map","rootOutlineItem","defaultLevel","typename","sequenceLast","getState","FindPlugin","instance","DecorationSet","updating","update","prevState","clearResultObserver","isResultSelected","term","resultElement","resultObserver","resultObserverTimer","updateResults","decorations","selectResult","afterSelection","matchesTerm","selectedText","wrap","searchTo","decorationSet","withResultUpdates","searchFrom","nextDecoration","lastDecoration","tr_3","decoration","tr_4","selectionMarks","marksAcross","replaceAll","replaced","hasTerm","tr_5","clear","kAddToHistoryTransaction","resultDecorations","search","findRegEx","Decoration","inline","class","TextSelection","watchForSelectedResult","MutationObserver","records","observer","ele","isResultNode","scrollToSelectedResult","observe","childList","window","setTimeout","disconnect","clearTimeout","querySelector","scrollElement","nextParent","offsetParent","caseSensitive","findPlugin","inclusive","parseDOM","toDOM","readers","writer","writeInlines","OmniInsertCommand","inputRuleFilter","completionHandlers","omni_insert_completion_1","omniInsertCompletionHandler","OmniInsert","selectionAllowsCompletions","kCompletionDefaultMaxVisible","prevHandler","scope","Node","replacement","omniInsertCompletions","inserter","keywords","keyword","sort","thenby_1","firstBy","omniInsertGroupCompare","thenBy","omniInsertPriorityCompare","direction","completion","deleteRange","selectionOffset","removeCommandText","component","OmniInserterView","kOmniInsertRegex","isOmniInsertCommandActive","query","placeholder_1","placeholderDecoration","translateText","completions","OmniInsertGroup","placeholder","pluginKey","set","emptyNode","textBefore","completionTextBeforeCursor","prevToken","isPaste","scrollUnsubscribe","removeEventListener","clearCompletions","pluginState","handled","horizontal","completionsActive","kbEvent","insertCompletion","selectedIndex","renderCompletions","forwardKey","completionPageSize","preventDefault","stopPropagation","promise_1","PromiseQueue","resetSelection","setAllCompletions","updatedCompletions","requestVersion_1","setDisplayedCompletions","displayedCompletions","updateCompletions","completionStream_1","stream","filteredCompletions","allCompletions","requestAllCompletions_1","hideNoResults","completionPopup","completion_popup_1","createCompletionPopup","renderCompletionPopup","performCompletionReplacement","CompletionPlugin","__importStar","document","createElement","zIndex","popup","completionPopupSize","positionStyles","selectionCoords","left","innerHeight","innerWidth","cursorCoords","completionPopupPositionStyles","applyStyles","render","react_1","CompletionPopup","destroyCompletionPopup","unmountComponentAtNode","concat","popup_1","Popup","CompletionList","kCompletionDefaultItemHeight","useRef","containerRef","scrollToRow","getElementsByClassName","ref","completionCount","header","completionHeader","headerProps","message","lineHeight","colSpan","completionsHeader","itemHeight","kNoResultsHeight","noResults","completionsNoResults","verticalCompletions","itemEventHandler","completionItemCell","onClick","onMouseMove","onHover","cellWidths","maxVisible","kCompletionDefaultWidth","headerHeight","horizontalCellWidths","total","contentEditable","queue","catch","err","running","reject","dequeue","spelling_1","excludedMarks","onCheckBegin","getWords","excluded","spellingDocPlugin","createAnchor","getText","wordRange","fromCoords","toCoords","spellingDocKey","get","SpellingDocPlugin","checking","anchors","setPosition","getPosition","SpellingAnchor","onCheckEnd","excludeWord","classifier","findBeginWord","findEndWord","beginPos","classifyCharacter","currentPos","advanceToWord","endWordPos","wordText","words","breakWords","hasNext","next","shift","spellcheckerWord","kCharClassWord","kCharClassBoundary","kCharClassNonWord","spelling_2","hasFocus","realtimeEnabled","hasBeenFocused","word_1","wordDecos","decos","prosemirror_changeset_1","ChangeSet","steps","AddMarkStep","RemoveMarkStep","markStep","markRanges","removeRanges_1","fromPos","toPos","fromB","toB","spellingDecorations","cursor","cursorDecos","realtimeSpellingKey","contextmenu","spellingSuggestionContextMenuHandler","focusUnsubscribe","updateSpelling","excludeCursor","checkWord","wordCheck","menuItems","clientX","clientY","schema_1","deco","from_1","to_1","word_2","suggestionList","suggestion","pandocPreprocessors","pandocPostprocessors","pandocTokensFilters","pandocBlockReaders","pandocInlineHTMLReaders","original","autoIds","gfm_auto_identifiers","adjustedFormat","preprocessor","blockCapsuleFilters","pandoc_capsule_1","pandocMarkdownWithBlockCapsules","pandoc_to_prosemirror_1","pandocToProsemirror","ast","tokensFilters","blockReaders","inlineHTMLReaders","postprocessor","pandocOptions","referenceLocation","disabledTableTypes","disabledFormatOptions","atxHeaders","dpi","column","parseInt","wrapOptions","astToMarkdown","ext","newFormat","kBlockCapsuleSentinel","handleText","encodedBlockCapsuleRegex","flags","envelopeLen","base64_1","base64Decode","record","fieldValue","blockCapsuleSourceWithoutPrefix","capsuleFilter","p3","p4","originalPos","positions","discard","extract","defaultExtractor","capsule","base64Encode","enclose","encodedRecord","decodeBlockCapsuleText","filters","blockCapsuleTextHandler","textFilter","stripPrefix","CodeBlock","RawBlock","parsePandocBlockCapsule","blockCapsuleParagraphTokenHandler","tokenRegex","Para","codeUnits","Uint16Array","Uint8Array","buffer","bytes","binary","Parser","createHandlers","ParserState","parser","closeNode","addNode","openMark","closeMark","writeText","hasInlineHTMLWriter","writeTokens","logUnrecognized","isNodeOpen","Null","blocks","prevTok","lineBreaks","columnBreaks","sentenceBreaks","targetAst","heading_ids","hasShortcutHeadingLinks","equalsIgnoreCase","autoIdentifier","ascii_identifiers","headingIds","has","toLocaleLowerCase","Link","astBlocks","Header","pandocAttrReadAST","heading_1","kHeadingAttr","kHeadingLevel","kHeadingChildren","resolveHeadingIds","lineWrapping","targetTokens","writeToken","blockCapsule","writeNode","reader","getChildren","this_1","block","blockReaders_1","blockReader","nodeType_2","openNode","Error","code_block","kCodeBlockAttr","readers_1","stack","Mark","none","unrecognizedTokens","merged","info","isInline","addToSet","removeFromSet","openNoteNode","note","maybeMerge","sameSet","pandocFromProsemirror","apiVersion","nodeWriters","notesNode","PandocWriter","writeNodes","notes","initEscapeCharacters","write","writeSpaces","spaceAfter","output_1","spaceBefore","outputText","trimRight","writeArray","writeAttr","preventEscapeCharacters","flushTextRun","textRun_1","smart","manualEscapeCharacters","writeNote","Note","noteBody","fragment","currentChild","childIndex","markedNodes","nextNode","activeMarks","md","fragment_1","fragmentText","escapeSymbols","escaped","escapeCharacters","RawInline","withOption","fill","tex_math_single_backslash","allEscapeCharacters","emjojiMark","emoji","emojihint","paragraph_1","blockquote_1","code_block_1","figure_1","hr_1","hard_break_1","null_1","em_1","strong_1","history_1","select_all_1","cursor_1","clear_formatting_1","smarty_1","attr_duplicate_id_1","trailing_p_1","empty_mark_1","escape_mark_1","code_block_input_1","manager","ExtensionManager","paste_text_1","bottom_padding_1","insert_symbol_plugin_symbol_1","insert_special_characters_1","nbsp_1","remove_section_1","footnote_1","yaml_metadata_1","rmd_chunk_1","table_1","definition_list_1","raw_block_1","shortcode_block_1","html_preserve_1","superscript_1","code_2","codeViewClipboardPlugin","tokensFilter","inlineHTMLReader","blockCapsuleFilter","pandocReaders","collectFrom","pandocMarkWriters","pandocNodeWriters","pandocNodes","code_view","views","attrEditors","collect","appendMarkTransactions","appendMarkTransaction","collector","visitor","results","flatMap","quote","group","Plain","insertParagraph","HeadingCommand","headingCommandFn","heading1OmniInsert","heading1","heading1_dark","heading2OmniInsert","headingOmniInsert","heading2","heading2_dark","heading3","heading4OmniInsert","heading4","heading4_dark","headingName","pandocAttrSupported","pandocAttrParseDom","header_attributes","mmd_header_identifiers","headingAttrs","headingAttr","data-link","partMatch","cut","writeBookdownH1","Heading1","Heading5","Heading6","textblockTypeInputRule","kHeadingLevels","pandocAttrParseText","emptyHeadingPlaceholderPlugin","CodeBlockFormat","codeBlockFormatCommandFn","languages","code_block_dark","fenced_code_attributes","potentialLang","codeBlockProps","dialogs","editCodeBlock","applyProps","newProps","propsWithLangClass","codeBlock","tags","right","editFn","codeNodeSpec","hasAttr","codeBlockLang","attrEditFn","codeBlockAttrEdit","CodeBlockFormatCommand","exitCode","ListNumberStyle","listAttrEdit","capabilities","list_commands_1","editListPropertiesCommandFn","task_lists","fancy_lists","startnum","tasks","checked","list_pandoc_1","readPandocList","number_delim","ListNumberDelim","DefaultDelim","order","number_style","typeToNumberStyle","numberDelim","fancy","DefaultStyle","Decimal","UpperAlpha","LowerRoman","UpperRoman","Example","OrderedList","writePandocOrderedList","nodeViews","ListCommand","BulletList","bulletListOmniInsert","orderedListOmniInsert","ListItemSink","sinkListItem","ListItemLift","liftListItem","ListItemSplit","splitListItem","list_checked_1","CheckedListItemCommand","CheckedListItemToggleCommand","basekeys_1","isNotInHeading","tightFn","listItemType","autoJoin","toggleList","TightListCommand","CheckedListItemNodeView","getPos","disabled","editable","ev","contentDOM","checkedListItemCommandFn","itemNode","setItemChecked","checkedListItemToggleCommandFn","check","baseInputRule","fragmentWithCheck","raw_inline","mappedTokens","lastWasChecked","writeListItemInlines","example","childAttrs","childWithChecked","writePandocListItem","figure","imageAttributes","src","decodeURI","readPandocTitle","alt","requireHTML","writeRawMarkdown","linkTo","writeFigure","writeLink","imageInlineHTMLReader","isImage","image_util_1","inlineHTMLIsImage","imageAttrsFromHTML","imageDOMOutputSpec","imageDOMAttributes","parseFromString","imageCommand","editorUI","img","imgDimensions","selectionIsImageNode","pandocImageHandler","imagePandocOutputWriter","imageNodeAttrsSpec","imageAttr","imageAttrsFromDOM","Image","attr_edit","noDecorator","_schema","imageTextSelectionPlugin","imageEventsPlugin","imagePropsWithSizes","linkMark","Figure","editImage","units","isNaturalHeight","newImage","imageProps","insertAndSelectNode","partitionedKeyvalue","sizeWithUnit","ensureContainerWidth","imagePos","findParentNodeClosestToPos","domAtPos","resizeContainer","elementInnerDimensions","resizeEl","definition_list","convertImagesToFigure","imagesToFiguresTransform","linkAttrs","getMarkAttrs","mappedImagePos","writerHasProhibitedFigureParent","contentElement","kRawBlockContent","html_1","isSingleLineHTML","fixupContext","appendTransaction","figureKeys","image_view_1","imageNodeViewPlugins","ImageNodeView","editorEvents","unregisterWatchImg","implicitFigures","implicit_figures","resizeUI","selectOnClick","imgBroken","onerror","onclick","ondblclick","image_dialog_1","imageDialog","imageDimensionsFromImg","updateImg","figcaption","noPropagateClick","manageFigcaption","ondragstart","initResizeContainer","updateImageSize","destroy","clearSizeOnVisibleTimer","detachResizeUI","selectNode","draggable","image_resize_1","isResizeUICompatible","detach","attachResizeUI","ignoreMutation","mapResourceToURL","updateImageViewSize","isFigure","sizeOnVisibleTimer","imageContainerWidth","noImplicitFigures","emptyFigcaption","selectionInFigcaption","hide","display","minHeight","margin","widthWithUnit","heightWithUnit","overflow","incompatibleWidth","incompatibleHeight","imageNode","imgContainerWidth","updateImageNodeFromShelf","hasPercentWidth","updateImageNodeSize","shelf","onInit","onWidthChanged","onHeightChanged","onUnitsChanged","onEditImage","uiImages","widgets_1","createPopup","editorContainer","updatePosition","editorBox","getBoundingClientRect","imageBox","editingScrollContainerEl","editingRootScrollContainerElement","positionTimer","panel","createHorizontalPanel","addToPanel","widget","addHorizontalPanelCell","paddingSpan","createInputLabel","wLabel","createTextInput","inputClasses","hLabel","hInput","onchange","hAutoLabel","unitsSelect","checkboxWrapper","lockCheckbox","lockLabel","createImageButton","properties","onload","manageUnitsUI","percentSizing","isNaN","getDim","wInput","shelfSizeFromImage","setWidth","setHeight","lock","resizeShelf","sync","lockRatio","prevUnits","widthPixels","widthInUnits","handle","onSizing","onSizingComplete","setPointerCapture","pageX","movedX","startX","movedY","pageY","startY","startWidth","startHeight","onPointerUp","havePointerEvents","releasePointerCapture","pointerId","onPointerMove","onPointerDown","resizeHandle","cssFloat","marginRight","marginLeft","liftStyle","liftImgStyle","widthProp","heightProp","kAlignAttrib","verticalAlign","onDestroyed","observer_1","subtree","button","imageEl","optionEl","widthChars","atEnd","selectFigureCaption","selectFigure","Selection","near","verticalArrowCanAdvanceWithinTextBlock","isWithinEmptyCaption","parentIndex","previousNode","parentTextBlock","figureSelection","nodePos","arrowHandler","ArrowRight","clipboardEvent","clipboardData","types","getData","clipboardUris","uris","handleImageUris","dragEvent","dataTransfer","coordinates","posAtCoords","uriList","droppedUris","imageUris","uri","handlePaste","imagePaste","Content","horizontal_rule_dark","horizontal_rule","HorizontalRule","insertNode","hrOmniInsert","br","ShiftEnter","atom","selectable","Emph","_mark","writeMark","Em","em","Strong","strong","inline_code_attributes","codeAttrs","autolink_bare_uris","citations","linkAttr","data-heading","extraAttr","kLinkTargetUrl","kLinkTargetTitle","linkCommand","onEditLink","result_1","Heading","asyncEditLink","link_dark","clipboard_1","autoLink","headingLink","linkEnd","matchText","copy","fromArray","linkText_1","attrs_1","matchedHeading_1","headingText","headingPos","linkPos","tooltip_1","button_1","linkCmd","removeLinkCmd","kMaxLinkWidth","React","LinkPopup","maxLinkWidth","openURL","clipboard","linkText","isSupported","LinkButton","showCopyButton","ImageButton","on","grav","show","tabIndex","onKeyDown","forwardRef","specKey","dismissOnEdit","makeLinksAccessible","onCmdClick","_oldState","kRestoreLocationTransaction","target_1","decorationPosition_1","decoration_1","textRangePopupDecorationPosition","editorView","ignoreSelection","stopEvent","textPopupDecorator","decorationEl","visibility","reactRenderForEditorView","links","getElementsByTagName","onkeydown","click","ReactDOM","element","editingBox","editingEl","editingBoxStyle","topPadding","popupStyle","rangeCoords","rightPos","prosemirror_history_1","history","SelectAll","selectAll","findBlockNodes","childBlocksSelection","gapArrowHandler","gapCursor","prosemirror_dropcursor_1","dropCursor","$divPos","createGapCursor","mouseEvent","clickPos","$clickPos_1","inside","divNode","stopImmediatePropagation","kFormattingMarks","markName","setStoredMarks","definition_list_term","definition_list_description","nodeRange","targetLiftDepth","liftTarget","lift","clearFormatting","enDash","ellipsis","emDash","hasAttrId","attrNode","mk","markRange_1","scannedRanges","extensionIfPandocAttrEnabled","requiresTrailingP","insertTrailingP","insertTrailingPTransform","firstChild","fencedAttributes","langAttrib","codeBlockInputRuleEnter","canApplyCodeBlockInputRule","pasteTextPlugin","bodyEl","bodyElement","toY","scrollHeight","insert_symbol_plugin_1","symbol_dark","symbol","filterPlaceholderHint","symbolGroups","symbols_1","insertSymbolTransaction","symbolCharacter","searchTerm","UnicodeSymbolDataProvider","symbolGroupNames","symbolGroup","flat","codepoint","groupName","symbols","unicode_1","parseCodepoint","filterText","filteredSymbols","fromCodePoint","Symbol","performInsertSymbol","symbolOmniInsert","InsertSymbolPlugin","isValidCodepoint","hexOnlyText","hexValue","Number","valueOf","showPopup","closePopup","focusChanged","panelPositionStylesForCurrentSelection","react_dom_1","insertSymbolPopup","editorRect","maximumTopPosition","minimumTopPosition","popupTopPosition","maximumLeftPosition","minimumLeftPosition","searchImage","searchPlaceholder","dataProvider","insert_symbol_grid_preview_1","InsertSymbolPopup","popupHeight","popupWidth","useState","setFilterText","selectedSymbolGroup","setSelectedSymbolGroup","selectedSymbolIndex","setSelectedSymbolIndex","preferenceChanged","setPreferenceChanged","symbolDataProvider","getSymbols","useMemo","filterSymbols","useEffect","focusElement","textRef","handleSelectedSymbolCommitted","onInsertSymbol","preferencesProps","onPreferencesChanged","preferenceRef","lastElement","onClose","shiftKey","focus_1","isElementFocused","gridRef","altKey","newIndex","insert_symbol_grid_1","newIndexForKeyboardEvent","gridWidth","TextInput","iconAdornment","onChange","selectRef","selectedOptions","selectedGroupName","symbolIndex","activeElement","SelectInput","characterWidth","onKeyUp","onKeyPress","onFocus","onPaste","SymbolCharacterGrid","columnWidth","floor","numberOfColumns","characterCellData","onSelectionChanged","selectedItemClassName","scrollToItem","rowIndex","symbolCharacters","react_window_1","FixedSizeGrid","columnCount","rowCount","ceil","rowHeight","itemData","SymbolCharacterCell","numberOfCells","prevRow","currentIndex","nextRow","nextPage","prevPage","itemIndex","characterGridCellItemData","onSelectionCommitted","symbolPreviewStyle","fontSize","insert_symbol_emoji_skintone_1","SymbolEmojiPreferencesPanel","bestAlias","aliases","alias","emoji_2","nodeForEmoji","kCategoryAll","emoji_1","emojiCategories","EmojiSymbolDataProvider","skinTone","emojiSkinTone","symbolForEmoji","description","hasMarkdownRepresentation","Emoji","emojiOmniInsert","emojis_all_1","emojis","emojiWithSkinTone","supportsSkinTone","emojiRaw","category","characterForSkinTone","SkinTone","Default","None","hasSkinTone","kEmojiAttr","kEmojiContent","catgegory","categories","emojiString","emojiWithSkinTonePreference","emojiFromChar","emojiAlias","kEmojis_1","emojiForAllSkinTones","Light","MediumLight","Medium","MediumDark","Dark","hint","prompt","emojiMark","emojiChar","emojiFromAlias","emojiName","emojiCompletionHandler","emojiSkintonePreferenceCompletionHandler","charLoc","skinToneEmoji","Save","markTr","markFrom","EmojiView","kEmojiCompletionRegEx","prefix_1","completions_1","setEmojiSkinTone","EmojiSkintonePreferenceHeaderView","kHeaderHeight","pref","kCellWidth","emojiText","selectedSkinTone","setSelectedSkinTone","previewEmoji","setSelectSkinTone","getCurrentSkinToneIndex","previewEmojiWithSkinTones","findIndex","nextSkinTone","selectSkinTone","commitSkinTonePreference","skinToneSelectedClass","handleButtonClick","EmDash","pastePluginKey","transformPastedHTML","highlightNode","forChangedNodes","highlightPluginKey","ReplaceStep","isRemoval","isSectionRemoval","fullySelectedDiv","divSelFrom","divSelTo","fullySelectedDivSection","Strikeout","strikeout","Superscript","superscript","Subscript","subscript","SmallCaps","Smallcaps","smallcaps","RawInlineInsertCommand","defaultFormat","outputFormats","editRawInline","raw_inline_dark","RawInlineCommand","kRawInlineFormat","kRawInlineContent","raw_attribute","rawTexMark","raw_tex","texText","texMatchLength","tex_1","texLength","addStoredMark","startTex","InsertInlineLatexCommand","TexInline","setTexSelectionAfterInsert","raw_inline_1","mark_highlight_1","markHighlightDecorations","latexHighlightingPlugin","splitInvalidatedMarks","texInputRule","braces","highlighter","decorationsForDoc","removeDecorations","addDecorations","markDecorations","rehighlightParent_1","braceLevel","isLetter","inBraces","inBrackets","bracketLevel","rawhtmlMark","endLoc","startLoc","isHTMLTag","close","void","isVoidTag","endTag","tagStartLoc","inSingleQuote","inDoubleQuote","rawHtmlInputRule","isRawHTMLFormat","writeInlineHTML","writeInlneHTML","isSingleTag","data-type","spellcheck","delimiterForType","kMathContent","delimter","mathText","delimiter","InlineMath","DisplayMath","Display","kInlineMathRegex","mathLength","startMath","math_commands_1","InsertInlineMathCommand","InsertDisplayMathCommand","singleLineDisplayMath","math_transaction_1","mathAppendMarkTransaction","math_highlight_1","mathHighlightPlugin","math_popup_1","MathPopupPlugin","math_view_1","mathViewPlugins","allowNewline","insertMathCommand","math_display_dark","math_display","displayMathOmniInsert","para","maths_1","mathRange","mathAttr","selectionIsWithin","lodash_debounce_1","updatePopup","updatePopupTimer","resizeUnsubscribe","mousemove","lastRenderedMath","$mousePos","equationPreview","rangeEndCoords","rangeStartCoords","editingElStyle","styles","inlineMath","error","autoscollPopup","popupBox","mathBottom","editorEl","mathText_1","mathjaxDiv","isActiveTab","_transactions","prevMathRange","delta","verticalArrowHandler","lodash_uniqby_1","bibliography_1","csl_1","kCiteIdBasePattern","bibManager","_event","cite_id","parsedDOI","cite_doi_1","doiFromSlice","doiText","findDoiInLocalBibliography","allowsWrites","citeIdInputRule","citeIdLen","citeIdLength","citeStart","citeEnd","readPandocCite","citeMark","cite","writeCitation","citationPrefix","suppress","citationMode","CitationMode","SuppressAuthor","citeIdMark","citationId","inTextSuffix","AuthorInText","citationSuffix","kNoteCiteRegex","kInTextCiteRegex","kInTextCiteWithSuffixRegEx","kCiteId","provider","load","performCiteCompletionReplacement","existingEntry","bibliographyFiles","writableBibliographyFiles","writableFile","insertCite","writableBiblios","thisWritableBiblio","writable","displayPath","bibliographyFile","fullPath","writableBiblioPath","isProject","project","providerKey","ensureSourcesInBibliography","idText","sources","providersWithWarnings","zoteroUseBetterBibtex","isBibTexBibliography","all","withWarning","warning","warningForProvider","yesNoMessage","every","kCitationIdRegex","citeText","idMark","BibliographyManager","zotero","prefixMatch","Cite","closeCite","parentText","beginBracketPos","cite_commands_1","InsertCitationCommand","bibliographyManager","kFindInTextCiteRegex","kFindFullCiteRegex","citeIdDashInputRule","citationDoiCompletionHandler","citationCompletionHandler","cite_highlight_1","citeHighlightPlugin","cite_popup_1","citePopupPlugin","bibliography_provider_local_1","bibliographyFileForPath","path","bibliographyTypes","defaultBiblioType","bibliographyDefaultType","displayName","kFields","weight","zoteroServer","BibliographyDataProviderZotero","refreshCollectionData","parsedYamlNodes","docPath","providersNeedUpdate","providersEntries","idSort","parseYamlNodes","providers","getDefaultResourceDir","prev","curr","isWritable","hasSources","allSources","kLocalBiliographyProviderKey","sourcesForProvider","sourcesForProviderCollection","collectionKey","localSources","bibFile","localProviders","providerName","prov","dataProviderBibTeX","generateBibTeX","bibDB_1","toBibTeX","warningMessage","warningProvider","findIdInLocalBibliography","searchProviderCollection","searchProvider","searchSources","limit","searchIndex","kSearchOptions","$or","bibliographiesRelative","bibliographyFilesFromDoc","yamlBlocks","path_1","expandPaths","resourcePath","parsedYamls","refBlockParsedYamls","parsedYaml","lastReferenceParsedYaml","referenceBlockFromYaml","getBibliography","bibliographiesAbsolute","refBlock","etag","bibliography","updateIndex","collections","collectionKeys","itemsForCollection","project_biblios","kPermissableFileExtensions","projectBiblio","getExtension","bibliographyFilesFromDocument","BibliographyDataProviderLocal","bibliographyValues","valueFromYamlText","ensureBibliographyFileForDoc","biblioNode","createBiblographyYamlNode","firstBlock","yamlWithBib","joinPaths","root","rootPath","paths","fileName","lastDot","changeExtension","biblatex_csl_converter_1","BibTypes","bibTypeKey","cslType","bibType","misc","keySortOrder","publisher","enumerableCSL","aOrder","bOrder","cslKey","biblatex","BibFieldTypes","bibFieldKey","bibField","cslFieldName","bibFieldDatas","bibFieldData","nodeValue_1","cslDate","edtfDate","cslDateToEDTFDate","options_1","optionKey","options_2","rangeArray","given","bibDBFieldName","required","optional","eitheror","shouldIncludeField","bibObject","pmNode","csl_text_1","cslTextToProsemirrorNode","nodes_1","BibLatexExporter","bibDB","traditionalNames","cslToBibDB","bibtex_1","bibDbToBibTeX","crossref_1","ensureValidCSLType","cslTypes","crossRefTypeToCSLType","sanitizeForCiteproc","sanitizeProperties","property","license","abstract","cslFromDoc","cslParsedYamls","part","partStr","_f","_g","_h","_j","_k","_l","_m","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z","article","articleJournal","articleMagazine","articleNewspaper","review","reviewBook","article_dark","bill","legislation","legalCase","treaty","legal","legal_dark","book","manuscript","thesis","book_dark","broadcast","broadcast_dark","dataset","data","data_dark","entryDictionary","entryEncylopedia","entry_dark","image_dark","map_dark","motionPicture","movie","movie_dark","musicalScore","song","song_dark","post","postWeblog","webpage","web","web_dark","paperConference","interview","pamphlet","personalCommunication","report","speech","other","other_dark","chapter","graphic","patent","kCrossrefItemsPerPage","imageForCrossrefType","crossRefTypes","monograph","journalArticle","journalVolume","journal","journalIssue","proceedingsArticle","dissertation","reportSeries","editedBook","bookChapter","bookSet","bookTrack","referenceBook","referenceEntry","postedContent","standard","standardSeries","peerReview","proceedingsSeries","proceedings","prettyType","bookSection","bookPart","bookSeries","kCslDOMParser","cslDOMParser","tagSpec","sup","sub","spanSpec","nocase","keysToExport","entryObject","csl_type","types_1","typeMapping","bibtex","bib_type","bibTexType","entry_key","fieldsForExport","fieldKey","fields_1","FieldMap","fieldType","typeReader","bibtexKey_1","outputFields","bibtexValue","year","month","formatText","formatRange","formatKey","escapeNonAscii","bibtexEntry","bibtexEntries","toBibtex","entries","bibTexStr","sortedKeys","rawValue","booktitle","number","codePointAt","characterMap","characters_1","ungrouped","latex","thisNodeMarks","closing","closeTags","lastNodeMarks","closeTag","formatting_1","FormattingTags","open","opening","formattedText","verbatim","doNotEscape","names","formattedNames","bookauthor","language_1","lanagugeMappings","series","swedish","thai","BibTextTypes","phdthesis","unpublished","inproceedings","techreport","fieldsRequired","fieldsOptional","booklet","fieldsEitherOr","character","decimal","731","780","__rest","kZoteroProviderKey","_resourcePath","useCache_1","newCollections","specResult","zoteroConfig","getCollections","collectionSpecs","status","collection","existingCollection","allCollections","col","allCollectionSpecs","toBibliographyCollection","hasUpdates","zoteroSpec","parentKey","bibliographyPaths","bibTeX","betterBibtexExport","zotero_1","kZoteroBibTeXTranslator","libraryID","managerEntries","loadedEntries_1","cite_bibliography_entry_1","entryForSource","kCitationCompleteScope","citationCompletions","_state","tokenWithoutEndPunctuation","searchAllSources","insertCitation","CompletionWarningHeaderView","BibliographySourceView","kCiteCompletionWidth","authorsFormatter","issuedDateFormatter","CompletionItemView","imageAdornment","htmlTitle","bibliography_provider_zotero_1","completion_detailed_1","cslEntry","CompletionItemDetailedView","subTitle","bibMgr","citeId","citationHTML","getDocumentPath","JSON","stringify","previewHtml","finalHtml","rootDiv","classNames","ensureSafeLinkIsPresent","url","urlForCitation","CitePopup","Citation","alreadyInCite","includeWrapper","wrapperText","preCiteIdRange","endOfWrapper","initialSelectionKey","selectionKey","setCitationDefaultInText","intextCitationStyle","bibliographySources","bibliographySources_1","citeIdText","performInsertCitations","initiallySelectedNodeKey","doiSourcePanel","crossrefSourcePanel","crossref","pubmedSourcePanel","pubmed","bibliographySourcePanel","InsertCitationPanel","onOk","requiresProgress","bibliographySourceProviders","sourceProvider","isSlowGeneratingBibliographySource","showProgress","toBibliographySource","hideProgress","onCancel","cancel","configuration","insertCitationConfiguration","setInsertCitationConfiguration","treeNode","citationsToAdd","defaultNode","selectedPanelProvider","statusMessage","placeHolderMessage","existingBibliographyFile","createBibliographyFile","citationDefaultInText","setInsertCitationPanelState","insertCitationPanelState","updatedState","displayedCitations","panelRef","defaultResults","insert_citation_source_panel_1","CitationSourceListStatus","streamTimerId","panelProvider","panelForNode","selectedNode","setSelectedPanelProvider","refreshSearchCallback","typeAheadSearch","existingCitationIds","searchResult","citationProps","panelHeight","mergedCitationsToAdd","onSearchTermChanged","memoizedTypeaheadSearch","onExecuteSearch","searchCanceled","inProgress","progressMessage","onAddCitation","newCitations","deleteCitation","filteredCitations","totalCitationCount","panelToDisplay","navigation_tree_1","NavigationTree","treeSourceData","suggestedPanel","tag_input_1","TagInput","displayText","isEditable","isIdEditable","targetSource","currentlySelectedCitation","onTagValidate","insert_citation_bibliography_picker_1","CitationBibliographyPicker","onCreateBibliographyFileNameChanged","biblographyFile","dialog_buttons_1","DialogButtons","nodeForKey","childNode","selected","toAdd","Tag","onTagDeleted","onTagChanged","editing","setEditing","editingText","setEditingText","setDisplayText","restoreFocusAfterCancel","useLayoutEffect","editTextInput","onEditClick","validationMessage","alert","kAlertTypeError","showingValidationError","commitTagEdit","pathToNode","expanded","visibleNodes","vizNodes","fixedList","stepNode","onSelectedNodeChanged","FixedSizeList","itemCount","itemSize","showSelection","preventFocus","indentLevel","indentStyle","nodeList","allNodes","increment","containsChild","existingSource","imageForType","finalId","rootImageForProvider","zotero_root","bibligraphy","toTree","containers","folderImage","treeMap","currentNode","hasParent","rootNodes","zotero_collection","bibligraphy_folder","folderImageForProvider","local_sources","providerNodes","collectionKeyForNode","useBetterBibTex","zoteroOverlay","toCitationListEntries","_searchTerm","_selectedNode","_existingCitationIds","insert_citation_source_panel_typeahead_search_1","CitationSourceTypeheadSearchPanel","onSelectedIndexChanged","onConfirm","listContainer","searchBoxRef","focusSearch","insert_citation_source_panel_list_1","CitationSourceList","focusPrevious","insert_citation_source_panel_list_item_1","CitationSourcePanelListItem","currentCitation","handleListKeyDown","handleIncrementIndex","itemsPerPage","onBlur","onRemoveCitation","showSeparator","itemProvider","search_progress","citationListData","citationEntry","maxIdLength","e_1","matchExistingSourceCitationListEntry","toCitationListEntry","errorForStatus","insert_citation_source_panel_list_item_detailed_1","pasted","performSearch","lastSearch","initialFocusSet","CitationSourcePanelListItemDetailed","alreadyAdded","doiServer","dedupeCitationIds_1","citationEntries","works","work","coercedCSL","crossrefWork","crossrefWorkTitle","pubMedResult","docs","pubmed_1","pubTypes","doiResult","sanitizedCSL","noResultsMessage","sortFirstAuthor","pubDate","creators","creator","fetchCSL","dataciteResult","familyName","publicationYear","span","getSelectionMarkRange","native_spans","data-span","all_symbols_escapable","stripRefBackslashTransform","potentialXRef","bookdownXRefUI","xref_popup_1","xrefPopupPlugin","xref_completion_1","xrefCompletionHandler","insertRef","cross_reference_dark","cross_reference","FuseIndex","xrefCompletions","xrefView","xrefs","fuse","createIndex","typeQuery","colonLoc","isCaseSensitive","shouldSort","withSavedDocument","refs","kXRefTypes","generic","h1","xrefs_1","xref_2","xrefForId","kMaxWidth","file","InsertHTMLCommentCommand","HTMLComment","raw_html_comment","comment_dark","comment","data-format","isComment","kHTMLCommentMarkRegEx","removeInvalidatedMarks","commentMarkAttribs","detectAndCreateShortcodes","shortcode_1","kShortcodeRegEx","shortcode","noSpelling","excludes","markTr_1","kShortcodePattern","writePandocNote","noteNode","footnote","footnoteOmniInsert","References","footnote_dark","selectedFootnote","findNoteNode","data-ref","data-content","footnote_editor_1","footnoteEditorActivationPlugin","footnoteEditorNodeViews","filterTransaction","footnote_transaction_1","footnoteFilterTransaction","footnoteSelectNoteAppendTransaction","Footnote","canInsertFootnote","edit","selectedNote","footnoteNode","ref_1","matching","ref_2","nodeDecoration","findFootnoteNode","NoteEditorView","footnoteEditorKeyDownHandler","firstNode","lastTextBlock","selectFootnote","findNotesContainer","noteWithPos","footnotes","findAllFootnotes","notesContainer","findAllNotes","toJSON","newNote","fromJSON","allNotes","footnoteFixupTransform","activeNote","RawBlockCommand","rawAttribute","textTrimmed","isSingleLineTex","readPandocRawBlock","isSingleChildParagraph","isParagraphWrappingMultilineRaw","rawTok","FormatRawBlockCommand","HTMLBlock","kHTMLFormat","Blocks","html_block_dark","html_block","TexBlock","tex_block_dark","tex_block","YamlMetadata","yaml_block_dark","yaml_block","yaml_metadata_capsule_1","yamlMetadataBlockCapsuleFilter","YamlMetadataCommand","yaml_metadata_title_1","RmdChunkCommand","Chunks","RChunkCommand","r_chunk_dark","r_chunk","PythonChunkCommand","python_chunk","BashChunkCommand","bash_chunk_dark","bash_chunk","d3_chunk","D3ChunkCommand","StanChunkCommand","StanCodeChunk","stan_chunk","md_index","firstLineMeta","lineNumbers","lineNumberFormatter","lineNumber","lineCount","bookdownTheorems","kBookdownDocType","rmd_chunk_capsule_1","rmdChunkBlockCapsuleFilter","RcppChunkCommand","SQLChunkCommand","rmd_chunk_image_1","RmdChunkImagePreviewPlugin","uiContext","imagePreviewDecorations","isRmdChunkNode","firstLine","widthMatch","width_1","stripQuotes","alignCenter_1","imagePath_1","unsubscribe","watchResource","kBlockCapsuleTextRegEx","kBlockCapsuleType","isFullDivSelection","createDiv","editDiv","defining","data-div","divCommand","Div","indexAfter","canApplyDivInputRule","attribMatch","attrProps","InsertDiv","LineBlock","line_block","line_block_dark","table_captions","grid_tables","multiline_tables","table_nodes_1","tableNode","tableCaptionNode","tableCellNode","tableHeaderNode","tableRowNode","TableInsertTable","table_commands_1","insertTable","insertTableOmniInsert","TablePreviousCell","prosemirror_tables_1","goToNextCell","TableColumnCommand","TableAddColumnAfter","addColumns","TableAddColumnBefore","TableRowCommand","TableAddRowAfter","addRows","TableAddRowBefore","TableDeleteRow","deleteRow","TableColumnAlignmentCommand","TableAlignColumnRight","CssAlignment","Right","TableAlignColumnCenter","Center","TableAlignColumnDefault","TableToggleCaptionCommand","headerOptional","columnResizing","handleWidth","table_paste_1","tablePaste","table_contextmenu_1","TableContextMenuPlugin","multiline","ModEnter","table_container","table_caption","numRows","rows","cells","cellType","tableCaption","tableContainer","selectionPos","cols","inactive","caption","Lists","table_dark","deleteTable","columns","rect","selectedRect","addRow","alignments_1","rowNode","cellPos","cellOffset","cellNode","align","colIndex","TableToggleHeaderCommand","TableToggleHeader","toggleHeader","isInTable","TableToggleCaption","tr_2","left_1","right_1","selectionCell","tableStart","TableMap","CellSelection","rectBetween","$anchorCell","$headCell","tableGroup","getFromDOM","textAlign","kDefaultCellClasses","Table","table_pandoc_1","readPandocTable","writePandocTableContainer","table_capsule_1","tableBlockCapsuleFilter","colgroup","childElementCount","colpercents","firstRow","colWidth","colWidths","table_columns_1","tableColumnWidths","writePandocTable","writePandocTableCaption","table_row","writePandocTableNodes","writePandocTableHeaderNodes","alignments","AlignLeft","Left","AlignRight","AlignCenter","AlignDefault","tableToken","ColWidth","columnPercents","parseRow","row","captionBlock","lastChild","widths","ColWidthDefault","headerCut","tableColumnAlignments","colwidth","defaultWidth","totalWidth","tables_1","kTableBlockCapsuleType","capsuleText","DefinitionList","definition","unparsedTable_1","TableDeleteColumn","subMenu","TableAlignColumnLeft","menuVisible","sliceHasNode","fixupTableWidths","currentColumn","columnAlignments","headerPos","childPos","definition_lists","definition_list_pandoc_1","writePandocDefinitionListDescription","readPandocDefinitionList","writePandocDefinitionList","definition_list_inputrule_1","definitionInputRule","definition_list_insert_1","insertDefinitionListAppendTransaction","emptyNodePlaceholderPlugin","termText","insertTermText","insertDefinitionList","createDefinitionDescription","definition_list_dark","InsertDefinitionList","InsertDefinitionListItemCommand","createFn","dlTypes","insertPos","InsertDefinitionTerm","InsertDefinitionDescription","lists_1","listPos","list","listParent","listIndex","definitionList","prevCursor","definitionListEnter","parentTerm","selectionNode","isParagraph","isEmpty","position_1","isLastChild","descriptionNode","endOfDescriptionEnter","isOnlyChild","emptyTermBackspace","emptyDescriptionBackspace","advancePos","definitionListShiftTab","backwardPos","prevNode","listNode","depthOffset","isParagraphAfterParagraph","prevPara","writeCurrent","writePandocDefinitionListTerm","kShortcodeBlockCapsuleType","_p3","shortcode_block","borderColorClass","isParaWrappingShortcode","Shortcode","shortcodeNode","htmlPreserveBlockCapsuleFilter","kHtmlPreserveBlockCapsuleType","handleToken","html_preserve","ace_placeholder_1","ace_node_views_1","acePlugins","aceRenderQueue","ace_render_queue_1","AceRenderQueue","aceNodeViews","AceNodeViews","AceNodeView","handleClick","editorOptions","gapCursorPending","selectionMarker","queuedSelection","subscriptions","renderedWidth","scrollRow","mouseDown","preview","AcePlaceholder","getElement","updateMode","onEditorDispatch","initEditor","renderQueue","unsub","_decos","editSession","getDocument","computeChange","AceRange","fromPoints","indexToPosition","findMarkers","removeMarker","findPluginState","markerFrom","markerTo","aceEditor","escaping","require","Range","setSelectionRange","QueuedSelection","pending","_mutation","forwardSelection","asProseMirrorSelection","session","getRange","positionToIndex","highlightSelectionAcross","addMarker","getContents","replaceWith","offsetTop","viewTop","viewBottom","scrollCursorIntoView","clearSelection","getSession","valueChanged","cursorDirty","addCommand","bindKey","arrowMaybeEscape","backspaceMaybeDeleteNode","undo","redo","win","mac","getCursorPosition","executeSelection","renderer","metrics","$fontMetrics","$observer","setContainer","debounceResize","evt","resizeTimer","setMode","execCommand","getLength","innerText","getCursor","containerRect","cursorRect","down","up","oldEnd","oldVal","newEnd","newVal","nodeBefore","nodeAfter","cursorPos","prevNodePos","nextNodePos","nextNodeTextBlock","nextNodeCode","targetPos","renderCompleted","updateTimer","needsSort","bypass","visible","onUpdate","IntersectionObserver","entries_1","processRenderQueue","isIntersecting","cancelTimer","onScroll","scheduleRender","isRenderCompleted","renderTimer","delayMs","nodeView","prevNodePos_1","nv","ndView","setGapCursorPending","AttrEditCommand","editors","editMarkAttrs","editAttr","attr_edit_1","kEditAttrShortcut","properties_deco_dark","properties_deco","ed","parentWithAttrs","editorNode","attrTags","rightPaddingOffset","attrsEl","attrsNode","offsetParentStyle","AttrEditDecorationPlugin","gutterBackgroundColor","gutterTextColor","textColor","surfaceWidgetTextColor","lightTextColor","linkTextColor","invisibleTextColor","markupTextColor","findTextBackgroundColor","findTextBorderColor","blockBorderColor","focusOutlineColor","paneBorderColor","fixedWidthFont","fixedWidthFontSizePt","proportionalFont","proportionalFontSizePt","atomColor","tagColor","attributeColor","hrColor","linkColor","errorColor","setStyleElement","css","styleEl","getElementById","defaults","backgroundColor","borderBackgroundColor","placeholderTextColor","selectionColor","cursorColor","metadataBackgroundColor","chunkBackgroundColor","spanBackgroundColor","divBackgroundColor","commentColor","commentBackgroundColor","nodeSelectionColor","padding","copy_png_1","properties_png_1","properties_deco_png_1","properties_deco_dark_png_1","removelink_png_1","runchunk_png_1","runprevchunks_png_1","search_png_1","search_progress_gif_1","generic_png_1","heading1_png_1","heading1_dark_png_1","heading2_png_1","heading2_dark_png_1","heading3_png_1","heading3_dark_png_1","heading4_png_1","heading4_dark_png_1","bullet_list_png_1","bullet_list_dark_png_1","ordered_list_png_1","ordered_list_dark_png_1","blockquote_png_1","blockquote_dark_png_1","math_inline_png_1","math_inline_dark_png_1","math_display_png_1","math_display_dark_png_1","html_block_png_1","html_block_dark_png_1","line_block_png_1","line_block_dark_png_1","emoji_png_1","emoji_dark_png_1","comment_png_1","comment_dark_png_1","div_png_1","div_dark_png_1","code_block_png_1","code_block_dark_png_1","footnote_png_1","footnote_dark_png_1","citation_png_1","citation_dark_png_1","cross_reference_png_1","cross_reference_dark_png_1","symbol_png_1","symbol_dark_png_1","table_png_1","table_dark_png_1","definition_list_png_1","definition_list_dark_png_1","horizontal_rule_png_1","horizontal_rule_dark_png_1","image_png_1","image_dark_png_1","link_png_1","link_dark_png_1","paragraph_png_1","paragraph_dark_png_1","raw_block_png_1","raw_block_dark_png_1","raw_inline_png_1","raw_inline_dark_png_1","tex_block_png_1","tex_block_dark_png_1","yaml_block_png_1","yaml_block_dark_png_1","python_chunk_png_1","sql_chunk_png_1","d3_chunk_png_1","stan_chunk_png_1","bash_chunk_png_1","bash_chunk_dark_png_1","r_chunk_png_1","r_chunk_dark_png_1","rcpp_chunk_png_1","rcpp_chunk_dark_png_1","heading3_dark","bullet_list_dark","ordered_list_dark","blockquote","blockquote_dark","math_inline","math_inline_dark","emoji_dark","div_dark","citation_dark","paragraph_dark","raw_block_dark","sql_chunk","rcpp_chunk_dark","book_dark_png_1","formatMenu","Underline","ListItemCheck","ListItemCheckToggle","EditListProperties","Blockquote","haveAnyOf","HTMLInline","ClearFormatting","AttrEdit","RCodeChunk","PythonCodeChunk","BashCodeChunk","RcppCodeChunk","SQLCodeChunk","D3CodeChunk","DefinitionTerm","DefinitionDescription","ParagraphInsert","commands_1","editorMenus","TableDeleteTable"],"mappings":"YAeA,IAAAA,EAAA,CACAC,EAAA,KAGE,MACAC,EAAA,SAAAC,kECXFC,EAASJ,EAAAK,EAAAF,GAAQ,IACXG,QAAE,KACJD,EAAA,CAAOC,QAAAF,EAAeE,gBACpBF,EAAGE,QAAAF,EAAAC,EAAAD,EAAAE,mBAEOF,EAAAC,EAAAC,8FCThBC,OAAAC,SAAAC,GAASA,EAAAC,QAAAD,sGDoBT,SAAAE,EAAAL,kJEnBAI,cACEE,EAAWZ,EAAAE,EAAO,KAA4BW,OAAOD,EAAAC,SAErDC,QAASF,EAAYE,2BACqCR,wDACxDS,GAAUA,EAAAC,WAASD,EAAY,CAAAL,QAAAK,0BAExBT,EAAA,aAAA,CAAAW,OAAA,oBAGTC,EAAOC,EAAcnB,EAAAE,EAAA,yBAVvBkB,EAAAV,23ECSA,MAEA,GAAAW,GAAAC,EAAAC,MAAAF,EAAA,GAAA,CACAC,EAAAC,MAAAF,EAAA,GACAC,EAAAE,IAAAC,KAAAC,GACA,MAIAL,EAAA,IAIAC,EAAAE,IAAAG,MAWAL,EAAAM,KAAAD,MACA,SAEAD,EAAAG,EAAAC,KAAAC,EAAAT,GAYA,MAAAU,GAOAN,EAAA,CACA,EAOAM,GAEAC,EAAA,EACA,QACAhC,EAAAoB,EAAA,EAGA,GAAA,EAAAK,EAAA,GACA,MAAAA,EAAA,GACA,MAAA,CAEAT,MAAAS,EAAA,GAAAA,EAAA,QAAA,EAEAQ,MAAA,cAMAC,EAAAC,MAAAA,KAAAD,gBAAA,WACA,IAAA,IAAAE,EAAA,EAAAC,EAAA,EAAAC,EAAAC,UAAAC,OAAAH,EAAAC,EAAAD,IAaAD,GAAAG,UAAAF,GAAAG,OACA,IAAAvC,EAAAwC,MAAAL,GAAAM,EAAA,EAAA,IAAAL,EAAA,EAAAA,EAAAC,EAAAD,IAEA,IAAA,IAAAM,EAAAJ,UAAAF,GAAAO,EAAA,EAAAC,EAAAF,EAAAH,OAAAI,EAAAC,EAAAD,IAAAF,IACAzC,EAAAyC,GAAAC,EAAAC,GAEA,OAAA3C,GAGAK,OAAAwC,eAAAzC,EAAA,aAAA,CAAAW,OAAA,IACA,IAAA+B,EAAAhD,EAAAE,EAAA,KACA+C,EAAAjD,EAAAE,EAAA,KACAgD,EAAAlD,EAAAE,EAAA,KAGAiD,EAAAnD,EAAAE,EAAA,KACAkD,EAAApD,EAAAE,EAAA,KA0DAF,EAAAE,EAAA,KAAS,IAAAmD,EAAArD,EAAAE,EAAA,KA4BToD,EAAAtD,EAAAE,EAAA,GAOEqD,EAAAvD,EAAAE,EAAA,KACcF,EAAAE,EAAA,MACVF,EAAAE,EAAA,MACAF,EAAAE,EAAA,MACAF,EAAAE,EAAA,MAAwCF,EAAAE,EAAA,0BAGrCF,EAAQE,EAAA,MACXF,EAAAE,EAAY,MAAMF,EAAAE,EAAA,gBAClBF,EAAAE,EAAA,QAAmBA,EAAA,gBACnBF,EAAAE,EAAY,MACZF,EAAAE,EAAA,MACAF,EAAAE,EAAA,gBAGGF,EAAAE,EAAA,MAIAF,EAAAE,EAAA,MAKHF,EAAME,EAAA,cAGZsD,EAAAxD,EAAAE,EAAA,cAlCauD,EAAAzD,EAAAE,EAAA,IAoCPwD,EAAwB1D,EAAAE,EAAA,IAE9ByD,EAAA3D,EAAAE,EAAA,IA4GE0D,EACE5D,EACAE,EAAA,MAFFF,EAAAE,EAAA,MA/EQF,EAAAE,EAAA,OACAF,EAAAE,EAAA,OAGAF,EAAAE,EAAA,OAoFQF,EAAAE,EAAA,SACd,SACA,WACKF,EAAAE,EAAU,MACf2D,eAAcC,EAAAC,iCAGd3B,KAAK4B,KAAA,CAGLC,aAAkBV,EAAKW,iBAGvBC,aAAcZ,EAAAa,iBAKdC,qBAAK,SAAAC,GAKA,OAAAC,EAAAF,qBAAAC,GAAA,UAKHE,MAAK,CACLC,WAAS,iCAKPC,YAAQ,WACV,OAAWC,EAAAC,cAIbC,aAAgBC,EAAAD,aACdE,aAAYD,EAAAC,aACZC,UAAAF,EAAAE,gBAEAC,OAAA,CAAUC,kBAAAC,EAAAC,gEAOZhD,KAAAiD,SAAO,CAAAC,OAAehC,EAAUgC,2BAOpB,IAAAnC,EAAcoC,UAAA,iBAGrB,oBAGA1E,EAAA2E,EAAAC,EAAsBC,EAAAT,EAAAU,EAAAC,GAQ3B,IAAIC,EAAKzD,UACP0D,gBAAW,yBACJ,4BACJ,gBAIL1D,KAAK2D,OAAK,IAAQC,EAAAC,gBAAYT,QAC5BC,QAAKA,iBAGPrD,KAAA6C,OAAAA,OAGEiB,YAAI,QACJP,aAAYA,0BAGMC,kBACZxD,KAAO+D,+BACAC,aAAUhE,KAAAiE,0FAGjBlD,EAAUmD,YAAAC,OAAA,wBAGZnE,KAAAoE,4CAhLY,IAAAC,EAApB,mHAOSrE,KAAAsE,oBAAAC,KAAAvE,oBACLwE,GAAWxE,KAAAyE,mBACXJ,0BAEArE,KAAA0E,KAAAC,IAAiB,eAAA,qDAQjBC,IAAA,wCACAC,EAAAC,qCACA,IAAAtD,EAAauD,gBAAA/E,KAAAyE,OAAAzE,KAAAiE,WAAAZ,EAAA2B,OAAAC,OAAAjF,KAAAwD,wHAQb0B,aAAA,aACE,gBAOE,cACNC,iBAAO,UAAA,6CAIG,uBAGJC,EAAWC,gBAIX,uBASY,qFAAZC,EAAY9B,EAAA+B,WAGSvF,MAAA,SAAAwF,UAAAA,EAAArG,uCAArBsG,YAAA,EAGAC,WAAa,aAGnBC,iBAAA,EAAAC,mBAAA,EAAOC,UAAQ,uGAkHVC,YAAP,EACYC,cAAA,oBAGLC,cAAP,EACaC,oBAAoB,GACjBpD,EAAOqD,eACdC,eAAAC,EAAA,CAAAC,YAAA,GAAAxD,EAAAsD,gBACOG,SAAOzD,EAAUyD,UAAO,gCAIjCjD,EAAA+C,EAAPA,EAAgB,GAAa/C,GAAA,CAChBkD,GAAAH,EAAAA,EAAA,GAAS/C,EAAKkD,IAAO,CACxBC,OAAAJ,EAAAA,EAAAA,EAAA,GAAAK,GAAApD,EAAAkD,GAAAC,QAAA,CACaE,YAAAN,EAAAA,EAAA,GAAAK,EAAAC,aAAArD,EAAAkD,GAAAC,2GAUN,WAAAhB,EAAAmB,OAAM,kDACb,SAIRnD,EAASgC,EAAAmB,SACF,IAAAlI,EAAQ2E,EAAAC,EAAAC,EAAAT,EAAYyC,EAAO9B,cAG9BoD,QAASrB,gCASR,sDAGK,SAAAsB,EAAeC,SACrB,+BACAC,UAAA,CAAAC,UAAAH,GAAAC,oDAOE,SAAAG,WACMC,SAAGlH,KAAAmH,MAAAF,yCAUfG,YAAK,SAAYC,EAAA/D,EAAagE,YAG1BtH,UAAA,EAAYuH,SAAA,iBACdC,EAAKC,EAAUC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,WACVjI,MAAA,SAAUwF,UACfA,EAAArG,cAKI,MAAA,CACY,EAAAa,KAAAkI,gBAAAC,cAAAd,EAAArH,KAAAuD,sBACZ,cADAiE,EAAAY,EAAYZ,IAAAC,EAAAW,EAAAX,cAAAC,EAAAU,EAAAV,aAAAC,EAAAS,EAAAT,cACZ3H,KAAAqI,eAGNrI,KAAAmH,MAAApG,EAAAmD,YAAAC,OAAA,CAAAM,OAAAzE,KAAAmH,MAAA1C,OAAO+C,IAAAA,EACLc,QAAAtI,KAASmH,MAAAmB,eAET5D,KAAA6D,YAAYvI,KAAAmH,YAaH,KAXTnH,KAAAwI,yIAQgB,qDADbV,KACiB,KAGXF,EAAAa,IAAbZ,EAAAL,IAAyBkB,oDAEjB1I,KAAK0E,KAAKiE,SAAMd,eACTe,YAAAC,EAAAC,aAAAC,MAAMzB,uEAAbtH,KAAOgJ,UAAA5D,EAAA6D,qBAGbjJ,KAAAmH,MAAA+B,GAAO,QAELC,gBAAgBpB,EAAKzE,2EAKlB0E,UAAAA,EACEP,cAAAA,iBAGFE,cAAPA,EACSM,SAAeA,cAStBmB,UAAOf,aAAA,kBACLrI,KAAImH,MAAAK,IAAA6B,MAAAC,qBAEJC,YAAe,SAAAjG,kDAIZ,OAAAkG,EAAAxJ,MAAA,SAAPwF,GACS,OAAAA,EAAArG,cAIP,OADK+J,EAAAlJ,KAAAmH,MAAA+B,GACL,GAGKlJ,KAAAmJ,gBAAPD,EAAA5F,WAIA,MAAA,CACS,EACC,CAAwCmG,KAF3CjE,EAAAmB,+CAGMsB,SAAAyB,EAAAC,0BAAA3J,KAAAmH,6BAEUwC,0BAAiB,uEAClBC,QAAA,0FACIC,SAAA,sDACKC,aAAA,4CAC3B,qBACAC,cAAOC,GAAAhK,KAAAmH,6FAKTiC,UAAOa,mBAAA,SAAAC,EAA+BC,0CAItCf,UAAAgB,WAAA,kDAIAhB,UAAAiB,eAAA,sBAMW,MAAA,6GAEI,oBAAWC,cAAA7G,EAAgBiB,qCAApCtD,EAASmJ,YAAA9G,EAAAiB,kBAIb,oBACK8F,WAAO/G,EAAAiB,wCAKRtD,EAAKqJ,eAAMhH,EAAAiB,eAIjB,SAAAxC,YAAAwI,QAAAjH,EAAAiB,KAAAxC,qGAOKzD,EAAA2K,UAAAuB,eAAA,WAEC,OAAArJ,EAAAqJ,eAAE3K,KAAA0E,KAAM1E,KAAAiE,WAAA2G,cAAA5K,KAAAqD,QAAAkD,GAAAsE,aAMdzB,UAAW0B,2BAAmB,WAC9BvJ,EAAmBwJ,mBAAA/K,KAAA0E,mBAIXsG,uBAAM,SAAcC,KACTC,eAAgBlL,KAAG0E,KAAAuG,oFAKjC,IAAA7C,EAAAjB,EAAA+B,EACD,OAAKM,EAAaxJ,MAAA,SAAewF,GACnC,OAAOA,EAAArG,OACF,KAAA,EACE,MAAA,4DAKL,KAAK,SACPiJ,EAAA5C,EAAAmB,kDAIGa,IAAPY,EAAAZ,IACYc,QAAAtI,KAAAmH,MAAAmB,UAGLY,EAAA/B,EAAP+B,GACalJ,KAAoBmL,gBAAAjC,EAAAL,EAAAC,aAAAC,OAG1B,EACa/I,KAAAmJ,gBAAeD,EAAA5F,wBAKqB8H,gBAAA,6GAAsBC,iBAAA,SAAAxM,sDAEtEyM,EAAMtL,KAAA0E,KAAAyC,MAAAoE,UAAWC,MAAKF,QAGxBpC,EAAAlJ,KAAQ0E,KAAMyC,MAAA+B,GAAAuC,qBAAAzL,KAAA0E,KAAAyC,MAAA1C,OAAAvC,KAAArD,EAAAyM,IAAA,WAChB5G,KAAKiE,SAAAO,MACC,gEAENwC,EAAe1L,KAAA0E,KAAAyC,MAAA+B,GAAAyC,aAAeC,6BAKhCxC,UAAKyC,mBAAA,WACL,OAAA7L,KAAKyE,OAAAqH,MAAAC,cACAC,EAAUC,gBAAAjM,KAAA0E,KAAAyC,MAAAK,KAGV,IAIA/I,EAAA2K,UAAA8C,qBAAP,SAAAC,GACEnM,KAAOyE,OAAAqH,MAAAC,sDAKP3C,UAAMgD,MAAc,WAEpBpM,KAAA0E,KAAO0H,qBAECC,KAAQ,qBACZ1H,IAAA0H,oBACgBC,YAAQ,SAASC,EAAKC,EAAAC,2BACtCzM,KAAA0E,KAAWyC,MAAAnH,KAAA0E,KAAAiE,SAAA3I,KAAA0E,gCACXgI,SAAQ,SAAAC,EAAA1E,EAAA2E,EAAAC,QAAM,mBAEZ,WACA,oEAQD7M,KAAAgJ,UAAA5D,EAAP0H,cAAoCC,OAKlC3D,UAAA4D,OAAA,mCAGKhN,KAAAiN,sBAAqCjN,KAAAgJ,UAAA5D,EAAA8H,qDAC1CC,EAAKnN,KAAA0E,KAAA,CAAAR,YAAkBnD,EAAAmD,iBAEvBkF,UAAKgE,SAAA,oEAMLhE,UAAKiE,SAAc,WACnB,IAAA5J,EAAKzD,KACHsN,EAAatN,KAAMsN,qBACnBtN,KAAAiE,WAAcoJ,SAAArN,KAAAyE,QAAA8I,KAAA,SAAAC,kBAIXC,OAAAH,EAAAE,EAAPzP,IACS2P,SAAK,uCAILC,UAAK,wCAILC,OAAA,qCAKDC,QAAA,WAGDL,EAAAK,QAAsBpK,EAAG0D,MAAA1D,EAAiBiB,KAAGiE,SAAAlF,EAAAiB,MAGrC8I,EAAWM,WACdrK,EAAY2I,0BAahB2B,WAAA,SAAgBC,eAClBC,UAAKC,OAAU,iBAAAF,EAAAG,iGAMnB/E,UAAKgF,mBAAU,SAAAC,EAAAC,gBAGTA,EAAA,2BAIAtO,KAAAuO,kBAAAD,EACNtO,KAAAwO,gCAGaC,eAAK,SAAAC,QACd5K,YAAS4K,OACTvH,MAAMnH,KAAKmH,MAAQwH,YAAQ,CAC3BlK,OAAQzE,KAAAmH,MAAA1C,eACNzE,KAAA4O,+BAGFC,gBAAuB,kBACvB7O,KAAA6C,oBAEAiM,gBACY,kBAGd9O,KAAKuD,cAID9E,EAAA2K,UAAA2F,sBAAA,SAARC,GAEE,OAAMjM,EAAakM,0BAAAjP,KAAoBmH,MAAKK,IAAQwH,MAQpD5F,UAAK9E,oBACH,SAAA4E,kCAIIlJ,KAAAkP,oBAAAhG,EAAAiG,eAARjG,EAAAkG,WACEpP,KAAKmH,MAAAnH,KAAWmH,MAAAkI,MAAAnG,qCAMVlJ,KAAAgJ,UAAA5D,EAAR6D,mBACEC,EAAAkG,YAAAlG,EAAAoG,kBACEpG,EAAAqG,QAAAC,EAAeC,oBACfzP,KAAKgJ,UAAA5D,EAAAsK,aAELC,EAAAvF,WAAApK,KAAAmH,SAAAyI,GACQ5P,KAAAgJ,UAAW5D,EAAayK,0BAGhC7G,UAAK5D,EAAA0K,cAAA5G,kCAIDzK,EAAA2K,UAAAJ,UAAA,SAAR+G,EAAAC,GACEhQ,KAAM2D,OAAQsM,KAAKF,EAAQC,gBAEhBjM,eAAA,kBACTmM,EAAOnM,eAAA,QACL/D,KAAA6C,eAAqC7C,KAAAsD,8IAKnC2M,KAAAjQ,KAAAgJ,UAAAzE,KAARvE,OAKQmQ,iBAASnQ,KAAAuD,aAAAU,WACTT,mBAAkBxD,KAAOwD,mBAI/BwB,OAAOhF,KAAMqD,QAAA2B,OACXoL,WAAK,CAAA1D,SAAgB1M,KAAQ0M,SAAAnI,KAAAvE,aAC3BqD,QAAOY,yBAEFoM,4BAAgC,kFAEzCrQ,KAAAiE,WAAOqM,SAAA,CAAAC,EAAAC,oBAAAxQ,KAAAiE,WAAAwM,cAAAzQ,KAAAyE,QAAAiM,EAAA1Q,KAAAqD,QAAAkD,+HAGT6C,UAAAuH,yBAAA,WACE3Q,KAAAiE,WAAW2M,gBAAA,CAAArP,EAAOsP,uBAAA7Q,KAAAyE,OAAAzE,KAAAiE,WAAA2G,cAAA5K,KAAAqD,QAAAkD,GAAAvG,KAAA2D,UAAA,gBAETiL,cAAA,oBACL,GACEkC,eAAO9Q,KAAkBiE,WAAY8M,SAAA/Q,KAAAyE,oCAEnCuM,yBAAOhR,KAAAiE,WAAAgN,mBAAAjR,KAAAyE,8GAEF6D,QAAAtI,KAACyE,QAAkB,oGAMZ,8BACVyM,OAAO,gBACFC,OAAA,WACEhO,UAAA,qEAQnBiG,UAAAgI,iBAAA,WAEE,IAAMV,EAAAW,EAAmBC,oBAAAtR,KAAAyE,OAAAzE,KAAAiE,WAAA2G,eAGnB2G,EAAA3Q,EAA2C4Q,WAAA,CAAAC,MAAAzR,KAAAiE,WAAAuN,WAAAxR,KAAAyE,UAC3CiN,EAAgBH,EAAAI,MAAWD,uBACjCH,EAAAI,MAASD,gBAAS,SAA2BhN,EAAAkN,EAAAC,EAAA3P,GAC3C,QAAMwO,EAAOhM,EAAAyC,UAGEzC,EAAOkN,EAAQC,EAAA3P,SAQhCkH,UAAM0I,gBAA6C,WACnD,IAAArO,EAAYzD,YACV,IAAMe,EAAuBoQ,OAAA,CAC7BY,IAAI,IAAAhR,EAAOoC,UAAA,mBACT,CACA6O,gBAAgB,CAChB3F,KAAA,SAAa3H,EAAWmC,uCAQjBuF,MAAA,SAAA1H,EAAAmC,GAEF,OADFpD,EAAAuF,UAAA5D,EAAA6M,WAAAvN,EAAAyC,MAAAK,MACE,GAGH0K,QAAI,SAAaxN,EAAGmC,GAElB,QAAa,QADPA,EACFkL,MAAkBtO,EAAAJ,QAAAkD,GAAA4L,MAAAC,kGAexBC,EAAA,GAEWrS,KAAKiE,WAAWoJ,SAASrN,KAAKyE,QACzC6N,SAAA,SAAuB9E,GAC3B,IAAA+E,EAAKjF,EAAcE,EAAQzP,IAC3BwU,GACCA,EAAAD,SAAA,SAAAP,GAGHM,EAAAN,GACKvE,EAAAK,kBAQH2E,EAAM,UACND,KAAMF,GAAcC,SAAK,SAAOG,GAChC,IAAIC,EAAAD,EAAcC,MAAK,sBACrBA,EAAA,KACKX,EAAAW,EAAA,GACLC,EAAA,OAAAZ,EAAa,YAAK,MAAAA,EAAoBa,4BAKpC,IAAAC,EAAAhS,EAARiS,eAAAT,GACE,OAAM,IAAAtR,EAAkBoQ,OAAY,CAChCY,IAACgB,EAGHpB,MAAK,yEAID,IAAAqB,EAARnM,EACgB,GAAMmM,EAAAC,QAAA,CACV,IAAAC,EAAoBV,EAAAQ,EAAAvJ,MACX,GAAAyJ,GAAAA,EAAAzP,EAAAiB,KAAAyC,OAEN,OADA+L,EAAAzP,EAAAiB,KAAAyC,MAAA1D,EAA0BiB,KAAAiE,SAAAlF,EAAAiB,OAC1B,GAIN,OAAAmO,EAAAnO,EAAAmC,2CAOP,MAAO7G,KAAAiE,WAAAoJ,SAAArN,KAAAyE,8BAIP,OADM8N,EAAA/E,EAAAzP,IAAAyP,EAARC,OACS8E,eAELnM,EACEA,EAAS,GAAA+M,GAAAnT,KAAA8D,0BAGT0K,iBAAA,oCAAQxO,KAAAoD,OAAAgQ,YAAA,OAAoBpT,KAAMuO,mBAAA,2BAClCvO,KAAA0D,gBAAA,EAAA6K,IAAQ8E,aAAA,gBAAArT,KAAA0D,gBAAA,wDAKAjF,EAAA2K,UAAA6D,oBAAd,yDAEEjE,UAAK5D,EAAoBkO,wDAQzBtT,KAAAmH,MAAA+B,mCAAAA,EAAA7F,uHAIJ5E,EAAS2K,UAAA+B,gBAAyB,SAAkBjC,EAAA7F,UAC5CrD,KAAAiE,WAAUsP,OAAAvT,KAAAyE,OAAgBzE,KAAA0E,MAAM4N,SAAA,SAAAkB,GAChCtK,EAAAsK,EAActK,EAAA7F,WAElB+F,UAAOhF,WAAiB,kBACnBpE,KAAAyE,OAAAgP,aAAA,CACL9G,KAAO,kCAKX,CAA8BA,KAAA,OAC5B+G,QAAY,CAAA,CAAA/G,KAAc,gBAGnBA,KAAA,QACE+G,QAAA,QAMXjV,EAAA2K,UAAAD,gBAAA,SAAAD,EAAA5F,GAX8B,OAAAqQ,EAAA3T,UAAA,OAAA,GAAA,sCC5iC9B,2FAAA,CAEa,EACPA,KAAAkI,gBAAuB0L,gBAAA1K,EAAA1B,IAAAxH,KAAAuD,aAAAD,WAQzB7E,EDuYK,sBChYHoV,2BAAgBC,UAAcC,MAAA,SAAAC,GAChC,OAAAA,EAAAvL,IAAkBtB,EAAAoE,UAAAqG,QAIpB,OAAIiC,EAGAA,EAAaG,KAAA3K,MAAAU,cAQV,cArBHtL,8BA8BF+F,EAAaC,GACb,OAAAwP,EAAAvU,KAAAM,KAAAyE,EAAA3D,EAAAoT,UAAAC,WAAA1P,GAAAgN,QAAAzR,KAWF,SAbQwE,EAAiByP,GAIzBzP,EAAO4E,UAAAgL,MAAA,SAAAzP,EAAArB,iFAITkB,EAAgB4E,UAAciL,WAA+B,SAAA1P,EAAArB,GACrD,OAAA2Q,EAAa7K,UAAAiL,WAAA3U,KAAAM,KAAA2E,EAAAyB,EAAAA,EAAA,GAAA9C,GAAA,CAAAgR,mBAAA,WAIf9P,KACU0P,8BAIVhW,mEAOAqW,qBAAc,sCAEhBC,EAAkBC,EAAAC,aAChB,IACa,GACbxU,EAAA,EAAAA,EAAAwU,EAAgBrU,OAAUH,IAAA,OACrBwU,EAAAC,WAAAzU,GACL0U,GAAA,iCAMiB,IAAjBC,EAAUxU,SACZwU,EAAmB,QAQrB,UALIA,EAAwBnK,QAAAxM,EAAAqW,qBAAA,QAKxBE,EAAYK,SAAAC,IAAc,CACnB,IAAPC,GAAkBA,EAAG,IAAA,IACvBC,GAASC,OAAAC,sBAGJD,OAAAC,gBAAgCH,EAAA,IA5CzCA,IAqDE,OAAID,WAGFK,EAAOX,EAAcY,6BAJzBC,EAAA,MAQAC,GAAgBA,EAAAlV,OAAyB,IACjCkV,EAAQ,GAAIC,OACVF,EAAOC,EAAA,GAAAC,OACFD,EAAA,GAAAE,UAAEH,EAAMC,EAAA,GAAAE,wBAErB,IAAMC,EAAKL,EAAA,eAAmBC,EAAjBI,IAAMA,MAAAA,OAAA,EAAAA,EAAArV,QAAA,EAAkBqV,EAAkBC,OAAQ,EAAAC,KAAAC,IA/C1C,EA+C0CH,EAAArV,iBAC7CgV,EAAApO,MAAgB0O,OAAA,EAASC,KAAAC,IAhDtB,EAgDsBR,EAAApO,MAAA5G,SACtBgV,EAAA1I,cAGrB,GAAMmJ,GAAAA,EAAiB,eAAIA,EAAA,cAAAzV,OAAA,EAAA,CACvB,IAAA0V,EAAgBD,EAAA,cAAA,GAAA,GAClBC,IAAaC,EAAMD,EAAA,sCAGF,IAAbrB,EAAArU,SACFqU,EAAQ,cACSD,EAAAC,YAQfuB,EAASZ,GACf,IAAAa,EAAY,IAAA5V,MACV+U,EAAIpO,SACF5H,KAAM,CAEN8W,KAAI,cAEFd,EAAMpO,yGAkFV,YAAYmP,IA/ChBC,EAAAtC,MAAA,SAAAiC,GA4CS,OAAgB,OAAhBA,EAAgB,MAKvB,OAAO,cA9EPE,EAAO7W,KAAA,mBAtCTR,MAAAyX,EAAAjB,EAAAS,UA2CE,IAAAS,EAAAlB,EAAA,mBACAkB,GACAL,EAAA7W,KAAA,CACA8W,KAAA,cACAtX,MAAA0X,IAGA,IAAAC,EAAAnB,EAAAmB,UAMFN,EAAS7W,KAAA,CACD8W,KAAA,SACFtX,MAAW2X,iBAEbC,WAEKN,KAAA,oBAOP,IAAIO,EAACrB,gBACH9C,KAAO8C,GAAA/C,SAAA,SAAAP,sBAGF,IAAAlT,EACA6X,EAAA3E,0BACH,IAAIoE,EAAOpE,EAAA4E,OAAO,GAAA/D,cAAAb,EAAA6E,MAAA,GAChBV,EAAO7W,KAAO,CACL8W,KAAAA,EAECtX,MAAOA,gCApFH2V,iDAyBpB,OAAMa,EAAAwB,IACIxB,EAAAwB,IACFxB,EAAKyB,IAAEC,EAAMC,UAAA3B,EAAAyB,UAAnB,KAoEEb,iBAAkBA,QACT,kGA+BPgB,EAAaC,EAASC,GAC5B,OAAID,GAA8B,IAA9BA,EAAa7W,SAIHkN,KAAA,SAAUgI,SACf6B,EAAAC,EAAAC,SAEgB,QAArB9R,EAAM+P,EAAAE,eAAgC,IAATjQ,OAAqB,EAAAA,EAAAnF,QACxCkV,EAAAE,kJAGP,QAAA6B,EAAA/B,EAAAC,cAAA,IAAA8B,OAAA,EAAAA,EAAAjX,oBAMI,gCAIL,OAAA8W,GAAiBI,EAAAlX,QAAA8W,GAAAI,EAAAC,SAzBhB,UA0BQD,EAGN,IAALE,EACEN,GAAoBO,EAAKrX,OAAI8W,EAE1BO,EAAAC,UAAA,EAAAR,EAAA,GAAA,IAKIO,EAGJD,EAAA,GAAAA,IAAAG,EAAAvX,OAAA,EACLwX,EAAAN,EAAAA,EAAA,SAAAG,EAAAP,sBAnCI,GA0CV,SAAgBU,EAAOC,EAA0BC,EAAAZ,GAC/C,OAAIA,GAAUY,EAAK1X,OAAA8W,WAKfa,EAAAb,2BAEGc,EAAA5X,OAAA8W,EAAA,CAEL,IAAAe,EAAOF,EAAAG,YAAA,QACLD,EACA,OAAAF,EAAerC,OAAA,EAAAuC,GAAfF,+EAVII,CAAAN,EAAcX,GAEpBY,sBC/QE,MAAA,GAEA,IAAA1B,EAAAgC,EAAA,cACA,GAAAhC,EACA,OAAAA,EAAAhW,QAEA,KAAA,EACJ,OAAAgW,EAAA,GAAA,GAAA,IAAAA,EAAA,GAAA,GACA,KAAA,EACA,IAAAiC,EAAAjC,EAAA,GAAA,GACA,MAAA,IAAAiC,GAAA,IACA,KAAA,UAMc,MAAO,GAAvB,MAAA,GD6NApa,EAAA+Y,cAAAA,ICxNMX,iBAAQA,oBACZiC,UACEA,EAAQlD,IAIN,CACFmD,YAJgBpD,EAASmD,EAAS9D,YAAA8D,EAAAlD,KAK7BoD,yBATTD,YAAA,GAcgBC,cAAqB,2BCzCrCta,OAAAwC,eAAAzC,EAAA,aAAA,CAAAW,OAAA,IAsCa,IA+IX6Z,EAAI,CA/IwB,kCACG,oBACF,gEA2IE,qBACV,wCAYnBC,EAAAC,yCAIJ,OAjBAlG,EAAAkG,EAAAlG,MAAAmG,KAiB8BnG,EAAA,GAAArS,OAAA,mBAI9B,SATIyY,mBAFF,YAAO1C,IAAAuC,EAAAC,MAiBHD,QAAAA,uBACKI,SACP,mBAAMA,oBAORxa,EAAOL,yBACQA,EAAK,aAAO,CAAAW,OAAA,UAChBjB,EAAKE,EAAA,YAwBdkb,EAAQC,YACNvO,QAAO,MAAA,ICpOA,SAAAwO,EAAAnb,GAQA,OAAAA,EACLA,EAAAob,WAAS,KACJpb,mBASLqb,EAAkBH,GACxB,OAAIA,EACFA,EAAAE,WAAgB,OAGL,IAAAF,EAGXA,IDiLAI,eAAK,IACLC,kBAAQ,qDAfZ,IAmBAC,IAnBAC,EAAA5X,EAAA4X,QAAA5X,EAAA4X,QAAAC,MAAA,OAAA,GAoBE,GAAA7X,EAAO2X,UAAa3X,EAAA8X,MAAA,CAAM,IAAAxX,EAAMN,EAAE2X,UAAO,GAAW3X,EAAA8X,oCAIhDH,EAAII,EAAAC,2BAAA1X,EAAA,mBAGCN,EAAA7D,IAAA,GAQFA,EAAA2M,QAAY,KAAuB,aAPtC8O,EAAajM,IAAAyL,gBClON9a,EAAA4D,0BD8OMF,cAGfA,EAAA2X,SAAO,8GChPE,SAAeA,GACf,OAAAA,EAAAhM,KAAe,SAAAsM,GAEf,OAAAA,EAAA,GAAA,IAAiBA,EAAA,MACjBC,KAAA,sBAdb/b,GAAAmb,EAAAtX,EAAA7D,UAAAqY,EAEaoD,QAAA5X,EAAA4X,QAAgB5X,EAAA4X,QAAAjM,IAAA6L,GAAAU,KAAA,UAAA1D,EAChBsD,MAAAA,EACAH,SAAAA,KA8Cb3b,EAAAC,EAAA,YACQU,EAAOL,UACbyC,eAAYzC,EAAS,aAAc,CAAAW,OAAS,iBAF9CX,EAAA6b,cAAA,EAKA7b,EAAA8b,mBAAkC,IAC1BC,oBAAmB,kBAiK3B,GAAA,MAAAC,EAAA,KAkBA,IAAgBC,EAAA,GACPC,GAAA,sBADT,IAAAC,EAAAnY,EAAAyU,OAAAzW,GAIgB,MAAAma,EACPD,GAAAA,eADTC,EAAA,MAKEF,GAAAE,EAEAnY,EAAAiY,EAGA,OADAjY,EAAAoY,OAAAb,MAAA,MACAlM,KAAA,SAAAgN,GACA,IAAAC,EAAAD,EAAAD,OAAAb,MAAA,KACA,MAAA,CACAe,EAAA,IACAA,EAAA,IAAA,IAAA9P,QAAA,KAAA,IAAAA,QAAA,KAAA,UAnME+P,aAAe,UACfC,cAAS,WACTC,aAAU,kDALdzc,EAAA0c,eAAA,EASA1c,EAAA2c,UAAgB,IAAgCC,cAAA,IAAAC,eAAA,mBAE9CvB,QAAM,CAAAlb,QAAe,IACrBib,SAAU,CAAAjb,QAAI,uCAGd,QAAI+K,EAAMtL,IAAWsL,EAAMmQ,SAAQnQ,EAASmQ,QAAGnZ,OAAA,GAAAgJ,EAAAkQ,UAAAlQ,EAAAkQ,SAAAlZ,OAAA,KAmBzC2a,wBAdS3R,OACb4R,EAAQ,iBAINA,EAAQld,GAAAsL,EAAAtL,gBAIZkd,EAAOzB,QAAAnQ,EAAAmQ,SApBTnQ,EAAAkQ,WAuBA0B,EAAgB1B,SAAmBlQ,EAAakQ,UAAyC0B,KAWjFC,0BAN0BC,GAChC,IAAI5I,EAACpU,OAAAoU,KAAkB4I,EAAA9R,OAAa,WAClCkJ,EAAAuC,SAAc,OAAYvC,EAAAuC,SAAA,YAAAvC,EAAAuC,SAAA,0CAKbsG,EAAA3D,GACf,IAAAwD,EAAgBG,EAAAC,EAAA5D,GAChB,MAAG,CACD1Z,GAAMkd,EAAmB/c,EAAA6b,qBAAa3D,EAEtCoD,QAAIyB,EAAc/c,EAAQ8b,6BAEnBiB,EAAA/c,EAAc+b,yBAoBnBqB,6BAhBSjS,EAAUkS,+BAazB,mBARUlS,EAAKtL,eAAqBsL,EAAAmQ,QAAAnZ,OAAA,iFAKlCkb,MA/DO,4BAkEOC,iCAIYC,EAAApS,EAAAqS,QACV,IAAZA,IAEAA,GAAU,OAEZC,EAAgBxd,OAAAoU,KAAAlJ,GAChBuS,EAAU,GAEVF,GAAYD,EAAAI,aA9EP,0BA+EIxc,KAAA,MAAA,aAEP,SACE,YACA,iCACKiT,SAAA,SAAA6D,SACLsF,EAAOK,aAAA3F,+CAEJyF,EAAYvb,SAAWub,EAAM9G,SAAAqB,KACtB,OAARA,EACFvU,EAAQ7D,GAAKc,EACN,UAAAsX,EACFvU,EAAA4X,QAAA3a,EAAA4a,MAAA,OAAAsC,QAAA,SAAAC,GACE,QAAAA,EAAA3b,8BAEJ,OAAA2b,EAAA7C,WAAA,6BAMWta,0CAUd+C,6BAGF,aAIAqa,EAAA,WACF,IAAIrV,EAAG8Q,WACL,kBAGE9Q,EAAAuS,WAAA,KACK,IAAPpb,EAAAsC,QAAOuG,EAAAvG,OAAA,IACPtC,EAAA6I,EAAU+O,OAAU,yBA1D1B/O,EAAAvG,OAAA,IAiEgBmZ,EAAAna,KAAAuH,EAA2B+O,OAAc,KAErC,IAKduG,EAAWtV,GACT,6BAIFwT,GAAA,YAEFA,EAAO,MAAAC,GAAAD,EAAAA,aAIF,CAAA,IAAM6B,gBACL,GAAAC,EAAa7b,OAAO,EAAM,CACzB6b,GAAAta,EAAA+T,OAAAzV,GAAC,YAHJwX,GAAa2C,EAYrB,OAAA4B,KACmB,IAAXle,EAAOsC,QAAI,IAAAmZ,EAAAnZ,SACX6b,EAActa,GAGd,CACF7D,GAAAA,UACKyb,EACLD,SAAU2C,EAAA7b,OAAA,EAAAuZ,EAAAsC,EAAA,KAAA,KAIP,2FCrLTC,EAAgB,IAAA7b,aACdiZ,EAAOjH,SAAC,SAAyBuH,GAC3BuC,EAAAtH,SAAiB+E,EAAA,IACnBsC,EAAO9c,KAAAwa,GAEPwC,EAAAhd,KAAOwa,OALbwC,KAAAA,EAUAF,YAAgBA,sDAQPG,EAAUC,mBAAeC,EAAAC,iCAExBtM,YACKuM,iBAAAvM,EAAAsM,WAKb,wCAhBF,wjDC7CsB,GAAsB,IAAtBnd,EAAA,MAA0CL,GAAAK,EAAA,GAAAL,EAAA,IAAAK,EAAA,GAAAL,EAAA,IAAA,4DAC/CA,EAAAK,EAAA,uCAATJ,EAASE,IAAAC,KAAAC,GACf,MAAOL,EAAA,IACLC,EAAAE,IAAAG,aACAA,8CAJJM,EAAA,qCCdA,MAAA,CAEAhB,MAAAS,EAAA,GAAAA,EAAA,QAAA,EAGAQ,MAAA,qBAqHEa,eAAOzC,EAAiB,aAAA,CAAmBW,OAAA,oBAuC3C8d,sBAxCF,SAAA3X,GAIA,OAAgB2O,EAAA3T,UAAA,OAAsB,GAAc,WAClD,IAAOoI,EAAsC,OAAAoB,EAAMxJ,MAAA,SAAAwF,0BADrD,MAAA,CAmBY,EAAAR,EAAA4X,mBAEV,KAAA,EAEA,MAAA,CACA,EACA,CACAC,SAJAzU,EAAA5C,EAAAmB,QAIAkW,QACAC,YAAA1U,EAAA0U,YACAC,eAAAC,EAAAC,sBAAA7U,EAAA2U,gBACAG,oBAAAF,EAAAC,sBAAA7U,EAAA8U,kCAUArf,EAAA,aACAU,EAAAL,UACAyC,eAAAzC,EAAA,aAAA,CAAAW,OAAA,QAgBAse,EAfAxD,EAAA/b,EAAAE,EAAA,GACAsf,EAAAxf,EAAAE,EAAA,IACAuf,EAAAzf,EAAAE,EAAA,IACAwf,EAAA1f,EAAAE,EAAA,IACAyf,EAAA3f,EAAAE,EAAA,eAwOW0f,EAAA3f,iCACEme,UACD,OAARA,GAAQ,iBAAAA,GACHA,EAAAyB,eAAA,cCxZEnd,MAAaod,QAAA1B,GACbA,EAAAzO,IAAiBoQ,GAElB3B,EAAA,SAAA4B,EAAAxC,GAKZ,IAAgByC,EAAchgB,EAAAud,GAI1B,ODoYJ,SAAAA,2DCvYQ0C,CAAoBD,KACnBA,EAAAxC,EAAAwC,EAAAxC,EAAA9N,IAAAoQ,IAEAE,oBDqKPE,kCAHA5N,GACA,OAAAA,EAAA6N,iBAAA7N,EAAA8N,YAQAhB,+BALAiB,GACA,OAAAA,EAAAzE,MAAA,SAAAsC,QAAA,SAAAoC,GACA,OAAAA,EAAA9d,oBAKA8c,GACAA,EAAA,IAAA,MACAA,EAAA,MAAA,QACAA,EAAA,OAAA,SA1CUA,EAAA,KAAA,OA2ECA,EAAkB,KAAA,OAClBA,EAAmB,YAAA,cA+FhCA,EAAkD,UAAA,YAAAA,EAAA,UAAA,cAAA,UAAA,oCAChDA,EACO,OAAA,WACY,UAAA,cACD,SAAA,aAED,UAAA,cAIJ,KAAA,SACO,MAAM,UACb,OAAA,WACa,UAAA,cACP,WAAA,eACO,WAAA,eACN,YAAS,gBAChB,eAAA,mBACE,MAAA,wBAEK,KAAM,SACP,KAAO,SACN,MAAA,UACC,WAAA,eACK,UAAA,cACb,aAAA,iBACa,YAAA,gBACN,SAAA,aACG,gBAAA,oBACM,eAAK,mBACvB,UAAA,cACE,UAAA,4BAGL,WAAA,yCAlCVA,EAAA,IAAA,MAqCAA,EAA6B,KAAuB,OAClDA,EAAkB,KAAA,UACdjf,EAAAif,kBAAAjf,EAAAif,gBAAA,OACFiB,gBAAO,yBAuCTC,4CA1CF,IAAAC,IAOAA,GAAgB,GAEZjD,EAAI9N,KAAA,SAAQgR,MACVA,EAAAtf,IAAWke,EAAeqB,WACrBD,EAAAlD,EACL,GAAOkD,EAAAtf,IAAAke,EAAAsB,OAAAF,EAAAtf,IAAAke,EAAAuB,WAAAH,EAAAtf,IAAAke,EAAAwB,oCAIX,OAASN,EAAiCE,EAAAlD,EAAAkC,EAAAqB,gBACjC,GAAAL,EAAQtf,IAAAke,EAAuB0B,KAAA,0CAGxC,OAASP,GAAiB1c,EAAA4X,SAAA,UAAA5X,EAAA4X,QAAA,GACZ5X,EAAM2X,SAAA,GAAA,GAEP8E,EAAoBE,EAAAlD,EAAA1B,EAAAmB,gBAExB,GAAAyD,EAAAtf,IAAAke,EAAA2B,OAAA,CACL,MAAOP,EAAAlD,EAAA+B,EAAA2B,YAAA9f,wEAIF,OAAAsf,EAAStf,IAAgBke,EAAAvH,KAC1ByH,EAAc2B,cAAAT,GAChBA,EAAAtf,IAAiBke,EAAY8B,KAC/BV,EAAUlD,EAAIiC,EAAA4B,eAETb,EAAAE,EAAAlD,GAGK,MA/BhBvB,KAAA,OA2CIqF,2BATJC,EAAA5B,GAAA,SAAApC,GAME,OADFvd,EAAgBud,GACPA,MChYTld,EAAMkhB,UAAgBA,EAKtBlhB,EAAAmhB,iBAJA,SAA0BpgB,GACpB,OAAAA,EAAAoc,EAAA3Q,QAAgB,MAAA,WCXpB4U,yBDeoBhU,EAAAiU,gCADtB,IAAAC,EAAAD,EAAA/e,EAAAmM,KAAAwJ,MAAAsJ,uDClBa,SAcX5hB,EAAA,aACEU,EAAAL,iCAYSwhB,EAAAC,wEAXAzhB,EAAY,aAAA,CAAAW,OAAO,iBAEpB,mBACC,gBAID,YAAO,4BACL,+BACQX,EAASwhB,UAAU,KAdzCxhB,EAAA0hB,cAAAA,EAuBA,IAAAC,EAAgBD,EAA6BF,EAAAI,aAC3CC,EAAa,IAASC,OAAQ,IAAAH,EAAAI,MAAAJ,EAAAK,IAAA,IAAA,OACrBN,EAAAF,EAAAC,eACF,IAAAK,OAAA,IAAAG,EAAAF,MAAAE,EAAAD,IAAA,IAAA,KAHThiB,EAAAkiB,6BAIWle,8CAMTrE,EAAA,mCCvBiC8O,gBAAhB0T,gBDqBnBliB,OAAAwC,eAAAzC,EAAA,aAAA,CAAAW,OAAA,qEC9CAyhB,EAAA,QAAA,eAEAA,EAAApiB,EAAAoiB,WAAApiB,EAAAoiB,SAAA,kBACA,SAAA/Z,GAEa,MAAA,CACAga,QAAA,SAAY9E,EAAA+E,EAAAf,GAET,OAAA,IAAAlY,SAAY,SAAAX,GACnB,GAAA6U,EAAAgF,YACIla,EAAAia,KAAAD,QAAA9E,EAAA+E,EAAAf,GAAAiB,KAAA9Z,QAEF,IAAA+Z,EAAAC,aAAA,WACDnF,EAAAgF,cACII,cAAAF,GACCpa,EAAAia,KAAAD,QAAA9E,EAAA+E,EAAAf,GAAAiB,KAAA9Z,0EAkBMwU,EAAIC,EAAAnd,EAAA4iB,WAAA7hB,2GAdzB,IAAA8B,EAAAnD,EAAAE,EAAA,4NClBAiU,IAAA,IAAAhR,EAAAoC,UAAA,uBACAwO,MAAA,CA8DgBoP,oBAAsB,SAAsB7e,EAA6C8e,GAC1F,IAAA,IAAAC,EAAA,EAAAzb,EAAArH,OAAAoU,KAAA2O,GAAwBD,EAAIzb,EAAKnF,OAAO4gB,IAAM,CAC5C,IAAKE,EAAM3b,EAAAyb,GACZG,EAAAF,EAAAC,GACD,GAAIC,EAAAC,wBAAKD,EAAAC,uBAAAC,KAAApf,GAAA,CAAI,IAAAuC,EAAMuc,EAAKhN,OAAOrH,KAAMlI,kDAJpD,IAAA8c,EAAA9c,EAAAvC,KAAAA,GAOgBsf,EAA0BC,EAAoCC,cAAA,GAAAH,GACrE,OAAA,IAAAzgB,EAAuB6gB,MAAM7gB,EAAc8gB,SAAAhQ,KAAA4P,GAAe,EAAA,KADnE,OAAA,6CAaexhB,KAAAoG,UAAA,WAUb,4CARSnG,EAAAC,EAAA,EAAA2hB,EAAAzhB,UAAAC,OAAAH,EAAA2hB,EAAA3hB,iBACLD,EAAAG,UAAOF,+CAGJjB,EAAA6iB,GAAA7hB,EAAA6hB,IAfT,OAAA7iB,IAmBMoQ,MAAArP,KAAAI,kCAEYlC,EAAO,aAAA,CAAAW,OAAA,UACZjB,EAAAE,EAAA,OACDF,EAAAE,EAAA,cAkEJikB,EAAc1e,EAAOoe,GAD7B,OAAAO,EAGIC,EAAA5e,SAHJoe,YAUMO,EAAaE,EAAAT,OACf,IAAMU,EAAAD,EAAAE,MAAiBD,GAAA,EAAAA,IAAS,CAChC,IAAA1K,EAAOyK,EAAUzK,MAAA0K,MACZD,EAAAlO,KAAAmO,GAAAE,eAAA5K,EAAAA,EAAAgK,GACL,OAAO,EANX,OAAA,yMAjEiEa,+BAP7C9a,EAAM+a,0EAIxB,mCAAOhV,KAAA,SAAA1O,yCAKD2jB,mCAFyDjX,EAAAoB,wEACzD,OAAAkV,EAAAlV,OAAYA,8BAGNvJ,EAAKmf,OACfE,2CAGF,OAAOA,UARTA,EAAA,CAWgBzO,KAAcA,EACVvL,IAAArF,EAAYqF,IAAA,EAAAA,IAEvB,cAMLga,KAkBCC,uBAdH,IAAAC,EAUA,yCAjBFJ,EAAAvO,KAUgB2O,EAAA,CACR3O,KAAYA,EACXvL,IAAArF,EAAcqF,IAAA,EAAWA,OAK1Bka,GAuBRzkB,EAAA0kB,sBAfQzb,EAAkBwF,EAAItD,QACtB,IAAAA,IACFA,EAAA,QAZN2K,EAAA/S,EAAA4hB,uBAAAlW,EAAA1L,CAAAkG,EAAAoE,YAAAtK,EAAA6hB,4BAiBE,OAAKjB,EAAAlV,OAASA,IAjBhB1L,CAAAkG,EAAAoE,WAoBA,OAAgBpN,OAAAoU,KAAAlJ,GAAgBhJ,QAAoB2T,0BACnCA,KAaT+N,cAAcA,IAUpBC,mBAAOA,kwDCnLI,GAAiB,IAAjB1iB,EAAiB,MAAAL,GAAAK,EAAA,GAAAL,EAAA,IAAAK,EAAA,GAAAL,EAAA,IAAA,CACjBC,EAAAC,MAAmBG,EAAA,GAEP,MAEZ,GAAc,IAAAA,EAAA,IAAAJ,EAAAC,MAAAF,EAAA,GAAA,CAEfC,EAAAC,MAAAF,EAAA,GAAQA,EAAAK,EAClB,MAEA,GAAAL,GAAAC,EAAAC,MAAAF,EAAA,GAAA,CAHUC,EAAAC,MAAAF,EAAA,GAsBsBC,EAAoBE,IAAAC,KAAAC,eACxCJ,EAAAE,IAAAG,MAA0BL,EAAAM,KAAED,MAAmB,uBAErD,MAAAK,GAAiFN,EAAA,CACrF,EACAM,OAGF,QAAA/B,EAAAoB,EAAA,KACE,eACA,2KC1CJf,EAAA0gB,cAAA,EAEa1gB,EAAA6kB,YAAA,WAGJC,oBADTA,EAAAA,EAAA,QAAA,GAAA,UAIAA,EAAgBA,EAAiB,GAAA,GAAY,MACpC9kB,EAAK8kB,WAAkB9kB,EAAM8kB,SAAW,+BADjD,OAAArP,EAAA3T,UAAA,OAAA,GAAA,WAIA,IAAgBijB,EAAAC,EAGd,OAAA1Z,EAAAxJ,MAAA,SAAAwF,UAAAyd,EAAAhiB,EAAAkiB,aAAA3b,GAAA,SAAAwM,yBACAzG,KAAA,SAAA1O,GAAA,OAAAA,EAAAmV,KAAA3K,MAAAtL,MAEMmlB,EAAcjiB,EACjBmiB,mBAAO5b,EAAIA,EAAAmF,KAAAlI,OAAAqH,MAAAuX,SAAA9V,KAAA,SAAA8V,GAAK,MAAA,CACZC,MAAID,EAAArP,KAAA3K,MAAAia,MAAOphB,KAAImhB,EAAKrP,KAAAuP,iBAR7B,EAagB,CAEXN,IAAQA,yBAYXplB,EAAA,aAA0BU,EAAAL,4ECoBnBslB,EAAA3kB,UAAPA,EAAA6L,QAAA,KAAA,SAAAA,QAAA,KAAA,UAAAA,QAAA,KAAA,UAAAA,QAAA,KAAA,QAAAA,QAAA,KAAA,gECrDW,OAHb+Y,EAAAC,YAAAxF,GAGauF,EAAAE,UFgCbzlB,EAAA0lB,kBAAA,kCAOMC,cAHN,SAAsBC,GACpB,QAAMA,EAAMpR,MAASxU,EAAA0lB,gDAGVE,6GCPS,IAApBC,UAgBE,IAAMC,EAAQ,IAVlB7lB,OAAAoU,KAAA0R,GAAAlI,QAAA,SAAA5F,GAGE,OAAA4N,GAA2BE,EAAA9N,WACzB,SAAUA,gCAGL2D,KAAA,MAGyBoK,EAAqB,IAAE,IAAM,2BAMAV,wBACjD/e,EAAKuP,wBAEf,OAAKlT,EAAoBqjB,cAAUhQ,WAAW1P,GAAA2f,cAAApQ,sCAKlD,OAAAqQ,GAAA,0EC3DazmB,EAAAC,EAAA,IACA,SAAAU,EAAAL,GACAC,OAAAwC,eAAYzC,EAAA,aAAc,CAAAW,OAAA,oBAC1B,SAAamI,GACb,MAAA,CAAAA,UAAgB,YAAAA,sjECX7B,MAEA,GAAA/H,GAAAC,EAAAC,MAAAF,EAAA,GAAA,CAEaC,EAAkBC,MAAAF,EAAA,GAClBC,EAAAE,IAAAC,KAA0BC,GAC1B,MAEAL,EAAA,IACaC,EAAAE,IAAAG,MACbL,EAAAM,KAAAD,MACA,SA2BLD,EAAAG,EAAAC,KAAoBC,EAAAT,GACnB,MAAKU,MAFd,EAKgBA,OAAhB,QAIgB/B,EAAAoB,EAAA,YAAhB,MAAAK,EAAA,GAIA,MAAS,wBAEDQ,MAAO,gBASLE,MAAAA,KAAmBD,gBAAO,eAChC,IAAIE,EAAA,EAAAC,EAAA,EAAAC,EAAAC,UAAAC,OAA+BH,EAAQC,EAAAD,OACzCE,UAAAF,GAAAG,0CAIF,IAAI,IAAAG,EAAAJ,UAAgBF,GAAAO,EAAA,EAAAC,EAAkBF,EAAAH,OAAAI,EAAAC,EAAAD,IAAAF,IACpCzC,EAAAyC,GAAMC,EAAAC,oEAIN7C,EAAOE,EAAA,QACFA,EAAA,MACLF,EAAOE,EAAA,aAUTwmB,EAAO7a,UAEPA,EAAOiJ,MADF,kDAYL6R,EAA6C9a,EAAAuF,OAC7CxJ,IACEwG,EAAMwY,eAAgB/a,QACtB,OACEuF,EAAUyV,EAAcC,UAAG,gBAAwBvY,MAAAA,OAAG,EAAAA,EAAA+R,aAAA9H,yFAG1DuO,aAA8BxmB,SACzBymB,EAAAC,EAAAF,sBAQH,OAHGG,IACHC,EAAoC9gB,WAAA6gB,GAAAC,EAAA9gB,YAAA,KAEpC8gB,EAGA,OAAO,KAKT,OACE,cAgBEC,EAAoBvb,OACxBwb,EAAW,sBACTX,EAAO7a,QACF,OACEiJ,EAAI,GACN+G,MAAA,UAAAlM,KAAA,SAAA2X,GACL,OAAOA,EAAA5K,sBAIL6K,EAAA7S,SAAY,SAAC4S,GACb,IAAAE,EAAeF,EAAWxS,MAAAuS,GAC5BG,IACKC,EAAAD,EAAA,GAAA9K,QAAA8K,EAAA,GAAA9K,gBAMH,OAAA,gBAuBcgL,gDAETC,EACEA,EACTA,EAAAC,WAEA,MAqBwD,qBAGxDC,KAAUC,EAAOJ,EAAAG,mCAMjBC,EAAAJ,EAAArhB,gDAGAyhB,EAAAJ,EAAAK,uGAIAD,EAAAJ,EAAAM,SAAAnM,MAAA,KAAAlM,KAAA,SAAAsY,YAECvL,0BAWiB,iBAAtBgL,EAAIQ,aACIC,oBAAUT,EAAkBQ,cACFC,oBAAGT,EAAAQ,WAAA7d,WAAU+d,kBAAWV,EAAAQ,WAAAG,yBAK1Cje,sBArDZ,GAAkB,kBAAXud,EACT,OAAAA,EAEK,IAAAM,EAAAH,EAAAH,GAAAW,wCAkDSC,CAAAb,EAAAtd,cA2ElB,SAAAoe,EAAA9iB,GAIAA,EAASA,EAAAmW,MAAA,MAAqBK,OAC5B,IAD4B,IAAA7V,EAAA,GAAAoiB,EAAA,+BACtB3T,GACJzO,EAAU5E,KAAA,CACV8W,KAAAzD,EAAA,GACA4T,QAAA,MAAA5T,EAAA,KAEAA,EAAA2T,EAAAE,KAAAjjB,UAEAW,WASAuiB,EAAA3jB,OACA4jB,EAAA5jB,EAAA6jB,QAAA,YACA,IAAAD,IACAA,EAAA5jB,EAAA6jB,QAAA,MAIA,CACA7jB,QAHA,IAAA4jB,EAAA5jB,EAAAA,EAAA8S,OAAA,EAAA8Q,GAIAnjB,SAHA,IAAAmjB,EAAA,GAAA5jB,EAAA8S,OAAA8Q,IAiBJ,SAASE,EAAaC,eACd,IAAAA,IAEJA,GAAA,GAEA,CACAA,EAAA,YAAA,YACA,yBACA,wBACA,6CAEF,8DAKF,wCC/VS/jB,UACFA,EAAOyD,SAAGwO,SAAA+R,EAAAC,eAAAjkB,EAAAqD,cAAAD,0EDgDR,sBACL8gB,sBAAO,gGAIX7oB,EAAA8oB,WAAS,QACDC,kBAAY,eACdC,mBAAmB,8CAUnBjY,0BAHN,SAASzH,EAAAwH,GACP,gBAsCWxH,EAAAwH,SACFhD,EAAAmb,kBAAA3f,YACLnH,OAAO,6BAGJ,KA3CD+mB,CAAgB5f,EAAAwH,aAqEFxH,SACX,QACE,EAeX,yCAXM,OAAA,EAEJ,IAAA/C,EAAa+C,EAAAmF,KAAOlI,gHAElB4iB,GAAmB,EACrBC,EAAatC,EAA6BhR,EAAAuP,oBAMxC+D,EAtFkBC,CAAA/f,IAAA,0CAGEiC,EAAAuF,UAEtBuV,EAA6B9a,EAAcuF,IAAAgW,EAAKvb,IAAA,mCAmJlDxE,EAAgBpC,YAGV7C,UAAA,EAA+CuH,SAAA,iBAGrDigB,EAAgBlkB,EAAemkB,EAAQC,EAAMC,EAAAxX,EAAAyX,EAAAC,sCAKvCzQ,EAAAjY,cA6BA,8DAwGJ,CACA,eAGA,YACA,oBACA,aAGA,uBAGE,WACF,6BAGF,4BAIF,oBACQ,aACJ,eACA,eACA,mBACA,iBACA,sDAOE,oBACF,+BAGF,uCAGF,aAEE,qEE5ZW,aACA,qIDjBb8E,EAAA5E,KAAA,qBAGA,OAAA4E,oBAKA,SAAoDpB,GAClD,IAAMoB,EAAY,CACd,yBACF,uCAEA,uDALJ,aAUA,SACQ,wBAEA6jB,EAAkBjlB,IAClBoB,EAAU5E,KAAM,qBAEtB,OAAI4E,UDuOAujB,EAAW,CACfO,cAAgB,GAEdC,eAAI,MAGFnlB,EAAAsN,mBACKtN,EAAAolB,wDAMT/pB,EAAA6oB,sBAAA7oB,EAAAgqB,mBAAOhqB,EAAAiqB,sBACLjqB,EAAM8oB,WACN9oB,EAAA+oB,kBACA/oB,EAAAgpB,2BACA/oB,OAAaoU,KAAA6V,IAAAtT,SAAA2S,OACbM,cAAQN,iEA9EZ3N,KAAA,IAAAxW,EAkFSmkB,EAAgB,mBAKuC,CACnD,EACIxiB,EAAKojB,eAAAZ,IAElB,KAAA,EAkBW,OAlBOC,EAAYtQ,EAAAzQ,OAAIwJ,EAAsB,6BAC7CA,EAAKmY,EAAAnS,MAAAmS,EAAAhC,WAGXsB,EAAAxB,EAAAsB,GAAAna,KAAA,SAAA+a,oBAIOT,EAAAJ,EACJrB,EAAe9iB,GAAUgP,SAAM,SAAUgW,uBAFrDT,IAAAS,EAAAhC,QAAA,IAAA,KAAAgC,EAAAnS,KAKgBhG,EAAsCmY,EAAAnS,MAAAmS,EAAAhC,SAGhCkB,EAAGQ,eAAA3oB,KAAAipB,EAAAnS,SAGV,CACG,EACT,CACGsP,KAAA5iB,EAAAolB,WACDR,SAAAA,0BAVXD,SAAAA,cAuCQe,iCALN,IAAA9O,EAAO+M,EAAA3jB,sCAkBL2jB,wBAAAA,IAIAgC,6BAHArY,UACAA,EAAAsY,sBAAAtY,EAAAuY,uDAGAvY,qECjVJvS,EAAAC,EAAA,IAcA,SAAgBU,EAAAL,UACdyC,eAAOzC,EAAA,aAA2B,CAAAW,OAAA,kCADpCX,EAAA4oB,aAAA,gBAIA,SAAAvoB,EAAAL,GAIA,IAAAa,EAAgBiB,MAAAA,KAA0BjB,iBAAqB,SAAAJ,GAC7D,OAAMA,GAAAA,EAAaC,WAAKD,EAAY,CAAAL,QAAMK,0BAE5BT,EAAW,aAAG,CAAAW,OAAA,UAClBE,EAAcnB,EAAAE,EAAA,QACtBF,EAAQE,EAAA,MACRF,EAAQE,EAAA,aAgCRqpB,EAAW3f,YACT8a,sBAAO9a,EAAAmhB,wBAIJ3U,EAAArH,OAAAqH,EAAArH,KAAAlI,OAAAqH,MAAAC,gBApCL6c,wBAAO,mBAYL3c,yBAXGzE,OACLqhB,EAAOC,EAAAthB,kCAIK,MAwBZ0E,8BAhBiBxH,EAAWqkB,OAG5BtkB,EAAMC,EAAQyC,MAAA1C,OACdukB,EAAO,QAAAD,EAAA,QACFtkB,EAAAqH,MAAAC,cAAA2V,cAAA,GAAAjd,EAAAvC,KAAA8mB,IACL9f,EAAAxE,EAAOyC,MAAA+B,sBAdXA,EAAA+f,iBAAAJ,EAAApgB,IAAAogB,EAAApgB,IAAAogB,EAAA7U,KAAAtL,SAAAwgB,GAoBAhgB,EAAgBigB,OAAA,EAAAD,GAEdxkB,EAAIiE,SAASO,wBAMFie,yBAmBbjpB,EAAAkrB,sCA3BA,IAAAC,EAAArV,EAAAuP,YAAA7Q,MAAAxU,EAAA0qB,yBAeA,GAAAS,EAA0B,CACpB,IAAApiB,EAAAoiB,EAAA,GAAA/O,OAMF,OADArT,GADAA,GAHAA,EAAMA,EAAAyD,QAAa,eAAK,KAGjBA,QAAA,OAAA,MACGA,QAAA,MAAA,+CAORyL,EAAA4S,OACFO,EAAiB,IAAKtJ,OAAA,YAAS7J,EAAA,kBAC/BoT,EAAOR,EAAArW,MAAA4W,UACPC,EAEOC,EADPD,EAAa,GAAAjP,QALjB,MAUA,IAAAmP,EAAA,8EAsBQD,EAAAE,GACN,WACmBC,EAAArrB,QAAAsrB,SAAAF,EAAA,CAAAG,UAAAC,EAAAC,qBAEjBnqB,kCE5IJ,SAAgBoqB,EAAuBN,GACrC,OAAKA,EAAQhf,QAAA,aAAA,IAAAA,QAAA,eAAA,IADf,SAAAoe,EAAAthB,2CFuIAtJ,EAAAsmB,eAXA,SAA+B/a,GAC7B,IAAMiJ,EAAAjJ,EAAYiJ,MAAA+W,GAElB,GAAM/W,GAAkB,IAAlBA,EAAA+E,MAA4B,CAChC,IACMwS,EAAWT,EADA9W,EAAK,IAEtB,MAAO,iBAAAuX,EAAEA,EAAyC,KAEpD,OAAO,wDGpIoBN,EAAQrrB,QAAA4rB,SAAA3E,GAArC,MAAA3lB,qFDKM4H,UAEQ2f,EAAa3f,GACR+F,KAAA,SAAAyG,OAEb0V,EAAOM,EADChW,EAAOA,KAAAuP,oBAGbmG,SAAOA,EACTvd,KAAAqd,EAAQE,GACR1V,KAAAA,+EEHN9V,EAAA6rB,4BAKAnsB,EAAAC,EAAA,IAGA,SAAAU,EAAAL,GACAC,OAAAwC,eAAAzC,EAAA,aAAA,CAAAW,OAAA,MAmBE6lB,UAlBF,SAAAA,EAAA3S,EAAAoY,GAIE,IAAAtrB,EAFU,GAAAsrB,EAcV,OAXAhsB,OAAAoU,KAAA4X,GAAAC,MAAA,SAAA7pB,GACA,OAAAA,IAAAwR,GACAlT,EAAAsrB,EAAA5pB,IACA,MAEA4pB,EAAA5pB,IAAA,iBAAA4pB,EAAA5pB,UAEA6V,KADAvX,EAAA6lB,EAAA3S,EAAAoY,EAAA5pB,QAKA1B,MAKAhB,EAAA,aACAU,EAAAL,OACA6B,EAAAC,MAAAA,KAAAD,gBAAA,WACA,IAAA,IAAAE,EAAA,EAAAC,EAAA,EAAAC,EAAAC,UAAAC,OAAAH,EAAAC,EAAAD,IACAD,GAAAG,UAAAF,GAAAG,OACA,IAAAvC,EAAAwC,MAAAL,GAAAM,EAAA,EAAA,IAAAL,EAAA,EAAAA,EAAAC,EAAAD,IACA,IAAA,IAAAM,EAAAJ,UAAAF,GAAAO,EAAA,EAAAC,EAAAF,EAAAH,OAAAI,EAAAC,EAAAD,IAAAF,IAzBUzC,EAAAyC,GAAAC,EAAAC,GAiCZ,OAAgB3C,yBAIZI,EAAA,aAAA,CAAAW,OAAA,YAAejB,EAAAE,EAAA,OAAgBF,EAAAE,EAAA,kBAC/BF,EAAAE,EAAA,OAAeF,EAAAE,EAAA,OAAOF,EAAAE,EAAS,gBAC/BF,EAAAE,EAAA,IAsIJ,SAASusB,EAAAljB,EAAawB,GACpB,OAAO,EAGT,SAAS2hB,EAAAnjB,EAAAwB,EAA+BjE,GACtC,IAAA6G,EAAYpE,EAAUoE,iCAGxB,GAAAgf,GAAS5hB,GAAsBjE,EAE3B,IADF,IAAO8lB,EAAA9lB,EAAC+lB,YAAoBlf,EAA4Dif,gBAClF/hB,EAAQ8C,EAAKqG,KAAe,EAAAnJ,GAAQiiB,EAAAjiB,IAAA,CAEtC,GAAMkiB,EAAcH,EADP9lB,EAAA+lB,YAAkBhiB,KACDA,IAAAiiB,EAAA,CACxB,IAAAxhB,EAAA/B,EAAU+B,GACVjI,EAAkB2pB,iBAAAniB,EAAA,EAAlBxH,CAAkBiI,GAClBP,EAAAO,GACN,gBAON,SAAS2hB,EAAA1jB,EAAAwB,EAAAjE,GACP,IAAA6G,EAAOpE,EAACoE,UACNgf,EAAMO,EAAcC,gBAAAxf,MACpBgf,GAAI5hB,GAAejE,UACjB8lB,EAAI9lB,EAAA+lB,YAAUlf,EAAAif,QACND,EAAWS,MAAAT,EAAAvW,KAAAtL,SACjBD,EAAA8C,EAAAqG,KAAA,EAAAnJ,EAAAwiB,EAAiBxiB,IAAY,QACpB/D,EAAA+lB,YAAAhiB,YAEX,IAAOS,EAAA/B,EAAA+B,GACFjI,EAAA2pB,iBAAAniB,EAAA,EAAAxH,CAAAiI,GACLP,EAAOO,yDCnOb,SAAAyhB,EAAAH,EAAA/hB,GAEA,OAAA+hB,EAAAU,IAAAziB,EAAA0iB,OAIA,SAAgBC,EAAkBC,GAChC,OAAM,SAAOlkB,EAAYwB,EAAMjE,GACzB,IAAAc,EAAK4R,EACX,GAAO1S,GAAAA,EAAA4mB,eAAuBD,IAAWE,EAAAC,wBAAArkB,EAAAoE,WAAA,CAAE,IAAIkgB,EAAA,SAAAJ,GAAA,OAAAA,GAAA,EAAA,EAAIK,EAAAvkB,EAAAoE,UAAAmgB,uGAHrDC,EAAAb,EAAAc,4BAAAC,EAAAH,OAMgB,OAA2E,QAA3ElmB,EAAAsmB,MAAAA,OAA2E,EAAAA,EAAA9X,YAAA,IAAAxO,OAAA,EAAAA,EAAAmH,SAAA,QAAAyK,EAAAuU,MAAAA,OAAA,EAAAA,EAAA3X,YAAA,IAAAoD,OAAA,EAAAA,EAAAzK,6BAI3F,OAAA,SAAAxF,EAAAwB,EAAAjE,GAIA,IAAgB6lB,EAAAO,EAAwBC,gBAAoB5jB,EAAAoE,WAClD,GAAAgf,GAAAgB,EAAAC,wBAAArkB,EAAAoE,WAAA,CACF,GAAA5C,EAAa,CACZ,IAAAO,EAAA/B,EACC+B,mEAJVP,EAAAO,GASS,OAAA,EAA2D,OAAO,gCDiCvE,IAAA,QAAO,MAAA,UAA4B,SAAA,yCACnC,UAAA,cAAO,OAAA,sBAAmB,IAAS,+BACnC,QAAA,eAAO,UAAQ,mBAAoB,UAAA,mDAGnC,WAAA,uBAAe,aAAA,2BAAc,SAAA,mCAC7B,eAAA,+BAAe,gBAAA,iCAAmB,aAAA,sEAGlC,cAAA,6BAAe,eAAA,+BAAiB,mBAAA,yGAChChL,EAAA6tB,UAAA7tB,EAAA6tB,QAAA,OA8FIjb,wBA9FGyB,aAAyBxS,EAAA,EAChCgS,IAAAga,EAAAC,MAAExe,QAAKye,EAAQC,aAIfna,IAAAga,EAAAC,MAAiBxe,QAAKye,EAAQE,iBAC9Bpa,IAAAga,EAAAC,MAAiBxe,QAAKye,EAAQG,sBAG9Bra,IAAAga,EAAAM,UAAE7e,QAAKye,EAAQK,qBACfva,IAAAga,EAAAM,UAAE7e,QAAKye,EAAQM,eACfxa,IAAAga,EAAAM,UAAE7e,QAAKye,EAAQO,kBACfza,IAAAga,EAAAU,IAAEjf,QAAK6c,IACPtY,IAAAga,EAAAW,SAAElf,QAAK6c,IACPtY,IAAAga,EAAAY,OAAEnf,QAAKye,EAAQW,oBAGZ7a,IAGHga,EAAAY,OAAEnf,QAAKye,EAAQY,cACH9a,IAAEga,EAAAY,kCAIhBG,EAAsBC,aAAO,CAAlBhb,IAAAga,EAAOiB,KAChBxf,QAAW8c,QAEbwC,EAAWC,aAAQ,CACbhb,IAAKga,EAAAkB,IACPzf,QAAAqd,SAIE9Y,IAAAga,EAAyCmB,UACzB1f,QAAA4d,EAAc,SAClC,CAEArZ,IAAqBga,EAAAoB,QAAhB3f,QAAM4d,EAAM,yBAMZ5d,QAAA4d,EAAO,UA/DhB,CAkEgBrZ,IAAAga,EAAAqB,UACR5f,QAAQ4d,EAAU,SAEpB,CACIrZ,IAAAga,EAAAsB,aACA7f,QAAA8f,oBAIF9f,QAAQ8f,0BAIP9f,QAAA5M,EAAA2sB,qCAbT,QAAAC,KAwBEC,EAAO,0CAGT,IAASC,EAAQloB,EAAoByb,GAC7BwM,EAAAC,GAAkB,GAExBrb,EAAIC,SAAe,SAAAP,GACXA,GACA0b,EAAA1b,EAAcA,KAAA4b,QAAY5b,EAAAvE,sBAG1B,KACF,EAAM6J,EAAKlZ,OAAMyvB,OAAA7B,GAAA3U,EAAAC,EAAAhX,OAAA+W,OACjBC,EAAAD,aACAqW,EAASC,GACTpW,EAAA,EAAAuW,EAAAH,EAAAjU,MAAA,MAAAnC,EAAAuW,EAAAxtB,OAAAiX,IAAA,gHAS8B/L,EAAA8f,GACpC,IAAIK,EAAAngB,EAAemgB,MACjB1X,EAAM0X,EAAO1X,UACbA,EAAM8Z,YAAY,CAClB,IAAAC,EAAerC,EAAUsC,aACvBC,EAAMja,EAASuP,eACX,SAAJ8H,GAAiB4C,EAAMtY,OAAWoY,GAAQjZ,SAAW,aACnD,KAEA,UAASmZ,EAAAtY,OAAA,EAAAoY,GAAAjZ,SAAA,aACT,eC/INjX,EAAA,kBAFFM,OAAAwC,eAAAzC,EAAA,aAAA,CAAAW,OAAA,IAKA,IAAAkC,EAAiCnD,EAAkBE,EAAA,KACjDowB,EAAsBtwB,EAAAE,EAAA,KACtBmD,EAAqBrD,EAAIE,EAAA,OACvBF,EAAAE,EAAA,ICxCJ,SAAAqwB,EAAA5iB,EAAA6iB,GAEA,OAAA7iB,EAAA8iB,QAAAD,EAAAxc,MAAArG,EAAA8iB,QAAAD,EAAAvc,gCDuCetG,EAAA+iB,OACX1c,EAAG0c,EAAQ7lB,IAAA,qBALfoJ,GAMSD,EAAA0c,EAASta,KAAAtL,YC5ClBxK,EAAAqwB,qEAMarwB,EAAAiwB,uBAAAA,EAMAjwB,EAAAstB,wBALA,SAAAjgB,GACA,IAAAmgB,EAAAngB,EAAAmgB,MACA8C,EAAA9C,EAAA1X,KAAA0X,EAA8BtJ,MAAA,GAC9B,OAAAoM,IAAAA,EAAyB7hB,OAAA6hB,EAAA7hB,KAAAlI,OAAAqH,MAAArM,MAAA8L,aAAA2iB,EAAAO,WAAAD,EAAA7hB,OAAA6hB,EAAA7hB,KAAAlI,OAAAqH,MAAAtE,6BAuBtC,SAAA/C,EAAA8G,GAGE,OAAAA,aAAYxK,EAAe2tB,eAAA,CACzBjqB,EAAKqH,MAAK1J,sBAEZ0S,SAAAvJ,EAAAyI,KAAIrH,SAGJgiB,qJAAAjqB,EAAA+D,SACE/D,EAAAyC,MAAY+B,0IAEPxE,EAAAiE,SAAAO,UAML,yBAEKvI,eAAAzC,EAAA,aAAA,CAAAW,OAAP,UACUjB,EAAAE,EAAiB,OAClBF,EAAAE,EAAA,gBAEF8wB,EAAAhxB,EAAAE,EAAA,MACL+wB,kBAAmB,UACnBC,wBAAO,0DAEXrf,kBAAA,2DA5BavR,EAAA6wB,uBAAA,wBAoCb7wB,EAAA8wB,yBAAgB,iBACdC,6BAAW,yBACA,oBAETC,EAAmBhmB,QAEjBA,GAAKA,sDAKL,WAGA,OAAMlJ,KAAAkJ,GAAS1B,iBAKL,gBACR,0BACa0nB,EAAO9lB,UAAA,YAAA,4BAKZF,GAAAqC,6CAQHnC,UAAA+lB,QAAiB,SAAAvd,EAAmBC,EAAAud,kBACzCD,QAAOvd,EAAAC,EAAAud,gDAnCf,iCAAApvB,MA0CEkvB,EAAW9lB,UAAAimB,iBAAO,SAAAD,GAGhB,OAFApvB,KAAKkJ,GAAAmmB,iBAAID,GAETpvB,QAGIoJ,UAAAkmB,WAAA,SAAAptB,EAAA0P,6CAIF5R,QAlDO,YAsKTuvB,EAAaC,UACbA,EAAapF,MAAA,SAAaqF,GAC1B,OAAIA,EAAYrgB,uBAKlBsgB,EAAOF,EAAAG,EAAAC,GA/BT,oCAAA3O,EAAA,EAAA4O,EAAAL,EAAAvO,EAAA4O,EAAAxvB,OAAA4gB,IAAA,CAkCA,IAAgBwO,EACdI,EACA5O,GAII6O,EAAWA,EAAAC,SAAAH,EAAApoB,IAAAioB,EAAAO,QAAAC,aAEbH,+BAiDJhpB,EAAgB,SAAAkN,EAAAvL,GAEZynB,GASE3N,IAAOA,EAAAvO,kBAILkc,GAAc,IAKpBP,EApBFA,EAAAnoB,MAAAooB,EAAApoB,yBChTA,IAAA2oB,EAAgBC,EAAAC,WACVC,EAASC,EAAAF,WACbG,EACE,IAAA,IAAAtwB,EAAU,EAAMO,EAAA,EAAAP,EAAQowB,EAASpwB,IAAA,CAE5B,qBAAAuwB,EAAAhwB,EAAAb,EAAAgW,KAAAC,IAAAsa,EAAAjwB,EAAA,GAAAuwB,EAAA7wB,EAAA6wB,uBALThwB,EAAAgwB,EAAA,EAQgBC,GAA2BC,EAAAjoB,SAC3B,SAAA8nB,EAGV3yB,EAAA8yB,EAAAD,GACAjwB,EAAO0vB,GAAAC,EAAAO,MAAAlwB,GAAAmwB,WAAAD,yBAGJA,EAAAE,aAAA,EAAAF,EAAAjd,QAAAod,KAAAjzB,EAAA6yB,EAAA,GARTA,GAAAC,EAAAjoB,kKCVa,GAAAqoB,EAAAnf,OAAemf,EAAOlf,IAAA+c,EAAcoC,mBAAoBD,EAAKna,QAAU,2ECKpF,OAAA,oBH+HcsY,0CAGQ+B,gBAEN9f,OAAQ,WACVhO,UAAa,iEAIVqsB,uBASQtmB,oDAIXT,eAAKyoB,EAAYD,EAAAhQ,EAAAiQ,EAAA7wB,OAAA4gB,IAAA,OACfiQ,EAAajQ,WACbkQ,OAAS1oB,sDAUXS,EAAYiG,cAAAjG,EAAAoG,+BAuEnB0B,kDAjEMG,OAAA,SACLpQ,EAAiBoC,UAAA,wCAAW,SAAQqsB,EAAWG,EAAcC,gBAK7D1mB,EAAA0mB,EAAO1mB,qDAnEf,GAAApC,EAAAiV,QAAAjV,EAAAsqB,eAyEgBtqB,EAAuBiV,SACjBsV,EAAKvqB,EAAAiV,OAAWyT,EAAAG,EAAAC,qBAMtB,4BAPhB,GAAA9oB,EAAAsqB,WAAApd,EAAAvL,EAAArF,EAAAqU,GAKkB,OADoB4Z,GAA6B,GACjD,GAEQpQ,EAAS,EAAAzb,EAASsqB,EAAKwB,QAAYrQ,EAAQzb,EAAAnF,OAAA4gB,IAAA,YAE5D0O,EAAAnoB,IAAAqpB,aAAAU,EAAAC,MAAAD,EAAAE,IAAAC,6CAULL,GAAA,EAGaA,GACLvqB,EAAA6qB,OAAAzoB,EAAAsmB,EAAAG,EAAAC,4BAOIgC,EAlBhBC,EAAA5Q,gCA8BM,OAAana,EAAA6qB,OAAAzoB,EAAAsmB,EAAAG,EAAAC,MAGb,OAAA1mB,EAAAkG,YAAalG,EAAAiG,cAAAjG,EAAAoG,eACNpG,OADP,8DAyCF4oB,qBAVK5oB,EAAArL,SACG,IAAMk0B,EAAgBC,UAAA9oB,EAAA1B,4EAO9B0B,uDApBJ,OAAA,MAoCE,IAAMmoB,GAAU,EACVK,EAAc,SAAA1d,EAAAvL,EAAArF,EAAAqU,GACpB,GAAA8K,EAAAvO,EAAAvL,EAAArF,EAAAqU,GACE,OADK4Z,GAAgB,GACf,OAIF7rB,EADAkqB,EAAWF,EAAAG,EAAAC,GACK0B,QAAArQ,EAAAzb,EAAAnF,OAAA4gB,IAAA,OAChBzb,EAAAyb,8EAGJoQ,EACA,oCGlSJnzB,EAAA+zB,4BAAAA,GAaar0B,EAAAC,EAAA,IAkBb,SAAgBU,EAAAL,UAEdyC,eAAMzC,EAAe,aAAmB,CAAAW,OAAW,kCAC5B+X,WACrBvW,EAAM,EACAH,EAAA,EAAmCA,EAAA0W,EAAAlD,QAAA2c,WAAAnwB,OACjC0W,EAAAlD,QAAAid,MAAAzwB,GAAAqjB,YAAAljB,kDAMR6xB,GAAS,mBACFC,aAAO,SAAAne,MACZuO,EAAKvO,GAEL,UADS,GACJ,qDAUA9V,EAAA,aAAA,CAAAW,OAAA,mBACD,oBAAAuzB,WAAA,MAAA9Q,KAAA8Q,UAAAC,4BAOJ9zB,EAAAL,UACJyC,eAA4CzC,EAAA,aAAA,CAAAW,OAAA,QAC5CoC,EAAarD,EAAaE,EAAA,OAClBF,EAAOE,EAAA,MACRF,EAAAE,EAAA,MACHF,EAAKE,EAAA,eA2DFqJ,OACL1C,EAAO0C,EAAA1C,2DAJXA,EAAAqH,MAAAC,8GChIAumB,EAAA,UAQAC,EAAAjgB,SAAA,SAAAkgB,GACA,CACA/tB,EAAAqH,MAAA2mB,YACAhuB,EAAAqH,MAAA4mB,cACA5d,SAAA0d,EAAAxe,KAAArH,MAUgB1L,EAAkBmiB,mBAAkBoP,EAAAxe,KAAAvP,EAAAqH,MAAA6mB,WAAA,GAAArgB,SAAA,SAAAsgB,GAG5C3xB,EAAemiB,mBAAAwP,EAAA5e,KAAAvP,EAAAqH,MAAA+mB,WAAA,GAAAvgB,SAAA,SAAAwgB,GACNR,EAACjzB,KAAkB,CAAO2U,KAAA8e,EAAA9e,uCAUvCse,EAAOjzB,KAAAmzB,iBAM6DO,EAAA/e,8BAC/DA,EAAArH,KAACwO,KAAoB9R,MAAAoU,eAAuD,2CD8BjE,mDAEhBuV,6BAAc,kBAuDdrpB,0CAnDF,IAAAspB,EAAcC,EAAA/rB,GAAAoG,KAAA,SAAA+gB,kBA9ChBta,EAAAsa,EAAAta,KAqDgBmf,EAAA,CAERxmB,KAASzO,EAAM80B,6BACf1P,MAAA,EACJrc,MAAO,GACLmsB,QAAO,EACPC,SAAO/E,EAAM7lB,QAEbuL,EAAArH,OAAalI,EAAAqH,MAAAC,cACbonB,EAAAxmB,KAAOzO,EAAM80B,6BACbG,EAAAlsB,MAAc+E,EAAAod,0BAAApV,IAAA,uCAIZmf,EAAAxmB,KAA8BzO,EAAAo1B,yBACpC,IAAUC,EAAQC,EAAAC,uBAAQzf,EAAAuP,aAEpBgQ,IAACJ,EAAAlsB,MAAassB,EAAAp0B,YAAwC6U,EAASrH,OAASlI,EAAKqH,MAAOuX,UAEtF8P,EAAAxmB,KAAAzO,EAAAw1B,0BACEpQ,MAAAtP,EAAA3K,MAAAia,cACEtP,EAAAuP,4CASJ,8BAKJ,IAAO4P,EAAAF,EAAA/yB,GAAAizB,qCAnCTA,EAAAC,QAAA,EAsCgBO,GAAgB,gBAIhC,MAAgB,CAAAC,MAAAA,ICtFhB11B,EAAAg1B,mBAA+BA,IAAyCW,yBAAfrsB,UAAAsjB,EAAAxI,sBAAA9a,EAAAurB,MAcrDA,cAAKA,OAIL,eAEQ70B,yBACAA,EAAY,aAAe,CAAAW,OAAW,UAAwBjB,EAAaE,EAAA,OAAYF,EAAAE,EAAA,OAC7FF,EAAME,EAAA,MAGNF,EAAME,EAAK,MACLF,EAAAE,EAAA,MACAF,EAAAE,EAAU,MAChBF,EAAME,EAAA,eACFqJ,SACFA,EAAA1C,kBACKgd,WACLxgB,EAAG6yB,qBAAqBrS,EAAxBxgB,CAAwBkG,EAAAoE,uBAExBO,MAAAioB,8HAoDR,SAAgBC,EAAqB7sB,GACnC,GAAIA,EAAA1C,OAAaqH,MAAA+mB,UAAiB,CAC9B,IAAAoB,EAAMhzB,EAAY6yB,qBAAA3sB,EAAA1C,OAAAqH,MAAA+mB,UAAZ5xB,CAAYkG,EAAAoE,WACpB,GAAM0oB,EACA,OAAAC,EAAYD,EAAWjgB,KAAAuP,yBAJjC,SAAA4Q,EAAAhtB,EAAAsB,EAAAsT,OAmCA,IAAAqY,EAAgB,GACV3vB,EAAO0C,EAAQ1C,OAEfwc,EAAM,EAAAoT,EADOpzB,EAAAmiB,mBAAAjc,EAAAK,IAAA/C,EAAAqH,MAAA+mB,WACG5R,EAAAoT,EAAAh0B,OAAA4gB,IAAA,KAChB6R,EAAMuB,EAAApT,MACN6R,EAAMrqB,IAAAqqB,EAAA9e,KAAAtL,SAAAD,YAEgB8qB,EAACW,EAAOpB,EAAc9e,KAAAuP,2BAC9C6Q,EAAO/0B,KAAAk0B,YAYX,SAAgBW,EAAAzqB,GAEd,IAAM6qB,EAAQ7qB,EAAK8qB,WAAM9a,MAAA,MACzB,GAAI6a,EAAAj0B,OAAO,EAAA,CAKT,IAAIm0B,EAAMF,EAAG,GAAA5pB,QAAQ,wBAAa,MAChC+pB,EAAOD,EAAA9hB,MAAA,cATbgiB,eAoBgBF,KAAAA,EACR/qB,MAVJ6qB,EAAOA,EAAAvY,QAAA,SAAAxB,EAAAoa,GACL,OAAQ,IAARA,IAGGpa,EAAApB,WAAA,mDASL,OAAM,KAzHVjb,EAAA02B,kBAA+BA,EAqB/B12B,EAAA22B,wBApBmBtoB,EAAiBC,EAAAC,eAChB,IAAhBD,IACAA,EAAI,qCAHR,IAAA/H,EAAA0C,EAAA1C,OAUA,KAAgB0C,EAAAoE,qBAA4B2iB,EAA8CO,WAAA/sB,EAAAozB,gBAAArwB,EAAAqH,MAAA+mB,UAAApuB,EAAAqH,MAAAipB,UAAArzB,CAAAyF,IAAA6tB,EAAAC,2BAAA9tB,EAAAK,IAAAL,EAAAoE,YAA1B,OAAA,WACxD,OAAA,EAEA,GAAA5C,EAAA,CACC,IAJTusB,EAIS3oB,EAA8BkN,MAAA,SAEtB7C,MAAc,EAAApK,GAAM2oB,QAAa,SAAAngB,EAAauF,4BAN/D9N,EAWgBvD,EAAA/B,EAAkB+B,GAE1BksB,EAA2B3wB,EAAAvC,KAAAqK,GAG3B0nB,EAAexvB,EAAAqH,MAAA+mB,UAAA1uB,OAAA,CAAA4F,cAAAsrB,EAAAC,UAAAF,GACfG,EAAgBP,EAAAC,2BAAmB/rB,EAAM1B,IAAK0B,EAAAqC,WACzB,GAAAgqB,EAAhBP,EAAAQ,wBAAYtsB,EAAAqsB,EAAAtB,OACjB,CACF/qB,EAAAuC,qBAAAwoB,2CAEIhzB,EAAiB2pB,iBAAkB6K,EAAnCx0B,CAAmCiI,GAEvCP,EAAOO,wEAyBiB/B,EAAAsB,gBAM1BA,EAAMtB,EAAAoE,UAAkBqG,YAGlBoiB,EAAA7sB,KACJuuB,EAAIA,EAAAhB,KAAA,MACE,yDAEH,IAAAnB,EAAAmB,KAAAiB,cAAAjB,OAAAte,EAAA,CAAAwf,YAAA,aAAAC,EAAAvU,KAAAiS,EAAAiB,UAKTt2B,EAAAi2B,kBAAAA,IA8CID,SAAOA,4BACGE,eACA,OACC,QACC,GAAAM,iDAIGnB,YACF9pB,MAAA8pB,EAAA9pB,KAAA,yDAQRvH,OACLwQ,EAAOxQ,EAAAwQ,MAAA,iFAxBX,oCC9JAxU,EAAA43B,8DA9CA,mCAAA,CAsBM,OAAO70B,EAAAkiB,aAAA3b,GArBb,SAAAwM,GAkBgB,OAAAA,EAAarH,OAAoClI,EAAcqH,MAAAiqB,YAAA/hB,EAAArH,OAAAlI,EAAAqH,MAAAkqB,gBAGlE5L,MAAA,SAAA6L,GACT,QAAOzuB,EAAA0uB,aAAeD,EAAQxtB,IAAAwtB,EAAQxtB,IAAAwtB,EAAAjiB,KAAetL,SAAMjE,EAAA6G,MAAA7B,oDAGxC2gB,MAAa,SAAU+L,uBAP9CC,EAAAC,EAAAC,aAAA9uB,EAAAZ,QAAAgL,GAAAnN,EAAA6G,MAAA7B,MAUgB,GAAa2sB,EAA2D,CAC9E,IAAMl0B,EAAAsF,EAAA+uB,YAAAH,EAAAxkB,KAAAwkB,EAAAvkB,IACM,MAAA,YAAAyP,KAAApf,GAGb,OAAO,QASd,OAAO,qBAQD3D,EAAQL,OAEd6B,EAAiBC,MAAAA,KAAAD,gBAAA,eACf,IAAAE,EAAO,EAAAC,EAAA,EAAAC,EAAAC,UAAAC,OAAAH,EAAAC,EAAAD,2BAGH,IAAApC,EAAOwC,MAAML,GAAKM,EAAA,EAAxB,IAA8BL,EAAK,EAAAA,EAAAC,EAACD,IAAe,IAAA,IAAAM,EAAKJ,UAASF,GAAAO,EAAA,EAAAC,EAAAF,EAAAH,OAAAI,EAAAC,EAAAD,IAAAF,cACjE,OAAKzC,wDAIL04B,EAAI54B,EAAAE,EAAa,IACjBmD,EAAoBrD,EAAAE,EAAU,gBAsBQokB,EAAUvV,gEALlD,IAAAqe,EAAAhX,KAUA,OAAgB,EAQd,IAAMyiB,EAAAzL,EAAAhX,KAAc1I,MAAAyI,MAAA,SAAAqb,GACpB,OAAAA,EAAYziB,OAAQA,SAElB8pB,EACA,OAAI,YAEGvU,EAAKzK,UACLyK,EAAA8I,QAAWA,EAAA0F,SACXgG,EAAA,sEAINC,GAAYzU,EAAA9e,OAAAutB,MAAA+F,GAAAhuB,SApBjB,KAAAkuB,EAAA1U,EAAA9e,OAAAitB,YAAAoG,EAAAI,QAAA3U,EAAA9e,OAAAutB,MAAAiG,GAAAtrB,QAuBAwrB,GAAgB5U,EAAA9e,OAAAutB,MAEdiG,GAEAluB,SAIMkuB,GAAA,SACAhlB,KAAA+kB,EACN9kB,GAAAilB,KAlDEC,sBATa1zB,EAAAsJ,GACf,IAAInH,EAAAnC,EAASkI,UAAWqG,EAAWpM,EAAAoM,KAAApG,EAAAhG,EAAAgG,MAAAqG,EAAArM,EAAAqM,GAEnC,OAFmCrM,EAAAwxB,MAGjCrqB,KAAcA,EAAAkqB,QAAAxzB,EAAA4zB,aAAAzrB,EAAAF,8DAMF9D,EAAA4mB,EAAAzhB,uBAGdrB,EAAO,KAAEulB,aAAMjf,EAAAC,GAAA,SAAAmC,GAAU1I,EAAIvL,EAAAuL,EAAA0I,EAAA1I,oCA/B/B,OAAA4rB,EAAAvqB,KAAAwJ,OAAAxJ,EAAAwJ,QAmCE,OAAIiZ,EACAA,EAAU/lB,MAEP,mBA0CUitB,mCACK/qB,EAAa4rB,YAE7BH,MACAV,EAAe/qB,EAAAmgB,MAAYyL,WAGvBvlB,0EApBZ3Q,EAAAm2B,mBAAApjB,EAAAmjB,GAAA,GA8BgB7kB,SAAA,SAEd6jB,GAQG,IAAAvkB,EAAYnJ,EAAA,EAAA0tB,EAAA1tB,IACT2tB,EAAYE,EAAAptB,EAAA1B,IAAgBZ,QAAMgL,GAACulB,GACvCf,mCAEgB1jB,MAAA2T,KACbnd,EAAAmuB,WAAYjB,EAAAxkB,KAAAwkB,EAAAvkB,GAAAslB,GACXjuB,EAAAmmB,iBAAgB8H,oBAIZ,oCAMWjuB,EAAA8K,EAAOvL,EAAM6uB,EAAKH,EAAAE,KAI1BD,mBAAsBpjB,EAAAmjB,GAAA,4BAHdI,KAAAA,WACVV,QAAQU,EAAAjsB,QAMf,IAAAsG,EAAWnJ,EAAA,EAAA0tB,EAAqB1tB,kCAGjC,IAAYvG,EAAAgH,EAAA1B,IAAA+uB,YAAAiB,EAAA5lB,KAAA4lB,EAAA3lB,WArCjBxR,GAAA,GAAAA,IAAA6B,EAAA7B,iECxGAnC,EAAAu5B,6BA1BevuB,EAAA8K,EAAAvL,EAAA4d,EAAA8Q,EAAA9tB,EAAA0S,EAAA7Z,iBAILs0B,EAAUkB,gBAAY1jB,GAAA,SAAA2jB,EAAAC,EAAApJ,YACd7hB,KAAAkrB,eAAaV,eAErB,SAAK5V,2BAEF8E,EAAAE,KAAAhF,EAAArf,MACL,UAAU,OACFA,EAAKA,EAAAwQ,GAAQA,EAAA,KACnBjK,EAAG,EAAA8Y,EAAA9Y,IAAAiK,EAAA+E,OAAA/E,EAAA,GAAArS,OAAAy3B,EAAAz3B,kDAGF+tB,GAAAA,EAAAxc,OAAAA,GAAAwc,EAAAvc,KAAAA,GAAA3I,EAAA1B,IAAA0uB,aAAAtkB,EAAAC,EAAAslB,EAAA1yB,OAAA6G,MAAA7B,UACLsS,GAAaA,EAAAnK,EAAAC,IAAA,+DAGV3I,EAAAqC,UAAA8iB,SAAAxc,wEAQPwU,EAAA0R,UAAY,6ECJVL,gBArCJ,SAAAlwB,EAAAuU,GAEY,IAAAic,EAAA,GAAZC,EAAY,SACVzwB,EAAA2qB,aAAA,SAAAne,EAAAvL,EAAA+lB,GACA,GAAAxa,EAAAkkB,OAAA,CAFU,GAAAnc,IAAAA,EAAA/H,EAAAvL,EAAA+lB,GAYW,OAAwC,EAErDwJ,EAAcC,GACbD,EAAKC,GAAgB,CACvB/1B,KAAA81B,EAAAC,GAAA/1B,KAAA8R,EAAA9R,KACEuG,IAAAuvB,EAAAC,GAAAxvB,KALXuvB,EAAAC,GAAA,CASgB/1B,KAAA8R,EAAA9R,MAA2B,GAE1BuG,IAAAA,QAOTwvB,GAAQ,KAGZD,0BAGM91B,UACNA,EAAIwI,QAAY,QAAK,iCAGdytB,EAAAC,UACE,MAAPzC,cAAOyC,OAAAhiB,EAAA,CAAAwf,YAAA,qBApBb,SAAAr3B,EAAAL,GA2BAC,OAAAwC,eAAgBzC,EAAA,aAAsD,CAAAW,OAAqB,QACzFoC,EAAkBrD,EAAUE,EAAA,eAE5Bu6B,GACAA,EAAO,QAAA,qCAJTn6B,EAAAm6B,WAAAn6B,EAAAm6B,SAAA,mZCjDAn6B,EAAAs3B,wCAJA,mHAAAtsB,IASAtL,EAAAC,EAAA,IACA,SAAAU,EAAAL,GAEA,IACAo6B,EADAC,EAAAv4B,MAAAA,KAAAu4B,YACAD,EAAA,SAAAnW,EAAAqW,GAWE,OATUF,EAAAn6B,OAAAs6B,gBAAA,CAAAC,UAAA,cAAAp4B,OAAA,SAAA6hB,EAAAqW,GAAArW,EAAAuW,UAAAF,IAEV,SAAArW,EAAAqW,GACA,IAAA,IAAA1W,KAAA0W,EACAA,EAAA/a,eAAAqE,KACAK,EAAAL,GAAA0W,EAAA1W,MAIAK,EAAAqW,IAEA,SAAArW,EAAAqW,GAEA,SAAAG,IACA34B,KAAA44B,YAAAzW,EAFAmW,EAAAnW,EAAAqW,GAIArW,EAAA/Y,UAAA,OAAAovB,EAAAr6B,OAAAgG,OAAAq0B,IAAAG,EAAAvvB,UAAAovB,EAAApvB,UAAA,IAAAuvB,KAGAvyB,EAAApG,MAAAA,KAAAoG,UAAA,WAUA,OATAA,EAAAjI,OAAA06B,QAAA,SAAA55B,GACA,IAAA,IAAAgB,EAAAC,EAAA,EAAA2hB,EAAAzhB,UAAAC,OAAAH,EAAA2hB,EAAA3hB,IAEA,IAAA,IAAA4hB,KADA7hB,EAAAG,UAAAF,GAEA/B,OAAAiL,UAAAqU,eAAA/d,KAAAO,EAAA6hB,KACA7iB,EAAA6iB,GAAA7hB,EAAA6hB,IAEA,OAAA7iB,IAEAoQ,MAAArP,KAAAI,mBAIAO,eAAAzC,EAAA,aAAA,CAAAW,OAAA,QACAotB,EAAAruB,EAAAE,EAAA,KACAg7B,EAAAl7B,EAAAE,EAAA,KACAmD,EAAArD,EAAAE,EAAA,KACAu4B,EAAAz4B,EAAAE,EAAA,IACAgtB,EAAAltB,EAAAE,EAAA,IACA6b,EAAA/b,EAAAE,EAAA,GACAk3B,EAAAp3B,EAAAE,EAAA,IACAi7B,EAAAn7B,EAAAE,EAAA,IAGAytB,EAAA3tB,EAAAE,EAAA,cAEA6D,GACAA,EAAA,KAAA,uCACAA,EAAA,KAAA,uCACAA,EAAA,UAAA,uCACAA,EAAA,gBAAA,uCACAA,EAAA,OAAA,uCACAA,EAAA,GAAA,uCACAA,EAAA,KAAA,uCACAA,EAAA,UAAA,uCACAA,EAAA,YAAA,uCACAA,EAAA,UAAA,uCACAA,EAAA,UAAA,uCACAA,EAAA,UAAA,uCACAA,EAAA,UAAA,uCAGAA,EAAA,SAAA,uCACAA,EAAA,SAAA,uCACAA,EAAA,SAAA,uCACAA,EAAA,SAAA,uCACAA,EAAA,SAAA,uCACAA,EAAA,SAAA,uCACAA,EAAA,UAAA,uCACAA,EAAA,gBAAA,uCACAA,EAAA,WAAA,uCACAA,EAAA,UAAA,uCACAA,EAAA,SAAA,uCACAA,EAAA,KAAA,uCACAA,EAAA,IAAA,uCACAA,EAAA,UAAA,uCACAA,EAAA,WAAA,uCACAA,EAAA,YAAA,uCACAA,EAAA,UAAA,uCACAA,EAAA,aAAA,uCACAA,EAAA,aAAA,uCACAA,EAAA,cAAA,uCACAA,EAAA,cAAA,uCACAA,EAAA,oBAAA,uCAGAA,EAAA,mBAAA,uCACAA,EAAA,iBAAA,uCACAA,EAAA,kBAAA,uCACAA,EAAA,mBAAA,uCACAA,EAAA,cAAA,uCACAA,EAAA,kBAAA,uCACAA,EAAA,qBAAA,uCAGAA,EAAA,oBAAA,uCACAA,EAAA,kBAAA,uCACAA,EAAA,kBAAA,uCACAA,EAAA,iBAAA,uCACAA,EAAA,eAAA,uCACAA,EAAA,iBAAA,uCACAA,EAAA,qBAAA,sCACAA,EAAA,sBAAA,uCACAA,EAAA,uBAAA,uCAGAA,EAAA,wBAAA,uCACAA,EAAA,WAAA,uCA3GUA,EAAA,KAAA,uCAuHZA,EAAA,WAAA,uCAOEA,EAAA,MAAA,yCAOY,SAAA,yCACI,gBAAA,yCACC,eAAA,yCACG,aAAA,yCACC,UAAA,2FAGdA,EAAA,YAAA,yCACe,SAAA,+FAGfA,EAAA,eAAA,yCACE,eAAA,sGAGFA,EAAA,OAAA,yCACE,MAAA,uFAEXA,EAAA,OAAA,iGAhCaA,EAAA,cAAA,uCAkCbA,EAAA,UAAA,uCAAiCA,EAAA,SAAA,uCAI/BA,EAAiC,YAAkB,yCAAoB,WAAA,yCAAA,UAAA,4FACrE,SAAA,yCACgB,WAAA,yCACH,cAAA,qJAGRA,EAAA,cAAP,yCACS,aAAa,8FAExBA,EAAA,sBAAA,uCAbiCA,EAAA,gCAAA,sCAApBA,EAAA,gBAAA,uCAebA,EAAA,oBAAA,wCAAiCzD,EAAAyD,kBAAAzD,EAAAyD,gBAAA,SAI/Bq3B,EACE,oBADFA,EAQEj7B,EAAA0P,EAAUI,EAAQorB,EAASnrB,GAC3B9N,KAAAjC,GAAKA,EACLiC,KAAAyN,OAAaA,mCAGRzN,KAAA8N,aAAP,IAAOA,4CAGT,OAAA9N,KAAA6N,QAAA1G,IApBa6xB,EAAA5vB,UAAAsE,SAAA,SAAAvG,GAsBb,OAAA,GACE6xB,EAAA5vB,UAEEwE,OACA,SACAzG,GACA,OAAA,KAvBA,8BA4BJ+xB,EAAA,SAAAjlB,GAXa,SAAAilB,EAAAn7B,EAAA0P,EAAA0pB,EAAA9tB,QAab,IAAAA,IAAiCA,EAAA,IACwC,IAAA5F,EAAAwQ,EAAAvU,KAAAM,KAAAjC,EAAA0P,EAAA0rB,EAAAhC,EAAA9tB,KAAArJ,cAAAm3B,SAAAA,YACrE1zB,EAIJ,OAnBkC80B,EAAAW,EAAAjlB,GAiBlCilB,EAAA9vB,UAAAsE,SAAA,SAAAvG,GAJiC,OAAAkvB,EAAAU,aAAA5vB,EAAAnH,KAAAm3B,WAMjC+B,EARA,MASEA,YAAAA,QACE,SAAAjlB,YAGEmlB,EAAKr7B,EAAA0P,EAAAgU,EAAqBpY,EAAOwE,EAAMorB,SACrChlB,EAAOvU,KAAAM,KAAAjC,EAAA0P,EAAAI,EAAAorB,IAAAj5B,2BAETqJ,MAAIA,aAJJ+vB,EAAenlB,KAOb7K,UAASsE,SAAA,SAAAvG,wDATb,MAeJiyB,YAAAA,MAjB4CC,EAAA,SAAAplB,GAqB5C,SAAgBolB,EAAet7B,EAAA0P,EAAoB6rB,EAA8BC,EAAAlwB,EAAA4vB,eACzE,IAAA5vB,IAECA,EAAA,IAMH4K,EAAIvU,KAAAM,KAAAjC,EAAa0P,EAAO6rB,EAAajwB,EAAMyrB,EAAOwE,EAAAC,EAAAlwB,GAAA4vB,IAAAj5B,YA9B3Cu4B,EAAAc,EAAAplB,KAA+B,gDA2CxCulB,EAAOz7B,EAAA0P,EAAkBgsB,EAAOpwB,EAAA4vB,GAIpC,0BAAgBhlB,EAAWvU,KAAAM,KAAoBjC,EAAA0P,EAAoBgsB,EAAoBpwB,EAAAqwB,EAAAD,EAAApwB,GAAA4vB,IAAAj5B,mBAE3Ew5B,QAERA,YAAcA,QAEF,SAAAvlB,qBAIZ,OAAMA,EAAAvU,KAAaM,KAAAjC,EAAA0P,GAAA,SAAAtG,EAAewB,EAAAjE,GAE9B,IAAAD,EAAM0C,EAAS1C,OACjB,IAAIqmB,EAAA/I,cAAO5a,EAAW1C,EAASqH,MAAA5J,MAC7B,OAAI,OAEA,OACAiF,EAAM+B,0BACSzE,EAAKvC,KAAMmY,IAAO,GAAAsf,iDAXvCC,EAAO3lB,KADG,iEA0BZ,GAAIkjB,IAAAhwB,EAAA1C,OAAA6G,MAAA7B,MACF4sB,EAAOU,aAAA5vB,EAAAA,EAAA1C,OAAA6G,MAAA7B,MAAA,+DAIH,GAAQowB,GAAMtO,EAAkB4C,uBAAAhnB,EAAAoE,UAAAsuB,KAAAtO,EAAAgD,kBAAApnB,EAAAoE,UAAAsuB,GAE/B,OAAA,EAIX,OAAgBC,EAAgC3yB,EAAAwB,kCAsCxC,IAAJU,MACE,IAGF,SAAOlC,EAAAwB,sDAIX,IAAgBsS,EACd,GAGA,GAAAtB,EAAAuB,iBAAAvO,EAAAwO,MAAA,CAAA,wBAAU,SAAsB0G,GAAK,OAAAlI,EAAAogB,oBAAAlY,EAAAxY,uBAE9B2K,IAECiH,EAAAtB,EAAEqB,eAAOhH,EAAAA,KAAA3K,6DAWfqwB,EAAa/sB,EAAAtD,UACb,SAAMlC,EAAgBwB,EAAKjE,UACjBomB,EAAUlI,aAASzb,EAAAwF,EAAetD,eAMtC4iB,EAAyB+N,OAAArtB,EAAAtD,EAAzB4iB,CAAyB9kB,EAAAwB,6BA1FlBixB,2CAkBRK,EAAqBC,EAAyC/nB,UACnE,SAAKhL,EAAUwB,EAAAjE,OACb6G,EAAOpE,EAASoE,4BAId6iB,EAAA5iB,EAAkB2uB,WAAAC,GACtB,IAAIhM,EACF,OAAM,yCACNA,EAAMhM,OAAO,GAAAiY,GAAAjM,EAAAhM,MAAeiY,EAAWjY,OAAM,GACzC4S,EAAMsF,OAAAD,EAAArmB,OAAAimB,EAAAM,aAAAF,EAAArmB,KAAAN,SAAA,CACR,GAAA2mB,EAAarmB,KAAArH,OAAAstB,EAAA,kBAIV5wB,EAAA,oCAIgBH,EAAgBsxB,cAA8BH,EAAA5xB,IAAAwxB,EAAA5wB,GAC/DV,EAAoBO,GAGtB,OAAU,gCAJlB,GAAAjI,EAAA6yB,qBAAA3sB,EAAA1C,OAAAqH,MAAAuX,QAAApiB,CAAAkG,EAAAoE,WAYgB,OAAA,EAA+B,IAAAkvB,EAAAtoB,EAAAuoB,gBAAA3B,EAAA4B,2FA4CjCjB,yCAIN,IAAJrwB,MACQ,aAEHlC,EAAYwB,WACfmiB,EAAA/I,cAAA5a,EAAAsa,KAIF9Y,8CA1CJ,KClWAzK,EAAA08B,+CCkGa7e,EAAA,SAAA4b,GACA,OAAA,6FCxGG,OAAM,EAElB,IAAMjM,EAAImP,WAAMC,KAAiB3zB,EAAAoE,UAAAyrB,MAC3B,OAAI+D,yEAHd,GAAA5zB,EAAAoE,UAAAqG,OAAAopB,+EFZA,IAAAC,EAAA5Y,eAAA6Y,EAAAA,EAAAvuB,GACA,OAAAouB,EASA,GAAApyB,EAAA,CAOgB,IAAAO,EAAA/B,EAAA+B,GACFT,EAAKuL,EAAMvL,IAAAuL,EAAUA,KAAAtL,UAAAkN,KAAAulB,IAAA/Y,GAAA,GAC3BlZ,EAAAigB,OAAS1gB,EAAAkE,EAAAxI,UACTlD,EAAmB2pB,iBAAAniB,EAAA,EAAnBxH,CAAmBiI,GAClBP,EAAAO,EAAAywB,kBAAO,OAAA,OAad97B,EAAI,aAEAU,EAAAL,yBACWA,EAAO,aAAgB,CAAAW,OAAM,wBAE3B,6BACP,6BAQFX,yBAIGA,EAAA,aAAA,CAAAW,OAAiC,qEAKZ6L,QAAc,SAAM,SAAa2Q,SACjD,iBAAA,iBACAvd,EAAA,EAAAA,EAAA,YACN,oFAYVs9B,EAAIx9B,EAAAE,EAAA,MACFF,EAAAE,EAAA,MACAF,EAAAE,EAAA,MACSF,EAAAE,EAAA,aG/CLu9B,EAAsBC,EAAkBC,GAE9C,IAAA92B,EAAO82B,EAAA5uB,KAAAlI,cACL62B,EAAU3uB,OAAAjD,EAAcspB,6BACxBuI,EAAW5uB,OAAelI,EAAWqH,MAAAC,6EAXzCuvB,EAAA3uB,OAAAjD,EAAAgqB,0BAegB6H,EAAiB5uB,OAAiBlI,EAAiBqH,MAAAuX,SAAuBkY,EAAAlyB,MAAAia,QAAAgY,EAAAhY,kBAKhFkY,EAAAC,EAAAxzB,6EHmCNvD,GApDJ,MAAA,CAyDA+D,IAJI/D,EAAAyC,MAAAoE,UAAkBqG,KAKd8pB,yCGvDAzxB,4BH2DGvF,EAAcwF,EAAsBC,OAE3CwxB,IADSjyB,EAAqBwpB,mBAAAxuB,EAAAyC,YAG9B,IAAA,IAAOjH,EAAA,EAAAA,EAAAgK,EAAA0pB,MAAAvzB,QAAAH,EAAA07B,EAAAv7B,OAAAH,IAAA,yBAIF,IAAAm7B,EAAiClI,EAAoB0I,EAAqB7nB,MAE5E,mBAGE,IAAM8nB,EAAkCD,EAASD,EAAA17B,EAAA,GAAAiK,oHGtF1D,OAIAwxB,GAIApQ,EAAgBwQ,iBAAsCr3B,EAAAi3B,EAAAlzB,KAC9CuzB,EAAKC,YAAAv3B,EAAiBi3B,EAAAlzB,MAEtB0B,IAAiCohB,EAAKwQ,iBAAgBr3B,EAAAyF,EAAA1B,mDAsBM,iFAVpE,SAAA/D,oKCxBA,IAAAw3B,EAAAC,iBAAA1gB,GAEA2gB,EAAA,SAAA5O,GAEA,OAAAA,EAAA6O,WAAA7O,GAAA,GAKE8O,EAAAF,EAAAF,EAAAK,aAAAH,EAAAF,EAAAM,cAAAC,EAAAL,EAAAF,EAAAQ,YAAAN,EAAAF,EAAAS,4DAMMC,EAAOR,EAAWF,EAAIW,gBAAQT,EAAAF,EAAAY,mBACpC,MAAM,CAGFC,MAAAthB,EAAAuhB,YAAWV,EAAAW,EACbC,OAAMzhB,EAAA0hB,aAAoBV,EAAAG,IAiB9B1+B,EAAAk/B,0BAfuGC,EAAA5hB,EAAA6hB,qCACnGC,EAAMjrB,SAAY,SAAakrB,GACzBA,EAAAC,aAAYnrB,SAAc,SAAY0B,GACtCA,IAAayH,GACf6hB,qBAKAD,EAAS,+CASb,aACA9+B,EAAML,SACA8B,MAAWA,KAAAjB,iBAAU,SAAeJ,UAC1CA,GAAIA,EAAUC,WAAAD,EAAA,CAAAL,QAAAK,0BAEPT,EAAA,aAAA,CAAAW,OAAA,UACOjB,EAAME,EAAG,yEAT3B,IAAA4/B,gKCpCAj5B,EAAAqH,MAAA4mB,aAEAjuB,EAAAqH,MAAA2mB,cAGAkL,EAAAl5B,EAAAqH,MAAA2X,IAAAxiB,EAAA28B,iCAAA1b,EAAAzd,EAAAqH,MAAA2X,UAAArN,EACAynB,EAAAxD,GAAAsD,EAAAzb,EAAA4b,OAAA,GAAA5b,EAAA4b,SAMYC,EAAAr5B,EAAAs5B,QAAAH,GAAZ,GAAYR,GAAAU,EAAc,CACxB,IAAAE,EAAAC,EAAA5/B,QAAA6/B,eAAAC,EAAAC,EAAA3N,GACAgN,EACAO,EAAAP,OAAAK,EAAAM,EAAA3N,EAAA4N,GAEAL,EAAAM,SAAAR,EAAAM,EAAAC,6BAcQ55B,EAAA+D,EAAA41B,EAAA3N,EAAA4N,GACN,IAAAtqB,EAAKtP,EAAAs5B,QAAev1B,MAClBuL,aAAOwqB,YAAoB,CAC7B,IAAKC,EAAe3T,EAAAC,gBAAArmB,EAAAyC,MAAAoE,WAClB8xB,EAAO34B,EAAas5B,QAAMS,EAAUh2B,KACjCw1B,EAAAC,EAAe5/B,QAAA6/B,eAAAd,EAAAgB,EAAA3N,GAClB2N,EACGJ,EAAApsB,GAAemC,EAAAqqB,EAAAC,GAEfL,EAAApsB,GAAemC,EAAA,EAAAsqB,MAOxB1gC,EAAAC,EAAA,aAA2DU,EAAAL,SAAA8B,MAAAA,KAAAjB,iBAAA,SAAAJ,+DACpBT,EAAK,aAAM,CAAAW,OAAA,YAAejB,EAAAE,EAAA,mBADjEgtB,EAAAltB,EAAAE,EAAA,IAIA0R,EAAgB5R,EAAeE,EAAA,IAAgC4gC,EAAA9gC,EAAAE,EAAA,IA0B/D,SAAgB6gC,EAAAj6B,EAAc3G,EAAkB8O,GAE9C,YAF2D,IAAAA,IAAAA,GAAA,GAErDH,EAAUhI,GAAK,SAAMsP,GAG3B,OAAWjW,IAAIiW,EAAK3K,MAAAU,gBAGpB8C,YAGK+xB,EAASl6B,EAAAm6B,EAAAhyB,eAGD,IAAPA,IACFA,GAAA,KAIKnI,GAAA,SAAAsP,UACLA,EAAM3K,MAAAtL,KAAc8gC,kBAMXn6B,EAAA2e,EACLxW,eAED,gBAGDnI,GAAS,SAAGsP,YACPrH,OAAAjI,EAAAyC,MAAA1C,OAAAqH,MAAAuX,SAAA,IAAArP,EAAAuP,YAAAoS,cAAAtS,OAAAjN,EAAA,CAAAwf,YAAA,yBAKTkJ,EAAOp6B,EAAAq6B,EAAAlyB,QAAK,WAAE,SACT6xB,EAAAM,aAAAt6B,EAAAyC,MAAAK,IAAAu3B,UACE,IAAPE,WAxCJ,4BA6CiB,IAATpyB,IACFA,GAAO,OAGTqyB,EAAOx6B,EAAAyC,MAAcoE,UAAMqG,YACtButB,IAAA12B,EAAA,OACLS,EAAAxE,EAAOyC,MAAA+B,iMChIX,IAAAu1B,EAAA3T,EAAAC,gBAAArmB,EAAAyC,MAAAoE,WAEA8xB,EAAA34B,EAAAs5B,QAAAS,EAAAh2B,KACAw1B,EAAAC,EAAA5/B,QAAA6/B,eAAAd,EAAA,IAAA,IACA+B,EAAAprB,EAoBgBA,EAAQqrB,eAAUrrB,EAAAqrB,cAAAA,eAAArrB,EAAAqrB,cAAAA,cAAAA,gBAAAhC,IAEpB+B,EAAQprB,EAAKqrB,iBAF3BpB,EAAApsB,GAAAutB,GAeMnB,EAAWpsB,GAAAutB,EAAA,KAIX,KACM,CACF32B,IAAAA,EACFy2B,QAAAA,sBASI3c,EAAO1V,0EAQbyyB,EAAiB56B,aAAKmI,qBDX1B0yB,EAAgB,IAAM,QAAa,GAAM,OAAa,KAAA,2BADxDA,EAAA,KAAA,QAIAA,EAAgBrhC,EAAkBqhC,iBAAmCrhC,EAAcqhC,eAAA,KAanFrhC,EAAAshC,oBAbqE96B,EAAAiI,EAAA1E,EAAA4E,eAAA,IAAAA,UAI/DF,QAKF4yB,EAAAE,iCATJ,KAAAF,EAAAG,GAaA,OAAgBf,EAAej6B,EAAkBuD,EAAc4E,GAAA,KAAA0yB,EAAAI,KAAA,OAAAf,EAAAl6B,EAAAuD,EAAA4E,kBACvD,OAAA+yB,EAAUl7B,EAAauD,EAAW4E,GACxC,KAAI0yB,EAAgBM,KAClB,OAAOf,EAAcp6B,EAAMuD,EAAS4E,WAEpC,OAAO,SAcN8xB,aAAQA,mBAeIC,sBAWVgB,IAQmDd,eAAAA,kBCnE5CQ,6GA2BZQ,EAAOliC,EAAAE,EAAA,MAKHiiC,oBAFN,OA/CA,QAAAze,KAAAyd,EAAApyB,MAAAoyB,EAAAhhC,GAAAghC,EAAApyB,KAAAtM,OAAA,EAAA0+B,EAAApyB,KAAA,IAAAoyB,EAAAhhC,GAAAghC,EAAAhhC,IA+CSghC,EAAAiB,gCAGEx4B,EAAAu3B,UACC,qCAuCV,OAAI,IAAAkB,EACF,CACAtzB,KAAUoyB,EAAApnB,UAAA,EAAAsoB,GACVliC,GAAAghC,EAASpnB,UAACsoB,EAAmC,SAzCvCC,CAAenB,aAEhBpyB,EAAAwzB,EAAAxzB,KAAAyzB,EAAAD,EAAApiC,GACLsiC,EAAOC,EAAA3zB,wBAUL,IACA4zB,EAD+D/4B,EAAAmF,KAAAlI,OAC/D6G,MAAA+0B,EAAAlJ,UACAl2B,EAAAm2B,mBAAA5vB,EAAA+4B,GAAA,GACAjuB,SAAA,SAAA6jB,GACA,IAAA,IAAA8I,EACA,OAAA,EAECoB,EAAAG,QAAArK,EAAAniB,KAAAosB,EAAAG,KACStB,EAAA9I,EAAA1tB,6BAGTjB,EAAA2qB,aAAA,SAAAne,EAAAvL,GACQ,OAAA,IAAAw2B,uDACFA,EAAwBx2B,GACjB,uCAuBlBg4B,GAAAC,IACAC,GAAAD,IACAE,GAAAF,IACAG,GAAAH,IACAI,GAAAJ,IACAK,IAAK,CACLC,UAAK,CAAA,mCAGE,OAAAC,EAAuCjtB,EAAgB,IAAejW,EAAA,uCAG7EmjC,IAAI,CACFF,UACE,CAIG,YACL,yCAIK,GAAc,cAAdhtB,EAAArH,KAAcwJ,KACd,OAAA8qB,EAAAjtB,EAAA,IAAAjW,EAAA,4BACM,GAAC,oBAAAiW,EAAArH,KAAAwJ,KAAA,CACZ,IAISzD,EAJCsB,EAAuB2c,MAAU,GAIvBpN,YAAa7Q,MAAA,4HAQjC,WAEM,CAAA,sBACF,wBACKsB,EAAAjW,EAAAo5B,OAELA,GAAcnjB,EAAK3K,MAAAxG,SAAkBi9B,EAAAqB,WACrC,OAAO,+MCzLfC,IAAgBC,EAAA,cACdC,IAAID,EAAS,kBACXA,EAAO,sBAGTJ,EAGajtB,EAAAutB,EAAApiC,EAAAqiC,iDARfxtB,EAAAuP,YAAA7Q,MAAA,4CAwBA,QAAA6gB,KACe,IAATA,EAASgO,OAAA5L,cAAA4L,OAAAnrB,EAAA,CAAAwf,YAAA,YAAArC,EAAAp0B,QAAAA,GAAAqiC,IAAAxtB,EAAAuP,YAAA7Q,MAAA8uB,IADf,SAAAd,IAYA,MAAgB,CACRM,UAAkB,CAAA,WAClBR,QAAM,SAAKxsB,EAAAjW,GACb,OAAAiW,EAAA3K,MAAAtL,KAAAA,GAAAoE,EAAAF,qBAAA+R,EAAAuP,aAAA,KAAAxlB,aAIFsjC,EAAQE,SACN,CACAP,UAAK,CAAA,aACLR,QAAK,SAAAxsB,EAAAjW,GACL,GAAKkjC,EAAAjtB,EAAAutB,EAAAxjC,GACA,OAAA,EAEA,IAAA2U,EAAAsB,EAAAuP,YAAA7Q,MAAA,4DACA,QAAAA,GAAA,IAAAA,EAAA,GAAAijB,cAAA4L,OAAAnrB,EAAA,CAAAwf,YAAA,YAAAljB,EAAA,KAAA3U,UAOL,aACAQ,EAAKL,YAmBLujC,EAAKv/B,WAGLw/B,EAFAC,EAAK,GACLC,EAAK1/B,EAAA7B,OAEAH,EAAA,EAAAA,EAAA0hC,EAAA1hC,IAAA,GACH,OACAma,EAAAnY,EAAAyS,WAAAzU,GAEF,OAAKma,GACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,KACAqnB,EAAA,IAEF,WACE,UACA,KAEF,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,IACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,WACE,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEFA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,UACA,KAEF,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,MACA,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,UACH,UACA,KAEFA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,UACH,UACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,UACH,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,WACE,UACA,KAEF,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,IACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACH,WACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,KACLA,EAAK,IACH,WACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,UACH,UACA,KAEF,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,UACH,UACA,KAEFA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,UACA,KAEF,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,UACH,KACAA,EAAA,IAEF,WACE,SACA,KAEF,KAAK,UACH,UACA,KAEF,KAAK,UACH,KACAA,EAAA,UAEJ,KAAI,UACF,OACK,IACL,wBAKJ,KAAO,aAhjBT,KAAA,0UAwBgBxjC,EAAA,aAAA,CAAAW,OAAA,MASVoD,8BAREC,EAAA2/B,UAEFA,IACA3/B,EAAKu/B,EAAAv/B,MAEHwI,QAAQ,sCAAA,IAAAA,QAAA,MAAA,KAAAwb,cAAAxb,QAAA,cAAA,OAWVo3B,2BAPK5/B,EAAA2/B,UACLA,IACA3/B,EAAKu/B,EAAAv/B,MAEHwI,QAAQ,wCAAA,IAAAA,QAAA,MAAA,KAAAwb,onCCpEhB,GAAA,IAAA5mB,EAAA,MAAAL,GAAAK,EAAA,GAAAL,EAAA,IAAAK,EAAA,GAAAL,EAAA,IAAA,CAE0BC,EAAAC,MAAAG,EAAA,GACC,MAEd,GAAe,IAAAA,EAAA,IAAAJ,EAAAC,MAAAF,EAAA,GAAA,CAEZC,EAAgBC,MAAcF,EAAA,GACrCA,EAAAK,EAAC,MAA2B,GAAAL,GAAAC,EAAAC,MAAAF,EAAA,GAAA,CAAuBC,EAAAC,MAAAF,EAAA,iBAD5D,MAKUA,EAAA,IACSC,EAAAE,IAAMG,MAGfL,EAAAM,KAAWD,MAEZ,uBAIL,MAAeK,sEAIT,QAAA,6EAQahC,EAAAE,EAAA,OAAAF,EAAAE,EAAA,sHACf+E,sECnCIk/B,4ED6CEjO,qBAAArvB,EAAAqH,MAAoBk2B,WAAU76B,EAAOoE,iFC7CnD,oBDmDUvL,UAAA,OAAS,GAAA,uEAIb,SACE2I,gBAGJ+K,QAAA,sCAOmC,CACjB,sCAKF,KAAI,GACHtL,EAAA5C,EAAAmB,UAEnBuC,EAAA/B,EAAA+B,kEEhFUA,EAAA+4B,aAAA7T,EAAAxc,KAAAwc,EAAAvc,GAAApN,EAAAqH,MAAAipB,WAAY,SAAA3sB,EAAA85B,SACtBh5B,EAAAsxB,cAAApM,EAAAxc,KAAAuwB,EAAAnuB,KAAArH,KAAA,CAAA9J,OAAAuF,EAAAg6B,IAAAv/B,SACA5B,EAAA2pB,iBAAA1hB,EAAAqC,UAAAqG,KAAA,GAAA,EAAA3Q,CAAAiI,KDcF,SAAAA,EAAArG,GAIA,IAAA4B,EAAgByE,EAAA1B,IAAAmF,KAAAlI,OACV49B,EAAMn5B,EAAAqC,iCALZ,SAAgB9G,EAAqB5B,GACnC,OAAO4B,EAAAqH,MAAAk2B,UAAY79B,OAAS,CAAAtB,OAAAA,IAKPy/B,CAAM79B,EAAA5B,IAAA,KACd+nB,iBAAA1hB,EAAA8mB,QAAAziB,IAAA80B,EAAAzwB,OAAA,GAAA1I,oCAzBf,KAAA,EAKwC,OAH3BxE,GAGcA,EAAA0H,QAAa,CAAA,UAE5Bm2B,IAAA,wBAuBDrkC,yBACEA,EAAA,aAAA,CAAAW,OAAA,aAEJiK,KACEA,EAAA,KAAA,GAAA,kDAZX5K,EAAA4K,eAAA5K,EAAA4K,aAAA,UAkBI,aACAvK,EAAOL,yBACFA,EAAA,aAAA,CAAAW,OAAA,UAELjB,EAAOE,EAAA,eEda0kC,aAAC,mBFQzBjgC,EAAAkgC,WAUA,KACE,KACA,KACElgC,EAAKC,uBAGAkgC,KACHA,EAAkB,MAAO,GAAA,UACzBA,EAAA,OAAA,GAAA,UACGxkC,EAAAwkC,YAAAxkC,EAAAwkC,UAAA,OAIHC,8BAHkBC,UAClB1kC,EAAA2kC,YAAA/tB,SAAA8tB,MAkBFE,+BAfEC,GACF,GAAAA,EAAK,CACL,IAAArwB,EAAAqwB,EAAArwB,MAAA,qBACE,OAAAA,EACA,uBAEQkwB,KAAMlwB,EAAA,IAGJ,KAGV,OAAO,MAHbxU,EAAA8kC,8BAOuBjG,EAAQG,EAAA+F,EAAAC,GAC3B,OAAAD,EAAKE,cAAAF,EAAAG,cACIxtB,KAAUulB,IAAA4B,EAAAG,EAAqB+F,EAAAE,aAAmBF,EAAAG,gBACtDrG,EAAAG,EAAA,IAEIgG,GEhFAhlC,EAAAuE,aFoFb,SAA0B5D,EAAe+jC,EAAYJ,GACnD,IAAAa,EACE,OAAKT,OACH,KACFS,KAAKxkC,EACH,MACF,IAAA,KACEwkC,EAAOxkC,MAAkB,qBAP/BwkC,EAAAxkC,MAAA,MAaA,MACE,KAAA0D,EAAOC,0BADT,oCEpGA,OAAAoT,KAAA0tB,MAAAD,MAoBM1gC,aAhBN,SAAgB0gC,EAAkBT,EAAeJ,GAC/C,OAAMI,GACN,IAAM,KACN,OAAOS,SACL,YACEA,KAAY,cAEd,OAAOA,KAAA,2CAPX,KAAA9gC,EAAAkgC,WAWA,QACM,OAACY,MAaHzgC,mBAPe/D,EAAA+jC,UACTA,oCACN,yBAGF,QACE,OAAAhtB,KAAA0tB,MAAezkC,GAAA2mB,yCAMjB3nB,EAAI,aACAU,EAAAL,UACJyC,eAAYzC,EAAS,aAAA,CAAAW,OAAA,QAErB8a,EAAW/b,EAAAE,EAAA,cAGG4b,EAAA6pB,EAAAz8B,0DAGZ4S,EAAQhP,QAAAmO,GAAA,SAAyB2qB,EAAAC,EAAAC,UAC/B58B,KACE28B,EAAAC,WAPJlhC,aAAQ,iBACD,OAcTmhC,kBAASA,ECpDXzlC,EAAY0lC,2BDqDDC,GACT,IAAAA,EAEA,OAAOA,EA3CT,IAAAC,EAAAD,EA8CAE,EAAgB,SAA6BhyB,GACvC,IAAAiyB,EAASF,EAAA/vB,MAAA,SAAAwF,GACP,OAAAA,EAAS,KAAAxH,cACYiyB,EAAG,GAAA,8CAG1B,OAAOzqB,EAAA,KAAAxH,KAEPlT,kBAOFk+B,EAAGgH,EAAUpqB,EAAOc,cACpByiB,EAAO6G,EAAUpqB,EAAce,iBAC1BqpB,EAAApqB,EAAgBgB,yBAGrBjB,EAAOiqB,EAAYjqB,EAAQC,EAAIc,cAAA,SAAAwpB,EAAAplC,GAC1Bk+B,YARTrjB,GAYEA,EAAoBiqB,EAAAjqB,EAAAC,EAAAe,eAAA,SAAUupB,EAAAplC,GAAnBq+B,IACTA,EAAAr+B,OAbJ6L,QAAA,YAAA,IAAA6pB,0FCxEA,SAAY9Y,EAAAjC,EAAgBE,GAC1BF,GACAA,GACAA,EAAAlH,SAAA,SAAA2G,GAHU,OAAAwC,EAAAxN,UAAArJ,IAAAqU,MAcJS,GACFvb,OAAAoU,KAAAmH,GAAApH,SAAqB,SAAA6D,GAClBsF,EAAA/B,MAASwqB,YAAC/tB,EAAAuD,EAAAvD,QALnBjY,EAAAimC,iCAUQ1oB,EAAA5V,EAAA6T,GACF+B,EAAAxN,UAAKm2B,SAAAv+B,iBACIw+B,OAAAx+B,GACP,IAAA4V,EAAAxN,UAAA5N,QACFob,EAAK6oB,gBAAA,gBAEH/xB,KAAAmH,GAAApH,SAAA,SAAA6D,GACFsF,EAAA/B,MAAAwqB,YAAA/tB,EAAAuD,EAAAvD,gBAIA8K,EAAI,EAAAsjB,EADC9oB,EAAA+oB,SACDvjB,EAAAsjB,EAAAlkC,OAAA4gB,IAAA,GACGsjB,EAAEtjB,kFCjCf,IAEAwjB,EAFAC,EAAA9mC,EAAAE,EAAA,MAIA,SAAgB2mC,GAMdA,EAAWA,EAAA,OAAU,GAAA,WACPA,EAAoB,MAAA,GAAA,UACvBA,EAAA,QAAA,GAAA,SARb,kDAmDIE,mBAxCM/yB,EAAQC,EAAA+yB,OACdC,EAAM,IAAKH,EAAMI,mBACjBC,aAAcH,QACZC,EAAMG,UAAYpzB,EAAAC,iCACFozB,KACZ13B,KAAA,SAAU4U,2BAGduiB,EAAgBQ,cACXT,EAAcU,kBAEnBT,EAAoBU,qBAEhB,MACN,KAAGV,EAAoBW,YACpB14B,EAAA83B,EAAiB9X,OACpB,6DAIJ,MAAgB,CAQRhgB,KAAAA,EAKD9N,MAAAsjB,EAAY,qDAgBFjkB,EAAM,aAAA,CAAAW,OAAA,UAIEjB,EAAME,EAAG,OAG5BF,EAAME,EAAA,eACAwnC,EAAUnO,EAAYpb,EAASwpB,cAGlC3kC,EAAgB4kC,UAAAF,GAAA,SAAAn+B,EAAAuL,EAAAsY,EAAA9K,OAGnBnE,EAAQ5U,EAAA6jB,EAAQ9K,GAChB,OAAM,SAMN7W,EAAMk8B,aAAgBE,SAAAF,EAAA7yB,GAAA6yB,EACtBr8B,EAAG/B,EAAQ+B,MAGXwJ,EAAG,GAAA,CAGH,IAAAgzB,EAAO1a,EAAAtY,EAAA,GAAAgU,QAAAhU,EAAA,uCAOGgzB,EAAA1a,GACR9hB,EAAAy8B,OAAkB3a,EAAA0a,GAGlBxlB,EAAA8K,EAAStY,EAAA,GAAarS,WAExB+uB,EAAA+H,EAAYhzB,OAAAkF,oBACV2hB,EAAK9K,EAAMkP,sBAAgBA,wBAESwW,IA+B1CC,qHA7BEC,KAGM,QAAOA,EAAA,QAAAC,EAAA,KAAAC,EAAA,OAAAD,EAAA,+GAdjBL,EAAA1a,EAAAtY,EAAA,GAAAgU,QAAAhU,EAAA,IAsBgBuzB,EAAAP,EACdhzB,EAAA,GACArS,OAKM6I,EAAAy8B,OAAAM,EAAoB/lB,GAEpBA,GADC8K,GAAIkb,GACMxzB,EAAQ,GAAArS,OACrB6I,EAAAy8B,OAAO3a,EAAA0a,2BAETx8B,EAAOimB,QAAAnE,EAAa9K,EAAAkP,kCAtBlBkW,EAAuB,MAAAS,EAAA,KAAAC,EAAA,OAAAD,EAAA,cAAZ,IAAQ/lB,OAAAslB,GAAAnO,EAAApb,mCA6BZtX,EAAc6G,kBCrGA7G,EAAS6G,SACrB,qBAEH,SAAO8jB,KACT+W,gBACM9mC,KAAAoF,EAAe6G,MAAA8jB,EAAUjZ,YDiGrBiwB,CAAkB3hC,EAAK6G,4DAGlC,IAAA+6B,EAAA,4HC/IT,OAAAC,EAAAxxB,SAAAqiB,MAKA,QAAgB/gB,IAAAxE,EACd,IAAA,IAAAqP,EAAA,EAAAslB,EAAgBD,EAAArlB,EAAAslB,EAAAlmC,OAAA4gB,IAAA,YADlB,GAAAoV,EAAAU,aAAA1zB,EAAA8zB,GAIS,OAAA,EAQL,OAAM,MAmBNqP,qDAZAC,EAAW7lC,EAAe8lC,kBAAApB,EAAA7jB,EAAA8jB,EAAuCoB,cAC/D/lC,EAAA4kC,UAAAF,GAAA,SAAAn+B,EAAAuL,EAAAsY,EAAA9K,eAMAumB,EAAA3/B,QAAAK,EAAAuL,EAAAsY,EAAA9K,GAFI,gGChCV1Q,EAAA5R,EAAAE,EAAA,IAEAmD,EAAArD,EAAAE,EAAA,cAYI8oC,EAAK19B,OACLzE,EAAOyE,EAAA1B,IAAAmF,KAAAlI,OACLxD,EAAcmiB,mBAAkBla,EAAA1B,IAAA/C,EAAAqH,MAAAipB,qBACvBziB,SAAA,SAAeyiB,mCAGxB7S,EAAAlO,KAAMkO,EAAiBE,OACrBzV,OAAMlI,EAAeqH,MAAC6mB,WAAAzQ,EAAAlO,KAAAkO,EAAAE,MAAA,GAAA/Y,MAAAoxB,eAOf1G,OAAK9yB,EAAA28B,iCAA2C1b,EAAAzd,EAAAqH,MAAAioB,eAKrDgB,EAAO/gB,KAAAuP,2CAIJjC,KAAAiC,8FAzBb,GAAA,IAAAra,EAAA1B,IAAAZ,QAAAmuB,EAAAtsB,IAAAo+B,EAAAzY,MAAA,GAAA,GAAA9iB,QAAAjL,OAAA,CAiCgB,IAASymC,EAAkBriC,EAAAvC,KAAA,MAC3B6kC,EAAShS,EAAAtsB,IAAAo+B,EAAAzY,MAAA,GAAA,0BAjCvB4Y,cAVF,SAAA99B,GAOMsG,EAAasiB,YAAA5oB,EAAA09B,OAiDjB/oC,EAAM,aAGAU,EAAAL,UACNyC,eAAkBzC,EAAA,aAAa,CAAAW,OAAY,QAG3CkC,EAAkBnD,EAAAE,EAAA,KAClB0R,EAAI5R,EAAaE,EAAA,IACjBkO,EAAmBpO,EAAAE,EAAA,MAAR,IAAAiD,EAAIoC,UAAA,gCCzCf8jC,EAAmB9/B,aAGb,EAAA+/B,EADFl7B,EAAAmb,kBAAAhgB,EAAAK,KACQyZ,EAAAimB,EAAA7mC,OAAA4gB,IAAA,OACNimB,EAAQjmB,KACRjV,EAAAod,0BAAYjd,EAAA6H,+BD8DhBmzB,0CAxBA,IAAIpmC,EAAYoQ,OAAA,KACdI,QACA,CACA61B,KAAG,SAAAC,EAAsBlgC,GACzB,OAAA8/B,EAAa9/B,sCAMZ,OAAY+B,EAAAkG,WAEEI,EAAayiB,4BAAyBzC,wDAKlDyX,EAAArX,GAtCT3oB,EAkCiBggC,EAAArX,GAFI3oB,SAiBnB4C,kBAHI1C,yBCrENjJ,EAAMgJ,4ZA1BN,OASA,IAAAogC,EAAA,CACA,IAAAve,EAAAtkB,EAAAvC,KAAA,MAAAqlC,EAAA,OAQAC,EAAA/iC,EAAAqH,MAAAC,cAAA5H,OAAA,GAAA4kB,GACA7f,EAAAigB,OAAA,EAAAqe,GAGM,OAAAt+B,sDAqBiB,+DAEJ9I,UAAAC,OAAAH,EAAA2hB,EAAA3hB,4EAITjB,EAAA6iB,GAAM7hB,EAAA6hB,sGAadtS,EAAU5R,EAAAE,EAAA,MACRF,EAAOE,EAAA,MACLF,EAAIE,EAAA,MACAF,EAAAE,EAAA,wBAIR01B,EAAA51B,EAASE,EAAA,UAGHiD,EAAKoC,UAAA,aAGL,mBACE,SAAMsB,iCAGNgjC,aACM/9B,EAAAqpB,8BACF7pB,SACK,IAAAw+B,IAiBe5c,EAAAxI,sBAAWpZ,EAAA1B,KAhBxB,SAAAwM,gGASc2zB,EAAwB/iC,IAAAoP,EAAA3K,MAAAU,gBACS,QAOxCuI,SAAA,SAAAs1B,GAClB1+B,EAAOsxB,cAAYoN,EAAYn/B,IAAAm/B,EAAU5zB,KAAArH,KAAAvG,EAAAA,EAAA,GAAAwhC,EAAA5zB,KAAA3K,OAAA,CAAAU,cAAAsrB,EAAAC,YACpCpsB,EAAA2+B,QA/BL,cA+BK,4HAQX,IAAOnmC,EAAAs3B,mBAAAt3B,EAAAC,gBAAAmmC,oBAAA,CAAA,cAAAC,EAAA,eAlBXz/B,QAAA,SAAA7D,GAsBA,MAAS,CAAA,IAAA1D,EAAgCoQ,OAAA,CAE3BY,IAAMR,EACZpK,MAAe,CAChBigC,KAAa,SAAQC,EAAAlgC,GACjB,OAAA6gC,EAAA7gC,IAIQkI,MAAI,SAAAnG,EAAArK,EAAA8wB,EAAAC,GAGf,OC1HR,SAAAJ,EAAAG,EAAAC,GACA,OAAAJ,EAAApF,MAAA,SAAAlhB,GACA,OAAAA,EAAAqG,QAAAC,EAAAsf,6BACA2Y,EAAAjY,IAAAhgB,EAAAy4B,uBAAAzY,EAAAG,EAAAC,EAAAlmB,EAAAqpB,eDuH4BmV,CAA2B,CAAAh/B,GAAAymB,EAAoBC,GAC1CoY,EAAUpY,GAIlB/wB,oBAQbwsB,mBACClkB,EAAAwB,EAAiBjE,MACxBiE,GAAOjE,EAAA,CACP,IAAAyjC,EAAUz+B,EAAAwpB,mBAAA/rB,GACA,aAAVkkB,mBAKA,IAAM+c,EAAQD,EAAAp0B,MAAA,SAAAua,GACV,MAAO,SAAPjD,EACGiD,EAAc7lB,IAAAtB,EAAAoE,UAAAif,iCAOnB4d,GACJC,EAAe/I,cAAA56B,EAAA0jC,EAAA3/B,KAAA,GAGf,OAAA,YAIIu/B,EAAkC7gC,GACxC,IAAAK,EAAAL,EAAgBK,IACV8qB,EAAMxH,EAAAxI,sBAAA9a,EAAAkC,EAAAqpB,mBAAMT,EAAAjyB,oBAGhBioC,EAAM,IAAAC,IAoCVC,EAAe,iKAjCQ,SAASla,EAAama,OACvCC,EAAWpa,EAAAta,KAAArH,KAAAwJ,qBAIOC,IAApBuyB,IAGIA,EAAY,wBAMlB,IAAOxV,EAAA,0CAGAxmB,KAAA2hB,EAAAta,KAAyBrH,KAAAwJ,KACzBmN,MAAAgL,EAAkBta,KAAA3K,MAAAia,OAAEmlB,EAAIxhC,MAAGqnB,EAAQta,KAAArH,KAAAwO,KAAA1R,KAAA6kB,EAAAta,KAAArH,KAAAwJ,KAAAmY,EAAAta,KAAAuP,oCAI1C,GACsB,cAApB+K,EAAata,KAAKrH,KAAAwJ,KAAE,CAAI,IAAAod,EAAGC,EAAQC,uBAAAnF,EAAAta,KAAAuP,aACnCgQ,qMA9HM,0CC9CRnpB,WAdF,SAAAjD,GAAyB,OAAAoK,EAAAq3B,SAAAzhC,cAgBhBqV,iCAKDxc,MAAOA,KAAAu4B,cACD,SAAKpW,EAAAqW,YACPr6B,OAAOs6B,gBAAK,CAAAC,UAAkB,cAAAp4B,OAAA,SAAA6hB,EAAAqW,8BAE9BA,qDAIOrW,EAAAqW,eAGTA,uCAGAA,6EAMFx4B,MAAaA,KAAAjB,iBAAmB,SAAAJ,eAC9BC,WAAWD,EAAS,CAAAL,QAAAK,2DAGxBf,EAAAE,EAAA,OA5CmBF,EAAAE,EAAA,OACfF,EAAAE,EAAA,MACAF,EAAoBE,EAAA,MAGpBF,EAAAE,EAAA,MAGAiB,EAAwCnB,EAAAE,EAAA,QAGxC,IAAAiD,EAAAoC,UAA8B,6BAoC/B,SAAA0lC,IAAP,IAAAplC,EAAAwQ,EAAAvU,KAAAM,KAAA,CACE+R,IAAOA,EACL5K,MAAI,CACFigC,KAAK,SAAQC,EAAQyB,GACrB,OAAK9nC,EAAU+nC,cAAA/R,+BAGV,OAAAvzB,EAAAulC,gCAIJhoC,EAAW+nC,cAAkB/R,QAIpCtyB,KAAA,WACS,MAAA,CACCukC,OAAA,SAAgCvkC,EAASwkC,GAC3CzlC,EAAY0lC,sBACP1lC,EAAA2lC,iBAAA1kC,EAAAyC,iHAeN1D,EAAA4lC,KAAA,GACL5lC,EAAAH,QAAY,iBAGPG,EAAA6lC,cAAA,KAAP7lC,EAAA8lC,eAAA,KAAkB9lC,EAAA+lC,oBAAA,EAAA/lC,EAoapB,gBAnaW2F,UAAC2K,KAAyB,SAAyCs1B,EAAA/lC,OACxEG,EAAMzD,YACN,SAAMmH,EAAawB,UAMbA,IACFlF,EAAA4lC,KAA4B/lC,EAAAuV,MAAmBwwB,EAALA,EAAK3+B,QAAA,wBAAA,QAC/CjH,EAAAH,QAAYA,EAEdG,EAAIgmC,cAAatiC,EAAMwB,8DAOhBxB,GAAA4M,OAAA1T,6DAKT,SAAI8G,EAAUwB,OACZ+gC,EAAW33B,EAAM62B,SAAAzhC,GAAA4M,KAAA,MACC,IAAlB21B,EAAKrpC,OACL,OAAK,mBAIPoD,EAAOkmC,aAAA9hC,EAAA6hC,EAAA,4CAKT,OAAO,MAMLtgC,UAAMkB,cAAoB,kBAC1BtK,KAAIwK,YAA4B,gBAG1BA,WAAa,SAAMo/B,SACrB5pC,iBACA,WACI,uBAICmH,EAAAK,IAAA+uB,YAAApvB,EAAAoE,UAAAqG,KAAAzK,EAAAoE,UAAAsG,MACE+3B,EAAAnmC,EAAAomC,YAAAC,GAAA3iC,EAAAoE,UAAAsG,GAAA,EAAA1K,EAAAoE,UAAAsG,GAAA1K,EAAAoE,UAAAqG,iCAKX,GAAc,IAAV83B,EAAUrpC,OAAA,CAEZ,IAAMoD,EAAAH,QAAaymC,KAQb,OAAK,EAPT,IAAIC,EAAAvmC,EAAeomC,YAAOC,GAAqB3iC,EAAAoE,UAAAqG,KAAA,EAAAzK,EAAAoE,UAAAqG,QAExC,OADEq4B,EAAAl2B,KAAA,EAAAi2B,IACF3pC,OACL,OAAO,OAOT,mCAGJoD,EAAOymC,mBAAA,mBAIX,OAAA,gBAGaz/B,eAAA,6BAGT,SAAItD,EAAUwB,OACZmhC,EAAW3iC,EAAMK,IAAA+uB,YAAApvB,EAAAoE,UAAAqG,KAAAzK,EAAAoE,UAAAsG,IACjBm4B,EAAMvmC,EAAAomC,YAAoBC,GAAgB3iC,EAAAoE,UAAeqG,KAAA,EAAUzK,EAAAoE,UAAAqG,KACnEq4B,EAAGl4B,EAAA62B,SAAqBzhC,GACxBuiC,EAAKO,EAAkBl2B,KAAA,EAAAi2B,MACZ,MAAT3pC,OAAS,oBASR,OAAC,iEALCqpC,EAAAO,EAAAl2B,KAAAo2B,uBAULxhC,EAAO,+BAGL,OAAAyhC,EAAUx4B,KAAAy4B,EAAAz4B,KACDw4B,EAILC,KAGJC,EAAMnjC,EAAK+B,KACXygC,aAAGW,EAAWC,KACdL,mBAAY,yEAWb,OAAA,SAAA/iC,EAAAwB,GAAP,IAAAlF,EAAA2lC,iBAAAjiC,GACS,OAAA,KAEHwB,EAAK,CACL,IAAA6hC,EAAKrjC,EAAU+B,GACfuhC,EAAmBD,EAAAj/B,UAAOC,MAAAk/B,YAAAF,EAAAj/B,UAAA6uB,mDAE5B32B,EAAOymC,mBAAA,mBAKT,OAAK,MAGH9gC,UAASuhC,WAAA,SAAAzoC,mCAIL,IAAA0oC,EAAA,EAAR,IAAAnnC,EAAAonC,UAEO,OAAKD,QAKJ,IAAAE,EAA4B3jC,EAAA+B,GAGhB6I,EAAA62B,SAAgBzhC,GAER4M,KAAA,GACTzB,SAAK,SAAAi4B,GACf,IAAA34B,EAAQk5B,EAAA9a,QAAAziB,IAAAg9B,EAAA34B,MACXC,EAAAi5B,EAAA9a,QAAAziB,IAAAg9B,EAAA14B,wBAGE+4B,GAAA,KAGFnnC,EAAMymC,mBAAW,WACfvhC,EAAAmiC,aAGFF,gBAGEG,MAAa,sCAEf5jC,EAAYwB,GAShB,qBAJOlF,EAAAH,QAAY,0BAId,4CAKCtD,KAAAkqC,mBAAA,WACA,IAAAhhC,EAAA/B,EAAY+B,GAClBA,EAAO2+B,QAAGr4B,EAAaw7B,0BAAW,cAKhC5hC,UAAM6hC,kBAAyB,SAAY/hC,OAC3CzF,EAAOzD,cACF6qC,UACL,OAAO7pC,EAAA+nC,cAAA/R,sBAUHR,EAAAkB,gBAAAxuB,EAAR1B,KAAA8K,SAAA,SAAAiP,GAEE,IAAK2pB,EAAAznC,EAAA0nC,YAGL,GAAKD,UAKDjtC,KACEitC,EAAO3kB,KAAAhF,EAAArf,mBAAA,qBAQH2P,EAAA0P,EAAQ9Y,IAACxK,EAAAwZ,MAAQxZ,EAAA,GAAAoC,OACvBmZ,EAAO,CAAA,gBACL5H,IAAK1I,EAAAqC,UAAAqG,MAAAC,IAAA3I,EAAAqC,UAAAsG,IAEH2H,EAAAna,KAAS,sBAELA,KAAA2B,EAAgBoqC,WAAAC,OAAAz5B,EAAAC,EAAA,CAAAy5B,MAAA9xB,EAAAM,KAAA,cAGpBzZ,OAAAW,EAAA+nC,cAAA5kC,OAAA+E,EAAA1B,IAAAkiC,GAAA1oC,EAAA+nC,cAAA/R,mBAIIkT,kBAAa,SAAkBrsC,kBACjC,qBAEF,8CAON0N,EAAI,IAAAxK,EAAewqC,cAAAriC,EAAA1B,IAAAZ,QAAA2jC,EAAA34B,MAAA1I,EAAA1B,IAAAZ,QAAA2jC,EAAA14B,cACjBlG,aAAKJ,GAAAouB,8EAKH,IAAAmQ,EAAc3iC,EAAAK,IAAA+uB,YAAgBpvB,EAAKoE,UAAMqG,KAAAzK,EAAAoE,UAAAsG,IAC3C,OAAA7R,KAAA6pC,YAAaC,GAIf,OAAK,eAGH0B,uBAAkB,SAAA9mC,mBAOpBykC,0CACO,IAAAsC,kBAAA,SAAAC,EAAAC,OACJrC,EAAA,kDAOC,OAAA,EAGJ,IAAKsC,EAAA53B,EACL,OAAK43B,EAAA39B,UAAiBm2B,SAAA,iBAAAwH,EAAA39B,UAAAm2B,SAAA,qBAIpBsH,EAAKp5B,SAAA,SAAAkrB,GACP,OAAOA,EAAa7wB,MACpB,IAAK,qDAUD28B,EAAAt1B,MAEF,MACI,IAAA,aAEF63B,EAAkBrO,EAAM4K,UAE1BkB,EAAgB9L,EAAU4K,gBAY5B3kC,EAAKqoC,uBAAgBpnC,EAAA4kC,GAGjB7lC,EAAA0lC,gCASQre,EAAAC,gBAAcrmB,EAAAyC,MAAAoE,gBAClB,KACN8xB,EAAI34B,EAAAs5B,QAAqBS,EAAAh2B,yBACvBsjC,QAAA1O,EAAA,YAEF2O,WAAA,8BAMFhsC,KAAAwpC,oBAAgByC,OAAeC,YAAK,uFAQhC,OAAAlsC,KAAAupC,iBACFvpC,KAAKupC,eAAW4C,aAClBnsC,KAAMupC,eAAa,MAEC,SAAlBC,6BACK4C,aAAApsC,KAAAwpC,0BACLA,oBAAO,MAGTpgC,UAAO0iC,uBAAA,SAAApnC,EAAA4kC,gDAIH,GAAA7K,EAAA,CACF,IAAApB,EAAA34B,EAAAs5B,QAAAS,EAAAh2B,QACgB,OAAlB6gC,IACAA,EAAMjM,EAAAgP,cAAA,oEAIZ,2CAEMrsC,KAAuBspC,cAAAA,MAC3B,IAAS5Y,EAAA,IACC4b,EAAIhD,sFAUK,IAAkBiD,EAAcD,EAAoBE,aAChE,GAAsB,OAAtBD,QAGOD,EAA2BC,8BAA3C7O,OAAA4O,EAAA,IAAA5b,oCAIA,OAAA1wB,KAAAqpC,KAAAhpC,OAAA,GAKEwoC,EAAOz/B,UAAWygC,YAAM,SAAqB3nC,sBAD/C,IAAA2W,EAAA7Y,KAAAmrC,YAIgB,QAAAtyB,GACIA,EAAMyI,KAAApf,aAQxB2mC,EAAOz/B,UAAW+hC,UAAc,eADlC,OAAA,IAAAnrB,OAAAhgB,KAAAqpC,KAAArpC,KAAAsD,QAAAmpC,cAAA,KAAA,OAIgB,MAAAjnC,GACP,OAAA,OAGOqjC,KACI13B,WADpB7I,QAAA,WAIA,MAAgB,CAAA,IAAAugC,gBCnfNnkC,kBACAyC,cDkfV,SAAAzC,EAAA2kC,EAAA/lC,GAIA,OAASopC,EAAWhoC,GAAgBqP,KAAAs1B,EAAA/lC,EAA3BopC,CAA2BhoC,EAAAyC,MAAAzC,EAAAiE,wBAIpC,SAAejE,oZCvgBfxG,EAAAysC,yBANA,OAAA+B,EAAAhoC,GAAAimC,WAAAzoC,EAAAwqC,CAAAhoC,EAAAyC,MAAAzC,EAAAiE,aAYIoiC,MAJJ,SAAArmC,GAEA,OAAgBgoC,EAAAhoC,GAAcqmC,OAAd2B,CAAchoC,EAAAyC,MAAAzC,EAAAiE,sCAIhBxB,qBACAA,+CAQNnH,MAAQA,KAAAu4B,cACN,SAASpW,EAAAqW,YACTr6B,OAAQs6B,gBAAA,CAAAC,UAAA,cAAAp4B,OAAA,SAAA6hB,EAAAqW,eACNA,eACAA,yEAUZ,SAAgBG,IAKP34B,KAAA44B,YAAAzW,EAhCTmW,EAAAnW,EAAAqW,eAiCyB,OAAJA,EAAIr6B,OAAkBgG,OAAAq0B,IAAAG,EAAAvvB,UAAAovB,EAAApvB,UAAA,IAAAuvB,2BACZz6B,EAAA,aAAA,CAAAW,OAAA,sCAP/Bw3B,EAAAz4B,EAAAE,EAAA,qBAWA,WAAgC,MAAA,CAC9BwN,MAAA,CAAA,CACE6K,KAAA,cAKQgF,KAAC,CACHwxB,WAAO,kBAILC,SAAA,CAAA,CAAA5oB,IAAa,+BACf6oB,MAAO,kBAIO,OACP,CAAAvB,MAAA,kBAKPrmC,OAAM,CACA6nC,QAAK,GACRC,OAAA,CACHttB,SAAS,yBAGJvB,EAAA8uB,aAAA5pC,YCqBPoN,2CAtGRnD,SAAA,WACA,MAAA,CAAA,IAAA4/B,EAAAC,KAKAC,mBAAA,WAEa,MAAA,CAAAC,EAA+BC,4BAAA58B,EAAAlK,WAiG1C0mC,EAAe,SAAOh5B,iBAKlB,OAACA,EAAAvU,KAAAM,KAAc0B,EAAWC,gBAAa2rC,WAAO,CAAA,UAAA,SAAAnmC,EAAAwB,EAAAjE,GAChD,IAAOrD,EAAAksC,2BAAApmC,EAAAoE,oBAKP,GAAO8qB,EAAAU,aAAA5vB,EAAAA,EAAA1C,OAAA6G,MAAA5E,sBAKP,IAAOgK,EAAAvJ,kBApBX,IAAAioB,EAAAjoB,EAAA1C,OAAA6G,MAAA5E,YAAAvC,SA6BgB6P,EAAA7M,EAAsB1C,OAA4BvC,KAAA,IAAA,CAAAktB,IAE3DlmB,EAAa/B,EAAA+B,GACTA,EAAAuC,qBAAAuI,GAAA,QAKP,OAAO,MACFhU,cAjCLitC,EAAOh5B,KADM,0BA0CfpW,EAAG,aAGCU,EAAAL,yBAEYA,EAAG,aAAgB,CAAAW,OAAA,UAG9BjB,EAAqBE,EAAA,OAGVF,EAAAE,EAAA,OAAQF,EAAAE,EAAA,6CACjB,KACL0vC,6BAAc,iCCpJlBtvC,EAAAqvC,oCDwJahiC,oCAnBb,QAAAA,EAAAyrB,sGChJAzrB,EAAAmgB,MAAAtoB,OAAAuJ,KAAAwO,KAAA1R,gCAYA,SAAA3C,EAAA2mC,GAEA,QAAAA,OAOIA,EAAIC,OAAAD,EAAAC,QAAA5mC,EAAA4mC,QAMFD,EAAO1vC,KACJ+I,EAAO/I,sEAOP,IAAOgD,EAAQwqC,cAAAriC,EAAA1B,IAAAZ,QAAA6B,GAAAS,EAAAqC,UAAAmgB,qBACP5qB,EAAiB6sC,KAAA,OAGxBzkC,EAAAqC,UAAAmgB,MAAQpgB,qCAMdA,EAAAgH,SAAA,SAAQ8c,GAEN,OAAMlmB,EAAAimB,QAAA1mB,EAAAS,EAAoBqC,UAAAsG,GAAAud,wBAGrBwe,8EAgBD5tC,MAAGA,KAAQjB,iBAAA,SAAAJ,eACXC,WAAcD,EAAA,CAAAL,QAAAK,0BAKXT,EAAI,aAAA,CAAAW,OAA+B,UACxCjB,EAAAE,EAAA,kBAEFiB,EAAenB,EAAAE,EAAA,mBAGXF,EAAAE,EAAA,MACJF,EAAWE,EAAA,MACNF,EAAAE,EAAA,kEAEL,mDACA+vC,EAAYp9B,EAAAlK,6DAnElB,OAAA,IAAAqS,EAAAvY,SAAA,IAAAytC,EAAA33B,KAAA+P,cAAAQ,QAAA9N,KAAA,QAAApT,EAAAsoC,EAAAC,gBAAA,IAAAvoC,OAAA,EAAAA,EAAA4kB,MAAA,SAAA4jB,GAwEM,OAAmB,IAAAA,EAAAtnB,QAAA9N,UAGhBmD,QAAC,SAAc+xB,GACd,OAAQA,EAAWtgC,QAAArG,MACrB8mC,KAAOC,EAAAC,QAAA59B,EAAA69B,wBAAAC,OAAA99B,EAAA+9B,0BAAA,CAAAC,UAAA,SAAAF,OAAA,kBAIP,SAAO3pC,EAAA+D,EAAA+lC,oBAIH,IAAAtlC,EAAQxE,EAAMyC,MAAG+B,GAGjBA,EAAAulC,YACJhmC,EAAM/D,EAAAyC,MAAWoE,UACbif,MAMNthB,EAAO2+B,QAAAr4B,EAAAw7B,0BAAA,GAELtmC,EAAKiE,SAAQO,OAMbslC,GAKA,uCAAAA,EAAWE,gBAAA,kBAERztC,EAAA2pB,iBAAA1hB,EAAAqC,UAAAqG,KAAA48B,EAAAE,gBAAAztC,CAAAiI,GACEA,EAAA2+B,QAAAr4B,EAAAw7B,0BAAA,6CAKP2D,IAMW,OAAWpnC,QAAAX,WAAgDlC,KAAI,CAEtEkqC,UAAAC,kBAUD,OAAArhC,EAAAzP,IAEAg/B,MAAO,8BCvIhB,IAAY+R,EAAA,aAAZ,SAAAjB,EAA2Bp9B,EAAAlK,GACzB,OAAA,SAAArE,EAAAmB,GACA,IAAAqP,EAAAxQ,EAAAwQ,MAAAo8B,GACA,GAAAp8B,EAAA,CACA,GAAA,IAAAA,EAAA+E,QAAAs3B,EAAA1rC,EAAAkI,WACA,OAAA,KAEA,IAAAyjC,EAAAt8B,EAAA,GAAAwT,cAPUwjB,EAAA,IAAAsF,EAAA3uC,OAAAW,EAAA+nC,cAAe5kC,OAAAd,EAAAmE,IAAA,CAAAynC,EAAAC,sBAAA7rC,EAAAkI,UAAAif,KAAAjkB,EAAAlD,QAAA8rC,cAAA,8BAAA/4B,EAUrB,MAAA,CAAgG3N,IAAApF,EAAAkI,UAAAif,KAAA9X,EAAA,GAAArS,OAACuY,MAAAo2B,EAAKI,YAAA,SAAAjoC,8BAE5FuiC,YAAAA,GAAhB,OAAA,MAIA,IAAAmF,EAAA,SAAAf,gjBCjCA,SAAAiB,EAAAxjC,GAMA,OAJAA,EAAAmgB,MAAAtoB,OAAAuJ,KAAAlI,OAIgB6G,MAAA5E,YAA2BmwB,QAAAtrB,EAAoBmgB,MAA8CpgB,eAKzG,eACEpN,+BACEA,EAAO,aAAA,CAAAW,OAAA,kBAID,SAAY,aAAuB,OAAK,WAA+C,MAAA,UACzF,KAAA,SACI,WAAA,eACC,QAAA,YACF,OAAA,YACLX,EAAOmxC,kBAAAnxC,EAAAmxC,gBAAc,8DAI3B53B,sFAUA62B,0BA9BJ,SAAA9tC,EAAAg4B,GA4BA,OAAgBh4B,EAAAif,UAAA,IAAsB+Y,EAAA/Y,UAAyB,SAK3D,mEALJ,IAAA1e,EAAAnD,EAAAE,EAAA,KASAkD,EAAgBpD,EAAAE,EAAA,KACdmD,EAAOrD,EAAAE,EAAA,smBACoB2jB,EAAS6tB,OAElCC,EAAM,IAAUxuC,EAAgBoC,UAAcse,EAAAtL,KAAA,6BAC9C,IAAApV,EAAsBoQ,OAAA,CACtBY,IAAAw9B,EAEApoC,MAAM,CACNigC,KAAQ,SAAUC,EAAIyB,GACd,OAAA9nC,EAAc+nC,cAAA/R,OAGtB3nB,MAAU,SAAAnG,EAAYsmC,EAAA7f,EAAAC,GACtB,IAAU6f,EAAYxuC,EAAA6hB,gBAAA,SAAA9O,GACf,OAAAA,EAAArH,OAAA8U,GAAA,IAAAzN,EAAAqc,aADepvB,oBAd1B,IAAAspC,EAAA2E,EAAAO,EAAAhnC,IAAA,EAAA6mC,EAAAG,EAAAz7B,OAmBgB,OAAAhT,EAAuD+nC,cAAa5kC,OAAA+E,EAAA1B,IAAA,CAAA+iC,87FC1DpF,GAAA,IAAAjrC,EAAA,MAAAL,GAAAK,EAAA,GAAAL,EAAA,IAAAK,EAAA,GAAAL,EAAA,IAAA,CAWAC,EAAAC,MAAAG,EAAA,GAEA,MAIA,GAAA,IAAAA,EAAA,IAAAJ,EAAAC,MAAAF,EAAA,GAAA,CASgBC,EAAAC,MACdF,EAAA,GAKOA,EAAAK,EACI,qDAPb,MAaAL,EAAA,IAA+BC,EAAAE,IAAAG,MA4B7BL,EAAAM,KAAAD,MAME,SAEED,EAAOG,EAAAC,KAAAC,EAAAT,SACLU,KAAY,GACZA,KAEE,uDAWEN,EAAA,QAAO,6EAWH1B,EAAAE,EAAU,SAGMA,EAAA,QAAjBA,EAAM,MAETF,EAAIE,EAAA,oBAEF,qCAEMovC,EAAS3mC,EAAA5C,sGAgBbsQ,gBAAkBi5B,EAAM3mC,EAAA5C,qBAAE,8CAMhC,SAAOuF,EAAAggC,sBAIL,MAAA,GACJ,IAAAhgC,EAAQkG,aAAClG,EAAgBoG,gBAAApG,EAAAiG,aAEvB,MAAK,OAML9N,EAAKksC,2BAAwBrkC,EAAAqC,wBAK7BmkC,ECzJV,SAAAnkC,EAAA4L,QAEA,IAAAA,IAEAA,EAAA,KAOA,IAAAuU,EAAAngB,EAAAmgB,MAEA,OAAAA,EAAAtoB,OAAAmzB,YAAA3gB,KAAAupB,IAAA,EAAAzT,EAAAsC,aAAA7W,GAAAuU,EAAAsC,kBAAA5X,EAAA,KD4Ieu5B,CAAAzmC,EAAAqC,cACW,IAAhBmkC,EAAOrvC,OAGP,MAAK,yEAIF,IAAAyG,EAAAoqB,EAAAjQ,GACL,GAAgC,OAAhCna,EAAawf,UAAmBxf,EAAAwf,QAAAxf,EAAAwf,QAAApd,GAAAgkC,EAAAhkC,IAAA,0BACxB,GAAAd,EAAc,CACpB,IAAOwnC,OAAA,qFAGQ,SAWX,OATI9oC,EAAU/I,MAAA,QAAAyH,EAAA0jC,EAAApiC,eAAA,IAAAtB,OAAA,EAAAA,EAAAzH,KAEFqK,EAAAK,OAAA,QAAA2O,EAAA8xB,EAAA9gC,cAAA,IAAAgP,OAAA,EAAAA,EAAA3O,OAGRmnC,EAAkB1G,EAAa9gC,OAAAwQ,OAI3B,CACD9R,QAAAA,EACHsB,OAAKA,EACLwnC,UAAUA,EACVC,QAAAA,uDAUAnrC,KACFmY,iBACEnY,sBACKA,GAAA,yBAGPorC,oCACOC,oBAAqB,UAAStsC,EAAAusC,sEAS9B7oC,WAEL4K,EAAA62B,SAAAzhC,UACG,QAAL3B,EAAKyqC,MAAAA,OAAA,EAAAA,EAAA7nC,cAAA,IAAA5C,OAAA,EAAAA,EAAAkkC,6BAEH,kBACAhlC,EAAUmC,SACVA,EACFqpC,GAAK,IACEzsC,EAAA0sC,WAAgB,aAAA,cAChB1sC,EAAA0sC,WAAkB,YAAA,eACvBC,2BACAC,EAAAt+B,yCAKFm+B,GAAS,EACX,MACA,IAAA,kBAIKzsC,EAAA6sC,iBAAA5rC,EAAAjB,EAAA8sC,iCAIb9sC,EAAA8sC,cAAA36B,KAAAupB,IAAA17B,EAAA8sC,cAAA,EAAA,GA5L8B9sC,EAAA+sC,kBAAA9rC,GAGYwrC,GAAA,EAQ5B,MACV,KAAwBO,EACHhtC,EAAA8sC,cAAA36B,KAAAC,IAAApS,EAAA8sC,cAAA,EAAA9sC,EAAA2rC,YAAA/uC,OAAA,GACRoD,EAAA+sC,kBAAA9rC,GACGwrC,GAAA,EAGE,MA6Kd,IAAA,SAGLzsC,EAAmB8sC,cAAK36B,KAAiBupB,IAAK17B,EAAA8sC,cAAA9sC,EAAAitC,qBAAA,GAC9CjtC,EAAoB+sC,kBAAiB9rC,GAC1BwrC,GAAiB,uBAG3BzsC,EAAA8sC,cAAR36B,KAAAC,IAA0BpS,EAAkB8sC,cAAuB9sC,EAAAitC,qBAAAjtC,EAAA2rC,YAAA/uC,OAAA,GAAnEoD,EAAA+sC,kBAAA9rC,GACoBwrC,GAAc,EAE5B,MAGI,IAAA,MAKAzsC,EAAA8sC,cAAwB9sC,EAAA2rC,YAAA/uC,OAAA,EAAAoD,EAAA+sC,kBAAA9rC,kEAERwrC,GAAA,aAAdrpC,EAAA8pC,iBAGN9pC,EAAK+pC,+KAwBD,IAAAC,EAAcC,yCAEXd,iBAAAzrC,KAAAd,uBACCE,EAAAoD,UAAA3B,EAAmBC,YAAA5B,EAAAusC,mDACzB,UAAkBvsC,EAAAusC,gEAId,SAActrC,EAAAqsC,qDAIV,EAAQ5pC,EAAAL,WAAAK,MAAAA,OAAA,EAAAA,EAAAiB,QAAA,4MAWb,KAAA,SAAwBgnC,EAAA5pC,EAAAmB,qDAEvBqqC,kBAAAC,KAAA,QAAAzrC,EAAA2B,EAAAL,eAAA,IAAAtB,OAAA,EAAAA,EAAAd,KAAAyrC,YAAAY,KAAAjqC,SAAAK,EAAAiB,QAAA3E,EAAAoZ,UAAAq0B,EAAA,0FACIztC,EAAA0tC,wBAAoCC,IACnCjqC,EACLL,QACApC,KAAAyrC,WAAaY,GAKXttC,EAAA+sC,kBAAA9rC,sBACF2sC,EAAKjC,mFAML,CAAA,IAAAhnC,EAAAkpC,EAAAC,SAAMnpC,qDAMZjB,EAAKyoC,WAAAzoC,EAAgBL,QAAQiV,gDAE1B,OAAApI,EAAAlQ,OAAA,OAAA,GAAA,WAEA,IAAA+tC,6CAID,KAAA,EAAR,OAAArqC,EAAAL,SAAAK,EAAAiB,QAAApI,KAAA6c,UAAAq0B,GAMiBM,EAA6BrqC,EAAAL,QAAUiV,OAAA/b,KAAAyxC,eAAA/sC,EAAAyC,MAAAA,EAAAiB,OAAAwQ,MAAAzR,EAAAyoC,2EAOzC5vC,KAACwwC,kBAAa9rC,GAChB,CACA,MAPa,CACD,EACT,GATkB,CAED,EACf,UAiBL,MAAA,CACF,EACWgtC,KAIlB,KAAA,EACKlsC,EAAAmB,OAEAnB,EAAArG,MAAA,kJAWC4S,EAAA62B,SAASlkC,EAAMyC,eAGjBL,UAAc9G,KAAAovC,YAAA/uC,OAAA,IAAA8G,EAAAL,QAAApC,KAAAitC,eAAA,OAAd,WAAA7qC,yFAEF9G,KAAAuwC,wBAAAvwC,KAAAuG,GAAAlD,QAAA8rC,cAAA,sBAAM,SAAM13B,oCAAZ,SAAAA,yDAGuB,YAAlBm6B,uCAEeC,EAAcC,wCAC9BryC,KAAAikB,YAAa1jB,KAAA4xC,oBAEfG,sBAAArtC,EAAAiN,EAAA3R,KAA6B4xC,sGAK5B5xC,UAAA,OAAA,GAAA,yDAEPwF,EAAKrG,iHASGgI,EAAQL,QAAI4D,QAAchG,EAAK0D,EAAAK,IAAAzI,KAAAovC,YAAA33B,MADnC,EAAA,KAJQ,gIAQNvO,EAAAxE,EAAAyC,MAAA+B,GAAM7H,EAAc2wC,6BAAgC9oC,EAAAd,EAAKK,IAAAmlC,qEACpD5tC,KAAIgwC,mBACT,CAAA,8IAQA,KAAA,EACD,OAAAhwC,KAAA0E,QAOEyC,OADLA,EAAA4K,EAAA62B,SAAA5oC,KAAA0E,KAAAyC,aACuB,EAAAA,EAAAiB,SAAAjB,EAAAL,2BAanB,CACD,EACAK,EAAeL,QAAA4D,QAAA1K,KAAA0E,KAAAyC,EAAAiB,OAAAK,IAAA,OAPd,CACD,EACA,GAhBA,GAGC,GAsBJ,KAAK,mBAID,KAEE,KAAA,EACCtB,EAAAL,QAAK8mC,aACPzmC,EAAAL,QAAA8mC,YAAA5tC,KAAA0E,KAAAyC,MAAA1C,OAAA,uBAjaoB,OAqa/BzE,KAAAgwC,mBAra+B,CAAA,WA0arBiC,EAAA7oC,UAAA4mC,iBAAA,WACRhwC,KAAOgxC,kBAAa,IAAA,GACb,6vBCvdTjwC,EAAAoQ,WAgCEtT,EAAA,aACAU,EAAYL,OACZkI,EAAOpG,MAAAA,KAAAoG,UAAA,WAaT,oCAjBA,IAAA,IAAAnG,EAAAC,EAAA,EAAA2hB,EAAAzhB,UAAAC,OAAAH,EAAA2hB,EAAA3hB,IASQ,IAAO,IAAA4hB,KAFC7hB,EAAAG,UAAAF,GAGR/B,OAAiBiL,UAAAqU,eAAA/d,KAA8BO,EAAA6hB,KACrD7iB,EAAY6iB,GAAA7hB,EAAO6hB,eAMLzS,MAAArP,KAAuBI,YAErC8xC,EAAMlyC,MAAAA,KAAAkyC,cAAA,SAAAvzC,sBAFR,OAAAA,EAKM,IAAAyJ,EAAA,GAEJ,GAAM,MAAAzJ,EACN,IACE,IAAA4B,KAAA5B,oCAMEyJ,EAAgD7H,GAAA5B,EAAA4B,IAEpD,OADA6H,EAAa,QAAAzJ,EACPyJ,GAINrJ,EAAUiB,MAAAA,KAAAjB,iBAAA,SAAAJ,UACRA,GAAMA,EAAAC,WAAcD,EAAa,CAAAL,QAAAK,0BAEzBT,EAAO,aAAY,CAAAW,OAAA,UACzBqzC,EAAMt0C,EAAcE,EAAK,QACrBiB,EAAanB,EAAAE,EAAA,QACfiB,EAAiBnB,EAAAE,EAAA,UACjBA,EAAA,4BAGF,MAYEg0C,uCAPF7F,OAAMkG,SAAAC,cAAA,sBACN/e,SAAM,mBACNgf,OAAQ,0CAOK3tC,EAAAiN,EAAsB2gC,GAEvC,IAAAxhB,EACEyhB,EAAA5gC,GACE6gC,EC5FO,SAAmC9tC,EAAA+D,EAAAs0B,EAAAG,GAC9C,IAA+BuV,EAAA/tC,EAAA+lB,YAAAhiB,GAAiByiB,EAAAunB,EAAAtnB,OAA7B,EAAqDunB,EAAAD,EAAAC,KAAwBxnB,EAAAgS,EAA9E,GAA8E+O,OAAA0G,cAC7FznB,EAAOunB,EAAiBvnB,IACxBgS,EAFgB,MAMjBwV,EAAA3V,EANgB,GAMNkP,OAAA2G,WAAA,CACV,IAAAC,EAAQnuC,EAAA+lB,YAAA/lB,EAAAyC,MAAAoE,UAAAif,wBAIH,CAAsBkoB,KAAAA,EAAO,KAAOxnB,IAAAA,EAAA,MDgFlC4nB,CAAApuC,EAAAiN,EAAAlJ,IAAAqoB,EAAAiM,MAAAjM,EAAAoM,UACL6V,YAAWT,EAAQ,GAAKE,KACjBl0C,QAAA00C,OAAAC,EAAA30C,QAAA8zC,cAAAc,EAAA9sC,EAAA,GAAAuL,IAAA2gC,MAcPa,qCAZA70C,QAAA80C,uBAAAd,qBAaI,SAAmB3gC,OACzB6H,EAAM,CAAA,uBAAgB65B,OAAS1hC,EAAApL,GAAA4L,MAAAhE,WAAA,CAAA,gBAAgB,WAE/C8kC,EAAI30C,QAAA8zC,cAAkBkB,EAAAC,MAAA,CAAA/5B,QAAAA,GAAAy5B,EAAA30C,QAAA8zC,cAAAoB,EAAAptC,EAAA,GAAAuL,QAGlB,SAAAA,WAGeA,KACTA,EAAS7K,QAAMpC,KAAQw4B,QAAK77B,EAAaoyC,+BAExCR,EAAA30C,QAAAo1C,OAAA,mBAKJ,eACLtV,EAAOuV,EAAAj8B,cAEJ,IACEk8B,EADFxV,EAAAyV,uBAAA,+BACE1gB,KAAAxhB,EAAA4+B,gDAMFhS,SAAoBqV,OAGzBjiC,EAAA4+B,oDAcJ/2B,EAAS,CAAA,sBAAkD65B,OAAA1hC,EAAoB7K,QAAApC,KAAAyrC,WAAkC,CAAA,iCAAA,IAC/G,OAAM8C,EAAA30C,QAAa8zC,cAAA,MAAqB,CACxC0B,IACEH,EAEY9tC,UAAA2T,EAAAM,KAAA,KACRJ,MAAO,2CAebu5B,EAAY30C,QAAM8zC,cAAiB,QAAA,cAEjBtrC,EAAAitC,EAA6BpiC,GAC/C,GAAM7K,EACJpC,KAAAsvC,OAAA,CACE,IAAAC,EAAKntC,EAAApC,KAAAsvC,OAAAltC,EAAApC,KAAAsvC,cAAA59B,EACL89B,EAAiB9tC,EAAO,CAAA+tC,QAAQF,MAAAA,OAAS,EAAAA,EAAAE,SAAAxiC,GACzC,GAAAsiC,EAAW,CACX,IAAAD,EAASf,EAAA30C,QAAmB8zC,cAAiB6B,EAAarF,UAAWsF,GACrE,OAAAjB,EAAa30C,QAAA8zC,cAAmB,QAAiB,KAAOa,EAAM30C,QAAA8zC,cAAW,KAAA,KAAAa,EAAA30C,QAAA8zC,cAAA,KAAA,CAExE14B,MAAA,CAAA06B,WAAAH,EAAA/W,OAAA,MAGEmX,QAAA1iC,EAAA7K,QAAApC,KAAAyrC,WAAA4D,OAAA39B,GAAK49B,iBAIZ,OACE,KAnBiCM,CAAA3iC,EAAA7K,QAAA6K,EAAAy9B,YAAA/uC,OAAAsR,GAAAshC,EAAA30C,QAAA8zC,cAAA,QAAA,KAAAhD,EAAAz9B,EAAA4iC,GAjCxB,SAAA98B,EAAA3Q,UACL,SAASD,GACTA,EAAA8pC,iBACA9pC,EAAA+pC,kBACA9pC,EAAA2Q,OA6B6B,IAAA9F,EAAAy9B,YAAA/uC,gBA6E3BsR,GACR,OAAOshC,EAAM30C,QAAA8zC,cAAgB,KAAC,CAC5BvsC,UAAU,2DACR,CAAAuuC,WAAaI,WACRl2C,QAAA8zC,cAAA,KAAA,KAAAzgC,EAAA8iC,YAjF0BC,CAAA/iC,GAAA,kBAuB/BgjC,EAAAhjC,EAAA4iC,EAAAK,2CAKN,IAASpvC,EAAAqvC,EAA8CljC,EAAA68B,EAAA/2B,GAAA1F,EAAAvM,EAAAuM,IAAAkkB,EAAAzwB,EAAAywB,KAE/C,OAAAgd,EAAA30C,QAAqB8zC,cAAA,KAAA,CAGrBrgC,IAAAA,EACA2H,MAAA,CAAA06B,WAAEG,EAAA,MAGF1uC,UAAa,8BACnBivC,QAAcF,EAAAn9B,EAAA9F,EAAAmjC,SAGVC,YAAeH,EAAAn9B,EAAA9F,EAAAqjC,UACf/e,iBAGetkB,EAAA4iC,EAAiBK,+GAOlC,OAFQC,EAAaljC,EAAY68B,EAAA/2B,EAAAw9B,EAAAx9B,GAAAm9B,GAAA3e,kBAKjC4e,EACEljC,EAAA68B,EAAqB/2B,EAAOslB,EAAO6X,SACjCjjC,EAAO7K,QAASpC,KAAAqN,IAAAy8B,KACfyE,EAAK30C,QAAA8zC,cAAAzgC,EAAA7K,QAAApC,KAAAkqC,UAAAxoC,EAAAA,EAAA,GAAAooC,GAAA,CAAAz8B,IAAAA,KAEVlM,EAAO,2BAAA4R,IAAA9F,EAAA4+B,cAAA,yBAAA,sBACL0C,EAAO30C,QAAA8zC,cAAA,KAAA,KACPrgC,0CAEGlM,EAELivC,QAAMF,EAEJA,EAAAn9B,EACA9F,EAASmjC,cAAA1+B,EAGX2+B,YAAOH,EAAAA,EAAAn9B,EAAA9F,EAAAqjC,cAAA5+B,+FAeXgB,EAASzF,EAAA7K,QAAApC,KAAA2S,EAAAD,EAA8B89B,WAA+BA,OAA6B,IAAA79B,EAAAhW,EAAAmsC,6BAAAn2B,EAAAC,EAAAF,EAAA2lB,MAAAA,OAAA,IAAAzlB,EAAAjW,EAAA8zC,wBAAA79B,EAGjGi9B,GADM,EAIN,IAAMa,EAAA,EAEN,GAAIzjC,EAAM7K,QAAApC,KAAAsvC,OAAgB,CACtB,IAAAC,EAAuBtiC,EAAA7K,QAAApC,KAAAsvC,SAGvBC,IACFmB,EAAMnB,EAAsB/W,OAXxB,MAgBJvrB,EAAM7K,QAAApC,KAAeyrC,WAAK,cAKbkF,EAAA1jC,GAAAwjB,QAAA,SAAAmgB,EAAA59B,GACb,OAAW49B,GAAA59B,IAFN,QAHe,sFA3MhB,sbE7ER,OAAAzY,IAEUoQ,MAAUrP,KAAAI,YAEXrB,EAAAiB,MAAAA,KAAAjB,iBAAQ,SAAyBJ,UAAxCA,GAAAA,EAAAC,WAAAD,EAAA,CAAAL,QAAAK,0BAEST,EAAW,aAAA,CAAAW,OAAA,YACPjB,EAAAE,EAAA,cACP,SAAO6T,SACP,0EAME,8BAARA,EAAA6H,SAAA,IAAAM,KAAA,KACEJ,EAAItT,EAAKA,EAAS,GAAAuL,EAAA+H,OAAA,UAChB,8BAGFu5B,EAAW30C,QAAA8zC,cAAA,MAAA,WACFvsC,UAET0vC,iBAAI,kCACa,KACf/Q,4FASgB,szCAIhBtmC,yBACKA,EAAO,aAAA,CAAAW,OAAA,UACP,wBAEPmB,KAAAw1C,MAAO,IAAAl1C,6DA1CE,IAAAmD,EAAAzD,0SCNby1C,OAAA,SAAAC,GACAjyC,EAAAkyC,SAAA,EAEAxiB,EAAAyiB,OAAAF,GAWAjyC,EAAAoyC,aAMgB,MAAAH,GAMR11C,KAAS21C,SAAK,EAGdxiB,EAAAyiB,OAAWF,GAGjB11C,KAAA61C,UAGE,OAAA,KDWO,kBCNE/E,iCAOT9wC,MAAcA,KAAAu4B,cACD,SAAWpW,EAAAqW,GAUxB,SATKr6B,OAAas6B,gBAAA,CAAAC,UAAc,cAAep4B,OAAU,SAAO6hB,EAAAqW,GAC9DrW,EAAAuW,UAAcF,kBAGhB,IAAS,IAAA1W,KAAA0W,EACDA,EAAA/a,eAAkBqE,KACjBK,EAAAL,GAAA0W,EAAA1W,MAGSK,EAAAqW,aAEVrW,EAAAqW,YAEDG,yBADFxW,EAAAqW,eAKS,OAALA,EAAWr6B,OAAUgG,OAAAq0B,IAAAG,EAAAvvB,UAAAovB,EAAApvB,UAAA,IAAAuvB,2BAIrBz6B,EAAW,aAAU,CAAAW,OAAA,qBAGbjB,EAAAE,EAAA,OACHF,EAAME,EAAA,iBAGpBF,EAAAE,EAAiB,MAwEjB6M,wBAvEQjG,EAAa4G,EAAKT,SAClBnG,EAAAyC,MAAW1C,SAEVqxC,EAAAC,cAAAtxC,EAAA6G,YACF5G,EAAKyC,OAAI6uC,yBAEZ,SAAYhrB,EAAI9K,UAChB41B,EAAQG,SAASvxC,EAASyC,MAAA6jB,EAAW9K,EAAArV,EAAAqrC,6BAIzC,OAAAC,EAAmBzxC,EAAAyC,OAAAivC,aAAA3tC,4BAInB,OAAS,yGAzEb/D,EAAAiE,SAAAO,IAqFAmtC,QAAS,SAAkBC,GAClB,IAAArrC,EAAAvG,EAAeyC,MAAIK,IAAA+uB,YAAA+f,EAAAtrB,MAAAsrB,EAAAp2B,mCAGW7U,iBAAA,SAAAnJ,GAIrC,IAAAgH,EAAAxE,EAAAyC,MAAA+B,GAAAuhC,EACEvhC,EAAAqC,UAAMC,MAAAF,QACJpC,EAAAuC,qBAAK/G,EAAAyC,MAAA1C,OAAAvC,KAAAA,EAAAuoC,IAAA,GACL/lC,EAAAiE,SAAOO,sBAEI,0DAGH,oBAEF/B,MAAKoE,UAAQqG,0CAKbzK,MAAKoE,UAAGsG,6EAOHnN,EAAA+lB,YAAA/lB,EAAAyC,MAAAoE,UAAcsG,qCAGzBhS,EAAO02C,EAAArrB,IACL6R,MAAAnnB,KAAAulB,IAAaob,EAAC7D,KAAkB8D,EAAA9D,aAC9B8D,EAAOrrB,OAAeorB,EAASrrB,wBAGnC,WAjCI8Q,EAAArC,eAAWj1B,EAAAA,EAAAyC,MAAAoE,UAAAqG,MAAA,OAAAwE,EAAA,2GA0CZ+/B,EAAAhvC,UACLsvC,EAAgBC,IAAAvvC,OAGXwvC,EAAA,SAAA1iC,YAEA0iC,IAEL,IAAIlzC,EAAMwQ,EAAMvU,KAAAM,KAAU,CACxB+R,IAAM0kC,EACNtvC,MAAA,CACAigC,KAAK,yCAGX/3B,MAAA,SAAAnG,EAAAknB,EAAAT,EAAAC,GAzDuC,OAAAnsB,EAAAmzC,WAA1BnzC,EAAAozC,QAAAvkC,SAAA,SAAA+b,GA2DbA,EAAAyoB,YAAA5tC,EAAA8mB,QAAAziB,IAAA8gB,EAAA0oB,oBACgB7tC,EAAAqC,UAAAyrB,OAEDh2B,EAAA+nC,cAAA5kC,OAAA+E,EAAA1B,IAAA,CAAAxG,EAAAoqC,WAAAC,OAAAniC,EAAAqC,UAAAqG,KAAA1I,EAAAqC,UAAAsG,GAAA,CAAAy5B,MAAA,uBAGCtqC,EAAA+nC,cAAA/R,QAGZrlB,MAAW,yBAEf,OAAA8kC,EAAA7N,SAAAzhC,QAGSnH,YACLyD,EAAAmzC,UAAS,IACPC,QAAY,cA3BTF,EAAW1iC,wCAgCpB,IAAAoa,EAAe,IAAA2oB,EAAAvuC,wFCzLfkuC,EAAAvtC,UAAA6tC,WAAA,SAAAvyC,MAEa1E,KAAA42C,UAAc,EAAM52C,KAAA62C,QAAA,6BACpB,IAAA3tC,EAAYxE,EAAAyC,MAAC+B,GAAyBjI,EAAe2pB,iBAAA1hB,EAAAqC,UAAAsG,GAAf5Q,CAAeiI,mBAW9DytC,ED0IK,aCxIHA,kBAAYA,QACR,yBAIF32C,KAAAyI,IAAW,EACXzI,KAAAyI,IAASA,SAGfuuC,EAAI5tC,UAAa2tC,YAAA,WACjB,OAAO/2C,KAAAyI,OAGDW,UAAc0tC,YAAQ,SAAAruC,QACxBA,IAAAA,GAIFuuC,EAjBM,aAmBJ,kBAIF1uC,QAAK,WACH,MAAM,CAAA,IAAAquC,wBAYRp4C,EAAAL,wDAIF43C,EAAOl4C,EAAAE,EAAA,MACLF,EAASE,EAAA,IA0Db,SAAgBo5C,EAAY1vC,EAAAoK,EAAoBC,EAAaqkC,GAE3D,GAAAA,EAAa9rB,MAAA,SAAA+M,GACL,OAAA3vB,EAAW0uB,aAAatkB,EAAKC,EAAAslB,aAEjC,QAEA3vB,EAAAmF,KAAAlI,0GAKJ,GAAO2pB,GAAA,kBAAA9M,KAAA9Z,EAAA+uB,YAAAnI,EAAAxc,KAAAwc,EAAAvc,cAMP,OAAI,aAEG1K,EAAAsB,EAAA0uC,QACL1uC,EAAQvK,EAAI+sB,UAAY9jB,EAAKK,MAAS,wCAJ1C,MASSiB,WAAkDA,EAD3D,SAAA2uC,EAAAjwC,EAAAsB,EAAA0uC,GAIA,KAAgB1uC,GAAAvK,EAAiBwsB,eAAY,MAC/B/T,EAAcxP,EAAAK,IAAAiB,EAAA,0BAD5B,mBCnJa,SAAA4uC,EAAAlwC,EAAoBsB,EAAA0uC,wND6DpB,iCAGH,SAAM3vC,qBACD,GAuCftJ,EAAA+3C,kBArCQ9uC,EAAO6jB,EAAA9K,EAAArV,EAAAqrC,wCA5Dfh2B,EAAAhiB,EAAA+sB,UAAA9jB,EAAAK,UAoEE,IAAI8vC,EAASF,EAAKjwC,EAAA6jB,EAAQngB,EAAA0sC,qBAAIF,EAAIlwC,EAAa+Y,EAAArV,EAAU0sC,qBAAY,GACnEC,EAAOF,WAIHE,EAAaC,EAAKtwC,EAAAqwC,EAAA3sC,EAAA0sC,qBACPzgB,SAGb4gB,EAAOL,EAAAlwC,EAAAqwC,EAAA3sC,EAAA0sC,sDAQG,IAAAI,EAAcxwC,EAAoBK,IAAa+uB,YAAkCihB,EAAAE,GACxFE,EAAMv4C,KAAAgQ,MAAAuoC,EAAU/sC,EAAMgtC,WAAMF,GAAApqC,KAAA,SAAA+oC,GAC3B,MAAW,CACbtrB,MAAWwsB,EAAclB,EAAAtrB,MAC3B9K,IAAAs3B,EAAAlB,EAAAp2B,oBAJN43B,QAAA,WAYgB,OAAAF,EAAcv3C,OAAoB,GAG9C03C,KAAM,WACF,OAAAH,EAAAv3C,OAAW,EACbu3C,EAAAI,QAEA,0BChHO95C,EAAAk5C,cAAAA,6BCEbl5C,EAAA63C,4HAOA73C,EAAA+5C,iBANA,SAAAhtC,GAEA,OAAAA,EAAAP,QAAA,KAAA,OAWA9M,EAAMC,EAAA,IACN,SAAMU,EAAAL,GACNC,OAAMwC,eAAAzC,EAAsB,aAAA,CAAAW,OAAA,IAE5BX,EAAMg6C,eAAA,EAENh6C,EAAAi6C,mBAAgB,IAMdC,kBAAW,GAGbx6C,EAAAC,EAAA,aACEU,EAAAL,OADFo6B,2BAAAA,EAAA,SAAAnW,EAAAqW,GAWA,OAPAF,EAA+Bn6B,OAAkBs6B,gBAAY,CAAAC,UAAA,cAAAp4B,OAAA,SAAA6hB,EAAAqW,GACrDrW,EAAKuW,UAAWF,IACnB,SAAQrW,EAAAqW,GACR,IAAQ,IAAA1W,KAAA0W,EACGA,EAAA/a,eAAAqE,kBAGhBK,EAAAqW,IAOE,SAAArW,EAAAqW,YAESG,IACL34B,KAAA44B,YAAOzW,EAHXmW,EACEnW,EAAAqW,eAIW,OAAPA,EAAOr6B,OAAAgG,OAAAq0B,IAAAG,EAAAvvB,UAAAovB,EAAApvB,UAAA,IAAAuvB,2BAGDz6B,EAAA,aAAU,CAAAW,OAAkB,UAChCjB,EAAOE,EAAA,kBAEFF,EAACE,EAAiB,kBAGvBF,EAAIE,EAAA,SACFA,EAAA,gBAIFF,EAAKE,EAAA,UACH,UAOKiD,EAAeoC,UAAA,8DAEdsB,EAAU6G,EAAA/E,EAAQ5C,gBAGlB00C,EAAqBtC,cAAAtxC,EAAsB6G,GAAA/E,EAAA5C,kCAGjDe,mCAUAA,EAAAuG,iBAGA/B,aAzBa,yBA0BS+B,eAAjB+/B,0BAAU,iCAGO/2B,4DAKhBvP,iBAC4BA,uCAIlC1D,EAAoB+nC,cAAA/R,sBACZ9tB,EAAAknB,EAAUT,EAAAC,aAEF,UAAdnsB,EAAQiB,YAAwB,IAAXc,OAAoB,EAAAA,EAAA8yC,oCAO3C70C,EAAM8C,GAAAsE,SAAY0tC,oBAChB90C,EAAU+0C,sBAAsBx3C,EAAC+nC,cAAA/R,yGAlDtB,2BAuDb,IAAAyhB,EAAoBvvC,EAAAqG,QAvDP,0BAuDRmpC,EAAWtoB,EAAArc,UAAAqC,OAAAA,GAAA,SAAA+E,GACd,OAAAA,EAAQlQ,OACHwtC,KAMP,OAAOroB,EAAAiU,OAAAqU,GACF,GAAIxvC,EAAGkG,WAAA,CAKZ,IAAIupC,EAAQvoB,EAGNN,EAAA8oB,EAAyBC,UAAA10C,OAAsBwrB,EAAAnoB,OAAQsoB,EAAOC,SAAAH,EAAApoB,IAAA0B,EAAA8mB,QAAAC,MACpE,aAAIhP,EAAA,EAAY7J,EAAAlO,EAAQ4vC,MAAA73B,EAAA7J,EAAA/W,OAAA4gB,IAAA,CAEtB,IAAM8P,EAAO3Z,EAAA6J,GACP,GAAA8P,aAAAgB,EAAQgnB,aAAAhoB,aAAAgB,EAAAinB,eAAA,CACd,IAAQC,EAAMloB,EAGdmoB,EAAc75C,KAAI,aAIbwS,GAAAonC,EAAApnC,MAWX,QAAiBwF,EACf,EAAA8hC,6CALGvnC,KAAA2f,EAAAC,MACQ3f,GAAA0f,EAACE,SAICpa,EAAA8hC,EAAqC94C,OAAAgX,IAAA,YAGtD+hC,EAAAf,EAAAjB,cAAAznB,EAAAvB,EAAAxc,KAAArL,EAAAsE,SAAA0sC,mBA/HqB8B,EAAAhB,EAAAhB,YAAA1nB,EAAAvB,EAAAvc,GAAAtL,EAAAsE,SAAA0sC,mBAESoB,EAAAA,EAAAtU,OAAAsU,EAAA5kC,KAAAqlC,EAAAC,IAmI1BV,EAAmBA,EAAOprC,IAAArE,EAAA8mB,QAAU9mB,EAAA1B,SAC/B,UAAM0xC,EAAA7F,OAAAvjB,EAAAwB,QAAA/jB,KAAA,SAAAgkB,GACb,MAAA,CACK3f,KAAA2f,EAAiB+nB,MACPznC,GAAA0f,EAAKgoB,gCAI5BZ,EAAAA,EAAA/zC,IAAAsE,EAAA1B,IAAAgyC,EAAA5pB,EAAArpB,EAAAsE,SAAAqrC,GAAA,EAAA9nB,EAAAxc,KAAAwc,EAAAvc,KAES,OACP8mC,EAGA,GAAAzvC,EAAAiG,aAAA,CAAA,OAAAwpC,EAAAvoB,mCACA,QAAAjV,EAAAs+B,uBACA,IAAAxuC,EAAAyuC,EAAA,GAAAv+B,KAAAlQ,KAAM4iB,EAAA6rB,EAAA,GAAA9nC,EAAAic,EAAAjc,KAAAC,EAAAgc,EAAAhc,GAGQ8mC,kBAAS/zC,IAAOsE,EAAM1B,IAAI,CAAAxG,EAAUoqC,WAAAC,OAAAz5B,EAAAC,EAAA,CAAAy5B,MAzHxC,qBAyHwC,CAAArgC,KAAAA,MAIrC,OAAW0tC,EAEL,OAAMvoB,IAIrBze,MAAM,CAGF+3B,YAAA,SAAuBviC,GACzB,OAAKwyC,EAAS/Q,SAAAzhC,IAEd6K,gBAAc,CAAA4nC,YAAAC,EAAAtzC,QAEhBvG,qCAGJyD,EAAO8C,GAAAA,6CAGA9C,EAAAiB,OACAo1C,IACGr2C,EAAA+0C,gBAAQ,EACduB,EAAOt2C,EAAAiB,iBAKPjB,aA/HiDwQ,QAkI7C9C,mBACKhK,EAAA0D,EAAAqrC,EAAA8D,EAAApoC,EAAAC,2BAML,IAAND,OAEQ,QAIN,WACA,WAGFgmC,EAAIS,EAAMpC,SAAgB9uC,EAAAyK,EAAAC,EAAkBhH,EAAMqrC,KAE1C,KAGA4B,WAAW,KACjB7sC,EAAM2sC,EAAOG,OACbJ,EAASxwC,EAAQK,IAAA+uB,YAAAtrB,EAAA+f,MAAA/f,EAAAiV,OAETm4B,EAAEJ,iBAAMN,SACRsC,UAAOC,GAAA,KAGb7wC,EAAM,GACN8R,EAAM,CAAAlQ,KAAAivC,GAGNF,GAAoC7yC,EAAAoE,UAAYif,KAASvf,EAAA+f,OAAgB7jB,EAAIoE,UAAAif,MAAAvf,EAAUiV,MACrFu5B,QAAO,UA/LL,2BAmMEz4C,EAAgBoqC,WAAAC,OAAApgC,EAAA+f,MAAc/f,EAAAiV,IAAU7W,EAAK8R,yBAKxC5U,qEAKT,SAAerE,EAAEggC,UAGnBhgC,KAAAA,OAAwE,eACxEwC,EAAA0H,aAMA,SAAgB+tC,OAChB30C,EAAAqB,EAAOuzC,EAAA50C,EAAA40C,QAAAC,EAAA70C,EAAA60C,yCAITxzC,EAAM+pC,kBACN/pC,EAAM8pC,uBAC8BvI,QAAMvhC,EAAWuhC,kBAAAuF,KAAA,KAAS2M,EAAK51C,EAAWyC,MAAA1C,gCAC1E81C,EAAAZ,EAAU/Q,SAAAlkC,EAAAyC,OAAA4M,KAAAtL,EAAAA,MACZ8xC,EAAMl6C,OAAK,CACX,IAAImF,EAAA+0C,EAAS,GAAAC,EAAQh1C,EAAAoM,KAAA6oC,EAAAj1C,EAAAqM,GACnB6oC,EAAMrC,EAAOJ,iBAAcvzC,EAAKyC,MAAOK,IAAA+uB,YAAcikB,EAAAC,IAGrDN,EADa5zC,EAAAsE,SAAA8vC,eAAiBD,GACd9jC,MAAc,EAFnB,GAE0BrJ,KAAA,SAAAqtC,SACnC,wBAGA,IAAO1xC,EAAAxE,EAAAyC,MAAA+B,8JAMRxE,EAAAiE,SAAAO,yBAMEixC,EAAA95C,QACA85C,EAAA96C,KAAA,CAAA6a,WAAA,81DCjTb,GAAA,IAAA5a,EAAA,MAAAL,GAAAK,EAAA,GAAAL,EAAA,IAAAK,EAAA,GAAAL,EAAA,IAAA,CAEAC,EAAAC,MAAAG,EAAA,GAIA,MAYA,GAAA,IAAAA,EAAA,IAAAJ,EAAAC,MAAAF,EAAA,GAAA,CAcEC,EAAAC,MACEF,EAAA,GAKcA,EAAAK,EAET,MAEA,GAAUL,GAAAC,EAAAC,MAAWF,EAAA,GAAA,CACrBC,EAAAC,MAAgBF,EAAA,GAChBC,EAAAE,IAAeC,KAAAC,GACf,MAEAL,EAAA,IACAC,EAAAE,IAAcG,MAEdL,EAASM,KAAAD,MACT,SAGMD,EAAAG,EAAAC,KAAAC,EAAAT,sBAEL,YAaAD,EAAA,yCAGHK,EAAA,QAAA,8CAUD,aAAW,CAAAT,OAAA,oBAGDjB,EAAAE,EAAA,QAAAA,EAAA,MAAWF,EAAOE,EAAA,sCAAlB2G,EAAAR,EAAAgB,EAAAzB,eACNiB,qBAYDR,EAAe42C,0CAClB52C,EAAa62C,yEAIf72C,EAAA82C,wCAAA92C,EAAA+2C,4CAAO/2C,EAAAg3C,2QAcN1zC,SAAO,2EA+BR,OA7BM2zC,EAAS7zC,EAeX8zC,EAASt4C,EAAAoB,WACXm3C,qBACA,uBAAA,qBAACC,EAAAx4C,EAAAglB,SAAA,CAAY,WACb,gBAAC,uBAAoBszB,IAAwB,kDAI/C9zC,EAASi0C,EAAAj0C,MAITrH,KAAKu7C,oBAAoBjpC,SAAA,SAAAyJ,GACvB1U,EAAAm0C,EAAmBC,gCAAAP,EAAA7zC,EAAA0U,MAEjB,CACF,0CAIF,WACEvW,EAAAmB,SAAqB+0C,EAAAC,oBAAAC,EAAA57C,KAAAyE,OAAA5B,EAAAoB,WAAAjE,KAAA8sC,QAAA9sC,KAAA67C,cAAA77C,KAAA87C,aAAA97C,KAAA+7C,kBAAA/7C,KAAAu7C,yCAASjpC,SAAA,SAAA0pC,KAAWx0C,IAAAw0C,EAAA5zC,EAAAZ,SAI3C,EAGAY,uBAQ4BwL,gBAAO,SAAqBpM,EAAKjE,EAAQD,0DAA/DT,EAAWo5C,EAAAC,WAGjBl8C,MAAA,SAAAqX,UAAAA,EAAAlY,cA4CI,yJA1CR,0CA5Ja,UAgKK0D,EAAAE,EAAAwlB,iBAEd1lB,EC3LJ,SAAuBA,EAAA2E,GACjB,IAAA20C,EAAe,kCACf3oB,EAAAsC,8BAAetuB,KACf20C,GAAe,iBAoErBt5C,EAAgBsW,WAAApW,EACdikB,aACAnkB,EACAsW,WAAApW,EAAuCkkB,sBAGjCk1B,EAAmB,aD+GvBC,CAAev5C,EAAG2E,GAAA,IAAIy0C,EAAI,GAAkB34C,EAAa+4C,YAAWJ,EAAA58C,KAAA,8BAInDiE,EAAAg5C,KACLL,EAAkB58C,KAAA,SAGzB68C,EAAA,kEAGAA,EAA0D,CAI7D,QAIA,UACF,2EAOAD,EAAqB58C,KAAA,wBAAA68C,0DAIhBD,EAAA58C,KAAA,cAAAiE,EAAAwiB,WAAAG,QAGAg2B,EAAwCA,EAAA5I,gBC7InC/vC,sBAKN,GAAsB,SAAtBA,EAAsBymC,MAAA,aAAAzmC,EAAAymC,KACxBkS,EAAQ58C,KAAc,mBACnB,CACL,IAAAk9C,EAAeC,SAAMl5C,EAAAymC,KAAA,IACbwS,yBAIVN,EAAoB58C,KAAA,aAAYk9C,iCAQ5Bl9C,KAAW,sBAIb48C,EDoH6CQ,CAAAn5C,IACf,CACd,EACJtD,KAASiF,OAAAy3C,cAAkBx+B,EAAS09B,IAAA/4C,EAAYo5C,IAErD,KAAA,EAED,MAAQ,CACV,EAFa5kC,EAAS1Q,OAGR+D,QAAK,gBAAa,eAMpC3F,4IC/OE,OANNd,EAAAqO,SAAA,SAAAqqC,GAEAC,EAAAA,EAAAlyC,QAAA,IAAAiyC,EAAA,OAIMC,IDiPJ73C,gBAAOA,OC/HC,aAGNxG,EAAML,yBASQA,EAAC,aAA2B,CAAAW,OAAA,UAAKjB,EAAAE,EAAA,cAyCjD++C,EAAO,uCAAuB32B,8DAmE5BhkB,EAAO6Z,EAAA+gC,WAAA56C,EAAAkZ,QClOX,SAAS2hC,EAAqB92B,EAAA+Z,EAAAgd,GAC5B,OAAM,IAAAh9B,QAAYiG,GAAI,IAAY42B,EAAhB,qEAAqBA,GAAA7c,GAAA,IAAAgd,iBAIvC,IAAMx3C,EAAqEy3C,EAAOJ,EAAax8C,ODqH3F,KCrH2FA,qCAC9E68C,EAAKC,aAAAC,SDoHlB,MChHNC,EAAoB,SAAcn9C,GAC1B,OAAAg9C,EAAYC,aAAWh4B,EAAOjlB,GAAAuZ,MD0H5B,KC1H4B,YAElCjU,EAAM,IAAY,KAAW63C,EAAA,GAAA73C,EAAA,SAAAg3C,SAAAa,EAAA,GAAA,IAAA73C,EAAA,OAAA63C,EAAA,GAAA73C,EAAA,OAAA63C,EAAA,GAAA73C,EAAA,OAAA63C,EAAA,GAAA73C,WAEyC83C,EAAoBh4B,EAAAW,kCACrFX,EAAU7L,MAAK,MAAAlM,KAAA,SAAAgN,EAAA9C,yFDiJJyjC,EAAgB7zC,EAAOk2C,aAC1B,SAAY7qC,EAAA+wB,EAAUC,EAAA8Z,iBAE1B/Z,SACCC,SACN8Z,oDAQJ9qC,EAAO6qC,EAAA7qC,MAAA6T,KAAA20B,GApBX,2BAAA7zC,EAAAqD,QAAA6yC,EAAA7qC,OAAA,SAAAA,EAAA+wB,EAAAC,EAAA8Z,EAAAC,GAyBA,IAAgBj4C,EACN6tB,EAAQ,EACdqqB,EAAcC,EAAW3F,QAF7B,OAIS3kB,EAAAqqB,GAJTH,EAAAK,SAAAlrC,EAAAA,MAAA6qC,EAAAK,SAOgB,OAAAlrC,EAIZ,IAGA0E,GAHMmmC,EAAwBM,SAAAC,GAGlBprC,EAAQ+wB,EAAAC,EAAS8Z,EAAAC,GAAAx3B,EAAK7O,EAAA6O,OAAAX,EAAAlO,EAAAkO,OAAA0a,EAAA5oB,EAAA4oB,OAChC+d,IAAMv4C,EAAA,IAA2B,KAAA+3C,EAAoB5wC,KAAAnH,EAAA,SAAA6tB,EAAA7tB,EAAA,OAAAygB,EAAAzgB,EAAA,OAAA8f,EAAA9f,EAAA,OAAAw6B,EAAAx6B,GACrD0f,EAAM,SAAU/O,EAAAtX,GAChB,OAAYsX,EA/DR,IA+DuB+mC,EAAAc,aAAAn/C,MAEvBqmB,EA1DJ,OA0DW64B,EAAApxC,MA5EX,KA4EmDuY,aAAgB64B,EAAA1qB,SAAA7N,YA5EnE,KA4EmEN,WAAA64B,EAAA93B,QA5EnE,KA4EmEf,EArIzE,SAqIyE64B,EAAAz4B,QA5EnE,KA4EmEJ,EA5CzD,SA4CyD64B,EAAA/d,UAC1Dkd,EAAAc,aAAAZ,YACLG,EAAeU,QAAApB,EAnEf,IAmEeqB,EAnEf,IAmEerB,EAAAkB,GAAA/d,kJAdzBpnB,EAAAyC,EAAA8iC,EAAAvlC,EAAAyC,EAAAzC,EAAAwlC,QAyBgB,GAAA99C,MAAAod,QAAA9E,EAAkCyC,GAEzC,IADD,IAAAmpB,EAAa5rB,EAAAyC,EAAAhb,OACXH,EAAgB,EAAAA,EAAAskC,EAAAtkC,IACR,iBAAA0Y,EAAAyC,EAAAnb,KACF0Y,EAAAyC,EAAAnb,GAAWi+C,EAAoBvlC,EAAAyC,EAAAnb,GAAA0Y,EAAgBwlC,iBAgB/DlgD,EAAAigD,uBAAgBA,IAsCZE,iCApCW1xC,EACT60B,EAAA8c,wBAHN,IAAAC,EAAAnjC,EAAAnc,IAAA+d,EAAAG,gBAAAqhC,WAAApjC,EAAAnc,IAAA+d,EAAAG,gBAAAshC,SAcA,OAAgBv8C,EAAAwI,QAAA82B,GAAwB,SAAY9uB,OAC5CqrC,EAAcW,YACd,OAAAX,EAAcpxC,OAAUA,EACxB4xC,EACSjB,EAAoBS,EAAAz4B,OAAAy4B,EAAA93B,QACD83B,EAAAz4B,cChQpCpnB,EAAAygD,8CDqRE,IAAAC,EAAa7B,EAAK,IAAA,wBAPpB,GAAA3hC,EAAAnc,IAAA+d,EAAAG,gBAAA0hC,qFCnRgB,WAAyBlyC,OAAAA,EACxB,OAAS+F,EAAA,GAKlB,OAAA,SAQJqqC,yBAAoBA,IAYhB2B,wBAAuBA,+ICf/B,SAAAx8C,GAeA,IARA,IAAA48C,EAAA,IAAAC,YAAA78C,EAAA7B,QAQAH,EAAA,EAAAA,EAAA4+C,EAAAz+C,OAAAH,IACA4+C,EAAA5+C,GAAAgC,EAAAyS,WAAAzU,GAeE,OAbFI,MAAAsR,KAAA,IAAAotC,WAAAF,EAAAG,SAAA1xC,KAAA,SAAA9D,GACA,OAAAyL,OAAAC,aAAA1L,MAYqBqQ,KAAA,+BA7CrB5b,EAAAi/C,4CAyDA,IAtBA,IAAA+B,EAAA,IAAAF,WAAAG,EAAA9+C,QAsBAH,EAAA,EAAAA,EAAAg/C,EAAA7+C,OAAAH,IAQEg/C,EAAAh/C,GAAAi/C,EACExqC,WACAzU,UAQKI,MAAasR,KAAA,IAAAmtC,YAAAG,EAAAD,SAAA1xC,KAAA,SAAA9D,GAClB,OAAKyL,OAAAC,aAAgB1L,MAGhBqQ,KAAA,oBAML,aAEAvb,EAAML,SACA8B,MAA4BA,KAAAoG,UAAA,oBAChCjI,OAAU06B,QAAM,SAAc55B,OAC9B,IAAAgB,EAAAC,EAAW,EAAA2hB,EAAMzhB,UAAUC,OAAKH,EAAA2hB,EAAA3hB,IAEhC,IAAA,IAAS4hB,KADT7hB,EAAAG,UAAcF,GAEd/B,OAAUiL,UAAeqU,eAAK/d,KAAAO,EAAA6hB,KAC9B7iB,EAAA6iB,GAAW7hB,EAAM6hB,WAEjB7iB,iDAIEf,EAAc,aAAA,CAAgBW,OAAM,qBAEtCjB,EAAAE,EAAA,MACEF,EAAOE,EAAA,eAETF,EAAAE,EAAA,MACAF,EAAAE,EAAY,gBAIVF,EAAAE,EAAA,MAMEF,EAAeE,EAAA,mCAGT89C,EAAAn3C,EAAkBR,EAAgB6oC,EAAA+O,EAAAC,EAAAC,EAAAR,UAGvC,IAAA6D,EAAY36C,EAAAR,EAAU6oC,EAAA+O,EAAAC,EAAAC,EAAAR,GAGtBnnC,MAAAwnC,UAGL,oBACAwD,EAAA36C,EAAeR,EAAI6oC,EAAA+O,EAAAC,EAAAC,EAAAR,mCAIfv7C,KAAA67C,cAAAA,EAAR77C,KAAA+7C,kBAAAA,EAEE/7C,KAAIu7C,oBAAeA,EAAA3kC,QAAA9C,UACnB9T,KAAKixB,SAAAjxB,KAAcq/C,eAAQvS,EAAMgP,wCAKjC,IAAA30C,EAAA,IAAam4C,EAAQt/C,KAAAyE,QAAO86C,EAAAv/C,oCAGtBw/C,UAAAr4C,EAAAq4C,UAARj7C,KAAmB4C,uCAEjBs4C,QAAqBt4C,EAAAs4C,QAAKl7C,KAAA4C,GAArBu4C,SAAMv4C,EAAMu4C,SAAAn7C,KAAA4C,GACfw4C,UAAMx4C,EAAAw4C,UAAcp7C,KAAO4C,GAC3By4C,UAAIz4C,EAAay4C,UAAAr7C,KAAA4C,uBACT,SAAe2c,GAErB,OAAAy7B,EAAaM,oBAAS/7B,oBAEtB,SAAAA,qCAKEg8B,YAAW,SAAKtiC,GACA+hC,EAAAO,YAAA9/C,KAAAwd,IAIpBuiC,gBAAY54C,EAAS44C,gBAAcx7C,KAAM4C,cAC/BA,EAAA64C,WAAgBz7C,KAAA4C,wGAmTXy0C,SAEX,IAKA,SACKz+B,gBAAA8iC,qBACHrE,EAAGsE,QAAA,SAAA9kC,WAAC+B,gBAAMuB,kBAAY1B,EAAMG,gBAAAqB,KAAA,iBAAA2hC,EAAA9kC,GAAA,qEAUpC+kC,EAAOC,EAAAC,gCAITA,EAAYD,EACF,WAEF,2BAvUNE,aA4USt8C,WAAUm3C,qBAAcj5C,EAAA2/B,kBAAA3/B,EAAAF,gCAAqB25C,EAAM4E,aAAA,IAAAjzC,KAAA,SAAcxP,oJAO1E,GAAO8gC,EAAA1lB,WAAA,KAAA,sEAIT,GAAApW,EACK09C,wBAAGx8C,IAAAuyB,EAAAkqB,iBAAA,IAAAC,EAAAz+C,EAAA+B,EAAA28C,mBAAA/hB,KAAAgiB,EAAAC,IAAAjiB,EAAAkiB,qBACE,MAAA,CACK9hD,EAAA+d,EAAAG,gBAAA6jC,8ICpgBjBC,EAAAjkC,EAAAoC,UAAAw8B,EAAAsE,QAAA,SAAA9kC,GAcA,GAAAA,EAAAnc,IAAA+d,EAAAG,gBAAA+jC,OAAA,CAEA,IAAAt/C,EAAA+X,EAAAwnC,kBAAA/lC,EAAAgmC,EAAAC,cACA,GAAAz/C,EAAA7D,KAAA8iD,EAAAC,IAAA,IAAAl/C,EAAA7D,GAAAgjD,qBAEgB,MAAA,CAOG9hD,EAAI+d,EAAMG,gBAAA+jC,OACT7lC,EAAA,CACCD,EAAAC,EAAA+lC,EAAaE,eACd,CACJ,6CAXhBlmC,EAAAC,EAAA+lC,EAAAC,cAAA1nC,EAAAM,sBA8BEmB,EACEC,EAAA+lC,EACAG,oBAMA,OAAKnmC,KAGLhV,EAAKA,EAAA,GAAAw1C,GAAA,CAELsE,OAAKe,EACLT,iBAAYpqC,ID2GUorC,CAAAjB,EAAAvgD,KAAAiE,cAAjB67C,YAAaS,EAAAL,QAChB,KACE/4C,EAAAK,oBACAi6C,uDAQErC,EAAAh2C,UAAA02C,YAAA,SAAR/S,EAA4BvvB,GAC1B,IAAA/Z,EAAqBzD,KAAhB0hD,EAAYlkC,OACfq+B,cAAWvpC,SAAK,SAAeyJ,KACtBA,EAAA2lC,EAAA3U,6BAGX,OAAOtpC,EAAAk+C,WAAA5U,EAAA3xB,SAIPhS,UAAqBu4C,WAAA,SAAK5U,EAAA3xB,WAArB5V,EACCyb,EAAA,EAAO7J,EAAKpX,KAAAu7C,oBAAuBt6B,EAAA7J,EAAA/W,OAAA4gB,IAAA,KACrClF,EAAA3E,EAAA6J,sGAOE,OADA2gC,EAAAt8B,OAARk2B,EAAuB2C,uBAAmFyD,EAAAt8B,OAAAlK,EAAApb,KAAAu7C,0BAA1Gx/B,EAAA8lC,UAAA7hD,KAAAyE,OAAAsoC,EAAA6U,cAKqE5hD,KAAIixB,SAAA7V,EAAAnc,IAAA,+BAG/D6H,EAAAoqB,EAAkB7Z,IAAoD3E,OAAA5L,EAAA4L,MAAA0I,GAExE,qCAQC,EAAIyW,EAAaZ,EAAA3Z,EAAAua,EAAAxxB,OAAAiX,IAAA,KACpBxQ,OAAAA,EAAU+qB,EAACva,IACL5E,oBACF5L,QAAMimC,EAAO3xB,qBAMDA,EAAAnc,gBAEd4gD,oBAAsB,SAAO/7B,aAC7B,EAAMte,EAAAxF,KAAO+7C,kBAAgB96B,EAASzb,EAAAnF,OAAA4gB,IAAA,OACtCzb,EAAOyb,IACPjhB,KAAIyE,OAAOqf,0EASR,EAAIte,EAAOxF,KAAA+7C,kBAAO96B,EAAAzb,EAAAnF,OAAA4gB,IAAA,KAEvB6gC,EADMt8C,EAAAyb,IACNjhB,KAAUyE,OAACqf,EAAAipB,sEAST,KACA,SAAW+U,SACTA,EAAOC,aAAiB,SAAQ3mC,YAC3BC,6CAGP,WAIO,KACTymC,EAAMh7C,QACNA,EAAUg7C,EAAAh7C,QAACk7C,EAA2Bv9C,gBACpCq9C,EAAI5/C,OACF,SAAO6qC,EAAS3xB,MAChB0mC,EAAOzL,QAAA,CACP,IAAAn0C,EAAO4/C,EAAAzL,QAAAj7B,KACFwkC,UAAA19C,eAGHktB,2BAEK3rB,EAAQgB,OAAA6G,MAAUw2C,EAAS1yB,iCAK7B0yB,EAAOzL,QAChBtJ,EAAU6S,UAACkC,EAA2BzL,QAAgBj7B,IAG9C2xB,EAAW+S,YAAAiC,EAAA3mC,IAIjB2xB,EAAO4S,UAASvwB,YAEhB0yB,EAAOG,MAAA,iCAEJ,SAAAlV,EAAA3xB,GACL,IAAM,IAAI6F,EAAM,EAAAihC,EAAApG,EAAA76B,EAAAihC,EAAA7hD,OAAA4gB,IAAA,CAIT,IAAOkhC,QAAS1+C,EAASgB,OAAO2W,EAAA2xB,GAEzB,8DA/FPA,EAAM+S,YAAAiC,EAAA3mC,mCAsGrB,IAAAgnC,EAAAJ,EAAAv9C,OAAAqH,MAAAg2C,EAAA9tC,sBAEA,GAAA8tC,EAAAC,YAQEhV,EAAYsV,SAAcD,EAAA7c,EAAAnqB,IACV2xB,EAAA+S,YAAAiC,EAAA3mC,IACA2xB,EAAAyS,gBAAa,CAA0B,IAAA9rC,EAAA,GAAaouC,EAAAzL,2CAErDtJ,EAAA0S,QAAA2C,EAAK7c,EAAAnqB,GAAA1H,2BAgBb,MAAA,IAAA4uC,MAAA,+CAXAx7C,EAAA,SAAPimC,EAAA3xB,GACQ,IAA6BqG,EAAAhe,EAAAgB,OAAAqH,MAAAy2C,WACtB3gD,EAAK+X,EAAWwnC,kBAAyB/lC,EAAMzB,EAAA6oC,gBAC/CtgD,EAAKkZ,EAAOC,EAAA1B,EAAYiB,gBACzBmyB,EAAOsV,SAAA5gC,EAAY7f,kBAG1BmrC,EAAAyS,aAMHvuB,EAAA6wB,EAAAlpC,OAAAqY,EAAA6wB,EAAAlpC,QAAA,oBAEIlG,MAA2BovC,EAAKpvC,MAChC5L,QAA8BA,KAGhCk7C,EAAQhiD,KACVihB,EAAM,EAAMwhC,EAAS3V,EAAK7rB,EAAAwhC,EAAApiD,OAAA4gB,IAAA,CAE1B2Q,EADK6wB,EAAAxhC,cAMPm+B,EA9NE,KAgOA,yBAEFp/C,KAAIyE,OAAKA,OACPi+C,MAAI,CAAA,CACF/1C,KAAK3M,KAAMyE,OAAKqH,MAAArM,WACX,GACLiU,QAAK,mBAGT1T,KAAAsL,MAAOxK,EAAA6hD,KAAAC,2BAGF5iD,KAAA6iD,mBAAA,YACaz5C,UAAI5B,IAAA,eAAEkM,EAAK,YAAErU,KAASW,KAAAkrB,MAAAve,KAAA+U,cAAA,KAAA1hB,KAAAkrB,MAAAxX,wHAKlCtK,UAAgC1B,aAAM,WAG5C,OAAK1H,KAAK6iD,sBAENz5C,UAAKw2C,UAAQ,SAAA19C,kCAOZygB,EAAA7W,EAAAA,EAAAzL,OAAP,GACE2T,EAAKhU,KAAQyE,OAAKvC,KAASA,EAAKlC,KAAAsL,8BAG3BqX,GAAAmgC,EACLh3C,EAAKA,EAAQzL,OAAK,GAAAyiD,EAGbh3C,EAAAzM,KAAA2U,OACwC5K,UAAaq2C,QAAA,SAAA9yC,EAAAtD,EAAAqK,mDAKxD1T,KAAK0iD,MAAAriD,uDAKAL,KAAKkrB,MAAMxX,QAAKrU,KAAA2U,OAPlB,QAWE5K,UAAWi5C,SAAW,SAAS11C,EAAAtD,oBAGhCsD,KAAAA,EACFtD,MAAOA,EACTqK,QAAO,8DAYP,OAPNqvC,EAAAp2C,KAAAq2C,8BAGShjD,KAAAsL,MAAmBxK,EAAc6hD,KAAAC,MAIpC5iD,KAAyBy/C,QAAGsD,EAAAp2C,KAAAo2C,EAAA15C,MAAgB05C,EAAArvC,YAEtCtK,UAAMs2C,SAAA,SAAgBtwB,QAC5B9jB,MACE8jB,EAAQ6zB,SAAMjjD,KAAAsL,oBAERq0C,UAAA,SAAAvwB,cAAKA,EAAA8zB,cAAAljD,KAAAsL,UAEXlC,UAAA+5C,aAAA,SAAArP,iBACK9zC,KAAAyE,OAAAqH,MAAAs3C,KAAA,KACLtP,0EAQA9zC,KAAA6iD,mBAA4B/tC,SAAAnI,IAC9B3M,KAAA6iD,mBAAkBxjD,KAAasN,MAG1BvD,UAAA42C,WAAA,SAAArzC,UACL3M,KAAO0iD,MAAAt4B,MAAA,SAAAvrB,4FAWXygD,EAAMl2C,UAAiBi6C,WAAW,SAAA7iD,EAAAg4B,GAG5B,OAAAh4B,GAAAA,EAAA03B,QAA6BM,EAACN,QAAIp3B,EAAuB6hD,KAAAW,QAAE9iD,EAAA8K,MAAAktB,EAAAltB,OAAOtL,KAAAyE,OAAAvC,KAAA1B,EAAA0B,KAAAs2B,EAAAt2B,KAAA1B,EAAA8K,YAGpE,KA9GA,gDCzRWpN,EAAA,aAAA,CAAAW,OAAA,MACbyiD,cAAc,iBACP,2CAMLpjD,0DAEgBN,EAAME,EAAA,OACnBF,EAAAE,EAAA,MACAF,EACHE,EAAA,cAIGsf,EAAAxf,EAAAE,EAAA,MAYLylD,+BAVY/7C,EAAAg8C,EAAA3gD,EAAA4gD,EAAAlkC,oBAIPmkC,EAAAl8C,EAAAmpB,MAAA,GACLoc,EAAM,IAAA4W,EAAiBH,EAAgB3gD,EAAA4gD,EAAoBlkC,EAAAmkC,YAC3DE,WAAUpxB,qBAON,oBACFmxB,EAAWH,EAAY3gD,EAAA4gD,EAAYlkC,EAAAskC,SACjC7jD,2BACgB,+BACX,IAAAuoC,iCACK,8CAGdvoC,KAAK8jD,2CAGAL,EAAAnxC,SAAA,SAAAy6B,GAAPtpC,EAAAggD,YAAA1W,EAAA52B,MAAA42B,EAAAgX,cAA0DxkC,YAAA,0BAEpD9b,EAAA8b,YAAAwtB,EAAA52B,MAA0B42B,gBAG1B,cACA,SAAWqW,KACXS,MAAAT,EAAY/5C,MAAAyqC,KAAAsP,UAKdxH,IAAO,QAED,wBACE4H,2BAKF,CAAAxjD,KAAA47C,IAAAsE,yCAIF,CAAI8D,aAAU,sBAEZ9lC,OAAA,6CAKA6lC,MAAA,SAAallD,kDAIfA,2BAGW,SAAW8N,EAAK+G,mEAKtBkF,EAAAyC,EAAA3H,sBAOPkF,gDAGA5Y,aACoB,gBAGF,uBAKf8L,MAAA,IAAAxL,MACL2jD,YAAgB,+DAMF,IAAXC,EAAAp4C,MAAAzL,QAAW2T,EAAmBuP,YAAA7Q,MAAA,UAChBwxC,EAAAC,aAAA,EACJC,EAAAA,EAAA7vB,8DAIV2vB,EAAAD,YAAP,EACaG,EAAAA,EAAAC,aAAsBD,EAAA1xC,MAAA,WAAgB0xC,EAAA,iBAG5CA,IAAPpwC,EAAAuP,YAAA2gC,EAAAp4C,MAAAzM,KAAA2U,EAAArH,KAAAlI,OAAAvC,KAAAkiD,EAAApwC,EAAA1I,QAIY44C,EAAAp4C,MAAAzM,KAAA2U,SAKJkwC,EAAKp4C,MAAKzM,KAAQ2U,wCAWlBhU,KAAI2hD,WAAK3kC,EAAWG,gBAAOsB,qCAQ3Bhb,EAAAupC,aAAUlsC,EAAA8gB,SAAoBhQ,KAAAsyC,EAAAp4C,WAG9Bo4C,EAAAD,gEAKFtC,WAASh1C,GAAQ,aACfqgC,aAAA5pC,mBAIKkhD,WAAA,SAAiB5wC,wBAEtBA,8BAGA6wC,UAAW,SAAAxmD,EAAAyb,EAAAD,qBAGfC,GAAA,cAIJpQ,UAAAw2C,UAAA,SAAA19C,GACE,IAAAuB,EAAKzD,KAEHwkD,EAAUxkD,KAAAwkD,6BACR,CAoBF,UAnBO,GACLC,EAAK,eAGFhhD,EAAWH,QAAA0gD,cACdU,EAAAA,EAAAh6C,QAAA,qBAAA,SAAA84B,EAAAC,EAAAC,4CAIsBjgC,EAASQ,WAAA0gD,mGAI9BlhD,EAAAk+C,WAAA3kC,EAAPG,gBAAsCqB,IAAAkmC,GAAtCA,EAAA,KAMSxkD,EAAA,EAAWA,EAAAgC,EAAA7B,OAAAH,IAAA,CACd,IAAAma,EAAKnY,EAAAyU,OAAWzW,oFAKfskD,EAAU1vC,SAAqBuF,IAC/BoqC,8BAGAzkD,KAAA4kD,uBAAW9D,IAAuBzmC,IAChCoqC,+DAGTC,GAAArqC,EAOIoqC,kDAKAhhD,EAAOzD,wDAIL4B,EACE6B,EAAA8gD,UAAW3iD,EAAA7D,GAAA6D,EAAA4X,QAAA5X,EAAA2X,UAEf9V,EAAA8gD,cAEED,YAAM,WACN5wC,gBAGEmrB,GAAA,GACJ53B,GAAA,WAWImC,UAAWy7C,UAAY,SAAAzB,SAEnBpjD,OACAA,KAAA6jD,MAAiCT,EAAC/5C,MAAKyqC,OAG7CvwB,YAAOjJ,OAAeja,OAAS,mBACtB2c,EAAAG,gBAAA2nC,MAAA,aACPlB,WAASmB,mBAKPlD,UAAA,SAAA7tC,4CAOJ5K,UAAKw6C,WAAiB,SAAKxgD,aACtBpD,KAAA6hD,UAAiBt9C,KAAKvE,oBAEtBgtC,aAAA,SAAAgY,aAELhlD,0GAKNsL,EAAO9F,EAAAyb,GAAPiiC,cAAA53C,GAKM,OAAAA,GAEF25C,EAAa,IACL,eACNC,EAASD,mBAGPD,EAAQr0B,MAAKu0B,yBAQjBD,EAAWD,EAAA30B,YAAA,gCAMR,IAFA,IAAAjB,EAAA2oB,EAAAzsC,MAAA,GACC65C,EAAqB,CAAApN,EAAA/jC,MACdixC,EAAUD,EAAA30B,YAAA,CAElB,GADL0nB,EAAAqN,KACah2B,EAAAziB,KAAUkqB,QAAAkhB,EAAAzsC,OAGjB,CAbN25C,IAeA,qBAIMjlD,KAAAqlD,YAAAhmD,KAAA+vB,EAAAziB,qEAAR3M,KAAAqlD,YAAA9lD,WAIIS,KAAKyjD,YAAA1L,EAAA/jC,KAAwBrH,KAAKwJ,MAAKnW,KAAA+3C,EAAA/jC,mDASzC,IAAMvQ,EAAAzD,KAAuBslD,EAAAj+C,aAAAvG,EAAA8gB,SAAA2jC,EAAAC,aAAAn+C,GAAAA,KAAMo+C,EAAA,CAAU,IAAL,IAAAC,EAAA,GAAKxlD,EAAA,EAAAA,EAAAolD,EAAAjlD,OAAAH,IAAA,CAAK,IAAAma,EAAAirC,EAAA3uC,OAAAzW,GAAKF,KAAA2lD,iBAAA7wC,SAAAuF,GAAKqrC,EAAArmD,KAAA,KAAAgb,GAAUqrC,EAAArmD,KAAAgb,GAAeirC,EAAAI,EAAA5rC,KAAA,SAAU6nC,WAAA3kC,EAAAG,gBAAAyoC,WAAA,WAAKniD,EAAAsgD,MAAA,YAAKtgD,EAAAsgD,MAAAuB,SAEvGl8C,UAAAy8C,WAAyB,SAAAv9B,EAAAzpB,EAAAhB,yBAE3BmC,KAAAsD,QAAKglB,GAAAzpB,2BAQAuK,UAAA08C,KAAA,SAA2BzoB,EAAK3pB,2BAEzCA,yKC/ZgB1T,KAAAwkD,wBAAgDnlD,KAAA,IAAA,KAAfW,KAAA6C,OAAAoB,WAAA8hD,sEAE/C,IAAAC,EAAiB,CACT,KAAqC,QACvC,IACF,QAEA,YAGG,QAVT,uSDuGQ,0BElFR7nD,OAAAwC,eAAAzC,EAAA,aAAA,CAAAW,OAAA,IAqBAX,EAAAsnD,aAjBA,SAAAR,EAAA1mC,QACA,IAAAA,IACAA,GAAA,GAEA,IAAApc,EAAA,GAWA,OAVA8iD,EAAA1yC,SAAA,SAAA0B,GACA,IAAAiyC,EAAAjyC,EAAA1I,MAAAyI,MAAA,SAAAqb,GACA,OAAAA,EAAAziB,OAAAqH,EAAArH,KAAAlI,OAAA6G,MAAA46C,SAEA,OACAhkD,GADAoc,GAAA2nC,GACAA,EAAA58C,MAAA88C,WAEAnyC,EAAAuP,eAGArhB,IAKAtE,EAAAC,EAAA,IAGA,SAAAU,EAAAL,GACA,IAAAkI,EAAApG,MAAAA,KAAAoG,UAAA,WAUA,OATAA,EAAAjI,OAAA06B,QAAA,SAAA55B,GACA,IAAA,IAAAgB,EAAAC,EAAA,EAAA2hB,EAAAzhB,UAAAC,OAAAH,EAAA2hB,EAAA3hB,IAEA,IAAA,IAAA4hB,KADA7hB,EAAAG,UAAAF,GAEA/B,OAAAiL,UAAAqU,eAAA/d,KAAAO,EAAA6hB,KACA7iB,EAAA6iB,GAAA7hB,EAAA6hB,IAEA,OAAA7iB,IAEAoQ,MAAArP,KAAAI,YAEArB,EAAAiB,MAAAA,KAAAjB,iBAAA,SAAAJ,GAGA,OAAAA,GAAAA,EAAAC,WAAAD,EAAA,CAAAL,QAAAK,IAEAR,OAAAwC,eAAAzC,EAAA,aAAA,CAAAW,OAAA,IACA,IAAAwS,EAAAzT,EAAAE,EAAA,IACA04B,EAAAz3B,EAAAnB,EAAAE,EAAA,KACAsoD,EAAArnD,EAAAnB,EAAAE,EAAA,KACAsjD,EAAAriD,EAAAnB,EAAAE,EAAA,KACAuoD,EAAAtnD,EAAAnB,EAAAE,EAAA,KACAwoD,EAAAvnD,EAAAnB,EAAAE,EAAA,KACAk3B,EAAAj2B,EAAAnB,EAAAE,EAAA,KACA4E,EAAA3D,EAAAnB,EAAAE,EAAA,KACAyoD,EAAAxnD,EAAAnB,EAAAE,EAAA,KACA0oD,EAAAznD,EAAAnB,EAAAE,EAAA,MACA2oD,EAAA1nD,EAAAnB,EAAAE,EAAA,MACA4oD,EAAA3nD,EAAAnB,EAAAE,EAAA,MACA6oD,EAAA5nD,EAAAnB,EAAAE,EAAA,MAGA8oD,EAAA7nD,EAAAnB,EAAAE,EAAA,MACAwf,EAAAve,EAAAnB,EAAAE,EAAA,MACAyf,EAAAxe,EAAAnB,EAAAE,EAAA,MACA+oD,EAAA9nD,EAAAnB,EAAAE,EAAA,MACAgpD,EAAA/nD,EAAAnB,EAAAE,EAAA,MACAipD,EAAAhoD,EAAAnB,EAAAE,EAAA,MACAsD,EAAArC,EAAAnB,EAAAE,EAAA,KACAwD,EAAAvC,EAAAnB,EAAAE,EAAA,KACAkpD,EAAAjoD,EAAAnB,EAAAE,EAAA,MACAmpD,EAAAloD,EAAAnB,EAAAE,EAAA,MAGAopD,EAAAnoD,EAAAnB,EAAAE,EAAA,MACAqpD,EAAApoD,EAAAnB,EAAAE,EAAA,MACAspD,EAAAroD,EAAAnB,EAAAE,EAAA,MAEAupD,EAAgBtoD,EAA0CnB,EAAAE,EAAA,MAExD4L,EAAM3K,EAAcnB,EAAAE,EAAiB,KAGrCwpD,EAAiBvoD,EAAAnB,EAAAE,EAAA,QACfiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,QACAiB,EAAAnB,EAAAE,EAAA,SACAiB,EAAAnB,EAAAE,EAAA,qBAIFyS,GAAQ3S,EAASE,EAAA,OAEfiB,EAAAnB,EAAAE,EAAA,SACAiB,EAAAnB,EAAAE,EAAA,SACAiB,EAAAnB,EAAAE,EAAA,SACAiB,EAAAnB,EAAAE,EAAA,SACAiB,EAAAnB,EAAAE,EAAA,SACAiB,EAAAnB,EAAAE,EAAA,SACAiB,EAAAnB,EAAAE,EAAA,SACAiB,EAAAnB,EAAAE,EAAA,SACAiB,EAAAnB,EAAAE,EAAA,SACAiB,EAAAnB,EAAAE,EAAA,SACAF,EAAAE,EAAA,QACAF,EAAAE,EAAA,QACAF,EAAAE,EAAA,8BACAuF,EAAAY,OAGAsjD,EAAA,IAAAC,GAAAnkD,KACAiN,SAAA,CACAkmB,EAAAl4B,QACA8nD,EAAA9nD,QACA8iD,EAAA9iD,QACA+nD,EAAA/nD,QACA02B,EAAA12B,QACAgoD,EAAAhoD,QACAoE,EAAApE,QACAioD,EAAAjoD,QAGAkoD,EAAAloD,QACAmoD,EAAAnoD,QACAooD,EAAApoD,QACAqoD,EAAAroD,QACAsoD,EAAAtoD,QACAgf,EAAAhf,QACAif,EAAAjf,QACAuoD,EAAAvoD,QACAwoD,EAAAxoD,QACAyoD,EAAAzoD,QACA8C,EAAA9C,QACAgD,EAAAhD,QACA0oD,EAAA1oD,YAEAgS,SAAA,CACA22C,EAAA3oD,kBAIE6oD,EAAY7oD,QACd8oD,EAAQ9oD,kBAMVoL,EAAQpL,QAMFgpD,EAAYhpD,QACZmpD,EAAoBnpD,QACtBopD,EAAgBppD,QAClBqpD,EAAgBrpD,kBAElBspD,EAAatpD,QAGbupD,EAAQvpD,QAGRwpD,EAAOxpD,mBAvGTypD,GAAAzpD,QA0GA0pD,GAAA1pD,QAIE2pD,GAAA3pD,QACE4pD,GAAK5pD,QACL6pD,GAAkB7pD,mBAGb8pD,GAAA9pD,QAAP+pD,GAAA/pD,QAAoEgqD,GAAAhqD,UAAAA,kBAClEiqD,EAAWjqD,UACLA,UACIA,UACGA,iFAQLA,oIASH,IAAA4iB,EAAAqmC,EAAArmC,YAAmC5Y,EAAA,SAAA,UAAAhF,QAAAoC,sDACvB8iD,GAAAC,wBAASvnC,sBAAM5Y,UAG3Bk/C,GAAA,oBACLA,EAAoBnkD,QAAaA,QAAAA,4BAG5BmkD,EAAAp+C,UAAAkH,SAAA,SAAPrM,EAAAwb,GACE,IAAAhc,EAAYzD,UAAqB,IAAAyf,UAG5Bxb,EAAAqO,SAAA,SAAAkK,GACL,GAAwB,mBAAZA,EAAY,CACtB,IAAMmgC,EAAAngC,EAAI/Y,EAAAJ,SAAIs5C,8BAIXl5C,EAAAQ,WAAA5E,KAAAs9C,WAIAl5C,EAAAQ,WAAA0pB,QAAAnR,GAEG/Y,EAAAQ,WAAI5E,KAAAmd,OAIPgrC,EAAAp+C,UAAAwH,gBAAA,SAAPtI,EAAAmX,QACc,IAAZA,IACEA,GAAM,kDAKDA,MACSrW,UAAMwB,YAAO,4CAC3B,OAAM4R,EAAAlR,8EAIH,OAAAkR,EAAA1Q,YAEW1C,UAAMyxC,oBAAO,yFAMbzxC,UAAK0xC,qBAAO,4DAC1B,OAAMgH,EAAA9F,cAAI,CAAA8F,EAAA9F,eAAA,4FAIP,MAAA,CAAAhoC,EAAA/O,OAAAyjD,sGAMA,MAAA,CAAA10C,EAAA/O,OAAAk9C,6BAGoClH,wBAAK,mCAAa,eAAyB7rB,uDAK/E,MAAA,CAAApb,EAAA/O,OAAA0jD,gGAIA30C,KAAA,SAAAA,GACC,MAAA,CAAAA,EAAgC/O,OAAA2jD,0BAIlCx/C,UAAcy/C,cAAI,uBAEhBC,YAAY,eACZ15B,6CAIC,IAAA5pB,4DAMI4D,UAAA2/C,kBAAW,uBAClBD,YAAW,iEAOH1/C,UAAA4/C,kBAAY,kBACtBhpD,KAAM8oD,YAAA,MAAI,SAAA90C,GAAI,OAAAA,EAAA/O,OAAM8nC,OAAA,CAAA,8CAKO3jC,UAAIiE,SAAU,SAAQ5I,0CAG9C,OAAA,QAAAe,EAAAgX,EAAAnP,gBAAmB,IAA1B7H,OAAwC,EAAAA,EAAA9F,KAAA8c,EAAA/X,SACT2E,UAAIqH,cAAU,SAAAhM,oCAGtC6N,SAAA,SAAA9E,GACEA,EAAKyrB,YAAiBxoB,EAAApR,KAAA+G,EAAAA,EAAA,GAAAoH,EAAAyrB,YAAA,CAAAl7B,GAAAyP,EAAIzP,2BAIJ0S,oDAGxBzQ,KAAAipD,cAAA32C,SAAA,SAAP0B,GACSA,EAAKk1C,YAAiBC,EAAAn1C,EAAAmC,MAAAnC,EAAAk1C,mBAIjB9/C,UAAQggD,YAAA,kBAASppD,KAAA8oD,YAAA,CAAA90C,KAAA,SAAIA,2EAOO5K,UAAA2H,SAAA,SAAAtM,UAAAzE,KAAAqpD,SAAI,SAAU7sC,2EAKpDpT,UAAW6H,mBAAS,SAAAxM,eAAA4kD,SAAA,SAAA7sC,OAAAhX,2EAahBgiD,EAAAp+C,UAAAkgD,uBAAe,SAItB7kD,GACC,OAAMzE,KAAAqpD,SAAuC,SAAA7sC,GAE7C,IAAKhX,EACH,OAAuB,QAAnBA,EAAQgX,EAAW+sC,6BAAA,IAAA/jD,OAAA,EAAAA,EAAA9F,KAAA8c,EAAA/X,SAGnB2E,UAAQd,QAAQ,SAAiB7D,eACnC4kD,SAAQ,SAAR7sC,SAEF,OAA8B,QAA1BhX,EAAQgX,EAAQlU,eAAiB,IAAA9C,OAAA,EAAAA,EAAA9F,KAAA8c,EAAA/X,wCAKvC,OAAOzE,KAAAqpD,SAAQ,SAAO7sC,GAAS,IAAAhX,4GAtMtB,OAAAxF,KAAAqpD,SAAA,SAAA7sC,0UC5MbA,UAAA,SAAAA,GAEA,IAAAhX,EAEkB,OAA0B,QAA1BA,EAACgkD,EAAyBhtC,UAAA,IAAAhX,EAAAA,EAAA,SAM/B4D,UACJ0/C,YAAgB,SAChBW,SAEE,eACLxlD,WAAOqO,SAAA,SAAAkK,+CAMPitC,EAAAr6B,MAAA5S,EAAAlR,OACEo+C,EAAMrqD,KAAAgQ,MAAAq6C,EAAAltC,EAAAlR,MAAAq+C,QAAAF,EAAAr6B,SAEJpb,MAAOwI,EAAA1Q,SACPzM,KAAAgQ,MAAAq6C,EAA2BltC,EAAA1Q,MAAA69C,QAAAF,EAAAz1C,uCAI7B,MAAQnV,QDiNP,4DC9MKmB,KAAAD,gBAAO,6BAAuBK,UAAMC,OAAAH,EAAAC,EAAAD,kDAAqBA,EAAA,EAAAA,EAAAC,EAAAD,kGACvB,aAAM,CAAArB,OAAA,4IAU5CiuC,QAAQ,CACN,CACAl0B,MAAOoE,EAAUG,gBAAAqB,qEAXjBtc,sBACSyiD,gBACP,OAAS,KAAAj6C,QAAA,MAAA,KAAAA,QAAA,UAAA,eAiBR,oVCrDf2Q,EAAAuuC,UAWY7c,OAAA,SAAA7uB,EAAAlK,GACJ,IAAS9R,EAAA8R,EAAAuP,YACFrF,EAAA0hC,UAAA19C,6BAOPhE,iBACE8B,KAAAu4B,cAAE,SAAOpW,EAAAqW,YAAsBr6B,OAAOs6B,gBAAA,CAAAC,UAAA,cAAAp4B,OAAA,SAAA6hB,EAAAqW,4BACtCrW,EAAAqW,gBAAEA,mBAAqC1W,kBAEjCK,EAAAqW,eAEJA,0CAOVrW,EAAA/Y,UAAW,OAADovB,EAAer6B,OAAAgG,OAAAq0B,IAAAG,EAAAvvB,UAAAovB,EAAApvB,UAAA,IAAAuvB,2BAGjBz6B,EAAA,aAAA,CAAAW,OAAA,sCAKV2d,EAAA,CAAqC1Q,MAAA,CAAA,CACnCqK,KAAA,iBACE,mBAEJ0zC,MAAA,wBAJqCjd,SAAA,CAAA,CAAA5oB,IAAA,MAMrC6oB,MAAe,2BC7Cf5nC,OAAA,CAEgB6nC,QAAgB,CACf,CAEVl0B,MAAcoE,EAAOG,gBAAa0hC,KAC9BoD,MAAA,aAGK,CACKrpC,MAAAoE,EAAAG,gBAAA2sC,MACd7H,MAAA,mCAKE/jC,EAAAyjC,WAAA3kC,EAAAG,gBAAA0hC,MAAA,mbCjBT3gD,EAAA6rD,oNAHA,OAAA,IAQAnsD,EAAAC,EAAA,IAOA,SAAAU,EAAAL,GAEA,IACAo6B,EADAC,EAAAv4B,MAAAA,KAAAu4B,YACAD,EAAA,SAAAnW,EAAAqW,UACAF,EAAAn6B,OAAAs6B,gBAAA,CAAAC,UAAA,cAAAp4B,OAAA,SAAA6hB,EAAAqW,GAEMrW,EAAAuW,UAAiBF,IAAC,SAAArW,EAAAqW,2DAElB,SAAYrW,EAAAqW,GAGV,SAAAG,IAEC34B,KAAA44B,YAAAzW,EAJCmW,EAAAnW,EAAAqW,eAOI,OAAAA,EAAAr6B,OAAAgG,OAAAq0B,IAAAG,EAAAvvB,UAAAovB,EAAApvB,UAAA,IAAAuvB,kBAGFvyB,UAAS,mCACD,SAASnH,eACjB,EAAA4iB,EAAAzhB,UAAiBC,OAAAH,EAAS2hB,EAAA3hB,YAG5B4hB,iBAFM5hB,GAGN/B,OAAOiL,UAAAqU,eAAA/d,KAAAO,EAAA6hB,KACP7iB,EAAA6iB,GAAA7hB,EAAA6hB,0BAEe1hB,oCACb,aAAA,CAAAvB,OAAA,UAAEjB,EAAKE,EAAA,SAAMA,EAAA,0CACA,iBACbA,EAAA,UAAE,8BAqKd,IAAAksD,EAAS,SAAmB/1C,GAC1B,SAAO+1C,EAAAvlD,EAAyB1G,EAAGulB,EAAQ2V,GACzC,IAAAx1B,EAAGwQ,EAAOvU,KAAAM,KAAAjC,EAAW,CAAA,WAAAulB,YCzMhB7e,EAAA6e,UACL5hB,EACEozB,gBAAArwB,EAAAqH,MAAAuX,QAAA5e,EAAAqH,MAAAipB,UAAA,CAAAzR,MAAAA,IDuMmB2mC,CAAExlD,EAAA6e,GAAA2V,IAAAj5B,YACvByD,EAAAge,SAAUhd,EAAAqH,MAAAuX,kCAKZ2mC,EAAO5gD,UAAAsE,SAAA,SAAAvG,GACL,IAAA1D,EAAMzD,aAGQiB,EAAS6hB,gBAFZ,SAAAjB,GACX,OAAOA,EAAAlV,OAAAlJ,EAAAge,UAAgBI,EAAAxY,MAAAia,QAAA7f,EAAA6f,QACTriB,CAAyCkG,EAAAoE,cAZlD,CAgBT7J,EAASs3B,6BACDkxB,EAAoB3jD,GAC1B,IAAAf,EAAU4R,6DAG2C,QAA9C5R,EAAAe,EAAAC,OAAAE,mBAA8C,IAAAlB,OAAA,EAAAA,EAAA2kD,SAC9B,QAAvB/yC,EAAO7Q,EAAAC,OAAAE,mBAA6B,IAAN0Q,OAAe,EAAaA,EAAAgzC,yBAK1DC,EAA0B9jD,OACxBf,EAAM4R,SACNkzC,EAAA/jD,EAAA,EAAAA,EAAAlD,QAAA8rC,cAAA,mBAAA,CACO,UAAL5oC,EAAAC,OAAKE,mBAAA,IAAAlB,OAAA,EAAAA,EAAA+kD,SACwB,UAA7BhkD,EAAAC,OAAAE,mBAA6B,IAAA0Q,OAAA,EAAAA,EAAAozC,8BAMnC,IAAAhlD,EAAS4R,EACP,OAAOkzC,EAAA/jD,EAAA,EAAAA,EAAAlD,QAAA8rC,cAA2B,uBAAc,CAAyB,QAArB3pC,EAAAe,EAAAC,OAAAE,mBAA2B,IAAAlB,OAAA,EAAAA,EAAAilD,uFAOzEC,EAAiBnkD,GACvB,IAAIf,EAAA4R,SACFkzC,EAAoB/jD,EAAK,EAAAA,EAAAlD,QAAA8rC,cAAA,mBAAA,CACL,QAApB3pC,EAAAe,EAAOC,OAAAE,mBAAa,IAAAlB,OAAc,EAAYA,EAAAmlD,SACb,QAAjCvzC,EAAA7Q,EAAOC,OAAAE,mBAAwC,IAAV0Q,OAAa,EAAAA,EAAAwzC,2CAMtDz0C,KAAA00C,EAAetkD,EAAA+c,yGCrQf,SAAAunC,EAAAtkD,EAAA+c,GAIM,OAFN/c,EAAAlD,QAAA8rC,cAAA,WAEmB,IAAA7rB,aAOLA,EAAAwnC,mBACJnmD,oBAEA,qBAEA8W,EAAAK,aAAA,gBACSnC,EAAAoxC,mBAAAtvC,EAAA,IAAA,gBAAiEgG,EAAAlb,sJD4B1E4J,EAAM66C,mBAAI76C,EAAA86C,0EAUN,CAAA3sD,QAAA,4EAKNoV,QAAW,UACTm2C,MAAI,kBACF,WACE,WACAtkB,SAAQ2lB,EAAA,EAAAC,+BAMV,2BAKF,CAEInnC,IAAA,KACAuhB,SAAO2lB,EAAA,EAAAC,uBAGLD,EAAe,EAAAC,KAGjBnnC,IAAA,cAAmCknC,EAAM,EAAAC,KAG7Cte,MAAA,SAAQ74B,GACN,IAAApS,EAAOupD,EAAWxxC,EAAA2B,oBAAwBtH,EAAA3K,OAAA,YACxCiiC,OAAO1pC,EAAM0pC,OAAW,IAAA+H,OAAA,eACxB,KACEr/B,EAAO3K,MAAAia,QACF,CAAA8nC,YAAAp3C,EAAA3K,MAAAotB,MAAA70B,yGAmBT,MAGJqD,OAAI,CACA6nC,QAAA,CAAA,gDAIIvH,SAAe,SAAAnqB,GAEvB,OAAAhV,EAAA,CAGYkd,MAAAlI,EAAAC,EAAA+lC,EAAAE,eACDv3C,cAASsrB,EAAAC,UAChB61B,EAAexxC,EAAAwnC,kBAAA/lC,EAAAgmC,EAAAC,cAAA,6BAKJ,OAAAjmC,EAAAC,EAAA+lC,EAAAG,qBAIVxU,OAAA,SAAA7uB,EAAAlK,qDAGCkK,EAAc6lC,MAAA/vC,EAAA3K,MAAAia,OACd6nC,yEAMDjtC,EAAAomC,YAAA,WAEO,IAAAtwC,EAAA3K,MAAAia,OAAAzgB,EAAqBqD,cAAaF,sBC9H5CkY,EACElK,uBACStB,MAAA,kEAIH5R,EAAuB8gB,SAAqBhQ,KAAAnN,EAAAvC,KAAAmpD,EAAA,GAAA,4BAClDr3C,EAAON,QAAA43C,IAAWD,EAAA,GAAAhrD,wCDwHbkrD,CAAArtC,EAAAlK,GAGAkK,EAAA8uB,aAAAh5B,EAAAN,8CAWN,CACL,IAAOs2C,EAAAvlD,EAAA/C,EAAAC,gBAAA6pD,SAAA,EAAAtB,EAAA3jD,qIAKb,IAAAyjD,EAAAvlD,EAAA/C,EAAAC,gBAAA8pD,SAAA,GAA6B,IAAAzB,EAAAvlD,EAAA/C,EAAAC,gBAAA+pD,SAAA,KAMzBl6C,WAAK,SAAW/M,GAChB,IAAKgN,EAAQ,CAAA7Q,EAAA+qD,uBAAA,IAAA3rC,OAAA,SAAA4rC,EAAAvrD,OAAA,UAAAoE,EAAAqH,MAAAuX,SAAA,SAAA3Q,4BAGR3I,cAAAsrB,EAAPC,cAGE,OAF0C61B,mBAQhC1mD,UACV,IAAA7D,EAAU4kC,UAAW,eAAA,SAAAr+B,EAAEuL,EAAAsY,EAAA9K,oEAIlB,IAAA7W,EAAAsQ,EAA+BkyC,oBAAAn5C,EAAA,UAC/B,IAAAxJ,EAAA/B,EAAkB+B,UACvBA,EAAGsxB,cAAOnX,EAAW5a,SAAA2N,EAAAhQ,EAAAA,EAAA,GAAEid,EAAArP,KAAA3K,OAAAA,IACvBH,EAAGulC,YAAOzjB,EAAA,EAAW9K,KAIhB,OAAA,KAEL,OAAG,aApBMzO,GAEbnJ,QAAA,SAAA7D,GAf6B,MAAA,CAAAqnD,EAAArnD,EAAAqH,MAAAuX,QAAA9c,yBChIzBhI,EAAAL,yBACUA,EAAA,aAAA,CAAAW,OAAA,uCAKd0R,EAAS3S,EAAAE,EAAA,4XACA,SAAAuF,OACLkD,EAAAlD,EAASkD,SACT,CACAuF,MAAO,CAAA,CACPqK,KAAU,aACHgF,KAAA,CAAAzH,QAAA,SAAOm2C,MAAG,mEAIN,MAAA,ypEC5Df,MAMA,GAAA5qD,GAAAC,EAAAC,MAAAF,EAAA,GAAA,CAEAC,EAAAC,MAAAF,EAAA,GACAC,EAAAE,IAAAC,KAAAC,GACA,MAKAL,EAAA,IACAC,EAAAE,IAAAG,MAEAL,EAAAM,KAAAD,MAEkB,SAGVD,EAAUG,EAAAC,KAAAC,EAAAT,GAET,MAAAU,GAEHN,EAAA,CACE,EAEAM,KAGE,yFAcAI,MAAAA,KAAAD,gBAA2B,yBACzB,EAAAI,EAAMC,UAAYC,OAAAH,EAAAC,EAAAD,oBAClBG,sBAQAE,EAAO,MAAAL,EAAA,EAAAA,EAAAC,EAAAD,wBAACA,GAAAO,EAAA,EAAAC,EAAAF,EAAAH,OAAAI,EAAAC,EAAAD,IAAAF,6DAAuB,CAAA1B,OAAA,sDAInCf,EAAA,QACEA,EAAA,QACEA,EAAA,mBAEF,yBA6FEmW,mCAKWjU,KAAA0B,EAAAC,gBAAAoqD,gBAAA,CAAA,gBAAAC,EAAA77C,EAAA5J,EAAA0lD,GAAA,gBAAA9c,cAAA,+BAAM9rC,QAAG8rC,cAAQ,wFAKhC/3B,iBAEQjJ,WAAgC,QAAnB3I,EAAAe,EAAAC,OAAmBE,mBAAA,IAAAlB,OAAA,EAAAA,EAAA0mD,gBAAA,QAAA90C,EAAA7Q,EAAAC,OAAAE,mBAAA,IAAA0Q,OAAA,EAAAA,EAAAmrC,sEAQ9BpyC,EAAkB5J,EAAA0lD,uBACpBvnD,sBAEYovB,qBAAarvB,EAAWqH,MAAOy2C,YAAAp7C,EAAAoE,qBAC7CupB,gBAAArwB,EAAAqH,MAAAy2C,WAA4B99C,EAAAqH,MAAiBipB,WAAA5tB,KAAA6tB,EAAAC,2BAAA9tB,EAAAK,IAAAL,EAAAoE,2IASrD,OAAI5C,2HAKNwH,EAAAg8C,yBAAAF,EAAAn3C,SAAAs3C,KAEOC,EAAA33B,KAAA03B,iCAKF,CAAM,EAAa7lD,EAAA+lD,QAAAC,cAAAF,EAAAl8C,EAAAg8C,uBAAAF,KAXf,MAWuC,KAAA,iBAGxBO,uCA2CXC,EAAA/3B,yCA3CgCg4B,CAAAtkD,GACzBukD,IACEzjD,EAAS/B,EAAM+B,IACZsxB,cAAMmyB,EAAAlkD,IAAAhE,EAAAqH,MAAAy2C,WAAAiK,8DAQFtjD,EAAM/B,EAAA+B,GACX+4C,EAAQx9C,EAAAqH,MAAAy2C,WAAAp+C,OAAAqoD,GACpBx3B,EAAuBQ,wBAAetsB,EAAAqsB,EAAA0sB,GAC7Bt5C,EAAYO,IAEhBxH,EAAAozB,gBAAArwB,EAAAqH,MAAAy2C,WAAA99C,EAAAqH,MAAAipB,UAAAy3B,EAAA9qD,CAAAyF,EAAAwB,EAAAjE,IAIZc,EAAArG,MAAA,EACE,KAAA,EAKF,oBAAA,CAAA,qDCxOT,OAAA4D,EAAAylB,oBAAArY,GACA,CAGAxD,KAAA,SAAAlI,GAGA,OAAAA,EAAAqH,MAAAy2C,YAGAqK,KAAA,SAAA54C,GACA,IAAA44C,EAAA,GAKA,GAJA54C,EAAA3K,MAAAtL,IACA6uD,EAAAvtD,KAAA,IAAA2U,EAAA3K,MAAAtL,IAGAiW,EAAA3K,MAAAmQ,SAAAxF,EAAA3K,MAAAmQ,QAAAnZ,OAAA,CAEA,IAAAq0B,EAAA1gB,EAAA3K,MAAAmQ,QAAA,GAQAhW,EAAA0Z,oBAAApI,SAAA4f,IAAA,QAAAA,EAEAk4B,EAAAvtD,KAAAq1B,GAE2Bk4B,EAAAvtD,KAAA,IAAAq1B,GAGzB,OAAAk4B,GAEAl8B,OAAA,CACAxF,IAAA,EACA2hC,MAAA,GAMUC,OAAA,WAAA,OAAAd,EAAe77C,EAAA5J,EAAA/C,EAAA0Z,uBAIzB,QAMQ5e,QDeF,SAAA+E,SAEQA,EAAA8M,iBAAA3M,EAAAH,EAAAG,mBAAA+C,EAAAlD,EAAAkD,GAAAjD,EAAAD,EAAAC,YAEJklB,oBAAArY,yCAKF/J,EAAQA,EAAC,GAAAkX,EAAsByvC,gBAAqB,OAClD3mD,EAAO,GAAA4mD,EAAWrzC,EAAAoB,eAA2B,aAC3C,CAAA,KACE,yBACiB,gBACjB,SAAO/G,MACFg5C,EAAA,CACL,IAAOvxC,EAAAzH,gDAST64B,MAAA,SAAe74B,GAKrB,MAAc,OADHg5C,EAAArzC,EAAA2B,oBAAAlV,EAAAA,EAAA,GAAA4N,EAAA3K,OAAA,CAAAmQ,QAAAzZ,EAAAiU,EAAA3K,MAAAmQ,QAAA,CAFP,0BAEO,CAAA8xB,MAFP,uBAQE,OACD,OAEL4d,UAAA,CAAEx0B,KAAK,SAAA1gB,GAAkB,gCAqJzBwF,SAAQxF,EAAA3K,MAAAmQ,QAAAnZ,OAAA,SAAMgJ,MAAAmQ,QAAA,oHAEX9G,EACL,OAAOA,EAAA,wBAxJ6Bu6C,CAAAj5C,EAAA1Q,IAClC4pD,WAAAlB,EAAA77C,EAAA5J,EAAA/C,EAAA0Z,gCAA2BiwC,EAASh9C,EAAA3M,EAAA+C,uEAM5CwmC,OAAA,SAAA7uB,EAAAlK,GAAqCkK,EAAAyjC,WAAA3kC,EAAAG,gBAAAqhC,WAAA,WACnC,GAAAwO,EAAY,CACV,IACEjvD,EAAAoS,EAAAg8C,uBACCn4C,EAAA3K,MACDtL,GAAA,GAEmBwb,EAAcpJ,EAAAg8C,uBAAAn4C,EAAA3K,MAAAkQ,SAAA,GACf2E,EAAQqmC,UAAAxmD,EAAciW,EAAA3K,MAAAmQ,QAAAD,QAE5B2E,EAAAqmC,YACHrmC,EAAA6lC,MAAA/vC,EAAAuP,oBAKflW,SAAA,SAAA5I,GAhBqC,IAAA4I,EAAA,CAAA,IAAA3L,EAAA23B,aAAA33B,EAAAC,gBAAA68C,UAAA,GAAA/5C,EAAAqH,MAAAy2C,WAAA99C,EAAAqH,MAAAipB,UAAA,KAsB3B,OAJDi4B,GACA3/C,EAAChO,KAAoB,IAAA+tD,EAAuDj9C,EAAA5J,EAAA/C,EAAA0Z,sBAG3E7P,YAMJ,kBAGF,8EACM4e,EAAAohC,iECvFN,aAQA9uD,EAAAL,yBACOA,EAAA,aAAiB,CAAAW,OAAA,uBAG1BkC,EAAOnD,EAAAE,EAAA,OACEF,EAAAE,EAAA,OACLF,EAAAE,EAAA,QACEA,EAAA,MACAF,EAAME,EAAA,QACJA,EAAA,QACAA,EAAA,MAGAF,EAAAE,EAAA,QACAA,EAAA,QAEIA,EAAA,UACA,0EAME,gEAIN,WAAA,eACQ,WAAa,eAGf,QAAA,eACFwvD,kBAAMpvD,EAAkBovD,gBAAqB,mBAEvC,aAAA,iBAAM,OAAA,WAAO,SAAA,wHAmQ3BC,EAAO5gD,EAAA6gD,EAAgBjnD,GACzB,OAAK,WACH,MAAO,CACJoG,KAAA,SAAAlI,GACI,OAAAA,EAAAqH,MAAgBa,IAEvBmgD,OAAO,WACT,OAAAW,EAAAC,4BAAAnnD,EAAAinD,kBAKKX,MAAA,uuBA5QD,SAAQxpD,qCAEV,SACQsqD,mBACAC,+BAEGC,gGAWC,CAAAvvD,QAAM,4DAMd,IAAAmd,EAAM9W,EACqC0E,EAAA,UACnCmkD,EAAQM,OAAAryC,EAAAI,aAAA,kBACLxS,EAAM0kD,QAAO,SAAAtyC,EAAAK,aAAA,qCAGR9H,OAAO3K,EAAA,CAAAiiC,MAAA,gBAGjB,2FAAA,CACN,KAEIjiC,EACA,YAGJ,wBAKJ8R,KAAA,CACEzH,QAAM,aACNm2C,MAAM,QACJxgD,MAAA,CAASoxB,MAAA,CAAAn8B,SAAA,IACTsuC,SAAO,CAAA,CACA5oB,IAAA,KACLuhB,SAAS,SAAS5gC,GACX,IACP0E,EAAgB,GAKd,OANO1E,EAEKkX,aAAW,4BAIlBxS,oBAIG2K,SACN,OAEI,yCACFymB,wBACY,kFAaZ,SAAMh2B,UACNupD,EAAiBC,eAAAxpD,EAAAqH,MAAA2mB,YAAA+6B,4GAYnB,kCAGJ/yB,MAAI,CAAAn8B,SAAa,SACf,CAAAA,QAAc,yCAEhB4vD,aAAI,CAAA5vD,QAAoB6vD,EAAAC,wBAEtB,CAAA,KACE,0BAEE,IAAA3yC,EAAA9W,EACE0E,EAAK,QACPoxB,MAAMhf,EAAAI,aAAkB,qDAKtBxS,EAAAglD,MAFAA,GAEA7R,SAAA6R,EAAA,sFAKRhlD,EAAAilD,yBA8KZ,OAAA3hD,sKA9KY4hD,CAAA9yC,EAAAK,aAAA,SAEE,IAAS0yC,EAAC/yC,EAAcK,aAAA,qBAAK0yC,oDAU9B,IAACnlD,EAAc,CAChBiiC,MAAoB,8BACtBt3B,EAAa3K,MAAOoxB,QACdpxB,EACF,cAAA,QAEKmkD,EAAAa,OAAA,IAAAr6C,EAAA3K,MAAAglD,QACLhlD,EAAA2hB,MAAWhX,EAAA3K,MAAAglD,SAEAI,MAAI,gBAyIf/0C,UACVA,UAAOg1C,oBAAUC,mDAIrB,MAAS,IACP,KAAArB,EAAOsB,WACL,MAAM,SACNtB,EAAgBuB,WAChB,MAAO,SACPvB,EAAUwB,WACV,MAAO,mBACL,sDA9IO96C,EAAA3K,MAAAilD,eAAAhB,EAAAyB,iCAKD1lD,EAAA,qBACF2K,EAAA3K,MAAA6kD,aAeE,MAAA,CACA,KACA7kD,EACA,aAKFyjC,QAAa,CAAA,CACNl0B,MACHoE,EAAAG,gBAAA6xC,gCAID,OAAAhB,EAAAC,eAAAxpD,EAAAqH,MAAA4mB,aAAA86B,MAIAzgB,OAAAihB,EAAAiB,uBAAAzB,cACED,EAAA,eAAQC,EAAAjnD,aACf,SAAA9B,SAAO,GAaT,SAb+BqpD,4BAC7B/7C,IAAAR,EAAEI,MAAK,CAAkBu9C,UAAS,6EAY9B5mD,wBAIN,IAAM+E,EAAQ,CACZ,IAAAogD,EAAA0B,YAAAztD,EAA6BC,gBAAAytD,WAAyBtiC,EAAMC,aAAa,CAAA,eAAgB,GAAAtoB,EAAAqH,MAAA2mB,YAAAhuB,EAAAqH,MAAA6mB,UAAA08B,EAAA9oD,GAAAA,EAAA4L,OACzF,IAAAs7C,EAAA0B,YAAAztD,EACEC,gBACAqtD,YAAaliC,EAAAC,aACb,CAAA,eACA,GAAKtoB,EAAAqH,MAAA4mB,aAAAjuB,EAAAqH,MAAA6mB,UAAA28B,EAAA/oD,GAAAA,EAAA4L,WAAIzQ,EAACs3B,mBAAAt3B,EAAAC,gBAAA4tD,aAAA,CAAA,OAAAz2B,EAAA02B,aAAA/qD,EAAAqH,MAAA6mB,kBAAEqG,mBAAct3B,EAAAC,gBAAA8tD,aAAA,CAAA,aAAA32B,EAAA42B,aAAAjrD,EAAAqH,MAAA6mB,kBAAIqG,mBAAOt3B,EAAAC,gBAAAguD,cAAA,CAAA,SAAA72B,EAAA82B,cAAAnrD,EAAAqH,MAAA6mB,oCAOzC,SANqB87B,oDAGjBjB,EAAaM,OACfzgD,EAAMhO,KAAK,IAAAwwD,EAAAC,uBAA4BrrD,EAAAqH,MAAA6mB,WAAA,IAAAk9B,EAAqBE,6BAAAtrD,EAAAqH,MAAA6mB,YAEvDtlB,+BAKJ,CACA0E,IAAAi+C,EAAAjkC,QAAAC,MACExe,QAAAsrB,EAAA82B,cAAAnrD,EAAAqH,MAAA6mB,YACqB,mBAClBnlB,QAAAsrB,EAAA02B,aAAA/qD,EAAAqH,MAAA6mB,aACA5gB,IAAAi+C,EAAAjkC,QAAAW,SACNlf,QAAKsrB,EAAA42B,aAAAjrD,EAAAqH,MAAA6mB,sDAOJ,MAAA,CAAA8H,MAAkBl0B,EAAsB4L,MAAAuoB,gBAAA3B,EAAA4B,oBAExCs1B,EAAgB,SAAA9oD,GAChB,OAAAlG,EAAgB6yB,qBAAArvB,EAAAqH,MAAAuX,QAAhBpiB,CAAgBkG,EAAAoE,YAEZkG,EAAA,CACJJ,EAAgBm1B,6BAAA,iBAAA/hC,EAAAqH,MAAA2mB,YAAAw9B,EAAAC,GACZ7+C,EAAAm1B,6BAAA,cAAA/hC,EAAAqH,MAAA4mB,aAAAu9B,GAAA,SAAAv9C,GACJ,MAAgB,CACZ27C,OAAA37C,EAAA,GACJ+nB,MAAgBy1B,QAEhB,SAAgBx9C,EAAAsB,GACZ,OAAAA,EAAAqc,WAAArc,EAAA3K,MAAAglD,SAAA37C,EAAA,OAOH,+EAAAjB,woDChWV,GAAA,IAAAnS,EAAA,MAAAL,GAAAK,EAAA,GAAAL,EAAA,IAAAK,EAAA,GAAAL,EAAA,IAAA,CAEAC,EAAAC,MAAAG,EAAA,GAGA,MAGiC,GAAA,IAAAA,EAAA,IAAAJ,EAAAC,MAAAF,EAAA,GAAA,CAC/BC,EACEC,MACAF,EAAA,GAMAA,EAAAK,QAT6B,GAAAL,GAAAC,EAAAC,MAAAF,EAAA,GAAA,CAApBC,EAAAC,MAAAF,EAAA,GAabC,EAAAE,IAAAC,KAAAC,GAAsC,MAElCL,EAAA,IAIUC,EAAAE,IAAaG,MACdL,EAAAM,KAAAD,MACH,SAGED,EAAAG,EAAUC,KAAAC,EAAAT,SACNU,GACNN,EAAM,CACH,EAIHM,GAGFC,EAAO,EAEV,cAID,GAAS,EAALP,EAAA,GACF,MAAMA,EAAA,SACN,OACKA,EAAA,GAAAA,EAAA,QAAA,EACLQ,MAAA,qBA/BgCa,eAAAzC,EAAA,aAAA,CAAAW,OAAA,IAAzB,IAAAotB,EAAAruB,EAAAE,EAAA,KAoCbmD,EAAgBrD,EAAAE,EAAA,KACd4D,EAAO9D,EAACE,EAAA,MAEFF,EAA+BE,EAAA,MACjB,SAAAmW,YAEdk7C,EAAapxD,EAAA0P,EAAAwsB,EAAAk2B,EAAAl3B,EAAA9mB,UACf8B,EAAOvU,KAAAM,KAAYjC,EAAA0P,EAAAwsB,EAAA,GAAAhO,EAAAmkC,SAAA1uD,EAAA2uD,WAAAp2B,EAAAk2B,EAAAh+C,GAAA,CAAA8nB,EAAA9jB,OAAA8iB,IAAAj5B,cAFfmvD,EAAcl7C,KADF,GAQdmlB,2BACK+1B,sNAML90B,EAAA5xB,IAAAuL,EAAArH,KAAAvG,EAAAA,EAAA,GAAA4N,EAAA3K,OAAA,CAAAoxB,OAAAzmB,EAAA3K,MAAAoxB,yCAFJ61B,EAAer8C,eAGPvG,SAAM,SAAAvG,0HAOdumD,EAAOnnD,EAAAinD,qCA3BX/kD,EAAA,EA+BA6lB,EAAArtB,EAAA6hB,eAAAkS,EAAAsF,OAAAr5B,CAAAkG,EAAAoE,WAIA,GAJ+C+iB,IAC7Cta,EAAAsa,EAAAta,OACEsa,EAAA7lB,MAEJuL,EAJ+C,OAAA,SAM/C,uBAOG,OAAA,GAAO,sEAUO,CAAS,kBARC,CACN,EACL,GAMR,KAAS,EAGXxO,EAAAmB,OACSjC,GACLA,EAAW0H,QAKjB5G,EAAArG,MAAS,mCAvCTmxD,iBAAAA,uoBC5EJ1yD,EAAAC,EAAA,aAQEU,EAAAL,OAEEo6B,IADKt4B,MAAOA,KAAAu4B,YACZD,EAAY,SAAAnW,EAAAqW,GAWZ,OAVAF,EAAcn6B,OAAAs6B,gBAAA,CAAAC,UAAA,cAAAp4B,OAAA,SAAA6hB,EAAAqW,GAGdrW,EAAKuW,UAAaF,IACd,SAAWrW,EAAAqW,GACb,IAAK,IAAI1W,KAAA0W,wBAGLrW,EAAAL,GAAY0W,EAAA1W,MAEGK,EAAAqW,aAIVrW,EAAAqW,YAITG,IACA34B,KAAA44B,YAAmBzW,IAFbA,EAAQqW,eAIR,OAAAA,EAAAr6B,OAAkBgG,OAAAq0B,IAAAG,EAAAvvB,UAAAovB,EAAApvB,UAAA,IAAAuvB,aAGnB34B,KAAAoG,UAAA,mDAEL,IAAAnG,EAAMC,EAAA,EAAA2hB,EAAAzhB,UAAiBC,OAAUH,EAAA2hB,EAAC3hB,QAEhC,IAAG4hB,OADH1hB,UAAWF,GAKX/B,OAAAiL,UAAAqU,eAAA/d,KAAiBO,EAAA6hB,KACjB7iB,EAAK6iB,GAAA7hB,EAAA6hB,WAEP7iB,IAIIoQ,MAAUrP,KAAOI,kCAElBlC,EAAa,aAAA,CAAAW,OAAA,UACRjB,EAAYE,EAAA,gBAE1B8C,EAAAhD,EAAAE,EAAA,eAvDakf,EAAApf,EAAAE,EAAA,IA0DbyyD,EACE,SAA4Bv8C,EAAkDtP,EAAA8rD,GAC5ExwD,KAAMgU,KAAAA,EACNhU,KAAK0E,KAAAA,OACH8rD,OAAOA,+CAGLx8C,EAAA3K,MAAUoxB,OACZz6B,KAAM2E,IAAKO,aAAM,aAAA,cAEf+mC,OAAekG,SAAIC,cAAU,sBACxBxtC,IAAA,gCACL8e,YAAA2Z,2BAGFr9B,KAAA2E,IAASO,aAAA,eAAA8O,EAAA3K,MAAA0kD,QAAA,OAAA,sDAGX1vD,EAAO4P,UAAArJ,IAAA,kFAlBXvG,EAAAk3C,gBAAA,QAsBgBl3C,EAAAoyD,UAAA/rD,EAAAgsD,SACPryD,EAAA8G,iBAAqB,aAAkD,SAAAwrD,GACtEA,EAAAhgB,oBAEJtyC,EAAA8G,iBAAO,UAAA,SAAAwrD,oBAGLznD,EAAAsxB,cAAUg2B,IAAAx8C,EAAArH,KAAAvG,EAAAA,EAAA,GAAA4N,EAAA3K,OAAA,CAAA0kD,QAAA4C,EAAAvoB,OAAA2lB,WACN9sD,EAAW2pB,iBAAA4lC,IAAA,EAAXvvD,CAAWiI,GACjBxE,EAAAiE,SAAeO,uGATrBlJ,KAAA4wD,WAAAl9C,EAiBA2pB,EAAA3Z,YAAAhQ,aAKSm9C,EAAA32B,UACL,SAAS/yB,EAAUwB,OACjBmoD,EAAM7vD,EAAW6yB,qBAAAoG,EAAXj5B,CAAsCkG,EAAAoE,eAC5CulD,SACK,mBAIX,OAAAA,EAAA98C,KAAA3K,MAAA0kD,QAb4CgD,EAAA7nD,EAAA4nD,EAAA,MAe5CC,EAAA7nD,EAAA4nD,GAAA,GAGEnoD,EAAAO,GAEE,OAAK,YAIL8nD,EAAiB92B,UACjB,SAAO/yB,EAAYwB,gDAEvB,IAAAmoD,GAAA,OAAAA,EAAA98C,KAAA3K,MAAA0kD,QAZkD,OAAA,EAelD,GAAgBplD,EAAA,CACP,IAAIO,EAAA/B,EAAA+B,GACH6nD,EAAe7nD,EAAA4nD,GAAAA,EAAA98C,KAAA3K,MAAA0kD,SAEfplD,EAAAO,UAGJ,iCAdG2nD,yBAAAA,mCAuBIG,QACF,SAAA/8C,4FACL67C,EAAO77C,GAlBb67C,EAAA1mD,UAAAsE,SAAA,SAAAvG,GAwBA,QAAgBnH,KAAA2N,UAAAxG,IAKa,OAHblG,EAAA6yB,qBAAA3sB,EAAA1C,OAAAqH,MAAA6mB,UAAA1xB,CAAAkG,EAAAoE,WAGayI,KAAA3K,MAAA0kD,WAZlB,wDAwBE,SAAA95C,YAEP87C,EAAO71B,gGAcX,WAfSjmB,GAMX87C,EAAyC3mD,UAAuBsE,SAA8B,SAAAvG,GACzF,IAAA2pD,EAAc7vD,EAAc6yB,qBAAkB9zB,KAAAk6B,SAAhCj5B,CACZkG,EAAAoE,2CAOCwkD,EAhBK,GAiBL/2B,+BA4CK9vB,EAAA4nD,EAAAG,mHA3CXlB,6BAAOA,wCAJT,OAAA,IAAAnvD,EAAA4kC,UAAA,iBAAA,SAAAr+B,EAAAuL,EAAAsY,EAAA9K,GAOM,IAAAzb,EAAe0C,EAAA1C,OACfqsD,EAAiB7vD,EAAA6yB,qBAAArvB,EAAAqH,MAAA6mB,UAAA1xB,CAAAkG,EAAAoE,WAEvB,GAAgBulD,EAAA,CAEV,IAAA5nD,EAAA/B,EAAA+B,GAME,OALF6nD,EAAiB7nD,EAAA4nD,EAAAp+C,EAAA,IAGfxJ,EAAAy8B,OAAA3a,EAAe9K,GAEXhX,EAEN,OAAO,yCAUQzE,SACX,sBACF7D,EAAU8lC,kBAAA7tB,EAAApU,EAAAqH,MAAA2mB,0BACO+S,UAAA3sB,GAAA,SAAA1R,EAAAuL,EAAAsY,EAAA9K,SACjBgxC,EAAYpqD,QAAMK,EAAAuL,EAAAsY,EAAA9K,aAElB4wC,EAAU7vD,EAAA6yB,qBAAArvB,EAAAqH,MAAA6mB,UAAA1xB,CAAAiI,EAAAqC,kBACVulD,GACAC,EAAY7nD,EAAM4nD,EAAAp+C,EAAA,IAElBxJ,EAEF,OAAO,SAhCbhL,EAAAizD,2BA0CS1sD,EAAAugD,EAAA+I,OACL3+B,EAAA3qB,EAAS6G,MAAA8lD,WAAYjtD,OAAY,CAAAtB,OAAU,aAC3CouD,EAAQxsD,EAAAvC,MAAA6rD,EAAA,MAAA,OAAA,IAAA,CAAA3+B,oFCpPZiiC,EAAAr0C,EAAAoC,UAAA5B,GAAA,SAAApC,GAEA,GAAA,UAAAA,EAAAnc,GAAAqyD,EAIM,OAHNA,GAAA,EAGqB,CACfryD,EAAA,MAEAoc,EAAA,IAEA,GAAA,QAAAD,EAAAnc,QAA2BmX,IAAA23C,EAAA,CAS3B,IAAA7rD,EAAAkZ,EAAAC,EAeA,YAdAnZ,EAAAyU,OAAwB,IAEdo3C,GAAe,EAEvBuD,GAAkB,EAGpBpvD,EAAcA,EAAA0U,MAAC,UAAyB1U,EAAAyU,OAAA,SACxC26C,GAAY,EAA8CpvD,EAAAA,EAAA0U,MAAA,IAIxDm3C,EAAkB,KAEd,CACF9uD,EAAA,MACFoc,EAAAnZ,gDAUFsb,OAAA6zC,kFASFzzD,EAAAE,EAAc,MAAsBF,EAAME,EAAA,gBAQ1B,IAAAkiB,OAAU,kDAAA,shBC1D9B,SAAAuxC,EAAArzC,EAAAszC,EAAAxM,EAAAvtC,GAOA,IAAAA,GAAA+5C,GAUAtzC,EAAAyjC,WAAA3kC,EAAAG,gBAAAqB,IDwC2B,wCCrC3BN,EAAA8uB,aAAAgY,KD6GEiJ,wBAtEWxsC,EAAQ+rC,SAEX/rC,EAAShd,SACP,SAA4C2W,UAGlDA,EAAIC,KAIF,SAAWD,eAKN,SAAS6I,MAChBupC,EAAOiB,MAAY,CACnB,IAAA/0C,EAAOuK,EArBQ,GAqBRhlB,oDAEF+1B,EAAAs4B,gBAAAoB,aAKF,OAAA15B,EAACs4B,gBAA2CoB,cASjDjtC,IAAOhd,EAAWqH,MAAA4mB,iBACT,SAAAtX,OACL6I,EAAO7I,EAAMC,WACb,CACAgzC,MAAOb,EAAWa,MAAApqC,EA1ChB,GA0C6C,oBAEjDiqC,aAAkBV,EAAAiB,MAAAxqC,EA1CG,GA0CHhlB,EAAA+1B,EAAAm5B,gBAAAC,wCA7ChB,6BA6BR,OAAA,SAAArhB,EAAA3xB,GAuBA,IAAgBopB,EAAAud,EAAsB3mC,GAC7B/R,EAAAk8B,EAAuBnqB,GAC5B/R,EAAAoxB,MAAO+J,EAAWnkC,QAAAmkC,EAAA,GAAgBnkC,QAAY,UAAAmkC,EAAA,GAAA,GAAAvlC,IAC5CojD,SAAK5gC,EAAQpY,KAAQiJ,SAAA,SAAAqe,qEAH3B8gC,EAAA1D,QAAA2D,EAAA3D,QAQgBvwC,EAAAk0C,EAAAl0C,uBAAhBuvB,EAAA+S,YAAAtiC,GASSuvB,EAAAyS,eAELzS,EAAOyS,gDAMcgO,mBACXtvC,EAAQlK,6EAIpBkK,EAAOyjC,WAAA3kC,EAAAG,gBAAA6xC,aAAA,oCAGA9wC,EAAA6lC,MAAoByJ,EAAsBa,MAA0Br6C,EAAqB3K,MAAAglD,MAAA,GAC1FnwC,EAAeyjC,WAAM6L,EAAAiB,MAAAz6C,EAAA3K,MAAAilD,aAAAt5B,EAAAs4B,gBAAAoB,cAEpBxwC,EAAWyjC,WAAA6L,EAAAiB,MAAA1oB,EAAA/Q,EAAAm5B,gBAAAC,iBAEdlwC,EAAIomC,YAAS,WACXtwC,EAAM1B,SAAA,SAAA6gB,GACN,OAAOw+B,EAAWzzC,EAAmB5a,EAAA6vB,+CAahCq6B,mBACLtvC,EAAOlK,8JAUO3M,gCCjJtBzJ,EAAAC,EAAA,IACA,WAEAD,EAAME,EAAA,IAANF,CAAM,qCAAa,wsDAInBA,EAAMC,EAAA,IACN,SAAMU,EAAAL,GAEN,IAAMkI,EAAApG,MAAYA,KAACoG,UAAyB,kBAClCA,EAAAjI,OAAA06B,QAAA,SAAA55B,GAEF,IAAA,IAAAgB,EAAYC,EAAA,EAAA2hB,EAAAzhB,UAAAC,OAAAH,EAAA2hB,EAAyB3hB,IAGzC,IACE,IAAA4hB,KAFG7hB,EAAAG,UAAAF,GAGD/B,OAAMiL,UAAAqU,eAAA/d,KAAAO,EAAA6hB,KACN7iB,EAAM6iB,GAAA7hB,EAAA6hB,eAIJzS,MAAArP,KAAWI,oBAGPJ,KAAKD,gBAAA,6BACLK,UAAAC,OAASH,EAAkBC,EAAAD,uHAK/BO,oEAIF7C,EAAAE,EAAQ,UACN,oBAGI,mBAGJ,MACAF,EAAAE,EAAQ,gBAGVF,EAAAE,EAAW,MAAMF,EAACE,EAAA,oBACU,0BAsEkB8zD,EAAMC,wDAKlDxoD,EAAAjD,EACJ,CAKE0rD,IAAKC,UAAa3pB,MACpBnhC,MAAS+qD,EAAA5pB,MACP6pB,IAAM,MACOt4C,EAAUwnC,kBAAgB/lC,KAAA,IACvCw2C,qCAKA7kB,EAAAsV,SAAQuP,EAAAntD,EAAAqH,MAAA8lD,OAAAntD,EAAAqH,MAAA1J,MAAAiH,GACNuoD,GACA7kB,EAAK+S,YAAc1kC,EAAAC,iCAOvBu2C,EAAArrD,0FA9CN2X,EAAAja,WAAA+Z,gBAoDSE,EAAAqmC,UAAsBvwC,EAAgB3K,MAActL,GAAAiW,EAA0B3K,MAAAmQ,QAAAxF,EAAA3K,MAAAkQ,UAEvE2E,EAAAqmC,qCAIFqN,EACI1zC,EAAA8uB,aAAmBh5B,EAAAN,SAEnBwK,EAAA0hC,UAAA5rC,EAAA3K,MAAA4oD,QAGZ/zC,EAAO6lC,MAAA,gDAQJmO,EAAAv4C,EAAAogB,oBAAA/lB,EAAA3K,SAAA6U,EAAAja,WAAA+Z,iBAAAE,EAAAja,WAAAga,SAMP,IANQjK,EAAA3K,MAAA+4B,KAAA8vB,KAAOnlB,EAAA,yDADjB7uB,EAAAi0C,iBAAAruC,KAOE8tC,EAAA,SAEwC59C,EACtC3K,MAAU+oD,SAEEC,EAAW,WACdn0C,EAAAo0C,UAAAt+C,EAAA3K,MAAA+oD,OAAA,GAAA,KAAArlB,KAGL7uB,EAAWyjC,WAAM3kC,EAAYG,gBAAA0hC,KAAAwT,QAEjCtlB,KASJ,SAAgBwlB,EAAmB9tD,EAAiBqf,EAAAipB,GAClD,IAAAylB,EAAAC,EAAAC,kBAAA5uC,OACE0uC,EACA,OAAO,KAEPzlB,EAAO,CACH,IAAA1jC,EAAWspD,EAAmB7uC,SAKmC,OAAA,EAXzEza,EAAA+4B,KAAA,EAWgB2K,EAAA0S,QAAkBh7C,EAAaqH,MAAA1J,MAAAiH,EAA0B,WAErEmpD,WAEAI,EAAQ5+C,EAAa69C,UAEvB,uBAQMgB,EAAa7+C,EAAA69C,EAAsBt2C,QACjC,IAAJA,IACFA,GAAO,OAEP3Z,EAAO,CAAAkwD,IAAA99C,EAAA3K,MAAAyoD,yBANXlwD,EAAAqF,MAAAA,GAWE,IAAAgrD,EAAOj+C,EAAA3K,MAAC4oD,KAAoBj+C,EAAAuP,mBAC1B0uC,IAEArwD,EAAKqwD,IAAAA,+DAOYG,EAAOP,YAClBzrD,EAA+B,KACnC,SACA,CAAI9H,QAAA,mBACM,oBACR,MACA,CAAA8zD,OAAI,CAAA9zD,QAAa,OAAa,IAAAuzD,EAAQl4C,EAAAoB,eAAA,eAG/BU,EAAAo2C,EAAAn2C,QACL,WACA,SAEF,oBACQ,QAAA,0BACN,UAAgB,+CAMlBtV,EAAA,GAAAiD,GAAAwoD,EAA0Bl4C,EAAcoxC,mBACvCtvC,EAAApS,EAAAqS,GAAA,eAMHoI,OAGFtc,yBAAOsrD,gBAAAhvC,EAAA,qGAIF,cAILivC,EAAOC,EAAAnB,UACP,SAAU1qD,EAAAwB,EAAAjE,GACV,IAAAD,EAAO0C,EAAA1C,WAAAqmB,EAAA/I,cAAA5a,EAAA1C,EAAAqH,MAAA1J,SAAA0oB,EAAA/I,cAAA5a,EAAA1C,EAAAqH,MAAA8lD,QAAM,OAAC,sBAITnwC,EAAgBhd,EAAoBqH,MAAA1J,MAChC6wD,EAAA,KACFC,EAAc,KAChB,GAAA3nC,EAAA4nC,qBAAA1uD,EAAA0C,EAAAoE,WAAA,QACEyI,EAAA7M,EAAAoE,UAAAyI,+BAIItP,EAAAs5B,QAAA72B,EAAAoE,UAAAqG,ytBAtJJwhD,EA8BXl1D,EAAAm1D,wBAAAA,IA+CQT,mBAAoBA,uBAmBaC,uBASzBS,0BA8BZX,mBAAgBA,oFAlOhBY,EAAUv2C,EAACe,yBAAe5N,kBAW1BgG,KAAS,QACPgF,KAAA,CACEkwB,QAAA,EACAhiC,MAAAiqD,GAAA,EAAkBC,GACf1J,MAAA,gDAMwBtkB,SAAiB,SAAA5gC,GAC5B,OAAA6uD,EAAA7uD,EAAA4uD,MAGd1mB,MAAK,SAAA74B,GACJ,OAAU4+C,EAAO5+C,EAAAu/C,KAGlBtuD,OAAA,CAID6nC,QAAQ,CAAA,CACCl0B,MAAAoE,EAAAG,gBAAsBs2C,wBAKhC9K,iBAAQx4C,EAAA8N,SAAAs0C,OAAAn8C,EACV22B,OAAOsmB,GAAkB,EAAA9sD,IAE3BmtD,UAAO,yDAIKC,aAAwB,EAC9B7G,OAAsB,WAEf,OAAAiG,EAAAxsD,EAAAgtD,0BAKAK,2GAGHnvD,YACK,GACFovD,6BACEC,kBAAevtD,q2CChJlC,GAAA,IAAAjH,EAAA,MAAAL,GAAAK,EAAA,GAAAL,EAAA,IAAAK,EAAA,GAAAL,EAAA,IAAA,CAGAC,EAAAC,MAAAG,EAAA,GACA,MAGA,GAAA,IAAAA,EAAA,IAAAJ,EAAAC,MAAAF,EAAA,GAAA,CAGEC,EAAAC,MAEAF,EAAA,8CAMMC,EAASE,IAAKC,KAAAC,GAGhB,MAGgBL,EAAA,IAChBC,EAAAE,IAAQG,MAEVL,EAAAM,KAAAD,MAMA,WAUAE,EAAIC,KAAAC,EAAaT,wDAYjB,gBAIII,EAAA,GAAOA,EAAA,QAAA,QAGE,qEAAA1B,EAAAE,EAAA,SACfA,EAAI,UAIF,oBAEI,wCAEA2jB,EAAU/c,EAAAsuD,EAAAnB,gFAKV7xD,MAAW,SAAOwF,UACtBA,EAAArG,uBAIEuF,EAAIyC,MAAO1C,WACUmd,SAAAoV,aACnB,+BAGA5wB,EAAAA,EAAW,GAAA4N,EAAY3K,OAAA,CAAA4oD,IAAAxwC,IAAAhd,EAAAqH,MAAA8lD,OAAA59C,EAAAuP,YAAAvP,EAAA3K,MAAA4oD,QACvB7rD,EAASA,EAAK,GAAAhE,GAAA,CAAAmX,SAAAhX,EAAAqhC,kBAAAxhC,EAAAmX,gBAACw6C,oBAAA3xD,EAAA6gC,OAAcx+B,EAAQqH,MAAA1J,+CAGnC,OAAOgtB,EAAAziB,OAAUlI,EAAU6G,MAAAmrB,aAEd27B,OAAA4B,EAAA3qD,MAAAw1B,oBAKbz8B,EAAAqf,EAAUtd,OAAA/B,GAAAiH,YAIV3E,EAAUyC,MAAA1C,OAAAqH,MAAA1J,MAAAM,EAAAggC,UAAA+wB,MAAA/wD,EAAAggC,UAAAuxB,oBAGVC,UAAW9xD,EAAS6gC,EAAK4uB,WCpF3B,WDuFAlrD,UAEFgG,IAAIjK,EAAWggC,UAAUuxB,QAAU7xD,EAAA6vD,MAAA7pD,EAAA6pD,QACjC7pD,EAAA6pD,gDAKanxD,EAAuB8gB,SAAYoV,8BAQlDm9B,EAAM/rD,EAAA+rD,OAAA/rD,EAAA+rD,QAAA5xD,EAAAkgC,WAAA,GAAAr6B,EAAA+rD,MACH/rD,EAAA20B,4EAnHTpjB,EAAAc,aAwHoDsiB,EAA4Bo3B,KAGvE/rD,EAAA80B,QAAAi3B,IAAA5xD,EAAAC,wBC7GYu6B,EAAAG,EAAA+F,eAAN/F,GAAE+F,IACJvgC,EAAAsgC,qBAAKjG,EAAAG,EAAA+F,GAAA,GD4GTmxB,CAAAhsD,EAAA20B,MAAA30B,EAAA80B,OAAA+F,KACE1pB,EAAAA,GAAA,iQCpIX86C,EAAA5yC,EAAAC,cAAA4yC,EAAA5gD,EAAApI,KAQAwf,EAAAypC,oBAAA7vD,EAAA2vD,IAQY3vD,GACCA,EAAA0H,QAEA,CAAA,mDAaIhG,UAAY,mCACjB,SAASnH,eACT,EAAA4iB,EAAAzhB,UAAiBC,OAAAH,EAAA2hB,EAAa3hB,YAEhC4hB,mIAQJ5jB,EAAY,aAAA,CAAAW,OAAqB,qBAEnCjB,EAAAE,EAAA,MAEOF,EAAAE,EAAA,KACLF,EAAAE,EAAM,MACNF,EAAAE,EAAK,ICtDXI,EAAA61D,6BDuDe3xD,EAAA6gC,QACT1pB,SAAU,CASZ,iBAPK2jB,OAAA,EACLi3B,OAAO,kCA5CXx6C,EAAAc,aAgDgBd,EAAAe,eACPtY,EAAAmX,UACL0H,EAAc,EAAAzb,EAAIgvD,EAAgBr4C,YAAA8E,EAAAzb,EAAAnF,OAAA4gB,IAAA,CAClC,IAAApH,EAAArU,EAAeyb,GACflP,EAAA8H,EAAgB,GAAAhb,EAAAgb,EAAA,qCAJpB46C,IAQgBA,EAAgB7xB,KAAmB6xB,EAAA7xB,MAAArgC,EAAAkgC,WACxC//B,EAAaigC,qBAAS8xB,EAAA7xB,4BADjC7F,EAAA03B,EAAA3jC,KAIgBqjC,EAAoBM,EAA6B7xB,MACpC7wB,IAAoB4H,EAAAe,gBAC3CwiB,EAAoBu3B,EAAA3jC,KACbqjC,EAAAA,GAAAM,EAAA7xB,MAEDzmB,GAAkB,IACpBA,GACFq4C,EAAsBn4C,KAAAhd,KAASwa,+DAPvCkjB,MAAAA,EAgBgBG,OAAAA,EACPi3B,MACJA,cAFL56C,SAAAi7C,EAAAn4C,0CC1FA,SAAA42C,EAAAzwB,GACA,MAAA,CAEMW,aAAgB8vB,EAAA9vB,cAAA,KAEtBC,cAAgB6vB,EAAA7vB,eAAwB,KACtCZ,eAAW9/B,EAAAgyD,qBAAsBlyB,gCAIpB1R,yEAKEroB,EAAA/D,gCAGH,KACN,KACAiwD,EAAOjwD,EAAAyC,MAAaK,IAAGZ,QAAU6B,KAC3BxH,EAAA2zD,2BAAAD,GAAA,SAAAp9B,4BAA0C,OAC5C7yB,EAAYmwD,SAAKC,EAAArsD,IAAA,KAAiB2yB,EAAI25B,uBAAAC,EAAAhhD,MAAA+oB,wDAO9CjZ,EAAOyQ,WAAArO,cAAA/M,WAAA,gCAxBXhb,OAAAwC,eAAAzC,EAAA,aAAA,CAAAW,OAAA,oFCiCIg1D,oCCtCJ,OAAA,IAAA9yD,EAAAoQ,OAAA,CAEAY,IAAgBw9B,EACdpoC,MAAO,oBADT,OAAAnG,EAAA+nC,cAAA/R,6IDOA,mJAVAhjB,KAAAA,EAIAvL,IAAAA,GAGA,CAAA6iC,MAAA,gCAGAtqC,EAAA+nC,cAAA5kC,OAAA+E,EAAA1B,IAAAkiC,KAmBA/3B,MAAA,CACA+3B,YAAA,SAAAviC,GACA,OAAAooC,EAAA3G,SAAAzhC,qDAcUjJ,EAAO,aAAA,CAAAW,OAAA,UACPjB,EAAWE,EAAA,+BACXwwB,EAAYjlB,YACF+hC,WAAAp3B,KAAAsa,EAAA7lB,IAAA6lB,EAAA7lB,IAAA6lB,EAAAta,KAAAtL,SAAAW,4CAQJtJ,gBAAe,uCACbM,OAAOH,EAAAC,EAAAD,oDAEP,EAAAA,EAAOC,EAAAD,+BACLQ,EAAKF,EAAAH,OAAAI,EAAAC,EAAAD,IAAAF,0FAOf3C,EAAAE,EAAA,wHA4Hc2G,GAAY2lB,MAAA,SAAAzd,WAG5B1L,EAAsB2zD,2BAA2B1yC,GAAO,SAAAlO,UACxDA,EAAIrH,OAAQA,qEAYpB,MAAS,CACHlI,EAAIqH,MAAMiqB,WACZtxB,EAAMqH,MAAS6mB,UACfluB,EAAMqH,MAAOmpD,0BAGbC,EAAOhsD,6BAIX,SAASisD,EAAuBjsD,GAC9B,IAAAzE,EAAWyE,EAAA1B,IAAMmF,KAAAlI,iDAGnB6N,SAAe,SAAAlQ,yKE3Nf,GAAAqC,EAAA6G,MAAAmrB,KAAAI,QAAAz0B,EAAA4R,KAAA1I,OAAA,CAGA,IAAA8pD,EAAA/+B,EAAAg/B,aAAAnsD,EAAA1B,IAAA,CACAoK,KAAA0jD,EAAA7sD,IACAoJ,GAAAyjD,EAAA7sD,IAAArG,EAAA4R,KAAAtL,UAEAjE,EAAA6G,MAAAmrB,MAEA2+B,GAAAA,EAAAv2B,OACAx1B,EAAA+oD,OAAAgD,EAAAv2B,MAWgB,IAAAnrB,EACdrK,EACA4oD,IACAnxD,EACA8gB,SAAkChQ,KAAAnN,EAAAvC,KAAAmH,EAAA4oD,MAAAnxD,EAAA8gB,SAAAoV,0CAG5B46B,GACG1oD,EAAI+f,iBAAAqsC,EAAa7sD,IAAI6sD,EAAA7sD,IAAArG,EAAA4R,KAAAtL,SAAAkpD,2CF6K9B2D,gCAAsCA,IErHpCj3D,iEFhBI0e,EAAQe,yBAAA5N,8CAQEmjD,oBAAO,EAAAC,kGAUTiC,eAAA,aACFjwB,SAAM,SAAU5gC,GAChB,IACOsuD,EADCtuD,EACD0nC,cAAA,OAEF,OAAI4mB,GAAAA,EAAAzkC,aAAuB7pB,EACzBjC,EAAgB8wD,kBAAMP,EAAAM,GAEtB,wCAMev/C,UAC1B,SAActR,EAAAkwD,mBAAA5+C,EAAiBu/C,8DAW7B7wD,EAAO2wD,yBAAA,EAAA9sD,0EE/BQ6U,UACvBA,EAAKnc,IAAA+d,EAAAG,gBAAkB0hC,MAAiBzjC,EAAAC,GAAA,IAAAD,EAAAC,EAAAhb,6DF8C9BqC,EAAA0wD,oBAAA,EAAAG,EAAA7wD,CAAA+B,EAEAqC,CAAcimC,EAAA3xB,EAAAC,EAAA,KACX,KE3FjB,SAAAD,GAyBE,GAAAA,EAAAnc,IAAA+d,EACEG,gBAEAshC,SACA,CAJF,IAAA57C,EAAAuY,EAAAC,EAAA2B,EAAAoB,iBAFQlc,EAAAkZ,EAAAC,EAAA2B,EAA0Cy4C,kBAWhD,MAAoB,SAAd5yD,GAAmB6yD,EAAAC,iBAAAzzD,IAAAuwD,EAAAC,kBAAAxwD,GAIzB,OAAK,kEF0CDmH,EAAA+4B,KAAA,EACQ2K,EAAA0S,QAAAh7C,EAAAqH,MAAA8lD,OAAAvoD,EAAA,KACM,mDActB,OAAA5E,EAAAqH,MAAA8lD,QAOS9E,OAAA,2CAI0Bv5C,OAAO,SAAMqgD,GAAW,MAAO,CAAA,SAAM1qD,EAAA0sD,uCAI/D1sD,KAKD2sD,kBAAS,SAAApxD,GACR,MAAQ,CAAA,CAEP0R,KAAA,iBAGDib,WAAe,SAASpd,GAErB,OAAcA,EAAIrH,OAAQlI,EAAAqH,MAAe1J,OASvCuvB,OAAQujC,gBAMFY,4BAAoBrxD,YACrBsxD,EAAMC,qBAAA,SAAAzvD,EAAA5C,EAAAwM,2BE1FhBjS,yBACEA,EAAS,aAAA,CAAAW,OAAA,qBAIVjB,EAAAE,EAAA,MACJF,EAAAE,EAAA,MACAF,EAAAE,EAAA,gBAYIF,EAAAE,EAAA,MACDF,EAAAE,EAAA,kBAIL,oCACmB6O,EAAIpG,EAAA5C,EAAAwM,OACvB3K,SACE,IAAAzE,EAAiBoQ,OAAA,qCAEnBQ,MAAS,CACPu9C,WAAK1pD,EAAY,GAAAA,EAAAmH,GAAA,SAAAqH,EAAAtP,EAAA8rD,8BAEVhrD,cAUD,oBACNywD,EAAUjiD,EAAAtP,EAAA8rD,EAAkBwC,EAAAkD,EAAA/lD,OAC5B1M,EAAKzD,UAGLm2D,mBAAsB,SACtB1xD,EAAKuP,EAAArH,KAAAlI,YAGLkI,KAAKqH,EAAArH,OAAalI,EAASqH,MAAA1J,MAAcM,EAAAggC,UAAA+wB,MAAA/wD,EAAAggC,UAAAuxB,YACzCjgD,KAAKA,OACLtP,KAAKA,OACL8rD,OAAKA,OACLqB,gBAAgB70C,EAAAe,yBAAa5N,QAC7BimD,gBAAkBjmD,EAAKkmD,sBACvBrD,SAASA,OAGTsD,SAAK,qBAGA,MACLC,EAAW,WAEX,IAAArtD,EAASxE,EAAAyC,MAAO+B,GAChBA,EAAAyC,aAAK5K,EAAA2tB,cAAAvqB,OAAAO,EAAAyC,MAAAK,IAAAgpD,MAEL9rD,EAAKiE,SAAAO,MAQG,SAAAynD,2BAKV3wD,KAAIizD,IAAK9gB,SAAAC,cAAiB,YACxB6gB,IAAAhlD,UAAArJ,IAAA,qCAIFnB,EAAK+yD,WAAA,QAIHvD,IAAAwD,QAAK,2BAIFz2D,KAAAizD,IAAAyD,QAAAH,EACLv2D,KAAIizD,IAAK0D,sBAtBTJ,IACEK,EAAUC,YAAgBpzD,EAAKuQ,KAAAy+C,EAAAqE,uBAAArzD,EAAAwvD,IAAAxvD,EAAA++B,kBAAA/+B,EAAAuQ,KAAArH,KAAAlJ,EAAAiB,KAAAsuD,EAAAvvD,EAAAouD,kBAsB/B7xD,KAAK2M,OAAAjK,EAAAggC,UAAAuxB,OAAA,2CAEPj0D,KAAK2E,IAAAsJ,UAAArJ,IAAA,aACL,IAAKy4B,EAAA8U,SAAAC,cAAA,OACL/U,EAAKkY,gBAAA,2BAGAlY,EAAA1L,OAAA3xB,KAAAizD,KAELjzD,KAAS+2D,YACL/2D,KAAKg3D,WAAA7kB,SAAoBC,cAAe,cAC1CpyC,KAAKg3D,WAAI/oD,UAAYrJ,IAAA,kEAIvB5E,KAAKg3D,WAAAN,QAAAO,EAGLj3D,KAAKg3D,WAAAL,WAAAM,kCAGAj3D,KAAA2E,IAAAgtB,OAAA3xB,KAAAg3D,YAELh3D,KAASk3D,wBAEPl3D,KAAK2E,IAAIwtC,SAAAC,cAAY,kCAIvBpyC,KAAK+2D,iCAIA/2D,KAAAg3D,WAAA,UAGHryD,IAAAwyD,YAAO,SAAAtwD,sBAIJA,EAAO8pC,iBACP9pC,EAAA+pC,yBAMDihB,mBACKuF,oBAAAp3D,KAAA2E,gGAKF0yD,qBC1LT,SD6LSjuD,UAAAkuD,QAAA,oCAIFt3D,KAAAm2D,+CAKCn2D,KAAAu3D,0BAARv3D,KAAAw3D,oBAGSpuD,UAAAquD,WAAA,+DAIDz3D,KAAA4wD,YAAgB5wD,KAAMgU,KAAArH,KAAAwO,KAAAu8C,YAC5B13D,KAAS2E,IAAA+yD,WAAW,QAIlBR,8EAMFl3D,KAAK2E,IAAIsJ,UAAQo2B,OAAA,6BACbrkC,KAAK4wD,YAAW5wD,KAAOgU,KAAArH,KAAAwO,KAAAu8C,YACzB13D,KAAK2E,IAAI+yD,WAAQ,GAInB13D,KAAKw3D,oBAMApuD,UAAA6/B,OAAA,SAAAj1B,oCAKLhU,KAAAgU,KAAAA,mBAGMhU,KAAAs2D,SAARqB,EAAAC,qBAAA53D,KAAAizD,KACQjzD,KAAAs2D,SAAArtB,UAEFjpC,KAAAs2D,SAAKuB,SACL73D,KAAAs2D,SAAK,6BAGTt2D,KAAK83D,kBAGC,MAEJ1uD,UAAc2uD,eAAK,SAAAv6B,UACnBx9B,KAAK4wD,aAAA5wD,KAAqB4wD,WAAAxsB,SAAA5G,EAAA4K,0CAKtB,IAAA3kC,EAAAzD,KAARA,KAAAm2D,oBACMn2D,KAAKm2D,2BACiBn2D,KAACgU,KAAA3K,MAAAyoD,iBAAE9xD,KAAKgzD,SAAK3vD,QAAA20D,iBAAAlG,WAAU,gKAE/C9xD,KAAKgU,KAAA3K,MAAWpC,8CAIZjH,KAAAizD,IAAAhB,IAAAjyD,KAAAgU,KAAAuP,aAARvjB,KAAAgU,KAAA3K,MAAAyoD,IACE9xD,KAAIk3D,wBACFG,6GAKIM,EAAAM,oBAAAj4D,KAARgU,KAAAhU,KAAAizD,IAAAjzD,KAAAk4D,WAAAl4D,KAAA2E,IAAA,KAAA69B,+CAIQ,IAAA/+B,EAAAzD,KAUNA,KAAMm4D,mBAAqBlsB,OAAKrrB,aATX,uCAGfnd,EAAA4zD,kBACC5zD,EAAA8zD,6BAKyB,QAE1BnuD,UAAYmuD,wBAAgB,WAC5Bv3D,KAAAm4D,qBACAt3C,cAAO7gB,KAAAm4D,oBAGTn4D,KAAKm4D,wBAAY/hD,MAGjBhN,UAAK0uD,eAAW,iBACX93D,aACL6xD,kBAAgB7xD,KAAAw2D,WAAkBmB,EAAiBC,qBAAA53D,KAAAizD,KAAA,iCAC9C,WACL,MAAK,CACLxqD,IAAKhF,EAAA+sD,2CAIb,uXCrWA,OAAAiC,EAAA2F,oBAAAp4D,KAAAwwD,SAAAxwD,KAAA0E,OAcAuxD,EAAA7sD,UAAA8tD,iBAAA,WACA,IAAAmB,GAAAr4D,KAAAo2D,gBACAkC,EAAAt4D,KAAAg3D,YAAA,IAAAh3D,KAAAgU,KAAAuP,YAAAljB,OASAkL,EAAAvL,KAAA0E,KAAAyC,MAAAoE,UAGAgtD,EAAAhtD,EAAAyrB,OAAAzrB,EAAAmgB,MAAA1X,SAAAhU,KAAAgU,KACAwkD,EAAAH,GAAAC,IAAAC,EAEMv4D,KAAag3D,aACbqB,GAEAr4D,KAAAg3D,WAA2Bt9C,MAAA++C,QAAA,OAEjBz4D,KAAAg3D,WAAoBzhB,gBAAsB,UAK9Cv1C,KAAMg3D,WAAWzhB,gBAAAijB,EAAA,QAAA,OAGjBx4D,KAAMg3D,WAAUt9C,MAAAwjB,OAAAs7B,EAAA,IAAA,GAGhBx4D,KAAMg3D,WAAWt9C,MAAAg/C,UAAAF,EAAA,IAAA,GAGpBx4D,KAAAg3D,WAAAt9C,MAAAi/C,OAAAH,EAAA,IAAA,MAKDvC,ED8EI,IChFZr4D,EAAAC,EAAA,IAeA,SAAgBU,EAAAL,OASdkI,EAAUpG,MAAAA,KAAcoG,UAAA,kBAGxBA,EAAMjI,OAAA06B,QAAA,SAA2B55B,GAC/B,IAAA,IAAAgB,EAAAC,EAAA,EAAA2hB,EACEzhB,UACAC,OACAH,EACA2hB,EAAA3hB,IAQE,IAAA,IAAA4hB,oBAEE3jB,OAAAiL,UAAAqU,eAAA/d,KAAAO,EAAA6hB,KAGO7iB,EAAA6iB,GAAA7hB,EAAA6hB,eAMCzS,MAAMrP,KAAMI,kCAEdlC,EAAU,aAAA,CAAAW,OAAA,UACtBjB,EAAAE,EAAA,eAIFgtB,EAAMltB,EAAAE,EAAA,MACEF,EAAAE,EAAA,MACAF,EAAQE,EAAA,MACFF,EAAAE,EAAA,KACZF,EAAAE,EAAA,4BAibF,IAAAi/B,EAASk2B,EAAKn3C,aA7aR,cA6aSohB,EAAA+1B,EAAAn3C,aA5aP,kBA4aqBihB,GAAQG,iEAqCjC,OA9BO07B,IAGRA,EAAoB,CAGjB9nC,KAAY+nC,EAAK/nC,MAAAmiC,EAAAj2B,YAAAi2B,EAAA91B,cACnByF,KAAUi2B,EAAAj2B,OAKTi2B,OAKS/nC,KAAA8nC,EAEd9nC,MACAmiC,EACA91B,aAAA81B,EAAsBj2B,aAGlB4F,KAAAg2B,EAAgBh2B,OAMhB,CACF7F,MAAO67B,EAAiB9nC,KACxBoM,OAAO27B,EAAM/nC,KACb8R,KAAOg2B,EAAeh2B,aAvClB7F,MAAOk2B,EAAA9vB,cAAA8vB,EAAAj2B,YACRE,OAAA+1B,EAAA7vB,eAAgB6vB,EAAA91B,aACnByF,KAASrgC,EAAKkgC,cApad20B,6BARoB/5B,YACdpvB,UAAArJ,IAAc,4BAAoB,oCACpC8U,MAAA2Z,SAAe,aACf3Z,MAAA++C,QALmB,iBAMrB/+C,MAAAo/C,SAAe,eAajBlB,8BARqB3E,OACrB8F,EAAY9F,EAAUv5C,MAAAqjB,QAAAk2B,EAAap3C,aAd/B,cAgBJm9C,EAAA/F,EAAAv5C,MAAAwjB,QAAA,SAAA+1B,EAAAv5C,MAAAwjB,SAAA+1B,EAAAp3C,aAfM,+BAgIRi8C,wBA3GEmB,EACE57B,EAAA41B,EAAYiG,EACZx0D,EAAA6B,6CASJ,IAAM4yD,EAEJ,qBAsbaz0D,EAAatC,EAAA6wD,EAAAiG,EAAAn8B,EAAAG,EAAA0F,KAC1BA,IAAOrgC,EAAMkgC,WAAU,GAAAG,MACvBrpB,EAAOhX,EAAMqhC,kBAAaxhC,EAAA4R,KAAA3K,MAAAkQ,aACnBA,EAAMwC,QAAA,SAAgBld,GAC7B,OAAO,CACP8a,EAAac,aACbd,EAAae,kCAMPrb,KAAA,CAGLsa,EAAqCc,eAE9BmoB,UAIN6vB,EAAYqE,uBAAA7D,EAAciG,OACpBE,gBAAQr8B,EAAA6F,IAAAlgC,EAAAsgC,qBAAAjG,EAAAG,EAAA+F,GAAA,WACV,GAAmDvoB,kCAGnDxR,mBACA9G,EAAAqG,IAAArG,EAAA4R,KAAArH,KAAkBvG,EAAOA,EAAW,GAAAhE,EAAA4R,KAAA3K,OAAA,CAAAkQ,SAAAA,qBAOtChO,qBAAqBxK,EAA4B2tB,eAAAwa,EAAA39B,UAAAqG,OAAAxP,EAAAqG,oBAAK1H,EAAU2tB,cAAoBvqB,OAAA+E,EAAA1B,IAAApF,EAAAqG,iBACpFS,GA7cAmwD,CAAS30D,EACbu0D,IACAhG,EAAAiG,EACYI,EACZ3nD,MAAMorB,QAAMu8B,EACZ3nD,MAAMurB,SACNo8B,EAAA3nD,MAAAwiD,UA+DFmF,WAce50D,EAAA24B,EAAA41B,EAAgBsG,EAAGC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAzqB,GAClC,IAAAmqB,EAAOO,EAAWC,YAAAp1D,EAAA,IAClBq1D,EAAmBr1D,EAAAC,IAAA6pB,WAGnBurC,EAAMr2C,YAAe41C,GACrB,IAAMU,EAAS,WACf,IACMC,EAASF,EAAAG,wBACRC,EAAW98B,EAAA68B,wBAClBZ,EAAA5/C,MAAWwR,IAAQivC,EAAAjvC,IAAA+uC,EAAA/uC,IAAAivC,EAAAj9B,OAAA,EAAA,KACAi9B,EAAAznB,KAJA,IAI4BunB,EAAApN,OAIzCyM,EAAA5/C,MAAcmzC,MAAA,GACpByM,EAAY5/C,MAAAg5B,KAAWynB,EAAAznB,KAAAunB,EAAAvnB,KAAA,OAKrB4mB,EAAA5/C,MAAYg5B,KAAA,GAGZ4mB,EAAA5/C,MAAAmzC,MAAAoN,EAAApN,MAAAsN,EAAAtN,MAAA,OAKFuN,EAAwBtvC,EAAAuvC,kCAAA31D,GAGlB01D,GACAA,EAAej1D,iBAAA,SAAA60D,GAErB,IAAAM,EAAgB15C,YAAOo5C,EAAA,IACvBO,EAAWV,EAAAW,wBACXlB,EAAM3nC,OAAA4oC,GACN,IAAAE,EAAW,SAAWC,EAAAl+B,GAQtB,GALMq9B,EAAAc,uBAAYJ,EAChBG,GAIFl+B,EAAoB,CACpB,IAAAo+B,EAAA3uB,OAAuBkG,SAAOC,cAAA,QAGtBwoB,EAAUlhD,MAAAqjB,MAAAP,EAAAj6B,EAAAkgC,WAChBo3B,EAAWc,uBAAQJ,EAAAK,QAMf,gBACJ,yBAGEf,EAAagB,iBAAU,QACvBC,EAAA,SACKjB,EAAAkB,gBAAA,EAAAC,cACLxB,aAIFyB,EAAApB,EAAiBgB,iBAAU,aAE7B,IAAAK,EAAArB,EAAAkB,gBAAA,EAAAC,EAAA,CAAAj+B,MAHe,SAMfm+B,EAAMC,SAAS1B,IACPyB,EAAQ,OACdE,EAAUvB,EAAQgB,iBAAA,SAAA,CAAA,uBAAA,CAAA99B,MARL,WASXq+B,EAAO,iDAELD,SAAW,aACb/uD,UACKA,iBAKTquD,EAAMY,EAAW,QACfC,EAAervB,OAAAkG,SAAUC,cAAO,iCAElCmpB,EAAMxN,SAAY,IACTp8B,OAAQ4pC,UAGjB,IAAAC,EAAO3B,EAAAgB,iBAAA1rB,EAAA,iBAEDqsB,EAAA,QAKJtH,EAAM2F,EAAA4B,kBAAA7B,EAAA8B,WAAA,CAAA,mCAAAvsB,EAAA,sBACJunB,QAAaiD,IACbgB,uBAAyBJ,EAAArG,KACzBhkC,oBACAqpC,EAAe,KAMfoC,OAAApC,MAGFqC,EAAU,eACRC,EAAAR,EAAAx8D,QAAA0D,EAAAC,gBAGF+4D,EAAQxN,SAAA,EACNwN,EAAI9K,UAAA,mBAIJ/2C,MAAM++C,QAAAoD,EAAA,OAAA,0CAIO,SAAAx9D,oCACby9D,MAAAj9D,GACA,SACAA,EACa,QACgB,SAACk+B,qCACb,SAAAG,gHAUd0+B,IAQD5B,KAEN3mC,SAAO,WACA2mC,KAEP31B,OAAO,WACA+1B,GAEDA,EAA+BrqB,oBAAK,SAAAiqB,GAGrCn5C,cAAAy5C,GAEGhB,EAAAj1B,UAGN1yB,MAAM,CACAorB,MAAA,WAEA,OAAAg/B,EAAiBC,IAAAC,EAAAhJ,GAAAl2B,OAIrBm/B,SAAMA,EACNh/B,OAAM,WAEF,OAAA6+B,EAAAb,IAAAe,EAAAhJ,GAAA/1B,QAEJi/B,UAAIA,QACF,kBACEd,EAAQx8D,yBAEHs1D,UACLkH,EAASx8D,MAAcs1D,+BAGpBoH,EAAAxN,sBAEI,SAAAqO,gBAILb,EAAexN,QAAAqO,MA7MnBC,CAAO33D,EAAA24B,EAAA41B,GA1DN,WACLqG,EAAAgD,WACEr5B,EAAMwvB,EAAAqE,uBAAA7D,EAAAiG,4FAGI,eACVn8B,EAAOu8B,EAAA3nD,MAAAorB,QACPG,EAAMo8B,EAAA3nD,MAAA4qD,YAAAtJ,EAAA91B,aAAA81B,EAAAj2B,YAAAD,EAAAu8B,EAAA3nD,MAAAurB,qCApHZ,WAyHA,IAASA,EACPo8B,EACA3nD,MAAAurB,SAWMH,EAAQu8B,EAAA3nD,MAAA4qD,YAAkBtJ,EAAAj2B,YAAAi2B,EAAA91B,aAAAD,EAAAo8B,EAAA3nD,MAAAorB,QAG1Bu8B,EAAA3nD,MAAAuqD,SAAkBn/B,GACxBo8B,OAIQ,WACN,IAAMqD,EAAYP,EAAgBhJ,GAAArwB,KAC5BJ,EAAW02B,IACjBn8B,EAAYu8B,EAAM3nD,MAAAorB,QACZ0/B,EAAA/5D,EAAeD,aAAgBs6B,EAAAy/B,EAAqBh6B,GACtDk6B,EAAch6D,EAAAC,aAAA85D,EAAAnD,EAAA3nD,MAAAwiD,QAAA3xB,GAChBiwB,EAAY2G,gBAAQE,EAAA3nD,MAAAwiD,UAAAuI,EAAA,MACpBA,EAAY,OAEZ/qD,MAAMuqD,SAAMQ,OACZx/B,EAAMo8B,EAAM3nD,MAAQurB,wFAKlBi8B,OAEJ,qBAIIvC,EAAAC,YAAgBvoC,EAAYta,KAAgBy+C,EAAAqE,uBAAA7D,EAAAiG,KAAA5qC,EAAAta,KAAArH,KAAAjI,EAAA6B,GAAA,KAIrCA,EAAAC,OAAAD,EAAAlD,QAAA8rC,eACPwtB,WAmNE1J,EAAAiG,EAAyBqD,EAAApI,EAAayI,EAAOC,SAC7C1qB,SAAMC,cAAkB,0BACX,oBAEjBxtC,IAAA,yBAAA,sBAAA,+DAGF8U,MAAMyR,OAAc,eAChB0hC,MAAA,eAGEpT,OAAA,sBACKtH,SAAA1yC,KAAAq9D,oBACA,SAAAnM,4BAEFsC,EAAAj2B,cACIi2B,EAAA91B,eACTwzB,EAAAoM,gBAIFv6B,EAAA02B,kBAGE,IAEFn8B,EACAG,EAHE8/B,EAAAp9D,EAAAm9D,MAAmBE,EACrBC,EAAOt9D,EAAAu9D,MAAAC,EAGFb,IACLS,GAASE,GACTngC,EAASsgC,EAAiBL,gBAI1B9/B,EAAmBogC,EAAAJ,EACdngC,EAAAsgC,EAAiBH,GAAeG,EAAAC,WAKlCpgC,EAAAogC,EAAAJ,GAMA,IAAAR,EAAmBh6D,EAAqBC,aAAAo6B,EAAAo3B,IAAA3xB,GAEjCiwB,EAAI2G,gBAAajF,MAAAuI,EAAA,MAI1Bx/B,GAHCH,EAAayF,IAGI86B,EAAAD,IAEnBpK,EAAAv5C,MAAOqjB,MAAIA,EAAAx6B,EAAoBkgC,WAC/BwwB,EAAA/tD,aA/XE,aA+X2BxC,EAAIC,aAAAo6B,EAAAo3B,IAAA3xB,GAAA2xB,KACjClB,EAAAv5C,MAAMwjB,OAAAA,EAAA36B,EAAAkgC,0BA/XF,2CAmYDm6B,KAEDW,EAAA,SAAiB39D,GAEjBA,EAAC+wC,iBACH6sB,GACEb,EAAMc,sBAAwB79D,EAAA89D,WAC9Bf,EAAM5sB,oBAAgB,cAAA4tB,0CAIrBxrB,SAAApC,oBAAgB,YAAA4tB,GACnBxrB,SAAApC,oBAAiB,UAAAwtB,YAMnBZ,EAAOG,kBAAAnM,EAAA+M,WACLf,EAAOx3D,iBAAc,cAAAw4D,GACrBhB,EAAAx3D,iBAAuB,YAAAo4D,uFAgB3BC,EAGIb,EAAAx3D,iBAAW,cAAkBy4D,GACGjB,EAAAx3D,iBAAC,YAAAy4D,YAvT/BC,CAAa5K,EAACiG,EAAyCI,EAAA3nD,MAAA4qD,UAAAjD,EAAA3nD,MAAAwiD,MAAAmF,EAAAgD,KAAAnD,YAC3DxnC,OAAAgrC,GACA,QACQ,WACNrD,EAAAgD,uEAMEK,EAAAt4B,SAAgBi1B,EAAAj1B,2CA+XRrwB,EAAAi/C,EAAArB,EAAkBpvB,qBACjB7oB,EAAQgB,gCA/fjB,gCACE,2BAmgBAmjD,SAAI,yBACE,kBACA,wDAKHC,YAAI,WACPC,WAAU,8BAEPthC,WAAY,WAEXC,cAAa,WACfH,aAAY,WACdD,YAAW,WACXk8B,QAjhBiB,kGAwhBnB1mD,EAAKnQ,EAAI,KACHA,EAAA,6BAKDgwD,EAAI,CACT,IAAQqM,EAAA,SAAA16B,EAAAvnB,GACD,OAAA41C,EAAAl4C,MAAAwqB,YAAAX,EAAAvnB,IAEHnd,EAAO0D,EAAMohC,kBAAW9kC,EAAA,QAAAo/D,GACxBp/D,EAAA0D,EAAAohC,kBAAA9kC,EAAA,iBAAAo/D,GACFp/D,EAAK0D,EAAAohC,kBAAA9kC,EAAA,uBAAAo/D,GACL17D,EAAKohC,kBAAA9kC,EAAA,UAAAo/D,OAEHC,EAAa,SAAA36B,EAAgBvnB,GAC7B,OAAAi3C,EAAAv5C,MAAAwqB,YAAAX,EAAAvnB,sGAMJnd,EAAA0D,EAAAohC,kBAAoB9kC,EAAA,UAAaq/D,QAC/B,GAAMnsD,IAAS4H,EAAAc,aAAA,kEA5GzB/X,EAAAigC,qBAAAw7B,EAAAv7B,uBArcQ,wGAAA,gBCvHRqwB,EAAAv5C,MAAAqjB,MAAAl+B,QAIgB,GAAAkT,IAAA4H,EAAqBe,cAAA,CACvB,IAAA0jD,EAAgB17D,EAAAogC,sBAAcjkC,GAC5Bu/D,IACPA,EAAAx7B,KAAAw7B,EAAAx7B,MAAArgC,EAAAkgC,4CAHTwwB,EAAA/tD,aDoHU,cCpHVk5D,EAAAttC,KAAAstC,EAAAx7B,MAMgBqwB,EAAAv5C,MAAuBwjB,OAAsCx6B,EAAAD,aAAA27D,EAAAttC,KAAAstC,EAAAx7B,KAAAJ,GAAAjgC,EAAAkgC,4BD8GnE,iBC9GVwwB,EAAAv5C,MAAAwjB,OAAAr+B,QAYgB,GAAO+yD,GAAS7/C,IAAA4H,EAAc0kD,aACtC,OAAAx/D,GACA,IAAU,OAOJ,IAAA,QACA+yD,EAASl4C,MAAAokD,SAAAj/D,EACrB,MAGI,IAAa,MACT,IAAA,SACJ,IAAA,SACE+yD,EAASl4C,MAAA4kD,cAAqBz/D,uCDgF9B,4DCrENN,EAAOL,oDAnCT,IAAAqE,EAAA3E,EAAAE,EAAA,IAsCAF,EAAAE,EAAA,MAME08D,iCAJA,IAAA/2C,EAAOwoB,OAAUkG,SAAIC,cAAA,OAErB,OADA3uB,EAAAxV,UAAOrJ,IAAQ,uBACf6e,GAOFvlB,EAAAy8D,gCAJgBJ,EAAA9+C,GACdA,EAAAxN,UAAOrJ,IAAA,2CA+BPk1D,qBA3Bcp1D,EAAO8U,EAAS+kD,EAAc7kD,GAC5C,IAAA44B,EAAMrG,OAAYkG,SAAAC,cAAA,QAMpB,GALEE,EAAMiD,gBAAc,QACpBjD,EAAArkC,UAAArJ,IAAY,WAAO,gBAAS,uBAAA,uBAAA,uBAC5B0tC,EAAA54B,MAAO2Z,SAAA,+BALT9wB,EAAAwwC,YAAAT,EAAA94B,EAAAE,GAQA6kD,EAAgB,CACR,IAAAC,EAAgB,IAAA/yB,kBAAS,SAAclO,GAC7CA,EAAsBjrB,SAAA,SAAAkrB,GACfA,EAAcC,aAAAnrB,SAAA,SAAA0B,GACJA,IAAIs+B,IACTksB,EAAQryB,aACboyB,cAKLC,EAAMzyB,QAAWrnC,EAAOC,IAAA,CACxBN,YAAS,EACT2nC,WAAS,EACTyyB,SAAU,IAId,OAAgBnsB,KAadmpB,2BAVar5D,EAAAoX,EAAAvS,EAAAyS,GACb,IAAAglD,EAAAzyB,OAAYkG,SAAOC,cAAS,UAC5BssB,EAAOzwD,UAAArJ,IAAA,6BALTrC,EAAAwwC,YAAA2rB,EAAAllD,EAAAE,GAQA,IAAAilD,EAAgB1yB,OAAgBkG,SAAAC,cAAwC,OAGtE,OAFAusB,EAAM7M,IAAQ1vD,EACds8D,EAAM/sC,OAAOgtC,GACPD,+BAGcx8D,EAAAsX,EAAaE,GACjC,IAAAva,EAAO8sC,OAAAkG,SAAAC,cAAA,8BAPTjzC,EAAA8O,UAAArJ,IAAA,wKCnGA,IAAAg6D,EAAA3yB,OAAAkG,SAAAC,cAAA,UAGAwsB,EAAA//D,MAAAypB,EASAs2C,EAAAr7C,YAAA+E,EACA+U,EAAA1L,OAAAitC,8IAIIplD,EAAAE,SAAEuyB,OAAKkG,SAAAC,cAAQ,4BAAOxtC,IAAS,yCAC/BmuC,YAAA10C,EAAAmb,EAAAE,iCACAmlD,EAAArlD,EAAAE,SAAEy4B,SAAKC,cAAQ,uBAAW,0CAC1BnkC,UAAArJ,IAAA,sCAAOvG,EAAAmb,EAAQE,WAAYqjB,MAAS8hC,EAAa,aAEjD,wBAA0B,kCAAsB,qwDAPpD,WAWAjhE,EAAAE,EAAA,IAAAF,CAAS,uCAAgB,23BAIrB,eACEM,0DAIaN,EAAME,EAAA,OACbF,EAAAE,EAAA,OACAF,EAAAE,EAAA,MACJF,EAAAE,EAAA,eA0GIutB,mBACFlkB,EAAQwB,EAAOjE,SACX,SAASktD,MACfjpD,EAAI,KAEFO,EAAK/B,EAAA+B,KACInI,EAAA2tB,cAAAvqB,OAAAgD,EAAAK,IAAAoqD,EAAAnpD,0CAGLS,OAIF,SAAa0oD,EAAAkN,sBAEf,iBAMC79D,EAAA2pB,iBAAAgnC,EAAAnpD,KAAAq2D,EAAAlN,EAAA59C,KAAAuP,YAAAljB,OAAA,EAAA,GAAA,EAAAY,CAAAiI,oMCjKL,OAHN61D,EAAAnN,IAGqB,EAKrB,IAAgB,OAAAvmC,GAA8B,SAAZA,IAAY9f,aAAAxK,EAAAwqC,eAAAtqC,EAAA6yB,qBAAArvB,EAAAqH,MAAA8lD,OAAA3wD,CAAAsK,IACrC,IAAI,OAAA8f,GAAA,SAAAA,GAAO,IAAA9f,EAAAmgB,MAAAsC,gBACX4jC,EAAA3wD,EAAA6yB,qBAAArvB,EAAAqH,MAAA8lD,OAAA3wD,CAAAsK,IAKH,OAHAyzD,EACEpN,IAEW,2CAPnB,IAgBQA,EAhBRnmC,EAAA,SAAAJ,GAAA,OAAAA,GAAA,EAAA,EAYSK,EAAuBngB,EAAAmgB,MACvBG,EAAC9qB,EAA8Bk+D,UAAAC,KAAA/3D,EAAAK,IAAAZ,QAAA6kB,EAAA,EAAAC,EAAAwP,QAAAxP,EAAAoS,UAAArS,GAC9B,GAAAI,EAAAH,MAKA,GAHFkmC,EAAe3wD,EAAe28B,iCAAA/R,EAAAH,MAAAjnB,EAAAqH,MAAA8lD,QAIxB,OAAU,OAAVvmC,GAAyB,SAAfA,IAA6B2kC,EAAQmP,uCAAAh4D,EAAAoE,UAAA8f,OAGvC,IAAVI,GAAUmmC,EAAA59C,KAAAqc,WAAA,IACQuhC,EAAW,SAALvmC,SAInB,mCDEJ5mB,UAIT,CACIsN,IAAAi+C,EAAAjkC,QAAsBC,MACxBxe,QAAI9L,EAAUk5B,SAAAn2B,EAAAqH,MAAA8lD,QAAA,GAAA,SAIZ5B,EAASjkC,QAAAM,sCA0BPllB,EAAOoE,+BAKb,IAAA9G,EAAO0C,EAAA1C,4CAIX,GAA2D,IAAlDupB,EACA,OAAA,MAGHoxC,EAAc1zC,EAAAtoB,OAAAuJ,OAAAlI,EAAAqH,MAAA8lD,QAAA,IAAAlmC,EAAAtoB,OAAAitB,gBACK,IACjB1nB,EAAM,CACN,IAAGO,EAAA/B,EAAA+B,GACHA,EAAAyC,aAAS5K,EAAA2tB,cAAAvqB,OAAA+E,EAAA1B,IAAAkkB,EAAAjjB,IAAA,SAKP,OAAA,MAAmDrF,EAAAsoB,EAAA1X,KAAA0X,EAAAtJ,MAAA,wBACvD,GAAIi9C,EAAU,EAAA,CACZ,IAAMC,EAAWl8D,EAAAutB,MAAA0uC,EAAA,GACjB,GAAAC,EAAA3yD,OAAAlI,EAAAqH,MAAiB8lD,OAAO,CACxB,GAAAjpD,EAAS,wCAKL,IAAA42D,EAAQt+D,EAAA2zD,2BAAAlpC,GAAA,SAAA1X,GAIK,OAAQA,EAAA8Z,eAKbyxC,GACZr2D,EAAAulC,YAAoB8wB,EAAA92D,IAAA82D,EAAA92D,IAAA82D,EAAAvrD,KAAAtL,mCAOb82D,EAAgBz+D,EACzB2tB,cAAqBvqB,OAAA+E,EAAA1B,IAAAi4D,GAGTv2D,EAAAyC,aAAiB6zD,GACrB72D,EAASO,GAEb,OAAA,UAMC,KAlFL6I,IAAMi+C,EAASjkC,QAAWmB,UAC1B1f,QAAMkyD,EAAc,cAGlB1P,EAAIjkC,QAAa4zC,mBACfD,EAAc,iBAKV3zC,QAAMoB,kBAA4D,sBAE7DC,8GCfRxvB,EAAAE,EAAA,KAIXyxC,EAAS,IAAUxuC,EAAYoC,UAAA,2BAgBlBoD,wBAIT,IAAIq5D,EAAwB/4D,EAG5B,GAAM+4D,EAAUC,cACZ,GAAAD,EAASC,cAAAC,MAAAhrD,2BAEN,GAAA,IADU8qD,EAAMC,cAAAE,yBAChB1/D,OAUE,OARAkG,EAAGlD,QAAQ28D,gBAAAt/C,MAAA,SAAAu/C,MAIRC,EAAsBx7D,EAAAA,EAAYyC,MAAKoE,UAAOqG,KAAW/K,EAAAo5D,EAAA15D,MAG9DM,EAAA8pC,kBACE,8GAYP,OAPGvuC,GAEW89D,EAAYx7D,EAAAA,EAAGyC,MAAAoE,UAAAqG,KAAA/K,EAAA,CAAAzE,GAAAmE,GAI7BM,EAAA8pC,kBACA,YAIA,cAGApqC,mBACA7B,EAAAmC,OACAs5D,EAAAt5D,MACAs5D,EAAAC,aACA,OAAA,MAEAC,EAAA37D,EAAA47D,YAAA,gBAEIp1C,IAAAi1C,EAAY9lB,gBAQhB,OAAU,aAOXkmB,EAAQJ,EAAiBC,aAAWL,yBAMrC,UAJAE,EADMM,EACCA,EAAQ9mD,MAAA,SAEVlT,EAAOlD,QAAKm9D,iBAEZN,EAASx7D,EAAA27D,EAAA53D,IAAA5B,EAAAo5D,EAAA15D,0BAIT,0BC/IT,IAAAk6D,EAAAR,EAAAlkD,QAAA,SAAA2kD,GACA,cAsB4B,MAAAnhE,MAAA2mB,oBAtB5B,CAGA,OAEA,MAEA,MAEA,MAEM,MACI,MAED,OACL,sDAO8BpR,SAAS0H,uDAG3BikD,GAAA//C,MAAA,SAAAla,WACNW,MAAA+B,uBAEI9G,WACA+E,MAAM1C,OAAAqH,MAAA1J,MAAA+B,OAAA,CAAA2tD,IAAA1vD,4CDwChB0xD,2BAdwBvtD,UAExB,IAAMxF,EAAYoQ,OAAA,CAGlBY,IAAKw9B,QACH,6BAIIoxB,YAAAC,EAAmBr6D,0BCfzBhI,EAAAL,yBAEIA,EAAI,aAAA,CAAAW,OAAA,UACIjB,EAASE,EAAM,OACfF,EAAAE,EAAA,SACNA,EAAI,oBAGG,8FChCTyI,EAAQlD,QAAA8rC,cAAqB,2CACpBE,gBAAWwxB,4CAM1B,OAAUt6D,EAAA4L,MAAChE,WAAe,QAAA3I,EAAAe,EAAAC,OAAAE,mBAAA,IAAAlB,OAAA,EAAAA,EAAAs7D,qBAAA,QAAA1pD,EAAA7Q,EAAAC,OAAAE,mBAAA,IAAA0Q,OAAA,EAAAA,EAAA2pD,yFDkCnB5lD,KAAa,CACb0uC,MAAA,QACIjd,SAAQ,CAAA,CAAA5oB,IAAA,OACjB6oB,MAAgB,WACT,MAAA,CACG,MACH,CAAA,KACI,CAAAvB,MAAa,0LCvE5Bj+B,SAAA,SAAA5I,GACA,MAAA,CAAA,IAAA/C,EAAAs3B,mBAAAt3B,EAAAC,gBAAAq/D,eAAA,GAAAt/D,EAAAu/D,WAAAx8D,EAAAqH,MAAAi1D,iBAAAG,EAAA36D,MAGEiL,WACE,SAAAoiD,GACE,MAAM,CAAA,IAAAhzD,EAAA4kC,UAAA,WAAA,SAAAr+B,EAAAuL,EAAAsY,EAAA9K,GACA,IAAAzb,EAAA0C,EAAA1C,OAEJ,OADQxD,EAAA6yB,qBAAArvB,EAAAqH,MAAAipB,UAAA9zB,CAAAkG,EAAAoE,YACD,IAAApE,EAAAoE,UAAAuvB,QAAA1Y,MACKjb,EAAA+B,GAAA+f,iBAAA+B,EAAA9K,EAAAzb,EAAAqH,MAAAi1D,gBAAA58D,UAEP,qvBA0Bb,SAAS5F,EAAAL,UACPyC,eAAQzC,EAAoB,aAA4D,CAAAW,OAAA,UAC3EjB,EAAME,EAAA,MACbF,EAAAE,EAAU,MACZ,SAEFqY,KAAO,6BAIX0zC,MAAe,6EClDf5kD,OAAA,CAE6B6nC,QAAA,CAAA,CAEzBl0B,MAAAoE,EAAAG,gBAAAwB,UACQ3K,KAAA,eAEJ+4B,OAAO,SAAA7uB,GACPA,EAAMyjC,WAAA3kC,EAAAG,gBAAAwB,iCAIJi1C,6FAkBVjrD,EAAexB,EAAA+B,GAAAuC,qBAAA01D,EAAAh9D,UAAAw1B,6BAfT,CACE5nB,IAAAi+C,EACEjkC,QAAAq1C,sEAaVz4D,EAAexB,EAAA+B,GAAAuC,qBAAA01D,EAAAh9D,UAAAw1B,qHC/Bf,IAAA3c,EAAApf,EAAAE,EAAA,IAEAF,EAAAE,EAAA,KACA,IAAA0e,EAAA,CAEM1Q,MAAA,CAAA,CAEFqK,KAAA,OACEgF,KAAM,CACN0uC,MAAM,QACJwX,MAAA,EACAC,YAAU,WACN,CAAK,CAAAt9C,IAAA,mCACL,WACF,MAAA,CAAE,MAAsB,CAAAsnB,MAAA,yBAE1BwB,QAAK,CAAA,CACHl0B,MAAQoE,EAAAG,gBAAA8iC,mBAGZlT,OAAQ,SAAA7uB,GACNA,EACEyjC,WAAA3kC,EAAAG,gBAAA8iC,muBAgBN,0BAGFt/C,eAAYzC,EAAC,aAA2C,CAAAW,OAAA,UAC/CjB,EAAAE,EAAA,MACLF,EAAAE,EAAA,MACAF,EAAAE,EAAA,yBAKNqd,KAAe,oDCjDfzB,MAAA,cAEA6rB,SAAA,SAAA1mC,GACA,MAAA,WAAAA,GAAA,QAMMguC,MAAM,WACJ,MAAO,CAAA,wBAMH,CAAA,OAAoC7vB,EAACG,gBAA4BokD,wBAEjE,CACF9hD,SAAA,QACE,SAAOvB,EAAAsjD,EAAAp+D,GACP8a,EAAAujD,UAAUzkD,EAACG,gBAAoBokD,KAAAn+D,0BAG9BqB,cACH/C,EAAQw3B,YAAAx3B,EAAAC,gBAAA+/D,GAAA,CAAA,SAAAj9D,EAAA6G,MAAAq2D,qCAGZ,GACW97B,uBACP,MAAAphC,EAAA6G,MAAAq2D,GAAA5lD,EAAA,SAAA,KACE8pB,uBAAO,IAAAphC,EAAgB6G,MAAAq2D,GAAA5lD,EAAA,SAAA,yGAcjCiB,EAAUpf,EAAAE,EAAA,MACAF,EAAIE,EAAA,OAGdwN,MAAA,CAAA,CACE6K,KAAO,SACLgF,KAAA,CACA0uC,MAAA,gCAKStkB,SAAA,SAAA1mC,sVCpDfwO,SAAA,SAAA5I,GACA,MAAA,CAAA,IAAA/C,EAAAw3B,YAAAx3B,EAAAC,gBAAAigE,OAAA,CAAA,SAAAn9D,EAAA6G,MAAAu2D,UAGUrwD,WAAA,SAAA/M,EAAAsX,GAEF,MAAA,CAEC1K,EAAAw0B,uBAAA,SAAAphC,EAAA6G,MAAAu2D,OAAA9lD,EAAA,KAAA,GACL1K,EACEw0B,uBAAA,KAAAphC,EAAA6G,MAAAu2D,OAAA9lD,EAAA,QAAA,gBAIES,2CAMMpW,UAAA,mCACE,SAAInH,6BACFoB,OAAOH,EAAA2hB,EAAA3hB,wGASbF,KAAMI,oBAQEJ,KAAAD,gBAAA,6BAAQK,UAAAC,OAAAH,EAAAC,EAAAD,qHAGpBM,EAAAC,qCAIM,aAAM,CAAA5B,OAAA,2DC3BZP,6CDiCUwjE,gEAKA,cAGN,mCAISnoD,EAASoB,eAAqB,yBACrCwqB,SAAO,SAAK5gC,GACR,OAAAo9D,EACKpoD,EAAWoxC,mBAAgBpmD,EAAM,IAEpC,qBAIFyqB,oMAaF0d,QAAA,CAAC,CACHl0B,MAAAoE,EAAAG,gBAAuB8B,4YChFrC5R,SAAA,SAAA5I,GAEA,MAAA,CAAA,IAAA/C,EAAAw3B,YAAAx3B,EAAAC,gBAAAsd,KAAA,CAAA,SAAAxa,EAAA6G,MAAA7B,QAEA+H,WAAA,SAAA/M,EAAAsX,GACA,MAAA,CAAA1K,EAAAw0B,uBAAA,IAAAphC,EAAA6G,MAAA7B,KAAAsS,YAUI,uBAEF3V,EAAMpG,MAAWA,KAAAoG,UAAiB,kBAClCA,EAAMjI,OAAW06B,QAAA,SAAiB55B,GAC5B,IAAA,IAAAgB,EAAAC,EAAc,EAAA2hB,EAAAzhB,UAAAC,OAAAH,EAAA2hB,EAAA3hB,IAGd,IAAA,IAAW4hB,KAFX7hB,EAAAG,UAAYF,GAIX/B,OAAAiL,UAAAqU,eAAA/d,KAAAO,EAAA6hB,KAEH7iB,EAAA6iB,GAAA7hB,EAAA6hB,qBAIM9hB,KAAMI,oBAENJ,KAASD,gBAAS,yBACd,EAAAI,EAAAC,UAAWC,OAAAH,EAAAC,EAAAD,iBAEjBA,GAAAG,mBACGJ,GAAAM,EAAQ,MAAAL,EAAA,EAAAA,EAAAC,EAAAD,cACXE,UACEF,GAAAO,EAAA,EAAAC,EAAAF,EAAAH,OAAAI,EAAAC,EAAAD,IAAAF,6DAIoD,CAAA1B,OAAA,mFAYtDf,EAAA,SACQA,EAAA,SAENA,EAAA,4CAMOqS,iBAAA5J,EAAAlD,EAAAkD,GAAA6J,EAAA/M,EAAA+M,iEAIA4N,6BAGHA,oBACAgkD,uBACAvhB,wBAA2BtwC,OACxB8xD,iDAKX9rD,KAAA,YACE/P,EACEA,EAAA,SACS,MACP,WACA,CAAA9H,QAAU,aACRA,QAAM,SACNqb,EAAAoB,eAAA,+CAMFwqB,SAAA,SAAa5gC,GAAsB,IAAA8W,EAAA9W,KAEnCk6B,KAAApjB,EAAeK,aAAA,sCAIXuH,QAAA5H,EAAAK,aAAA,iBAEC,OAAA1V,EAACA,EAAkC,GAAAiD,GAAgB64D,EAAAvoD,EAAAoxC,mBAAAtvC,EAAApS,GAAA,sBAGtD+lB,SAEK,cAMDzV,EAAO2B,oBAAalV,EAAAA,EAAA,GAAAgpB,EAAA/lB,OAAA,CAAAmQ,QAAAzZ,EAAAqvB,EAAA/lB,MAAAmQ,QAAA,CAPjB,yCAAA,sCAiBRqlB,KAAczP,EAAA/lB,MAAAw1B,KAChB53B,MAAAmoB,EAAA/lB,MAAApC,MACDk7D,eAAA/yC,EACF/lB,MAAAga,SAKE++C,OAMRn9D,OAAA,CACE6nC,QAAA,CAAA,8BAEQ1d,KAAA,OAENmW,SAAA,SAAAnqB,GAQY,IAAAgtB,EAAAhtB,EAAAC,EAAAkC,EAAAwF,aAEV,OAAI3c,EAAA,CACOy4B,KAAAuJ,EAAA7qB,EAAA8kD,gBAEPp7D,MAAAmhC,EAAiB7qB,EAAA+kD,mBAAiB,gDAKnCvgB,YAAA,SAAA3mC,ywECtKb,GAAA,IAAA9b,EAAA,MAAAL,GAAAK,EAAA,GAAAL,EAAA,IAAAK,EAAA,GAAAL,EAAA,IAAA,CAEAC,EAAAC,MAAAG,EAAA,GAEA,MAEA,GAAA,IAAAA,EAAA,IAAAJ,EAAAC,MAAAF,EAAA,GAAA,CAE4BC,EAAAC,MAAoBF,EAAA,GACtCA,EAAoBK,EAEf,0BAIIJ,EAAAC,MAAaF,EAAA,8GAMlB,mDASC,8CAUA,aAAA,CAAAJ,OAAA,YAEDf,EAAA,SACFA,EAAA,6BAKJA,EAAI,gBC5CVykE,uBD8CaC,EAAShV,qBACd7kD,EAAKjE,yBACAsP,OAAArH,KAAAkrB,eAAAV,YCpDf,oBDyDuBn3B,UAAA,OAAA,GAAA,iBAAMouB,EAAAqI,EAAWgsC,EAAKv5D,EAAAkmB,EAAqBpb,EAASqP,kDAA7D,EACN,OAAI1a,mBAWWxB,EAAMK,MAVR,CACR,EACC,iGAciBzG,EAAgBwqC,uDAI/BrpC,MAAO,KAILA,MAAA,iBAGQiF,EAAAgwB,OACP/wB,EAAA,GAAcqwB,GAAAJ,EAAWg/B,aAAWluD,EAAOK,IAAM4mB,EAAO+I,6DAS/DV,EAAApT,QACFoT,EAAK9pB,KAAA4Q,EAAAyF,SAAA0/C,qGAMJ,KAAA,kBA/FXx5D,EAAA/B,EAAA+B,IAmG2CmuB,WAAAjJ,EAAAxc,KAAAwc,EAAAvc,GAAAslB,GAClC,SAAAsrC,EAAAvgC,SACY9S,EAAc+H,EAAAhzB,OAAAs+D,EAAAhsC,MACP+2B,EAActrD,MAAAu0B,EAAAv0B,OAAAugE,EAAAhsC,KAAAv0B,MAC/B8R,EAAAmjB,EAAgB1yB,OAAAvC,KAAAugE,EAAAhsC,KAAAv0B,KAAA,CAAAktB,IACbqH,EAAAoI,KACH31B,EAAA+f,iBAAAmF,EAAAxc,KAAAwc,EAAAvc,GAAAmC,GAAgB9K,EAAauC,qBAAUuI,GAAA,6BAIhByuD,EAAkBhsC,KAAA9pB,OAAA4Q,EAAAyF,SAAA0/C,UACtBr/C,EAA4DpiB,EAAAkiB,aAAAja,EAAA1B,KAAA,SAAAwM,GAC3D,OAAMA,EAAArH,OAAUxF,EAAO1C,OAAAqH,MAAAuX,SAAAmT,EAAAkqB,iBAAA1sC,EAAAuP,YAAAk/C,EAAAhsC,KAAApT,SAAA,QAEzChjB,OAAA,oGAMEsI,EAAAO,IAGJxE,aAbXc,EAAArG,MAAA,0BCvHAwjE,IAEA,8BAKkBp8D,iBAE6FlD,QACvG8rC,cAAY,iFAGd5+B,EAAA8+B,gBAAcwxB,iBAAwF,2BAKpG,OAAAt6D,EAAU4L,MAAAhE,WAAA,QAAA3I,EAAAe,EAAAC,OAAAE,mBAAA,IAAAlB,OAAA,EAAAA,EAAAo9D,UAAA,QAAAxrD,EAAA7Q,EAAAC,OAAAE,mBAAA,IAAA0Q,OAAA,EAAAA,EAAAqf,qCASKU,mBACRhwB,EAAAwB,EAAiBjE,SACjB2xB,EAAAC,aAAWnvB,EAAAoE,UAAAC,MAAA2rB,gBAEd,QAMR,IAAOjuB,EAAA/B,EAAA+B,oCAIX,OAAgB,uGC5ChBmI,EAAAzT,EAAAE,EAAA,IAIA+kE,EAAgBjlE,EAAAE,EAAiB,+BACfglE,EAACC,UACf,SAAOt+D,EAAYsX,GAEnB,IAAMtK,EAA2B,CAEjCJ,EAAiBu0B,cAAC,0CAAsBnhC,EAAA6G,MAAAmrB,KAAA1a,GAAA,SAAArJ,GAClC,MAAM,CAAAmsB,KAAQnsB,EAAA,SAEZkzB,cAAM,uCAAAnhC,EAAA6G,MAAAmrB,KAAA1a,GAAA,SAAArJ,GACV,MAAI,CAAAmsB,KAAKnsB,EAAA,6BAKL9R,EAAoB4kC,UAAA,8CAAA,SAAAr+B,EAAAuL,EAAAsY,EAAA9K,SACpB/Y,EAAM+B,SACAwJ,EAAA,GAAYrS,QACJqS,EAAA,GAAArS,wBACd2qB,EAAIg4C,EAAWv+D,EAAA6G,MAAAmrB,KAAAtyB,OAAA,CAAA06B,KAAAnsB,EAAA,yBACPjO,EAAK6G,MAAUmrB,0BAEZ7L,iBAAiB1K,EAAA,GAAAhX,yCAS1BzE,sIA/BdtG,OAAAwC,eAAAzC,EAAA,aAAA,CAAAW,OAAA,2QCHAmsB,EAAA,GAEAlf,EAAAzM,KAAAsxB,EAAA26B,IAAA7iD,EAAAuiB,IAMgBlf,EAAAzM,KAA0BsN,EAAoBlI,OAAAvC,KAAA+gE,GAAA7zC,KAAAziB,EAAAxI,OAAAkF,GAAA45C,SAAAtyB,EAAArlB,SAEzC7C,EAAKyX,SAMxBxN,GACQjK,EAAYvG,EAAA7B,QACdyL,EAAWzM,KAAAsxB,EAAA26B,IAAA7iD,SAGPqD,EAAAzM,KAAAsxB,EAAAuyC,KAAiBp8D,EAAS6pB,EAAKjd,gBAGrCqkB,UAAI,IAEenW,SAAUuhD,UAAMr3D,qJAcvC1F,EAAOjI,OAAA06B,QAAA,SAAA55B,4CAGO,IAAA,IAAA6iB,KAnChB7hB,EAAAG,UAAAF,GAoCS/B,OAAAiL,UAAAqU,eAAA/d,KAAAO,EAAA6hB,KACC7iB,EAAA6iB,GAAA7hB,EAAA6hB,WAEJ7iB,IACMoQ,MAACrP,KAAeI,kCAKhBlC,EAAQ,aAAA,CAAAW,OAAA,UACAjB,EAAAE,EAAA,SACZA,EAAM,QACNA,EAAM,yCACK0J,WACTmF,KAAMlI,WACc2e,mBAAgB5b,EAAM/C,EAAMqH,MAAMuX,kBAClD+T,mBAAkB5vB,EAAA/C,EAAA6G,MAAAmrB,MAAiBnkB,SAAM,SAASmkB,SACpDJ,EAAGC,aAAiB9uB,EAAAZ,QAAY6vB,EAAIhuB,KAAOhE,EAAM6G,MAAAmrB,sGAOvD,OAAAD,EAAAkqB,iBAAAr9B,EAAsBrP,KAAKuP,YAAa6/C,KAAiBC,EAAAp8D,OAAO,MAAPo8D,EAAOxkC,QAE9DykC,IACA97D,EAAMqpB,aAAA2G,EAAsB5lB,KAAK4lB,EAAM3lB,IAAA,SAAAmC,GAEnC,IAAAggD,EAAehgD,EAAC1I,MAAAyI,MAAA,SAAiB9V,GAEhC,OAAAA,EAAA0O,OAAclI,EAAY6G,MAAAmrB,QAO3Bu9B,IACAA,EAAM3qD,MAAQga,QAAAigD,EAAoBtvD,KAAQuP,kBAGpCvP,KAAA3K,MAAAotB,KAAA2sC,iHA3ClB,OAAApvD,EAAArH,OAAAqH,EAAArH,KAAAlI,OAAAqH,MAAAuX,SAAArP,EAAArH,KAAAlI,OAAA6G,MAAAmrB,KAAAI,QAAA7iB,EAAA1I,4hBC3CAy3D,EAAA1/C,EAAArP,KAAA3K,MAAAotB,KAEAssC,IAAAvsC,EAAAkqB,iBAAAqiB,EAAAQ,IAAAA,EAAAljE,OAAA,IAEA6I,EAAAsxB,cAAAgpC,EAAA/+D,EAAAqH,MAAAuX,QAAAjd,EAAAA,EAAA,GAAAid,EAAArP,KAAA3K,OAAA,CAAAotB,KAAA8sC,KAMAtiE,EAAAm2B,mBAAAluB,EAAA1B,IAAA/C,EAAA6G,MAAAmrB,MAAAnkB,SAAA,SAAAmkB,GAEA,IAAAgtC,EAAAv6D,EAAA8mB,QAAAziB,IAAAkpB,EAAAhuB,KAGA2lB,EAAAiI,EAAAC,aAAAptB,EAAA1B,IAAAZ,QAAA68D,GAAAh/D,EAAA6G,MAAAmrB,MACA,GAAArI,EAAA,CACA,IAAA/kB,EAAAgtB,EAAAg/B,aAAAnsD,EAAA1B,IAAA4mB,EAAA3pB,EAAA6G,MAAAmrB,MAEAD,EAAAkqB,iBAAAr3C,EAAAga,QAAA0/C,KAGE75D,EACAomB,WAEAi0C,EACAn1C,EAAAxc,KAAwBwc,EAAAvc,IAEE3I,EAAAimB,QAAAf,EAAAxc,KAAAwc,EAAAxc,KAAA2xD,EAAAljE,OAAAoE,EAAA6G,MAAAmrB,KAAAtyB,OAAAiC,EAAAA,EAAA,GAAAiD,GAAA,CAAAga,QAAAkgD,uCAelBrlE,SACA8B,MAAIA,KAAAkyC,cAAA,SAAAvzC,WACJC,wCAKN,IAAA,IAAS2B,KAAA5B,EACDR,OAAAsf,eAAkB/d,KAAMf,EAAA4B,KAC9B6H,EAAO7H,GAAA5B,EAAQ4B,uBAEjB6H,oDAGAzJ,GAAAA,EAAYC,WAACD,EAAkC,CAAAL,QAAAK,kFApCnDkkE,EAAA9jE,EAAAnB,EAAAE,EAAA,MAoDMytB,EAAsC3tB,EAAAE,EAAA,IAE1C4lE,EAAM9lE,EAAWE,EAAA,KACjB6lE,EAAM/lE,EAAAE,EAAA,OACEF,EAAKE,EAAA,MACDF,EAAKE,EAAA,MACPF,EAAIE,EAAA,gCACK2G,EAAK8B,EAAKwG,EAAA62D,EAAWC,yEAQlC1sC,SAAA1yB,EAAiB6G,MAACmrB,KACpBpoB,SANMy1D,IAOJhK,YAAA,SAAgBp1D,EAAC0jC,EAAgC1uB,GACjD,OAAAnS,QAAQX,QAAAm9D,EAAA3xB,cAAA4xB,EAAA,CACVvtC,KAAA2R,EAAgB/+B,MACd46D,aAAMH,YAAMF,yBAEdr9D,GAAAA,EACEwG,IAAAA,sBAIA,SAAUq7B,iEAMVrsB,OAAA,SAAkBxQ,GAGtB,OAAWggB,EAAA4nC,qBAAA1uD,EAAA8G,eAEH,SAAK68B,GACV7hC,EAAAkyD,QAAAyL,QAAA97B,EAAA/+B,MAAAw1B,cAQLmlC,EACE,SAAAryD,OAWIwyD,EAXGC,EAAUzyD,EAAA8kB,KAAApT,QAAA1R,EAAA8kB,KAAApT,QAAA1R,EAAA8kB,KAAAoI,QAUfltB,EAAA8kB,KAACpT,SAAAw/C,EAAWvkE,QAAA+lE,qBC5HhBN,EAAA3xB,cAAAkB,EAAAC,MAAA,2BAEG75B,MAAA/H,EAAa+H,OACbqqD,EAAA3xB,cAAauxB,EAAcW,WAAA,CAC9BpiE,KAAAkiE,EACAtvB,QD6GkD,WAC9CnjC,EAAAjN,KAAA0H,QAAYuF,EAAM8kB,KAAApT,QAAU1R,EAAS5E,IAAAL,SAAA27B,EAAA9I,eAAAmjC,QAAA/wD,EAAA8kB,KAAApT,SAAyB1R,EAAM8kB,KAAAoI,KAAA1lB,WAAA,KACnExH,EAAA5E,IAAAL,SACC27B,EAAA9I,eAACI,KAAAhuB,EAAW8kB,KAAAoI,KAAAlpB,OAAA,IAEVhE,EAAUpL,GAAAkyD,QAAAyL,QAAAvyD,EAAA8kB,KAAAoI,OClHDxwB,SAAAsD,EAAAsyD,eAAgBM,EAAAR,EAAA3xB,cAAAuxB,EAAAa,YAAA,wBATnChrD,QAAA,CAAA,4FDkIkB,SAAAklD,GACVA,GACAyF,EAAS,IAAAtB,EAAAvkE,QAAAogE,EAAA,CAEXx8D,KAAA,WACS,OAASkiE,MAGPK,GAAA,WAAA,0SC9IjB9yD,EAAAkyD,cAAAlyD,EAAAjN,KAAAyC,MAAAwK,EAAAjN,KAAAiE,SAAAgJ,EAAAjN,MAEAiN,EAAAjN,KAAA0H,UAEgB,0KAGd,4RCPF,IAAAs4D,IAWaA,EAAA,UACQ,IAAA9/B,IAAWA,EAAA,KAE9BnpB,EAAAvW,aAAW,QAAA,IAKXuW,EAAAvW,aAAgB,aAAoBhD,KAChC5D,QAAAqmE,KAAAlpD,EAAA,CAAAipD,KAAAA,gBACI,sCAGR9/B,6BASI,KAAA,kCAAY,ihEAGZ,cACArmC,EAAOL,SACP8B,MAAWA,KAAAoG,UAAA,oBACJjI,OAAA06B,QAAA,SAAA55B,GAEN,IAAM,IAAAgB,EAAAC,EAAA,EAAA2hB,EAAAzhB,UAAAC,OAAAH,EAAA2hB,EAAA3hB,IAYA,IAAA,IAAA4hB,oBACO3jB,OAACiL,UAAAqU,eAA0B/d,KAAMO,EAAA6hB,KACnC7iB,EAAA6iB,GAAA7hB,EAAC6hB,WAEX7iB,2BAINF,EACEiB,MAAAA,KAAAjB,iBAAA,SAAAJ,UACEA,GAASA,EAAAC,WAAAD,EAAA,CAAAL,QAAAK,0BAEET,EAAA,aAAA,CAAAW,OAAA,UACXE,EAAanB,EAAAE,EAAA,QACbwmE,WAAK,SAAA3yD,OACL9L,EAAU,CAEV,UAAK,6BAAuB8L,EAAM6H,SAAA,IAAAM,KAAA,8FAoBtC8qD,SACE,EACE9vB,oBAVOl1C,EAAA+wC,iBACLh/B,EAAAmjC,WAUF+vB,UAViC,SAAAjlE,GAAgC,KAAbA,EAAO+S,UACzD/S,EAAA+wC,iBACAh/B,EAAMmjC,YASR7tC,MAAA0K,EAAW1K,OAAA0K,EAAAzP,KACX2D,UAAOA,EACP6T,MAAKA,KACLxX,SAGCsiE,YAAMvxB,EAAA30C,QAAAwmE,YAAA,SAAAnzD,EAAAmiC,6DAgBT,OACEb,EAAA30C,QAAA8zC,cAAA,SAAA,CACE0C,QAPK,SAAgBl1C,GAEnB+R,EAAAmjC,UAAal1C,EAAA+wC,iBAAqBh/B,EAAAmjC,YAMpC7tC,MAAK0K,EAAA1K,MACLpB,UAAWA,EACX6T,MAAO/H,EAAM+H,MACbo6B,IAAKA,EACL8wB,SAAUjzD,EAAMizD,UAEf3xB,EAAM30C,QAAA8zC,cAAA,MAAA,uFC7Hf,iBACA,mBAIAiB,OAAA1hC,EAAA6H,SAAA,IAAAM,KAAA,KA0CE,OAAIm5B,EAAA30C,QAAA8zC,cAAA,SAAA,CAEJ0C,QA3CF,SAAAl1C,GAEA+R,EAAAmjC,UACAl1C,EAAA+wC,iBACAh/B,EAAAmjC,YAwCInoC,KAAG,SACH9G,UAAAA,QACE8L,EAAA+H,UACAo6B,sBAEF2c,SAAO9+C,EAAA8+C,YACLxpD,oEAGO,2EAOLuS,SAAI,IAAAM,KAAiB,sBACZs4B,cAAA,SAAA,2CASTvsC,UAEI6T,uBAGAkrD,qGAeIhnE,EAAAE,EAAQ,OACRF,EAAOE,EAAA,WACb,QAAiBA,EAAA,8BAIjBA,EAAM,yCAGFy8C,iBACApjB,EAASojB,EAAApjB,SAAA9oB,EAAAksC,EAAAlsC,SAAAyrD,EAAAvf,EAAAuf,YAAAiL,EAAAxqB,EAAAwqB,QAAAC,EAAAzqB,EAAAyqB,cAAAC,EAAA1qB,EAAA0qB,oBAAAlpD,EAAAw+B,EAAAx+B,OAAAmpD,EAAA3qB,EAAA2qB,wBAEJ/zD,OAAA,4DASHk2B,YAKI0B,cAAsB/R,sBAI5B9tB,EAAAknB,EAAY+0C,EAAMv1C,gBAChBpgB,EAAW41D,8BAAAl8D,EAAAqG,QAAAC,EAAAuf,iCACTga,cAAA/R,YAIE9tB,EAAMkG,kCAEG4nB,cAEPzrB,2BACMA,EAAEC,MAAY2rB,2BAEX5rB,EAAAsG,GAAAuc,EAAAvc,qDALEk3B,cAAa/R,mEAehCquC,EAAO,CAGTh8D,gCAIFnH,qCAEAojE,EAAOC,EAAcC,iCAAAC,EAAAr3C,EAAA/f,mBAIpB0D,IAAAuzD,EAAAvzD,IAAAgzD,EAAAM,GACQK,iBAAmB,EACnBC,UAAS,uBAMd,IAAMC,EAAQ5kE,EAAwBoqC,WAAKsvB,OAAA4K,EAAA78D,KAAA,SAAA/D,EAAA8rD,GAAE,IAAAqV,EAAM55B,OAAAkG,SAAAC,cAAA,cAAKyzB,EAAInsD,MAAAosD,WAAA,SAAOhM,EAAAp1D,EAAA2gE,EAAAC,EAAA5rD,OAAAgH,MAAA,SAAA4xB,GAC7D,GAAQA,EAAA,CAEN,GADJW,EAAgB8yB,yBAAAzzB,EAAAuzB,EAAAnhE,GACZugE,EASZ,IARY,IAAAe,EAAAH,EAAAI,qBAAA,KACYr0C,EAAU,SAAA1xB,GACjB,IAAAu2B,EAAAuvC,EAAA,GAAOvvC,EAAAyvC,UAAA,SAAAtmE,GAAM,KAAAA,EAAA+S,6BACjB8jB,EAAA0vC,WAKbjmE,EAAA,EAAAA,EAAA8lE,EAAA3lE,OAAAH,QApJV2lE,EAAAnsD,MAAAosD,WAAA,gLCjCA,6BAAA,CAcgB,IAAAz8D,EAAAgtB,EAAyBg/B,aAA6B3wD,EAAwByC,MAAgBK,IAAA,CAEvFoK,KAAOnJ,EAIPoJ,GAAApJ,GACL0uB,GACH/I,EAAAiI,EAAaC,aAAQ5xB,EAAAyC,MAAIK,IAAAZ,QAAA6B,IAC5B,GAAAY,GAAS+kB,EAAW,CACtBvnB,EAAS+pC,kBACT/pC,EAAS8pC,4DAKwB,4BAAA,kBAGlCv6B,2MC/BTjY,OAAAwC,eAAAzC,EAAA,aAAA,CAAAW,OAAA,IAEA,IAAAunE,EAAAl0B,EAAAt0C,EAAAE,EAAA,QA8DQioE,yBAtDR,SAAgBM,EACdhpC,EACA34B,GAMA,IAAMovC,EAAAsyB,EAAcpzB,OAAKqzB,EAAYhpC,GAG/BsO,EAAW,IAAAF,kBAAe,SAAclO,GACxCA,EAAcjrB,SAAA,SAAAkrB,GACdA,EAAYC,aAAcnrB,SAAA,SAAmB0B,GAC7CA,IAAaqpB,IACbsO,EAAkBQ,aAGlBi6B,EAAahzB,uBAAyB/V,sBAUpC0O,QAAArnC,EAAcC,IAAK,CACzBN,YAAM,EACN2nC,WAAK,WAIA,IAaL8H,MAWFj2C,EAAA,cACEU,EAAKL,SACA8B,MAAAA,KAAAoG,UAAA,oBACFjI,OAAA06B,QAAA,SAAA55B,4CA7DP,IAAA,IAAA6iB,oBAiES3jB,OAAciL,UAAmCqU,eAAA/d,KAAAO,EAAA6hB,KAClD7iB,EAAc6iB,GAAA7hB,EAAA6hB,IAEpB,OAAO7iB,oGCxETf,EAAMsnE,qDCFF9rD,wHAPJ4sD,EAAAC,EAAArM,wBAEAsM,EAAAv6B,OAAA9P,iBAAAoqC,GAGME,EAAuBjqB,SAAAgqB,EAAA9pC,WAAA,KAAA,EAC3BgqC,EAAU,CAAAx7C,IAAAy7C,EAAAx7C,OAAAm7C,EAAAp7C,IAAAu7C,EAAA,EAAAlkE,EAAAkgC,eAEFkkC,EAAAj0B,KAAArkC,EAAmBi4D,EAAAzZ,MACnB,6DAIRnzC,EAAStT,EAAAA,EAAA,GAAAsgE,GAAA,CAAA7Z,MAAA+Z,EAAArkE,EAAAkgC,iBACP,+ODbJ/oB,MAAAA,EAEA3H,IAAAA,SAeI,yBAEE,qCAAiB,m/BAIf7T,yBACMA,EAAS,aAAY,CAAAW,OAAY,UACpCjB,EAAaE,EAAI,iBAEtB,UACA,iLAdN,MAAA,CAAA+oE,EAAAC,eAyBQxoE,QAAQke,KAGd3e,EAAA,mBAGFM,OAAAwC,eAAezC,EAAA,aAAA,CAAAW,OAAA,qDE9CfwO,SAAA,WAGA,MAAA,CAAA,IAAA3L,EAAAs3B,mBAAAt3B,EAAAC,gBAAAolE,UAAA,CAAA,SAAAC,MAIA,SAAAA,EAAA7/D,EAAAwB,EAAAjE,GAGA,GAAAiE,EAAA,CAEA,IAAA81B,EAAA3T,EAAAC,gBAAA5jB,EAAAoE,WAEA,GAAAkzB,EAAA,CAGM,IAAuBh6B,EAAA0C,EAAA1C,OAEjByE,EAAA/B,EAAA+B,GACR,GAAOu1B,EAAAzqB,KAAArH,OAAAlI,EAAAqH,MAAAs3C,KACLl6C,EAAAyC,sBAUWnE,EAAApE,SACTnC,EACEgmE,eACS7jE,EAAA4Q,gHAbbkzD,CAAAh+D,EAAA1B,IAAAi3B,QAAE,CAAwB,IAAAzT,EAAS9hB,EAAA1B,IAAAZ,QAAgB63B,EAAAh2B,4CACnDS,EAAAyC,aAAA,IAAA5K,EAAAwqC,cAAAvgB,EAAA9K,MAAwBhX,sCAQpB89D,IAYR1oE,QAAOke,uBAODte,yBACGA,EAAA,aAAa,CAAAW,OAAA,UACPjB,EAAAE,EAAA,kBAEJF,EAAAE,EAAA,oBAGCF,EAAUE,EAAA,OAGZF,EAAAE,EAAQ,qBAKZA,EAAA,gBAIF,iBAGA,EAGEiU,IAAIi+C,EAAYjkC,QAAMmB,kBAGhBi6C,EAAA,cAIJnX,EAAOjkC,QAAAoB,oDASX,GAEKi6C,YACLC,EAAOC,iHAYyBH,EAAiB97C,UAAS,SAAKlkB,EAAWwB,EAAAjE,qBAE1E,GAAAiE,EAAU,CAGN,IAAA8wC,EAAY,IAAKvrB,EAAkBO,UAASvM,EAAAA,GAG5ChZ,EAAA/B,EAAkB+B,GAEtBA,EAAKyC,aAAA8tC,GAGC9wC,EAAKO,GAEX,OAAG,MAIH/B,EAAMoE,UAAAyrB,OAAAtyB,GAAAA,EAAA4mB,eAAAD,GAAA,CACN,IAAAK,EAAMvkB,EAAAoE,UAAAmgB,MACN,GAAO,OAAPL,GAAO2kC,EAAAmP,uCAAAh4D,EAAAoE,UAAA8f,YAKP,IAAM5H,EAAMxiB,EAAA6yB,qBAAA3sB,EAAA1C,OACVqH,MAAK2X,IADKxiB,CACCkG,EAAIoE,WAEjB,GAAIkY,EAAA,CACF,IAAM8jD,EAAUpgE,EAAKK,IAAAZ,QAAY6c,EAAAhb,KACjC,GAAoC,IAAhCijB,EAAAjU,MAAAiU,EAAAtJ,MAAmB,MAAajb,EAAAoE,qBAAA2iB,EAAAO,WAClC,OAAIxtB,EAAoB6hB,eAAUkS,EAAQsF,OAAtCr5B,CAAsCkG,EAAAoE,qEAqB3Ci8D,EAAArgE,EAAAK,IAAAZ,QAAA8kB,EAAAjjB,IAAA,uFC1JTyiB,IAAAu8C,EAAAptB,UAIM,GAAAqtB,EAAA,CAAoB,IAAAC,EAAAjjE,EAAAyC,MAAAK,IAAAZ,QAAA8gE,EAAAj/D,KAII,GAAAhE,EAAAqH,MAAA2X,IAAA,CAAc,IAAAA,EAAAxiB,EAAA28B,iCAAAl5B,EAAAyC,MAAAK,IAAAZ,QAAA8gE,EAAAj/D,KAAAhE,EAAAqH,MAAA2X,KAAc,GAAAA,GAAAA,EAAAhb,MAAAi/D,EAAAE,OAAA,CAAO,IAAAC,EAAAnjE,EAAAs5B,QAAAva,EAAAuH,oCAEpCpV,KAAAulB,IAAAssC,EAAArtB,QAAAytB,EAAA3N,wBAAAxnB,MAAA,IACjB,OAPsB,WAAMhuC,EAAA0H,QAAa,IAAAlD,EAAAxE,EAAAyC,MAAA+B,GAAauwC,EAAA,IAAAvrB,EAAAO,UAAAk5C,EAAAA,UAAQz+D,EAAAyC,aAAA8tC,GAAa/0C,EAAAiE,SAAAO,GAAUrC,EAAA8pC,iBAAe9pC,EAAAihE,8BAOpGN,YAQR,IAIMlpE,QAAAke,uHAYN,gBAEMte,yBACFA,EAAA,aAAA,CAAAW,OAAA,oBAKcjB,EAAAE,EAAA,OAMd,8FAeI,iDASVuP,SAAO,wKC7ET06D,EAAAz1D,SAAA,SAAA01D,GACA,IAAA54C,EAAAjoB,EAAA1C,OAAA6G,MAAA08D,GAGA54C,GACAvnB,EAAAwvB,WAAAmjB,EAAAC,EAAArrB,MAMQvnB,EAAAogE,eAAA,IACApgE,EAAAL,IAAAqpB,aAAgB2pB,EAAOC,GAAY,SAAGzmC,EAAAvL,GACxC,GAAAuL,EAAArH,OAAsB2tC,EAAAxuC,MAAaipB,WAAG/gB,EAAArH,OAAA2tC,EAAAxuC,MAAA5J,MAGjC8R,EAAArH,OAAA2tC,EAAAxuC,MAAA2mB,aAAAze,EAAArH,OAAA2tC,EAAAxuC,MAAA4mB,cAAA1e,EAAArH,OAAA2tC,EAAAxuC,MAAAmpD,iBAAAjhD,EAAArH,OAAA2tC,EAAAxuC,MAAAo8D,sBAAAl0D,EAAArH,OAAA2tC,EAAAxuC,MAAAq8D,4BAAP,wFAMWC,EAAIhvB,EAAAjf,WAAAkf,GACX,GAAK+uB,EACR,GAAWp0D,EAAArH,KAAKmhB,YACZjmB,EAAA2yB,cAAA4tC,EAAAp9C,MAAAsvB,EAAAxuC,MAAAipB,4CAGoB,IAAAszC,EAAAt2C,EAAAu2C,WAAAF,IACfC,GAAA,IAAAA,IACHxgE,EAAA0gE,KAAAH,EAAAC,oBAIP,oBAIWG,8DAcI,aAAA,CAAA3pE,OAAA,kFAQnB4pE,EAAA,IAAA7nE,EAAe4kC,UAAmB,aAAW,SAAAr+B,EAAAuL,EAAAsY,EAAA9K,4RC1D7C,MAAA,CACAtf,EAAA8nE,SAGAD,EACAE,YAKU,SAAAlkE,SACJ,CAAA,IAAQ1D,EAAkBoQ,OAAK,CAAmBY,IAAAR,yCAU1C,UALDrP,GADHA,EAAeA,EAAAwI,QAAW,eAAA,UACPA,QAAA,cAAA,iCAIvBxI,EAAAkb,EAAAgD,oBAAAle,oBAGEoa,EAAYC,mBAAAC,EAAA,kDAKJpW,UAAS,mCACL,SAAKnH,mBACXmB,UAAYC,OAASH,EAAA2hB,EAAA3hB,iDAGdud,eAAA/d,KAAAO,EAAA6hB,sCAIqC1hB,oCAC5C,aAAM,CAAYvB,OAAA,UAClBjB,EAAME,EAAA,SACAA,EAAA,sDAEJ81D,kBACA5/C,uBACEA,EAAG1I,MAAA8e,MAAW,SAAUgF,mBACxBrxB,wOCzClBkD,EAAAkiB,aAAAja,EAAA1B,IAAAohE,GAAA,GAAAt2D,SAAA,SAAAu2D,GACA,GAAAA,EAAA70D,KAAA3K,MAAAtL,GAAA,CACA,IAAAA,EAAA8qE,EAAA70D,KAAA3K,MAAAtL,GAE6B,GAAA4pC,EAAAmZ,IAAA/iD,GAAA,CACJ,IAAAiW,EAAA60D,EAAA70D,KAED9K,EAAAsxB,cAAqBquC,EAAApgE,SAAA2N,EAAAhQ,EAAAA,EAAA,GAAA4N,EAAA3K,OAAA,CAAAtL,GAAA,OAAAiW,EAAA1I,YAE/Bq8B,EAAA/iC,IAAkB7G,6CAIjB,QAAA+qE,EAAAz/D,MAAAtL,qDAOTA,EAF8Bs4B,EAAAg/B,aAAAnsD,EAAA1B,IAAAuhE,EAAA35C,EAAAziB,MAE9B5O,MACQirE,EAAAj1D,MAAA,SAAAqa,GACG,OAAeA,EAAAxc,OAAAm3D,EAAAn3D,MAAAwc,EAAAvc,KAAAk3D,EAAAl3D,QAEpBm3D,EAAgB3pE,KAAA0pE,aAEX7/D,EAAAmuB,WAAA0xC,EAAAn3D,KAAAm3D,EAAAl3D,GAAAud,EAAAziB,6FAefrO,QAAOqb,EAAcsvD,6BAAAzsD,2BAMvBre,OAAAwC,eAASzC,EAAkB,aAAoB,CAAAW,OAAA,QAC7CisB,EAAMltB,EAAAE,EAAA,IACN+K,EAAIjL,EAAAE,EAAa,MACPF,EAAAE,EAAA,MACH,QACL,SAAO2G,wBAQF,gCAJAykE,EAAwDhgE,EAAAqC,YACrD49D,EAAAjgE,GAGHA,mCAKT,MAAS,CAAA,mBACKyoB,OAAK,SAAYzoB,UACfggE,EAAgBhgE,EAAAqC,YACvB49D,EAAAjgE,gECxETsG,EAAAsiB,YAAA5oB,WAMsBqhB,UAClB,SACErhB,SACEqhB,EAAMvW,KAAArH,KAAAlI,gBACN8lB,EAAQ9hB,IAAC8hB,EAAiBvW,KAA6BtL,SAAwB,EAAAjE,EAAqBqH,MAAAipB,UAAA5wB,WAV5GilE,CAAA7+C,eAcYhf,eACEwf,gBAAAxf,+IAoBdyI,EAAeq1D,uHClCfnrE,EAAAI,QAAAke,OAKI,gBAEIte,yBACAA,EAAS,aAAqB,CAAAW,OAAoC,UACtDjB,EAAAE,EAAA,6CAON2G,mDAMEyE,EAAGsmB,EAAe21C,EAAAv1C,WAElBrkB,UAASyrB,4BAEX,OAAOvH,EAAAqpB,MAAA1uB,MAAA,SAAA2G,mNAUN7nB,EAAAmmB,iBAAAD,aC/BflxB,EAAAI,QAAAke,GAIA5e,EAAAC,EAAA,KACA,SAAAU,EAAAL,GAEAC,OAAMwC,eAAYzC,EAAC,aAAyB,CAAAW,OAAA,QAClCmxD,EAAApyD,EAAAE,EAAA,IAER0e,EAAM,CAENzL,SAAO,SAAA6iD,GACL,MAAA,CAAA,CACE7hD,IAAQi+C,EAAAjkC,QAAA4zC,mBAAO,SAAAx4D,EAAAwB,GAAe,GAAAxB,EAASoE,UAAAyrB,MAAA,2CAG7B,GAAA5zB,EAAAuJ,KAAAmhB,aAAApC,EAAAsC,eAAA5qB,EAAAmgB,YAAAljB,SAAAqrB,EAAApgB,QAAAjL,OAAA,GAAA8G,EAAA8vB,aAAA,CACN,GAAAtuB,EAAkB,CAEd,IAAAO,EAAA/B,EAAA+B,GACGA,EAAA++D,eAAA,IACH/+D,EAAOomB,WAAA,UAGN,OAAA,gCAabzxB,EAAA,cAEEU,EAAML,yBACEA,EAAA,aAAA,CAAAW,OAAA,UAGGjB,EAAUE,EAAA,OACZF,EAAAE,EAAA,kBAKHF,EAAAE,EAAQ,MACFF,EAAAE,EAAA,KACVF,EAAOE,EAAA,gBAILF,EAAAE,EAAA,eA2CgBqS,EAAcm5D,EAAMzmE,4BAGtC4B,EAAS0C,EAAA1C,2BAGX,IAAA0C,EAAOoE,UAAAyrB,eAIX,IAAStkB,EAAAgZ,EAAAtoB,OAAAmgB,YAA4C7Q,MAAiB,sCACpE,IAAOA,WAID,GAAA2jB,EAASU,aAAM5vB,EAAA1C,EAAA6G,MAAA7B,MACb,OAAA,WAIV,OAAe,kIC/Hf,GAAAyqB,IAAAV,EAAAoB,kBAAAztB,GACA,OAAA,EAKE,GAAAwB,EAAS,CAAoB,IAAC+rB,EAAA60C,EAAgB7+D,QAAA,SAAA,uBAGvCwV,EAAA8K,EAAgBU,EAActoB,OAAAmgB,YAAAljB,OAC9B6I,EAAIulC,YAAAzjB,EAAA9K,GACT,IAAKvT,EAAIw1B,EAAA19B,EAAAqH,MAAUk2B,UAAA9N,EAAAzvB,EAAAqH,MAAA+mB,UAAApuB,EAAAqH,MAAAy2C,WAEZ7uC,EAAAwgB,EAAAzvB,EAAAvC,KAAA,IAAAwQ,EAAA,GAAA,OAAA5R,EAAA8gB,SAAAoV,MACL3tB,EAAA84B,EAAqB,CAAAt/B,OAAC6xB,IAAcR,GAAqBQ,EAAAr0B,OAAAsZ,EAAAqB,eAAA,CAAAxB,QAAA,CAAAkb,KAAA,GAEvDa,EAAiBP,EAAAC,2BAAc9tB,EAAAK,IAAAL,EAAAoE,gBACf,KACd02C,EAAMt1C,EAAA+U,cAAuBrY,EAAMqK,KACnC8hB,wBAAWtsB,EAAAqsB,EAAM0sB,iBAEjBj3B,EAAOtX,6OClBjBxV,EAAAI,QF8DM,SAAO+E,uCAITimE,EAAKn5D,EAA2Bg8C,0BAAQtpD,EAAAqD,cAAAJ,sCAKlC,MAAA,CAAA,CACAiM,IAAai+C,EAASjkC,QAAMC,MAC5Bxe,QAAWg8D,EAA2Br5D,EAAiBm5D,EAAiBzmE,iBAKrE,oBAIK,CAAA,IAAAjC,EAAA4kC,UAAA,UAAA,SAAAr+B,EAAAuL,EAAAsY,EAAA9K,GAEC,IAAAupD,EAA6BtiE,GAGzB,OAAA,KAEL,IAAA+B,EAAQ/B,EAAM+B,GAKpB,OAJHA,EAAYomB,WAAO,MAGTruB,EAAkB2pB,iBAAkBI,EAAAtY,EAAW,GAAOrS,OAAtDY,CAA4DiI,GACzDA,MAKZ,OE7FVtL,EAAAC,EAAA,KACA,SAAAU,EAAAL,GAGAC,OAAMwC,eAAAzC,EAAmB,aAAA,CAAAW,OAAA,IAEzB,IAAMiC,EAAuBlD,EAAAE,EAAA,KAC3BiD,EAAUnD,EAAcE,EAAA,OAEpB,kBACO2G,UACLilE,EAAMjlE,iCAGE0M,OAAA,WACIhO,UAAA,kDAEEjB,EAAA8e,OACA,oBAAA,SACA1V,YACApJ,KAAAA,EAAaoJ,gBACNqW,MAAA7gB,EAAuB8gB,SAAWhQ,KAAA2P,GAAU,EAAA,uDAczE,IAAAxiB,EAASiB,MAAAA,KAAAjB,iBAAqD,SAAAJ,GAC5D,OAAIA,GAAAA,EAAAC,WAAAD,EAAA,CAAAL,QAAwBK,0BAEtBT,EAAa,aAAA,CAAAW,OAAA,UACFjB,EAAAE,EAAU,OACvBiB,EAAgBnB,EAAYE,EAAA,0BAGhCs9B,EAAOx9B,EAAAE,EAAA,uLC9BLytB,EAASC,wBAAgBjgB,GAAA,KACvBkzB,EAAY3T,EAAAC,gBAAAxf,0GAOd,8KDyBW,ICtDf,IAAAo+D,EAAAvuC,EAAAwuC,YAAAllE,GAEAw5B,EAAA5/B,QAAA6/B,eAAAwrC,GAGAE,IAAAF,EAAAG,aAAA,wBAyBettD,qBACXje,EAAAL,SACO8B,MAAAA,KAAAD,gBAAgB,eACvB,IAAAE,EAAA,EAAUC,EAAA,EAAAC,EAAAC,UAAAC,OAAAH,EAAAC,EAAAD,IACVD,GAAAG,UAAOF,GAAAG,WAAAvC,EAAAwC,MAAAL,GAAAM,EAAA,MAAAL,EAAA,EAAAA,EAAAC,EAAAD,QAAM,IAAAM,EAACJ,UAASF,GAAAO,EAAA,EAAaC,EAAAF,EAAAH,OAAUI,EAAAC,EAAAD,IAAAF,wBAIlDxB,EAAAiB,MAAAA,KAAAjB,iBAAA,SAAAJ,GACE,OAAAA,GAAAA,EAAAC,WAAAD,EAAA,CAAAL,QAAAK,0BAiBgBT,EAAA,aAA4C,CAAUW,OAAA,UAhB/DjB,EAAeE,EAAA,OAA0BF,EAAEE,EAAA,yBAI3CisE,EAAAnsE,EAAAE,EAAA,OAKCiB,EAAWnB,EAAAE,EAAA,QACjB,IAAGiD,EAAWoC,UAAgB,4BAiBzBoD,8DAEL,UACyB,UACtB,yBACAA,EAAAlD,QAAA8rC,cAAA,sEAGE1vB,SAAA,EACLrd,MAAM,WACA,IAAAoD,EAAA4R,EAEJ,OAAI7Q,EAAA4L,MAAYhE,WAAoC,QAA3B3I,EAAAe,EAAWC,OAAAE,mBAAgB,IAAAlB,OAAA,EAAAA,EAAAwkE,YAAA,QAAA5yD,EAAA7Q,EAAAC,OAAAE,mBAAA,IAAA0Q,OAAA,EAAAA,EAAA6yD,eAM3C,6BAGTC,sBAAO,iEAGTlqE,KAAImqE,aAAgBC,EAAA9rE,QAAgB2vC,MAAA,SAAcztC,EAAAg4B,GAChD,OAAOh4B,EACL2V,KAAAwf,cAAA6C,EAAAriB,kBAGE/M,UAASihE,wBAAA,SAAAC,EAAAC,EAAApjE,cAIf,6BAAO+B,GAEXshE,EAAAphE,UAAAqhE,iBAAA,2DACM,OAAeC,EAAAv0D,6HCnGfw0D,OAAA18B,MAAqB,SAAAztC,EAAAg4B,GACrB,OAAAh4B,EAAqBoqE,UAAApyC,EAAAoyC,aAKX5qE,KAAAmqE,aAAepuD,QAAqB,SAAA2uD,GAG5C,OAAAG,IAAqBH,EAAev0D,QACrC5I,KAAA,SAAam9D,GACZ,OAAAA,EAAiBI,2DAMnB,IAAAF,EAAcG,EAAAC,eAAcC,GAC5BC,EAAYJ,EAAW/uD,QAAA,SAAoBkuD,GAC7C,QAAAA,EAAc9zD,KAAArB,SAAcm2D,EAAOr4D,mBAMnCg4D,GAAcX,EAAAW,YAAmBA,sCAO5B,CAAA,qBA1BT/rE,MAAAqW,OAAAi2D,cAAAP,GA6BSA,UAAiBA,SD8CX,qBAlCJ,SAAAvnE,yBAOF,MAAA,CACLgK,SAAA,WAA8D,MAAA,CAAA,IAAA3L,EAAYs3B,mBAAAt3B,EAAAC,gBAAAypE,OAAA,GAAArB,EAAAsB,oBAAAt5D,GAAAu5D,EAAA/kE,0BAGrE,MAAA,CAAA,IAAAwjE,EAAAwB,mBAAWx5D,EAAA,IAA6By4D,EAAAjkE,EAAA5C,yFE5C/C6nE,EAAQZ,UACNA,KAAuBA,UAFd1sE,EAAA8sE,oNAlBbS,OAAAA,GAIA,IAAAC,EAAAC,OAAAF,GAAAG,UAEA,OAAAD,OAAA7P,MAAA4P,IAAAF,EAAAE,GAEAA,OAFA,wBAoBMxtE,OAEFo6B,2BAAAA,EAAO,SAAAnW,EAAAqW,GAcT,8FAVO,SAAUrW,EAAkBqW,GAC5B,IAAA,IAAA1W,KAAA0W,wBAGTrW,EAAAL,GAAA0W,EAAA1W,MAMEK,EAAYqW,aAEHrW,EAAAqW,YACOG,qBACFxW,IADJA,EAAAqW,mFAMGx4B,KAAAjB,iBAAA,SAAAJ,0BACEA,EAAS,CAAAL,QAAAK,sEAGpBI,EAAAnB,EAAAE,EAAA,QAhBIiB,EAA4BnB,EAAAE,EAAA,QAkBlCF,EAAKE,EAAA,MACLF,EAAUE,EAAA,MACQF,EAAKE,EAAA,OAClBF,EAAAE,EAAA,eAiBHqJ,YAA8C4a,cAAA5a,EAAAA,EAAA1C,OAAAqH,MAAA5J,QAdhDmpE,oBAAgB,SAAA97B,mCAGX,OAAA,EAEH5mC,GAAMjE,GACS6qC,EAAAmH,IAAAvvC,GAEV0kE,UAAQnnE,UAEb,UAIsE,SAAAuP,0CAKlElC,IAAAw9B,EACA7qC,KAAA,WACA,MAAA,CAEAukC,OAAA,WAEAxlC,EAAAqoE,cAKAxU,QAAA,WAEA7zD,EAAAqoE,aAIAroE,EAAAqsC,oBACA7D,OAAAkG,SAAyBpC,oBAAI,UAAqBtsC,EAAAsoE,gCAQxDtoE,EAAA6uC,MAAO,sBAGD7uC,EAAA8C,GAAAA,oCACN9C,EAAIqsC,kBAAgBnsC,EAAAoD,UAAuB3B,EAASC,YAAM5B,EAAKqoE,cAC7DC,aAAKtoE,EAAAsoE,aAAAxnE,KAAAd,gECvGX,SDoEM8nE,EAAqBt3D,KAwCd7K,UAAOyiE,UAAA,SAAAnnE,OACd1E,KAAAsyC,MAAA,uEAMItyC,KAAAsyC,MAAA54B,MAAA2Z,SAAA,WAARrzB,KAAAsyC,MAAA54B,MAAA24B,OAAA,MACQ9vC,EAAAwwC,YAAe/yC,KAAAsyC,MAAC,GAAAtyC,KAAAgsE,uCAAoDtnE,EAN7D,IACE,MAMbunE,EAAW3tE,QAAK00C,OAAAhzC,KAAaksE,kBAAAxnE,EAAwB,CAP1C,IACE,kBAWTunC,OAAAkG,SAAa1yC,KAAAikB,YAAA1jB,KAAAsyC,4EAKnB,IAAA/mC,EACE7G,EAAAyC,MAAAoE,UACE4gE,EAAAznE,EAAAC,IAAoBu1D,wBACpBznB,EAAS/tC,EAAA+lB,YAAAlf,EAAAqG,MACTw6D,EAAgBx2D,KAAAC,IAAA48B,EAAAtnB,OAAA8gB,OAAA0G,YAAAzV,EA/EK,GAgFrBmvC,EAAmBF,EAAKtsE,EACxBysE,EAAM12D,KAAAupB,IAAAktC,EAAAD,GACNG,EAAqB32D,KAAAC,IAAO48B,EAAAoa,MAAA5gB,OAAA2G,WAAA7V,EAlFP,GAmFrByvC,EAAmBL,EAAQ3+C,EA7GtB,kBAkHbklB,KAJiB98B,KAAAupB,IAAAqtC,EAAAD,GAIjB,+oBCtJAE,YAAAzsE,KAAAuG,GAAAC,OAAA0kC,OAGAwhC,kBAAA1sE,KAAAuG,GAAAlD,QAAA8rC,cAAAnvC,KAAA2sE,aAAAzC,uBACA3jE,GAAAvG,KAAAuG,MAMAglE,EDmE4E,CCjE5ExqE,EAAAoQ,QACAjT,EAAAqtE,mBAAAA,KAeE1tE,EAAM,cACAU,EAAAL,OACNkI,EAAMpG,MAAKA,KAAAoG,UACN,WAYC,SAXJjI,OAAQ06B,QAAc,SAAA55B,GACtB,IAAA,IAAOgB,EAAAC,EAAA,EAAA2hB,EAAazhB,UAAAC,OAAAH,EAAA2hB,EAAA3hB,IAEhB,IAAA,IAAa4hB,oBAEb3jB,OAAaiL,UAAcqU,eAAA/d,KAAAO,EAAA6hB,KACf7iB,EAAA6iB,GAAA7hB,EAAA6hB,IAGZ,OAAA7iB,IAEAoQ,MAAArP,KAAAI,YAGNrB,EAAgBiB,MAAAA,KAAMjB,iBAAQ,SAAAJ,UAAMA,GAAAA,EAAMC,WAAAD,EAAmB,CAAAL,QAAWK,MACtEqB,MAAAA,KAAAkyC,cAAA,SAAAvzC,MACAA,GAAAA,EAAAC,WACA,OAAMD,WAER,GAAM,MAAAA,EAAsC,IAAA,IAAA4B,KAAM5B,EAAuDR,OAAAsf,eAAA/d,KAAAf,EAAA4B,KACvG6H,EAAA7H,GAAA5B,EAAA4B,aACA,QAAA5B,EACAyJ,UAKFzH,eAAMzC,EAAU,aAAA,CAAAW,OAAA,UACVE,EAAAnB,EAAsBE,EAAA,QACxBF,EAAAE,EAAA,iBAEDF,EAAAE,EAAA,OAACF,EAAAE,EAAA,OAAqBo0C,EAAAt0C,EAAAE,EAAA,mBAEzB8uE,EAAsBhvE,EAAyBE,EAAA,OACzC+uE,kBAAY,SAAMl7D,GACxB,IACMm7D,EAAAn7D,EAAgBmf,KAAA,GADN,GAIhBi8C,EAAMp7D,EAAAmf,KAAU,GACdpX,EAAAtT,EAAAA,EAAa,GAAQuL,EAAA+H,OAAA,CACpBwjB,OAAA4vC,EAAA,KAEG/vC,MAAAgwC,EAAgB,SACP,CAAA,0BAAA15B,OAAA1hC,EAAA6H,SAAA,MAAaszD,EAAA,MACdC,EAIRvnE,EAAAytC,EAAA30C,QAAA0uE,SAAsB,IAAC/B,EAA2BzlE,EAAA,GAAAynE,EAAAznE,EAAA,GACtD4R,EAAM67B,EAAiB30C,QAAM0uE,WAA6BE,EAAmB91D,EAAA,GAAA+1D,EAAA/1D,EAAA,GAC7EC,EAAM47B,EAAA30C,QAAA0uE,SAA8C,GAAAI,EACjD/1D,EAAA,GAAAg2D,EACKh2D,EAAI,KAAI47B,EAAA30C,QAAS0uE,SAAA,GAAAM,EAAAh2D,EAAA,GAAAi2D,EAAAj2D,EAAA,mCACzB,OAAI3F,EAAA67D,mBAAmBC,WAAAP,UAKnBv7D,EAAA67D,uBAIEv6B,EAAc30C,QAAYovE,SAAM,oBAClCF,mBAAOG,cAAA1C,EAAAH,UAMXn5D,EAAA67D,uBAGIlvE,QAAMsvE,WAAA,WACNR,EAAMlC,EAAA7qE,QACNgtE,EAAAz3D,KAAAupB,IAAA+rC,EAAA7qE,OAAA,EAAA,mBAOE4yC,EAAA30C,QAAAo1C,OAAa,QACbT,EAAM30C,QAAAo1C,OAAA,iCAERT,EAAA30C,QAAAo1C,OAAA,QAEFp1C,QAAKsvE,WAAA,aACCC,aAAAC,EAAAp2D,qBAEF/F,EAAM67D,mBAAA/C,mBAAAl9D,KAAA,SAAA4I,4CAERpE,IAAAoE,EAEFtX,MAAKsX,GACLxE,EAAKpL,GAAAlD,QAAA8rC,cAAAh5B,OA0EE43D,EAIL,WAGI,IAAAvoE,EACA0lE,EAAe7qE,OAAA+sE,GACfz7D,EAAAq8D,eAAoB9C,EAAAkC,IAAA,QAAA5nE,EAAAsoE,EAAAp2D,eAAA,IAAAlS,OAAA,EAAAA,EAAA3G,QAAA,KAUpBovE,EAAkB,CAA+Cb,oBAAAA,EAQjE/pE,QAAAsO,EAAApL,GAAiBlD,QACjB8O,MAAAR,EAAApL,GAAA4L,MACA+7D,qBAdU,WAEZX,EAAAD,EAAA,IAcGx5B,IAAAq6B,wPAtFLC,IACF,OAAA,OAAAD,EAAAz2D,QACEy2D,IAKJ,OAAAtnE,EAAAkL,kBAGIJ,EAAA08D,6BACA,UACF,6EAIExnE,EAAA8pC,mBACU9pC,EAAAynE,UAAAC,EAAKC,iBAAAJ,IAAS12D,qCAGxB7Q,EAAA8pC,wBAIA,IAAA,SACJ49B,EAAAC,iBAAmBV,EAAAp2D,UAAA62D,EAAAC,iBAAAC,EAAA/2D,YACnBq2D,IACOlnE,EAAM8pC,kBAEb,sBAGI,IAAA,aAIN,IACE,UAAO,IAAA,YAAqB,IAAA,SAC1B,IAAA,WACO,GAAA49B,EAAUC,iBAAAV,EAAAp2D,WAAA7Q,EAAAynE,WAAAznE,EAAA6nE,SAAA7nE,EAAAoM,QAAA,CAAiD,IAAE07D,EAAOC,EAAAC,yBAAAhoE,EAAAumE,KAAAlC,EAAA7qE,aACvE+V,IAAAu4D,GAACA,GAAS,GAAAA,IAAAvB,IACIvmE,EAAA8pC,iBACZ08B,EAAqBsB,uCC5LjC9oE,UAAgB,0CACV6T,MAAA,CAASqjB,MAAA+xC,MACJxwE,QAAO8zC,cAAS5b,EAAAu4C,UAAkB,cAE3CC,cAAOr9D,EAAA86D,uBAJT5mE,UAAA,wCAOAypC,YAAgB39B,EAAa+6D,kBACvBuC,SD6Ma,SAAApoE,GACPomE,EAAApmE,MAAAA,OAAiB,EAAAA,EAAAuhC,OAAAvpC,QC7MzBi1C,IAAAg6B,sDAFJh6B,IAAAo7B,8DD0HW,SAAAroE,GACL,IAAAhI,EAAKgI,EAAAuhC,OAAA+mC,gBAAA,GAAAtwE,MACLuwE,EAAKz9D,EAAA67D,mBAAA/C,mBAAA12D,MAAA,SAAAoC,GAGH,OAAIA,IAAAtX,UAQMuwE,4RAuDD,SAAAC,GACLhC,EAAUgC,6eErLpBxxE,EAAA,cAEIU,EAAAL,yBACOA,EAAA,aAAA,CAAAW,OAAA,gCACSwnE,WAChBA,GACAp6B,OAAUkG,SAAMm9B,gBAAAjJ,0GCnBtB,2KAAAh3D,MAAArP,KAAAI,YAsBErB,EAAMiB,MAAiBA,KAAMjB,iBACzB,SAASJ,GAEb,OAAMA,GAAKA,EAAAC,WAAAD,EACN,CAAAL,QACHK,0BAIeT,EAAA,aAAA,CAAAW,OAAA,UAAyBE,EAAOnB,EAAAE,EAAA,QAC5CyxE,YAAMt8B,EAAgB30C,QAAAwmE,YAAA,SAAAnzD,EAAAmiC,OAAKp6B,EAAKtT,EAAM,GAAAuL,EAAA+H,cAAeu5B,EAAU30C,QAAA8zC,cAAA,SAAA,CAAoBvsC,UAAI,0EAAA8L,EAAA9L,gBAAQ6T,EAE9FkrD,SAAKjzD,EAAAizD,SACL9wB,IAAAA,EACAm7B,SAAMt9D,EAAAs9D,SACN/rC,aAAWvxB,EAAAuxB,gBAOXsB,kBAIA,cACAjmC,EAAQL,SACR8B,MAAeA,KAAAoG,UAAA,oBACfjI,OAAU06B,QAAM,SAAA55B,GAChB,IAAA,IAASgB,EAAAC,EAAM,EAAA2hB,EAAAzhB,UAAAC,OAAAH,EAAA2hB,EAAA3hB,IAEf,IAAA,IAAY4hB,KADZ7hB,EAAKG,UAAAF,4XCzDbwZ,EAAAtT,EAAAA,EAAA,GAAAuL,EAAA+H,OAAA,CAAAqjB,MAAAyyC,OAAAp5D,EAAAzE,EAAAorB,QACA,OAAAkW,EAAA30C,QAAA8zC,cAAA,MAAA,CAEAvsC,UAAA,yBAKA6T,MAAAA,GAGA/H,EAAAq9D,cAAA/7B,EAAA30C,QAAA8zC,cAAA,MAAA,CAaM0f,IAAAngD,EAAAq9D,cAEAnpE,UAAA,oBACEosD,IAAA,UACA77C,EAAA68B,EAA+C30C,QAAA8zC,cAAA,QAAA,CACnDzlC,KAAA,OACA2iC,YAAA39B,EAAiB29B,YACjBxe,KAAA0+C,EACA3pE,UAAA,kIAA0B8L,EAAA9L,UAAA,gBAAA8L,EAAAq9D,cAAA,+BAAA,IAC1BnwE,WAAsBuX,IAAtBzE,EAAA9S,MAA4B8S,EAAA9S,WAAAuX,EAC5B64D,SAAAt9D,EAAAs9D,+BAGIQ,QAAA99D,EAAU89D,QACVC,WAAA/9D,EAAe+9D,2BACnBC,QAAAh+D,EAAQg+D,QACP/K,SAAAjzD,EAAAizD,SAEHgL,QAAAj+D,EAAMi+D,QAEA97B,IAAAA,EACJruC,YAAM,iCAaD,KAAA,+BAAW,+VACd,cACElH,EAAAL,SACU8B,MAAUA,KAAMjB,iBAAiB,SAASJ,UACpDA,GAAQA,EAAMC,WAAAD,EAAA,CAAAL,QAAAK,0BAEHT,EAAA,aAAA,CAAAW,OAAA,UACXE,EAAanB,EAAAE,EAAA,QACHF,EAAAE,EAAA,OACAiB,EAAAnB,EAAAE,EAAA,QACLF,EAAAE,EAAA,SAEJ,SAMT+xE,EAAkB58B,EAAsB30C,QAAAwmE,YAAyB,SAAAnzD,EAAqBmiC,GACpF,IAAMg8B,EAAWl6D,KAAAm6D,MAAAp+D,EAAeorB,MAAAprB,EAAAq+D,iBAChCC,EAAmB,qCAErBD,gBAAcr+D,EAAsBq+D,gBAC5Bz/B,cAAW5+B,EAAA4+B,cACjB2/B,mBAAgBv+D,EAAAu+D,+DAElBC,+CAEE1B,EAAOx7B,EAAY30C,QAAIo1C,OAAW,8BAEpC,IAASluC,EACyB,QAA1BA,EAAAipE,EAAW/2D,eAAe,IAAAlS,GAAAA,EAAA4qE,aAAA,CAAAC,SAAAz6D,KAAAm6D,MAAAp+D,EAAA4+B,cAAA5+B,EAAAq+D,qBAChC,kFAWWnL,UATK,SAAsBh+D,GAChC,IAAA8nE,EAAWzwE,EAAA2wE,yBAAmBhoE,EAAA8K,EAAA4+B,cAAA5+B,EAAAq+D,gBAAAr+D,EAAA2+D,iBAAAjwE,aACpB+V,IAATu4D,4BAEA9nE,EAAS8pC,mBAWhBi0B,SAAc,EACZ9wB,IAAKA,KACIx1C,QAAA8zC,cAASm+B,EAAeC,cAAiB,CAElDC,YAAK9+D,EAAAq+D,gBACHU,SAAO96D,KAAQ+6D,KAAAh/D,EAAA2+D,iBAAejwE,OAAiBsR,EAAAq+D,iBAEjD9yC,OAAKvrB,EAAAurB,OACHH,MAAOprB,EAAKorB,MAAA,EAEd6zC,UAAKd,EACHA,YAAOA,EAETe,SAAKZ,EACHpqE,UAAO,iBAETiuC,IAAK26B,KACaqC,2BCnGdjC,yBAAkB,SAAwBhoE,EAAA0pC,EAAAy/B,EAAAe,UAC9ClqE,EAAMkL,SACN,mBDsGA48D,IAAK,EACH/4D,KAAOupB,IAAA,EAAAwvC,GCpGX,IAAM,UACJ,iDAAMqC,CAAAzgC,EAAAy/B,OACN,aACA,gBDoGEiB,EAAOjB,EAAAe,oCCpGTh5B,CAAAxH,EAA0By/B,EAAAe,mBAGxB,gDAAAG,CAAY3gC,EAAiBy/B,EAAQe,OACvC,WACA,OAtCJ,SAAAE,EAAAjB,EAAAe,GAca,IAAApC,EAAAsC,EAAsB,EAAAjB,EACjC,OAAMp6D,KAAAC,IAAAk7D,EAA4B,EAAApC,GAwB9BwC,CAAA5gC,EAAAy/B,EAAAe,gCAtBEE,EAAkBjB,EAAWe,GAEnC,IAAMpC,EAAAsC,EAAmB,EAACjB,SACxBp6D,KAAAupB,IAAA,EAAAwvC,GAqBIyC,CAAO7gC,EAAMy/B,qBAEb,mBAEAe,EAAc,qBDoFlBpC,kTE/GqF0C,EAAKf,EAAAjwE,OAAA,CACxF,IAAAga,EAAAi2D,EAAAe,gHAHuB,SAAAxqE,sBAC3BA,EACE+pC,kBAAK0gC,EAAiBC,mEAlB1B1qE,EAAA+pC,mPCVI,yFAEU,+kCAKA,o1CAIR1yC,SACQ8B,MAAAA,KAAAjB,iBAAA,SAAAJ,aACNA,EAAAC,WAAOD,EAAA,CAAAL,QAAAK,2DAGTI,EAAAnB,EAAAE,EAAA,+BAESm1C,EAAA30C,QAAAwmE,YAAA,SAAAnzD,EAAAmiC,qDAGT,CAAA5W,OAAA,kBACE,4DAEAkV,cAAW,MAAA,CAAAvsC,UAAA,4CAAAotC,EAAA30C,QAAA8zC,cAAA,MAAA,CAAA14B,MAAA/H,EAAA6/D,oBAAA7/D,EAAA24D,gBAAAzrE,OAAAo0C,EAAA30C,QAAA8zC,cAAA,MAAA,CAAAvsC,UAAA,0CAAAotC,EAAA30C,QAAA8zC,cAAA,MAAA,CAAAvsC,UAAA,qDAAA8L,EAAApL,GAAAlD,QAAA8rC,cAAAx9B,EAAA24D,gBAAAn0D,OAAA88B,EAAA30C,QAAA8zC,cAAA,MAAA,CAAAvsC,UAAA,+DAAA8L,EAAA24D,gBAAAjjE,UAAA,MAAA,QAAA7B,EAAAmM,EAAA24D,gBAAAM,iBAAA,IAAAplE,OAAA,EAAAA,EAAAggB,SAAA,QAAAytB,EAAA30C,QAAA8zC,cAAA,MAAA,CAAAvsC,UAAA,yCAAA8L,EAAA6yB,4+CAUXtmC,sDCYJI,QDVE,+BAGE,EAEF6X,KAAA,iBACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,4BACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,YACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,aACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,gBACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,WACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,aACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,eACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,YACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,6BACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,4CACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,WACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,SACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,cACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kBACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kBACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oBACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,eACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,aACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,eACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,aACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,UACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kBACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,8BACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,6CACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,8BACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,yBACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,yCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,wCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,yCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,sCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,yCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,wCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,yCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,wCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,yCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,wCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,sBACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,yCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,wCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,6BACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,6BACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,uCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,sCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,uCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,wBACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,oCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,uCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,sCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,uCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,sCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,yBACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,uCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,sCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,gBACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,mCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,uCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,sCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,kCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,sCACEtX,MAAM,IACN+rE,UAAO,MAGTz0D,KAAA,aACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,UACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,WACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,UACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,oBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,yBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,kBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,8BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,yBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,cACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,4BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,yBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,oBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,WACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,eACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,WACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,aACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,WACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,oBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,yBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,cACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,gBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,yBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,cACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,aACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,eACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,eACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,oBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,yBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,4BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,8BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,gCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,8BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,8BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,gCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,8BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,gBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,mBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,WACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,eACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,8BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,oBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,oBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,sBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,oBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,sBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,sBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,wBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,wBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,yBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,yBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,wBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,4BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,4BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,4BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,8BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,8BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,gCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,gCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,gCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,gCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,8BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,sBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,sBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,wBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,uBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,uBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,sBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,wBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,wBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,uBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,uBACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,4BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,4BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,2BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,6BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,4BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,4BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,0BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,qCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,iCACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAAM,IACN+rE,UAAO,OAGTz0D,KAAA,+BACEtX,MAA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E,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,OAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,qCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,sCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,oCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,kCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,uCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,2CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,yCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,gDACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,8CACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,mCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,iCACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,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SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,+BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,4BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA,6BACEtX,MAAM,KACN+rE,UAAO,SAGTz0D,KAAA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F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,gBAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,gBAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,gBAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,WAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,UAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,UAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,gBAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,WAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,WAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,UAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,eAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,eAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,YAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,GAAA,qBAEFo6F,UAAK,IACH9B,MAAI,cAEJ,CACAt4F,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BAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,0BAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,w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AAI,YAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F,UAAQ,IACN9B,MAAI,wBAEJ,CACAt4F,GAAA,wBAEFo6F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","sourcesContent":["/*\n * index.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport polyfillIsConnected from './isconnected';\nimport polyfillCustomEvent from './custom-event';\n\nfunction polyfill() {\n  polyfillIsConnected();\n  polyfillCustomEvent();\n}\n\nexport default polyfill;\n","/*\n * Node.isConnected polyfill for IE and EdgeHTML\n * 2020-02-04\n *\n * By Eli Grey, https://eligrey.com\n * Public domain.\n * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n */\n\nfunction polyfill() {\n  if (!('isConnected' in Node.prototype)) {\n    Object.defineProperty(Node.prototype, 'isConnected', {\n      get() {\n        return (\n          !this.ownerDocument ||\n          !(\n            // tslint:disable-next-line: no-bitwise\n            (this.ownerDocument.compareDocumentPosition(this) & this.DOCUMENT_POSITION_DISCONNECTED)\n          )\n        );\n      },\n    });\n  }\n}\n\nexport default polyfill;\n","// apply polyfills\nimport polyfill from './polyfill/index';\npolyfill();\n\n// objects instantiated by the IDE\nexport { Editor, UITools } from './editor/editor';\n","/**\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n *\n * From https://developer.mozilla.org/en-US/docs/MDN/About:\n * \"Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/\"\n */\nexport default function() {\n  if (typeof window.CustomEvent === 'function') return false;\n\n  function CustomEvent(event: any, params: any) {\n    params = params || { bubbles: false, cancelable: false, detail: null };\n    var evt = document.createEvent('CustomEvent');\n    evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n    return evt;\n  }\n\n  window.CustomEvent = CustomEvent as any;\n}\n","/*\n * editor.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { inputRules } from 'prosemirror-inputrules';\nimport { keydownHandler } from 'prosemirror-keymap';\nimport { Node as ProsemirrorNode, Schema, DOMParser, ParseOptions } from 'prosemirror-model';\nimport { EditorState, Plugin, PluginKey, TextSelection, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport 'prosemirror-view/style/prosemirror.css';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { citeUI } from '../api/cite';\nimport { EditorOptions } from '../api/options';\nimport { ProsemirrorCommand, CommandFn, EditorCommand } from '../api/command';\nimport { EditorUI } from '../api/ui';\nimport {\n  attrPropsToInput,\n  attrInputToProps,\n  AttrProps,\n  AttrEditInput,\n  InsertCiteProps,\n  InsertCiteUI,\n} from '../api/ui-dialogs';\n\nimport { Extension } from '../api/extension';\nimport { PandocWriterOptions } from '../api/pandoc';\nimport { PandocCapabilities, getPandocCapabilities } from '../api/pandoc_capabilities';\nimport { fragmentToHTML } from '../api/html';\nimport { DOMEditorEvents, EventType, EventHandler } from '../api/events';\nimport {\n  ScrollEvent,\n  UpdateEvent,\n  OutlineChangeEvent,\n  StateChangeEvent,\n  ResizeEvent,\n  LayoutEvent,\n  FocusEvent,\n  DispatchEvent,\n  NavigateEvent,\n  BlurEvent,\n} from '../api/event-types';\nimport {\n  PandocFormat,\n  resolvePandocFormat,\n  PandocFormatConfig,\n  pandocFormatConfigFromCode,\n  pandocFormatConfigFromDoc,\n} from '../api/pandoc_format';\nimport { baseKeysPlugin } from '../api/basekeys';\nimport {\n  appendTransactionsPlugin,\n  appendMarkTransactionsPlugin,\n  kFixupTransaction,\n  kAddToHistoryTransaction,\n  kSetMarkdownTransaction,\n} from '../api/transaction';\nimport { EditorOutline, getOutlineNodes, EditingOutlineLocation, getEditingOutlineLocation } from '../api/outline';\nimport { EditingLocation, getEditingLocation, setEditingLocation } from '../api/location';\nimport { navigateTo, NavigationType } from '../api/navigation';\nimport { FixupContext } from '../api/fixup';\nimport { unitToPixels, pixelsToUnit, roundUnit, kValidUnits } from '../api/image';\nimport { kPercentUnit } from '../api/css';\nimport { EditorFormat } from '../api/format';\nimport { diffChars, EditorChange } from '../api/change';\nimport { markInputRuleFilter } from '../api/input_rule';\nimport { editorMath } from '../api/math';\nimport { EditorEvents } from '../api/events';\nimport { insertRmdChunk } from '../api/rmd';\nimport { EditorServer } from '../api/server';\nimport { pandocAutoIdentifier } from '../api/pandoc_id';\nimport { wrapSentences } from '../api/wrap';\nimport { yamlFrontMatter, applyYamlFrontMatter } from '../api/yaml';\nimport { EditorSpellingDoc } from '../api/spelling';\n\nimport { getTitle, setTitle } from '../nodes/yaml_metadata/yaml_metadata-title';\nimport { getOutline } from '../behaviors/outline';\nimport {\n  FindOptions,\n  find,\n  matchCount,\n  selectFirst,\n  selectNext,\n  selectPrevious,\n  replace,\n  replaceAll,\n  clear,\n  selectCurrent,\n} from '../behaviors/find';\n\nimport { omniInsertExtension } from '../behaviors/omni_insert/omni_insert';\nimport { completionExtension } from '../behaviors/completion/completion';\n\nimport { getSpellingDoc } from '../behaviors/spelling/spelling-interactive';\nimport { realtimeSpellingPlugin, invalidateAllWords, invalidateWord } from '../behaviors/spelling/spelling-realtime';\n\nimport { PandocConverter, PandocLineWrapping } from '../pandoc/pandoc_converter';\n\nimport { ExtensionManager, initExtensions } from './editor-extensions';\nimport { defaultTheme, EditorTheme, applyTheme, applyPadding } from './editor-theme';\nimport { defaultEditorUIImages } from './editor-images';\nimport { editorMenus, EditorMenus } from './editor-menus';\nimport { editorSchema } from './editor-schema';\n\n// import styles before extensions so they can be overriden by extensions\nimport './styles/frame.css';\nimport './styles/styles.css';\n\nexport interface EditorCode {\n  code: string;\n  selection_only: boolean;\n  location: EditingOutlineLocation;\n}\n\nexport interface EditorSetMarkdownResult {\n  // editor view of markdown (as it will be persisted)\n  canonical: string;\n\n  // line wrapping\n  line_wrapping: PandocLineWrapping;\n\n  // unrecoginized pandoc tokens\n  unrecognized: string[];\n\n  // unparsed meta\n  unparsed_meta: { [key: string]: any };\n\n  // updated outline \n  location: EditingOutlineLocation;\n}\n\nexport interface EditorContext {\n  readonly server: EditorServer;\n  readonly ui: EditorUI;\n  readonly hooks?: EditorHooks;\n  readonly extensions?: readonly Extension[];\n}\n\nexport interface EditorHooks {\n  isEditable?: () => boolean;\n}\n\nexport interface EditorKeybindings {\n  [id: string]: string[];\n}\n\nexport interface EditorSelection {\n  from: number;\n  to: number;\n  navigation_id: string | null;\n}\n\nexport interface EditorFindReplace {\n  find: (term: string, options: FindOptions) => boolean;\n  matches: () => number;\n  selectFirst: () => boolean;\n  selectCurrent: () => boolean;\n  selectNext: () => boolean;\n  selectPrevious: () => boolean;\n  replace: (text: string) => boolean;\n  replaceAll: (text: string) => number;\n  clear: () => boolean;\n}\n\nexport { EditorCommandId as EditorCommands } from '../api/command';\n\nexport interface UIToolsAttr {\n  propsToInput(attr: AttrProps): AttrEditInput;\n  inputToProps(input: AttrEditInput): AttrProps;\n  pandocAutoIdentifier(text: string): string;\n}\n\nexport interface UIToolsImage {\n  validUnits(): string[];\n  percentUnit(): string;\n  unitToPixels(value: number, unit: string, containerWidth: number): number;\n  pixelsToUnit(pixels: number, unit: string, containerWidth: number): number;\n  roundUnit(value: number, unit: string): string;\n}\n\nexport interface UIToolsFormat {\n  parseFormatConfig(markdown: string, isRmd: boolean): PandocFormatConfig;\n}\n\nexport interface UIToolsSource {\n  diffChars(from: string, to: string, timeout: number): EditorChange[];\n}\n\nexport interface UIToolsCitation {\n  citeUI(citeProps: InsertCiteProps): InsertCiteUI;\n}\n\nexport class UITools {\n  public readonly attr: UIToolsAttr;\n  public readonly image: UIToolsImage;\n  public readonly format: UIToolsFormat;\n  public readonly source: UIToolsSource;\n  public readonly citation: UIToolsCitation;\n\n  constructor() {\n    this.attr = {\n      propsToInput: attrPropsToInput,\n      inputToProps: attrInputToProps,\n      pandocAutoIdentifier: (text: string) => pandocAutoIdentifier(text, false),\n    };\n\n    this.image = {\n      validUnits: () => kValidUnits,\n      percentUnit: () => kPercentUnit,\n      unitToPixels,\n      pixelsToUnit,\n      roundUnit,\n    };\n\n    this.format = {\n      parseFormatConfig: pandocFormatConfigFromCode,\n    };\n\n    this.source = {\n      diffChars,\n    };\n\n    this.citation = {\n      citeUI,\n    };\n  }\n}\n\nconst keybindingsPlugin = new PluginKey('keybindings');\n\nexport class Editor {\n  // core context passed from client\n  private readonly parent: HTMLElement;\n  private readonly context: EditorContext;\n  private readonly events: EditorEvents;\n\n  // options (derived from defaults + config)\n  private readonly options: EditorOptions;\n\n  // format (pandocFormat includes additional diagnostics based on the validity of\n  // provided mode + extensions)\n  private readonly format: EditorFormat;\n  private readonly pandocFormat: PandocFormat;\n\n  // pandoc capabilities\n  private pandocCapabilities: PandocCapabilities;\n\n  // core prosemirror state/behaviors\n  private readonly extensions: ExtensionManager;\n  private readonly schema: Schema;\n  private state: EditorState;\n  private readonly view: EditorView;\n  private readonly pandocConverter: PandocConverter;\n\n  // setting via setKeybindings forces reconfiguration of EditorState\n  // with plugins recreated\n  private keybindings: EditorKeybindings;\n\n  // content width constraints (if unset uses default editor CSS)\n  private maxContentWidth = 0;\n  private minContentPadding = 0;\n\n  // keep track of whether the last transaction was selection-only\n  private lastTrSelectionOnly = false;\n\n  // create the editor -- note that the markdown argument does not substitute for calling\n  // setMarkdown, rather it's used to read the format comment to determine how to\n  // initialize the various editor features\n  public static async create(\n    parent: HTMLElement,\n    context: EditorContext,\n    format: EditorFormat,\n    options: EditorOptions,\n  ): Promise<Editor> {\n    // provide option defaults\n    options = {\n      autoFocus: false,\n      spellCheck: false,\n      codeEditor: 'codemirror',\n      rmdImagePreview: false,\n      hideFormatComment: false,\n      className: '',\n      ...options,\n    };\n\n    // provide format defaults\n    format = {\n      pandocMode: format.pandocMode || 'markdown',\n      pandocExtensions: format.pandocExtensions || '',\n      rmdExtensions: {\n        codeChunks: false,\n        bookdownXRef: false,\n        bookdownXRefUI: false,\n        bookdownPart: false,\n        blogdownMathInCode: false,\n        ...format.rmdExtensions,\n      },\n      hugoExtensions: {\n        shortcodes: false,\n        ...format.hugoExtensions,\n      },\n      docTypes: format.docTypes || [],\n    };\n\n    // provide context defaults\n    const defaultImages = defaultEditorUIImages();\n    context = {\n      ...context,\n      ui: {\n        ...context.ui,\n        images: {\n          ...defaultImages,\n          ...context.ui.images,\n          omni_insert: {\n            ...defaultImages.omni_insert,\n            ...context.ui.images,\n          },\n          citations: {\n            ...defaultImages.citations,\n            ...context.ui.images,\n          },\n        },\n      },\n    };\n\n    // resolve the format\n    const pandocFmt = await resolvePandocFormat(context.server.pandoc, format);\n\n    // get pandoc capabilities\n    const pandocCapabilities = await getPandocCapabilities(context.server.pandoc);\n\n    // create editor\n    const editor = new Editor(parent, context, options, format, pandocFmt, pandocCapabilities);\n\n    // return editor\n    return Promise.resolve(editor);\n  }\n\n  private constructor(\n    parent: HTMLElement,\n    context: EditorContext,\n    options: EditorOptions,\n    format: EditorFormat,\n    pandocFormat: PandocFormat,\n    pandocCapabilities: PandocCapabilities,\n  ) {\n    // initialize references\n    this.parent = parent;\n    this.events = new DOMEditorEvents(parent);\n    this.context = context;\n    this.options = options;\n    this.format = format;\n    this.keybindings = {};\n    this.pandocFormat = pandocFormat;\n    this.pandocCapabilities = pandocCapabilities;\n\n    // create core extensions\n    this.extensions = this.initExtensions();\n\n    // create schema\n    this.schema = editorSchema(this.extensions);\n\n    // register completion handlers (done in a separate step b/c omni insert\n    // completion handlers require access to the initializezd commands that\n    // carry omni insert info)\n    this.registerCompletionExtension();\n\n    // register realtime spellchecking (done in a separate step b/c it\n    // requires access to PandocMark definitions to determine which\n    // marks to exclude from spellchecking)\n    this.registerRealtimeSpelling();\n\n    // create state\n    this.state = EditorState.create({\n      schema: this.schema,\n      doc: this.initialDoc(),\n      plugins: this.createPlugins(),\n    });\n\n    // additional dom attributes for editor node\n    const attributes: { [name: string]: string } = {};\n    if (options.className) {\n      attributes.class = options.className;\n    }\n\n    // create view\n    this.view = new EditorView(this.parent, {\n      state: this.state,\n      dispatchTransaction: this.dispatchTransaction.bind(this),\n      domParser: new EditorDOMParser(this.schema),\n      attributes,\n    });\n\n    // add custom restoreFocus handler to the view -- this provides a custom\n    // handler for RStudio's FocusContext, necessary because the default\n    // ProseMirror dom mutation handler picks up the focus and changes the\n    // selection.\n    Object.defineProperty(this.view.dom, 'restoreFocus', {\n      value: () => {\n        this.focus();\n      },\n    });\n\n    // add proportinal font class to parent\n    this.parent.classList.add('pm-proportional-font');\n\n    // apply default theme\n    this.applyTheme(defaultTheme());\n\n    // create pandoc translator\n    this.pandocConverter = new PandocConverter(\n      this.schema,\n      this.extensions,\n      context.server.pandoc,\n      this.pandocCapabilities,\n    );\n\n    // focus editor immediately if requested\n    if (this.options.autoFocus) {\n      setTimeout(() => {\n        this.focus();\n      }, 10);\n    }\n\n    // disale spellcheck if requested\n    if (!this.options.spellCheck) {\n      this.parent.setAttribute('spellcheck', 'false');\n    }\n\n    {\n      // scroll event optimization, as recommended by\n      // https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n      let ticking = false;\n      this.parent.addEventListener(\n        'scroll',\n        () => {\n          if (!ticking) {\n            window.requestAnimationFrame(() => {\n              this.emitEvent(ScrollEvent);\n              ticking = false;\n            });\n            ticking = true;\n          }\n        },\n        { capture: true },\n      );\n    }\n  }\n\n  public destroy() {\n    this.view.destroy();\n  }\n\n  public subscribe<TDetail>(event: EventType<TDetail> | string, handler: EventHandler<TDetail>): VoidFunction {\n    if (typeof event === 'string') {\n      return this.events.subscribe({ eventName: event }, handler);\n    } else {\n      return this.events.subscribe(event, handler);\n    }\n  }\n\n  public setTitle(title: string) {\n    const tr = setTitle(this.state, title);\n    if (tr) {\n      this.view.dispatch(tr);\n    }\n  }\n\n  public async setMarkdown(\n    markdown: string,\n    options: PandocWriterOptions,\n    emitUpdate: boolean,\n  ): Promise<EditorSetMarkdownResult> {\n    // get the result\n    const result = await this.pandocConverter.toProsemirror(markdown, this.pandocFormat);\n    const { doc, line_wrapping, unrecognized, unparsed_meta } = result;\n\n    // if we are preserving history but the existing doc is empty then create a new state\n    // (resets the undo stack so that the initial setting of the document can't be undone)\n    if (this.isInitialDoc()) {\n      this.state = EditorState.create({\n        schema: this.state.schema,\n        doc,\n        plugins: this.state.plugins,\n      });\n      this.view.updateState(this.state);\n    } else {\n      // note current editing location\n      const loc = this.getEditingLocation();\n\n      // replace the top level nodes in the doc\n      const tr = this.state.tr;\n      tr.setMeta(kSetMarkdownTransaction, true);\n      let i = 0;\n      tr.doc.descendants((node, pos) => {\n        const mappedPos = tr.mapping.map(pos);\n        tr.replaceRangeWith(mappedPos, mappedPos + node.nodeSize, doc.child(i));\n        i++;\n        return false;\n      });\n      // set selection to previous location if it's still valid\n      if (loc.pos < tr.doc.nodeSize) {\n        // eat exceptions that might result from an invalid position\n        try {\n          setTextSelection(loc.pos)(tr);\n        } catch(e) {\n          // do-nothing, this error can happen and shouldn't result in \n          // a failure to setMarkdown\n        }\n      }\n      // dispatch\n      this.view.dispatch(tr);\n    }\n\n    // apply fixups\n    this.applyFixups(FixupContext.Load);\n\n    // notify listeners if requested\n    if (emitUpdate) {\n      this.emitEvent(UpdateEvent);\n      this.emitEvent(OutlineChangeEvent);\n      this.emitEvent(StateChangeEvent);\n    }\n\n    // return our current markdown representation (so the caller know what our\n    // current 'view' of the doc as markdown looks like\n    const getMarkdownTr = this.state.tr;\n    const canonical = await this.getMarkdownCode(getMarkdownTr, options);\n    const location = getEditingOutlineLocation(this.state);\n\n    // return\n    return {\n      canonical,\n      line_wrapping,\n      unrecognized,\n      unparsed_meta,\n      location\n    };\n  }\n\n  // flag indicating whether we've ever had setMarkdown (currently we need this\n  // because getMarkdown can only be called after setMarkdown b/c it needs\n  // the API version retreived in setMarkdown -- we should remedy this)\n  public isInitialDoc() {\n    return this.state.doc.attrs.initial;\n  }\n\n  public async getMarkdown(options: PandocWriterOptions): Promise<EditorCode> {\n    // get the code\n    const tr = this.state.tr;\n    const code = await this.getMarkdownCode(tr, options);\n\n    // return code + perhaps outline location\n    return {\n      code,\n      selection_only: this.lastTrSelectionOnly,\n      location: getEditingOutlineLocation(this.state),\n    };\n  }\n\n  public getEditingOutlineLocation(): EditingOutlineLocation {\n    return getEditingOutlineLocation(this.state);\n  }\n\n  public getHTML(): string {\n    return fragmentToHTML(this.state.schema, this.state.doc.content);\n  }\n\n  public getTitle() {\n    return getTitle(this.state);\n  }\n\n  public getSelection(): EditorSelection {\n    const { from, to } = this.state.selection;\n    return {\n      from,\n      to,\n      navigation_id: navigationIdForSelection(this.state),\n    };\n  }\n\n  public getEditingLocation(): EditingLocation {\n    return getEditingLocation(this.view);\n  }\n\n  public setEditingLocation(outlineLocation?: EditingOutlineLocation, previousLocation?: EditingLocation) {\n    setEditingLocation(this.view, outlineLocation, previousLocation);\n  }\n\n  public getOutline(): EditorOutline {\n    return getOutline(this.state) || [];\n  }\n\n  public getFindReplace(): EditorFindReplace {\n    return {\n      find: (term: string, options: FindOptions) => find(this.view, term, options),\n      matches: () => matchCount(this.view),\n      selectCurrent: () => selectCurrent(this.view),\n      selectFirst: () => selectFirst(this.view),\n      selectNext: () => selectNext(this.view),\n      selectPrevious: () => selectPrevious(this.view),\n      replace: (text: string) => replace(this.view, text),\n      replaceAll: (text: string) => replaceAll(this.view, text),\n      clear: () => clear(this.view),\n    };\n  }\n\n  public getSpellingDoc(): EditorSpellingDoc {\n    return getSpellingDoc(this.view, this.extensions.pandocMarks(), this.context.ui.spelling);\n  }\n\n  public spellingInvalidateAllWords() {\n    invalidateAllWords(this.view);\n  }\n\n  public spellingInvalidateWord(word: string) {\n    invalidateWord(this.view, word);\n  }\n\n  // get a canonical version of the passed markdown. this method doesn't mutate the\n  // visual editor's state/view (it's provided as a performance optimiation for when\n  // source mode is configured to save a canonical version of markdown)\n  public async getCanonical(markdown: string, options: PandocWriterOptions): Promise<string> {\n    // convert to prosemirror doc\n    const result = await this.pandocConverter.toProsemirror(markdown, this.pandocFormat);\n\n    // create a state for this doc\n    const state = EditorState.create({\n      schema: this.schema,\n      doc: result.doc,\n      plugins: this.state.plugins,\n    });\n\n    // apply load fixups (eumlating what a full round trip will do)\n    const tr = state.tr;\n    this.extensionFixups(tr, FixupContext.Load);\n\n    // return markdown (will apply save fixups)\n    return this.getMarkdownCode(tr, options);\n  }\n\n  public getSelectedText(): string {\n    return this.state.doc.textBetween(this.state.selection.from, this.state.selection.to);\n  }\n\n  public replaceSelection(value: string): void {\n    // retrieve properties we need from selection\n    const { from, empty } = this.view.state.selection;\n\n    // retrieve selection marks\n    const marks = this.view.state.selection.$from.marks();\n\n    // insert text\n    const tr = this.view.state.tr.replaceSelectionWith(this.view.state.schema.text(value, marks), false);\n    this.view.dispatch(tr);\n\n    // update selection if necessary\n    if (!empty) {\n      const sel = TextSelection.create(this.view.state.doc, from, from + value.length);\n      const trSetSel = this.view.state.tr.setSelection(sel);\n      this.view.dispatch(trSetSel);\n    }\n  }\n\n  public getYamlFrontMatter() {\n    if (this.schema.nodes.yaml_metadata) {\n      return yamlFrontMatter(this.view.state.doc);\n    } else {\n      return '';\n    }\n  }\n\n  public applyYamlFrontMatter(yaml: string) {\n    if (this.schema.nodes.yaml_metadata) {\n      applyYamlFrontMatter(this.view, yaml);\n    }\n  }\n\n  public focus() {\n    this.view.focus();\n  }\n\n  public blur() {\n    (this.view.dom as HTMLElement).blur();\n  }\n\n  public insertChunk(chunkPlaceholder: string, rowOffset: number, colOffset: number) {\n    const insertCmd = insertRmdChunk(chunkPlaceholder, rowOffset, colOffset);\n    insertCmd(this.view.state, this.view.dispatch, this.view);\n    this.focus();\n  }\n\n  public navigate(type: NavigationType, location: string, recordCurrent = true, animate = false) {\n    // perform navigation\n    const nav = navigateTo(this.view, type, location, animate);\n\n    // emit event\n    if (nav !== null) {\n      if (!recordCurrent) {\n        nav.prevPos = -1;\n      }\n      this.emitEvent(NavigateEvent, nav);\n    }\n  }\n\n  public resize() {\n    this.syncContentWidth();\n    this.applyFixupsOnResize();\n    this.emitEvent(ResizeEvent);\n  }\n\n  public enableDevTools(initFn: (view: EditorView, stateClass: any) => void) {\n    initFn(this.view, { EditorState });\n  }\n\n  public getMenus(): EditorMenus {\n    return editorMenus(this.context.ui, this.commands());\n  }\n\n  public commands(): EditorCommand[] {\n    // get keybindings (merge user + default)\n    const commandKeys = this.commandKeys();\n\n    return this.extensions.commands(this.schema).map((command: ProsemirrorCommand) => {\n      return {\n        id: command.id,\n        keymap: commandKeys[command.id],\n        isActive: () => command.isActive(this.state),\n        isEnabled: () => command.isEnabled(this.state),\n        plural: () => command.plural(this.state),\n        execute: () => {\n          command.execute(this.state, this.view.dispatch, this.view);\n          if (command.keepFocus) {\n            this.focus();\n          }\n        },\n      };\n    });\n  }\n\n  public applyTheme(theme: EditorTheme) {\n    // set global mode classes\n    this.parent.classList.toggle('pm-dark-mode', !!theme.darkMode);\n    this.parent.classList.toggle('pm-solarized-mode', !!theme.solarizedMode);\n    // apply the rest of the theme\n    applyTheme(theme);\n  }\n\n  public setMaxContentWidth(maxWidth: number, minPadding = 10) {\n    this.maxContentWidth = maxWidth;\n    this.minContentPadding = minPadding;\n    this.syncContentWidth();\n  }\n\n  public setKeybindings(keyBindings: EditorKeybindings) {\n    // validate that all of these keys can be rebound\n\n    this.keybindings = keyBindings;\n    this.state = this.state.reconfigure({\n      schema: this.state.schema,\n      plugins: this.createPlugins(),\n    });\n  }\n\n  public getEditorFormat() {\n    return this.format;\n  }\n\n  public getPandocFormat() {\n    return this.pandocFormat;\n  }\n\n  public getPandocFormatConfig(isRmd: boolean): PandocFormatConfig {\n    return pandocFormatConfigFromDoc(this.state.doc, isRmd);\n  }\n\n  private dispatchTransaction(tr: Transaction) {\n    // track previous outline\n    const previousOutline = getOutline(this.state);\n\n    // track whether this was a selection-only transaction\n    this.lastTrSelectionOnly = tr.selectionSet && !tr.docChanged;\n\n    // apply the transaction\n    this.state = this.state.apply(tr);\n    this.view.updateState(this.state);\n\n    // notify listeners of state change\n    this.emitEvent(StateChangeEvent);\n\n    // notify listeners of updates\n    if (tr.docChanged || tr.storedMarksSet) {\n      // fire updated (unless this was a fixup)\n      if (!tr.getMeta(kFixupTransaction)) {\n        this.emitEvent(UpdateEvent);\n      }\n\n      // fire outline changed if necessary\n      if (getOutline(this.state) !== previousOutline) {\n        this.emitEvent(OutlineChangeEvent);\n      }\n    }\n\n    this.emitEvent(DispatchEvent, tr);\n\n    this.emitEvent(LayoutEvent);\n  }\n\n  private emitEvent<TDetail>(eventType: EventType<TDetail>, detail?: TDetail) {\n    this.events.emit(eventType, detail);\n  }\n\n  private initExtensions() {\n    return initExtensions(\n      {\n        format: this.format,\n        options: this.options,\n        ui: this.context.ui,\n        math: this.context.ui.math.typeset ? editorMath(this.context.ui) : undefined,\n        events: {\n          subscribe: this.subscribe.bind(this),\n          emit: this.emitEvent.bind(this),\n        },\n        pandocExtensions: this.pandocFormat.extensions,\n        pandocCapabilities: this.pandocCapabilities,\n        server: this.context.server,\n        navigation: {\n          navigate: this.navigate.bind(this),\n        },\n      },\n      this.context.extensions,\n    );\n  }\n\n  private registerCompletionExtension() {\n    // mark filter used to screen completions from noInputRules marks\n    const markFilter = markInputRuleFilter(this.schema, this.extensions.pandocMarks());\n\n    // register omni insert extension\n    this.extensions.register([\n      omniInsertExtension(this.extensions.omniInserters(this.schema), markFilter, this.context.ui),\n    ]);\n\n    // register completion extension\n    this.extensions.register([\n      completionExtension(this.extensions.completionHandlers(), markFilter, this.context.ui, this.events),\n    ]);\n  }\n\n  private registerRealtimeSpelling() {\n    this.extensions.registerPlugins(\n      [realtimeSpellingPlugin(this.schema, this.extensions.pandocMarks(), this.context.ui, this.events)],\n      true,\n    );\n  }\n\n  private createPlugins(): Plugin[] {\n    return [\n      baseKeysPlugin(this.extensions.baseKeys(this.schema)),\n      this.keybindingsPlugin(),\n      appendTransactionsPlugin(this.extensions.appendTransactions(this.schema)),\n      appendMarkTransactionsPlugin(this.extensions.appendMarkTransactions(this.schema)),\n      ...this.extensions.plugins(this.schema),\n      this.inputRulesPlugin(),\n      this.editablePlugin(),\n      this.domEventsPlugin(),\n    ];\n  }\n\n  private editablePlugin() {\n    const hooks = this.context.hooks || {};\n    return new Plugin({\n      key: new PluginKey('editable'),\n      props: {\n        editable: hooks.isEditable || (() => true),\n      },\n    });\n  }\n\n  private inputRulesPlugin() {\n    // filter for disabling input rules for selected marks\n    const markFilter = markInputRuleFilter(this.schema, this.extensions.pandocMarks());\n\n    // create the defautl inputRules plugin\n    const plugin = inputRules({ rules: this.extensions.inputRules(this.schema) });\n    const handleTextInput = plugin.props.handleTextInput!;\n\n    // override to disable input rules as requested\n    // https://github.com/ProseMirror/prosemirror-inputrules/commit/b4bf67623aa4c4c1e096c20aa649c0e63751f337\n    plugin.props.handleTextInput = (view: EditorView, from: number, to: number, text: string) => {\n      if (!markFilter(view.state)) {\n        return false;\n      }\n      return handleTextInput(view, from, to, text);\n    };\n    return plugin;\n  }\n\n  private domEventsPlugin(): Plugin {\n    return new Plugin({\n      key: new PluginKey('domevents'),\n      props: {\n        handleDOMEvents: {\n          blur: (view: EditorView, event: Event) => {\n            this.emitEvent(BlurEvent);\n            return false;\n          },\n          focus: (view: EditorView, event: Event) => {\n            this.emitEvent(FocusEvent, view.state.doc);\n            return false;\n          },\n          keydown: (view: EditorView, event: Event) => {\n            const kbEvent = event as KeyboardEvent;\n            if (kbEvent.key === 'Tab' && this.context.ui.prefs.tabKeyMoveFocus()) {\n              return true;\n            } else {\n              return false;\n            }\n          },\n        },\n      },\n    });\n  }\n\n  private keybindingsPlugin(): Plugin {\n    // get keybindings (merge user + default)\n    const commandKeys = this.commandKeys();\n\n    // command keys from extensions\n    const pluginKeys: { [key: string]: CommandFn } = {};\n    const commands = this.extensions.commands(this.schema);\n    commands.forEach((command: ProsemirrorCommand) => {\n      const keys = commandKeys[command.id];\n      if (keys) {\n        keys.forEach((key: string) => {\n          pluginKeys[key] = command.execute;\n        });\n      }\n    });\n\n    // for windows desktop, build a list of control key handlers b/c qtwebengine\n    // ends up corrupting ctrl+ keys so they don't hit the ace keybinding\n    // (see: https://github.com/rstudio/rstudio/issues/7142)\n    const ctrlKeyCodes: { [key: string]: CommandFn } = {};\n    Object.keys(pluginKeys).forEach(keyCombo => {\n      const match = keyCombo.match(/^Mod-([a-z\\\\])$/);\n      if (match) {\n        const key = match[1];\n        const keyCode = key === '\\\\' ? 'Backslash' : `Key${key.toUpperCase()}`;\n        ctrlKeyCodes[keyCode] = pluginKeys[keyCombo];\n      }\n    });\n\n    // create default prosemirror handler\n    const prosemirrorKeydownHandler = keydownHandler(pluginKeys);\n\n    // return plugin\n    return new Plugin({\n      key: keybindingsPlugin,\n      props: {\n        handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n          // workaround for Ctrl+ keys on windows desktop\n          if (this.context.ui.context.isWindowsDesktop()) {\n            const keyEvent = event as KeyboardEvent;\n            if (keyEvent.ctrlKey) {\n              const keyCommand = ctrlKeyCodes[keyEvent.code];\n              if (keyCommand && keyCommand(this.view.state)) {\n                keyCommand(this.view.state, this.view.dispatch, this.view);\n                return true;\n              }\n            }\n          }\n          // default handling\n          return prosemirrorKeydownHandler(view, event);\n        },\n      },\n    });\n  }\n\n  private commandKeys(): { [key: string]: readonly string[] } {\n    // start with keys provided within command definitions\n    const commands = this.extensions.commands(this.schema);\n    const defaultKeys = commands.reduce((keys: { [key: string]: readonly string[] }, command: ProsemirrorCommand) => {\n      keys[command.id] = command.keymap;\n      return keys;\n    }, {});\n\n    // merge with user keybindings\n    return {\n      ...defaultKeys,\n      ...this.keybindings,\n    };\n  }\n\n  // update parent padding based on content width settings (if specified)\n  private syncContentWidth() {\n    if (this.maxContentWidth && this.parent.clientWidth) {\n      const minContentPadding = this.minContentPadding || 10;\n      const parentWidth = this.parent.clientWidth;\n      if (parentWidth > this.maxContentWidth + 2 * minContentPadding) {\n        applyPadding(`calc((100% - ${this.maxContentWidth}px)/2)`);\n      } else {\n        applyPadding(this.minContentPadding + 'px');\n      }\n    }\n  }\n\n  private applyFixupsOnResize() {\n    const docChanged = this.applyFixups(FixupContext.Resize);\n    if (!docChanged) {\n      // If applyFixupsOnResize returns true, then layout has already\n      // been fired; if it hasn't, we must do so now\n      this.emitEvent(LayoutEvent);\n    }\n  }\n\n  private applyFixups(context: FixupContext) {\n    let tr = this.state.tr;\n    tr = this.extensionFixups(tr, context);\n    if (tr.docChanged) {\n      tr.setMeta(kAddToHistoryTransaction, false);\n      tr.setMeta(kFixupTransaction, true);\n      this.view.dispatch(tr);\n      return true;\n    }\n    return false;\n  }\n\n  private extensionFixups(tr: Transaction, context: FixupContext) {\n    this.extensions.fixups(this.schema, this.view).forEach(fixup => {\n      tr = fixup(tr, context);\n    });\n    return tr;\n  }\n\n  private initialDoc(): ProsemirrorNode {\n    return this.schema.nodeFromJSON({\n      type: 'doc',\n      attrs: {\n        initial: true,\n      },\n      content: [\n        { type: 'body', content: [{ type: 'paragraph' }] },\n        { type: 'notes', content: [] },\n      ],\n    });\n  }\n\n  private async getMarkdownCode(tr: Transaction, options: PandocWriterOptions) {\n    // apply save fixups\n    this.extensionFixups(tr, FixupContext.Save);\n\n    // apply sentence wrapping if requested\n    if (options.wrap === 'sentence') {\n      wrapSentences(tr);\n    }\n\n    // get code\n    return this.pandocConverter.fromProsemirror(tr.doc, this.pandocFormat, options);\n  }\n}\n\nfunction navigationIdForSelection(state: EditorState): string | null {\n  const outline = getOutlineNodes(state.doc);\n  const outlineNode = outline.reverse().find(node => node.pos < state.selection.from);\n  if (outlineNode) {\n    return outlineNode.node.attrs.navigation_id;\n  } else {\n    return null;\n  }\n}\n\n// custom DOMParser that preserves all whitespace (required by display math marks)\nclass EditorDOMParser extends DOMParser {\n  constructor(schema: Schema) {\n    super(schema, DOMParser.fromSchema(schema).rules);\n  }\n  public parse(dom: Node, options?: ParseOptions) {\n    return super.parse(dom, { ...options, preserveWhitespace: 'full' });\n  }\n\n  public parseSlice(dom: Node, options?: ParseOptions) {\n    return super.parseSlice(dom, { ...options, preserveWhitespace: 'full' });\n  }\n}\n","/*\n * cite.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CSLName, CSLDate, CSL } from './csl';\nimport { InsertCiteProps, InsertCiteUI } from './ui-dialogs';\nimport { urlForDOI } from './doi';\n\nexport const kInvalidCiteKeyChars = /[\\]\\[\\s@',\\\\\\#}{~%&\\$\\^_]/g;\nconst kCiteIdLeadingLength = 8;\n\nexport function createUniqueCiteId(existingIds: string[], baseId: string): string {\n  let count = 0;\n\n  // Remove any non-8bit ascii characters\n  let asciiOnlyBaseId = '';\n  for (let i = 0; i < baseId.length; i++) {\n    const char = baseId.charCodeAt(i);\n    if (char <= 255) {\n      asciiOnlyBaseId = asciiOnlyBaseId + String.fromCharCode(char);\n    }\n  }\n\n  // If there are no characters left, just used a placeholder\n  if (asciiOnlyBaseId.length === 0) {\n    asciiOnlyBaseId = 'cite';\n  }\n\n  // The base ID but with invalid characters replaced\n  let safeBaseId = asciiOnlyBaseId.replace(kInvalidCiteKeyChars, '');\n\n  // Ensure that this is a valid citation, stripping any invalid characters\n  let proposedId = safeBaseId;\n\n  // If there is a conflict with an existing id, we will append\n  // the following character and try again. If the conflict continues with\n  // the postfix character added, we'll increment and keep going through the\n  // alphabet\n  const disambiguationStartCharacter = 97; // a\n\n  while (existingIds.includes(proposedId)) {\n    // If we've wrapped around to a and we haven't found a unique entry\n    // Add an 'a' to the end and try again. Will ultimately create an entry like\n    // Teague2012aaaf\n    if (count !== 0 && count % 26 === 0) {\n      safeBaseId = safeBaseId + String.fromCharCode(disambiguationStartCharacter);\n    }\n\n    const postfix = String.fromCharCode(disambiguationStartCharacter + (count % 26));\n    proposedId = safeBaseId + postfix;\n    count++;\n  }\n  return proposedId;\n}\n\n// Suggests a bibliographic identifier based upon the source\nexport function suggestCiteId(existingIds: string[], csl: CSL) {\n  const author = csl.author;\n  const issued = csl.issued;\n\n  // Try to get the last name\n  let citeIdLeading = '';\n  if (author && author.length > 0) {\n    if (author[0].family) {\n      citeIdLeading = author[0].family;\n    } else if (author[0].literal) {\n      citeIdLeading = author[0].literal;\n    }\n  }\n\n  // If we can't use author information, try using short title,\n  // the title, or perhaps the type to construct a leading part of the\n  // citeId.\n  if (citeIdLeading.length === 0) {\n    const shortTitle = csl['short-title'];\n    if (shortTitle && shortTitle?.length > 0) {\n      citeIdLeading = shortTitle.substr(0, Math.min(kCiteIdLeadingLength, shortTitle.length));\n    } else if (csl.title) {\n      citeIdLeading = csl.title.substr(0, Math.min(kCiteIdLeadingLength, csl.title.length));\n    } else {\n      citeIdLeading = csl.type;\n    }\n  }\n\n  // Try to get the publication year\n  let datePart = '';\n  if (issued && issued['date-parts'] && issued['date-parts'].length > 0) {\n    const yearIssued = issued['date-parts'][0][0];\n    // Sometimes, data arrives with a null value, ignore null\n    if (yearIssued) {\n      datePart = yearIssued + '';\n    }\n  }\n\n  // Create a deduplicated string against the existing entries\n  let baseId = `${citeIdLeading.toLowerCase()}${datePart}`;\n  if (baseId.length === 0) {\n    baseId = 'untitled';\n  }\n\n  return createUniqueCiteId(existingIds, baseId);\n}\n\nexport interface CiteField {\n  name: string;\n  value: string;\n}\n\nexport function urlForCitation(csl: CSL): string | undefined {\n  if (csl.URL) {\n    return csl.URL;\n  } else if (csl.DOI) {\n    return urlForDOI(csl.DOI);\n  }\n}\n\nexport function formatForPreview(csl: CSL): CiteField[] {\n  const pairs = new Array<CiteField>();\n  if (csl.title) {\n    pairs.push({ name: 'Title', value: csl.title });\n  }\n  pairs.push({ name: 'Authors', value: formatAuthors(csl.author, 255) });\n  if (csl.issued && isValidDate(csl.issued)) {\n    pairs.push({ name: 'Issue Date', value: formatIssuedDate(csl.issued) });\n  }\n\n  const containerTitle = csl['container-title'];\n  if (containerTitle) {\n    pairs.push({ name: 'Publication', value: containerTitle });\n  }\n\n  const volume = csl.volume;\n  if (volume) {\n    pairs.push({ name: 'Volume', value: volume });\n  }\n\n  const page = csl.page;\n  if (page) {\n    pairs.push({ name: 'Page(s)', value: page });\n  }\n\n  const cslAny = csl as { [key: string]: any };\n  Object.keys(csl).forEach(key => {\n    if (!kFilteredFields.includes(key)) {\n      const value = cslAny[key];\n      // Don't display complex fields or fields that aren't strings\n      if (typeof value === 'string') {\n        // Capitalize preview names\n        const name = key.charAt(0).toUpperCase() + key.slice(1);\n        pairs.push({ name, value });\n      }\n    }\n  });\n\n  return pairs;\n}\n\nconst kFilteredFields = [\n  'id',\n  'title',\n  'author',\n  'issued',\n  'container-title',\n  'volume',\n  'page',\n  'abstract',\n  'provider',\n];\n\n// Sometimes, data arrives with a null value\n// This function will validate that the year (required) doesn't\n// contain null\nfunction isValidDate(date: CSLDate): boolean {\n  const dateParts = date['date-parts'];\n  if (dateParts) {\n    const invalidElement = dateParts.find(datePart => datePart[0] === null);\n    return invalidElement === undefined;\n  }\n  return true;\n}\n\n// TODO: Needs to support localization of the templated strings\nconst kEtAl = 'et al.';\nexport function formatAuthors(authors?: CSLName[], maxLength?: number): string {\n  // No author(s) specified\n  if (!authors || authors.length === 0) {\n    return '';\n  }\n\n  return authors\n    .map(author => {\n      if (author.literal?.length) {\n        return author.literal;\n      } else if (author.given?.length && author.family?.length) {\n        // Family and Given name\n        return `${author.family}, ${author.given.substring(0, 1)}`;\n      } else if (author.family?.length) {\n        // Family name only\n        return `${author.family}`;\n      } else {\n        return '';\n      }\n    })\n    .reduce((previous, current, index, array) => {\n      // Ignore any additional authors if the string\n      // exceeds the maximum length\n      if ((maxLength && previous.length >= maxLength) || previous.endsWith(kEtAl)) {\n        return previous;\n      }\n\n      if (index === 0) {\n        // Too long, truncate\n        if (maxLength && current.length > maxLength) {\n          return `${current.substring(0, maxLength - 1)}…`;\n        }\n        // The first author\n        return current;\n      } else if (index > 0 && index === array.length - 1) {\n        // The last author\n        return addAuthorOrEtAl(previous, `${previous}, and ${current}`, maxLength);\n      } else {\n        // Middle authors\n        return addAuthorOrEtAl(previous, `${previous}, ${current}`, maxLength);\n      }\n    });\n}\n\nfunction addAuthorOrEtAl(previousAuthorStr: string, newAuthorStr: string, maxLength?: number) {\n  // if adding the string would make it too long, truncate\n  if (maxLength && newAuthorStr.length > maxLength) {\n    return etAl(previousAuthorStr, maxLength);\n  }\n  return newAuthorStr;\n}\n\nfunction etAl(authorStr: string, maxLength: number) {\n  // First try just using et al., then shorten existing\n  // author to accomodate\n  const etAlStr = `${authorStr} ${kEtAl}`;\n  if (maxLength && etAlStr.length > maxLength) {\n    // First try to truncate to a space\n    const lastSpace = authorStr.lastIndexOf(' ');\n    if (lastSpace) {\n      return `${authorStr.substr(0, lastSpace)} ${kEtAl}`;\n    } else {\n      // As a last resort, truncate with ellipsis\n      const excessLength = etAlStr.length - maxLength - 1;\n      return `${authorStr.substr(0, authorStr.length - excessLength)}… ${kEtAl}`;\n    }\n  }\n  return etAlStr;\n}\n\n// TODO: Needs to support localization of the templated strings\nexport function formatIssuedDate(date: CSLDate | undefined): string {\n  // No issue date for this\n  if (!date) {\n    return '';\n  }\n\n  const dateParts = date['date-parts'];\n  if (dateParts) {\n    switch (dateParts.length) {\n      // There is a date range\n      case 2:\n        return `${dateParts[0][0]}-${dateParts[1][0]}`;\n      // Only a single date\n      case 1:\n        // Note that it is possible to receive an entry with a single null entry\n        // For examples:\n        // 10.1163/1874-6772_seg_a44_588\n        const singleDatePart = dateParts[0][0];\n        return `${singleDatePart ? singleDatePart : ''}`;\n\n      // Seems like a malformed date :(\n      case 0:\n      default:\n        return '';\n    }\n  }\n  return '';\n}\n\nexport function citeUI(citeProps: InsertCiteProps): InsertCiteUI {\n  if (citeProps.csl) {\n    const suggestedId = suggestCiteId(citeProps.existingIds, citeProps.csl);\n    const previewFields = formatForPreview(citeProps.csl);\n    return {\n      suggestedId,\n      previewFields,\n    };\n  } else {\n    // This should never happen - this function should always be called with a work\n    return {\n      suggestedId: '',\n      previewFields: [],\n    };\n  }\n}\n","/*\n * doi.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface DOIResult {\n  status: 'ok' | 'notfound' | 'nohost' | 'error';\n  message: any | null;\n  error: string;\n}\n\nexport interface DOIServer {\n  fetchCSL: (doi: string, progressDelay: number) => Promise<DOIResult>;\n}\n\n// ^10.\\d{4,9}/[-._;()/:A-Z0-9]+$\n// Core regexes come from https://www.crossref.org/blog/dois-and-matching-regular-expressions/\nconst kModernCrossrefDOIRegex = /10.\\d{4,9}\\/[-._;()/:A-Z0-9]+$/i;\nconst kEarlyWileyCrossrefDOIRegex = /10.1002\\/[^\\s]+$/i;\nconst kOtherCrossrefDOIRegex1 = /10.\\\\d{4}\\/\\d+-\\d+X?(\\d+)\\d+<[\\d\\w]+:[\\d\\w]*>\\d+.\\d+.\\w+;\\d$/i;\nconst kOtherCrossrefDOIRegex2 = /10.1021\\/\\w\\w\\d+$/i;\nconst kOtherCrossrefDOIRegex3 = /10.1207\\/[\\w\\d]+\\&\\d+_\\d+$/i;\n\nconst kCrossrefMatches = [\n  kModernCrossrefDOIRegex,\n  kEarlyWileyCrossrefDOIRegex,\n  kOtherCrossrefDOIRegex1,\n  kOtherCrossrefDOIRegex2,\n  kOtherCrossrefDOIRegex3,\n];\n\n// Determines whether a a given string may be a DOI\n// Note that this will validate the form of the string, but not\n// whether it is actually a registered DOI\nexport function hasDOI(token: string): boolean {\n  return findDOI(token) !== undefined;\n}\n\nexport function findDOI(token: string): string | undefined {\n  let match = null;\n  kCrossrefMatches.find(regex => {\n    match = token.match(regex);\n    return match && match[0].length > 0;\n  });\n\n  if (match === null) {\n    return undefined;\n  } else {\n    return match[0];\n  }\n}\n\nexport function urlForDOI(doi: string): string {\n  return `https://doi.org/${doi}`;\n}\n","/*\n * ui-dialogs.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { LinkTargets, LinkCapabilities, LinkType } from './link';\nimport { ImageDimensions } from './image';\nimport { ListCapabilities, ListType } from './list';\nimport { TableCapabilities } from './table';\nimport { CSL } from './csl';\nimport { CiteField } from './cite';\nimport { kStyleAttrib, attrPartitionKeyvalue, pandocAttrKeyvalueFromText } from './pandoc_attr';\n\nexport interface EditorDialogs {\n  alert: AlertFn;\n  yesNoMessage: YesNoMessageFn;\n  editLink: LinkEditorFn;\n  editImage: ImageEditorFn;\n  editCodeBlock: CodeBlockEditorFn;\n  editList: ListEditorFn;\n  editAttr: AttrEditorFn;\n  editSpan: AttrEditorFn;\n  editDiv: DivAttrEditorFn;\n  editRawInline: RawFormatEditorFn;\n  editRawBlock: RawFormatEditorFn;\n  insertTable: InsertTableFn;\n  insertCite: InsertCiteFn;\n  htmlDialog: EditorHTMLDialogFn;\n}\n\nexport type EditorHTMLDialogFn = (\n  title: string,\n  okText: string | null,\n  create: EditorHTMLDialogCreateFn,\n  focus: VoidFunction,\n  validate: EditorHTMLDialogValidateFn,\n) => Promise<boolean>;\n\nexport type EditorHTMLDialogCreateFn = (\n  containerWidth: number,\n  containerHeight: number,\n  confirm: VoidFunction,\n  cancel: VoidFunction,\n  showProgress: (message: string) => void,\n  hideProgress: VoidFunction,\n) => HTMLElement;\n\nexport type EditorHTMLDialogValidateFn = () => string | null;\n\nexport const kAlertTypeInfo = 1;\nexport const kAlertTypeWarning = 2;\nexport const kAlertTypeError = 3;\n\nexport type AlertFn = (message: string, title: string, type: number) => Promise<boolean>;\n\nexport type YesNoMessageFn = (\n  message: string,\n  title: string,\n  type: number,\n  yesLabel: string,\n  noLabel: string,\n) => Promise<boolean>;\n\nexport type AttrEditorFn = (attr: AttrProps, idHint?: string) => Promise<AttrEditResult | null>;\n\nexport type DivAttrEditorFn = (attr: AttrProps, removeEnabled: boolean) => Promise<AttrEditResult | null>;\n\nexport type LinkEditorFn = (\n  link: LinkProps,\n  targets: LinkTargets,\n  capabilities: LinkCapabilities,\n) => Promise<LinkEditResult | null>;\n\nexport type ImageEditorFn = (\n  image: ImageProps,\n  dims: ImageDimensions | null,\n  editAttributes: boolean,\n) => Promise<ImageEditResult | null>;\n\nexport type CodeBlockEditorFn = (\n  codeBlock: CodeBlockProps,\n  attributes: boolean,\n  languages: string[],\n) => Promise<CodeBlockEditResult | null>;\n\nexport type ListEditorFn = (list: ListProps, capabilities: ListCapabilities) => Promise<ListEditResult | null>;\n\nexport type RawFormatEditorFn = (raw: RawFormatProps, outputFormats: string[]) => Promise<RawFormatResult | null>;\n\nexport type InsertTableFn = (capabilities: TableCapabilities) => Promise<InsertTableResult | null>;\n\nexport type InsertCiteFn = (props: InsertCiteProps) => Promise<InsertCiteResult | null>;\n\nexport interface AttrProps {\n  readonly id?: string;\n  readonly classes?: string[];\n  readonly keyvalue?: Array<[string, string]>;\n}\n\nexport interface AttrEditResult {\n  readonly action: 'edit' | 'remove';\n  readonly attr: AttrProps;\n}\n\nexport interface LinkProps extends AttrProps {\n  readonly type: LinkType;\n  readonly text: string;\n  readonly href: string;\n  readonly heading?: string;\n  readonly title?: string;\n}\n\nexport interface LinkEditResult {\n  readonly action: 'edit' | 'remove';\n  readonly link: LinkProps;\n}\n\nexport interface ImageProps extends AttrProps {\n  src: string | null;\n  title?: string;\n  alt?: string;\n  linkTo?: string;\n  width?: number;\n  height?: number;\n  units?: string;\n  lockRatio?: boolean;\n}\n\nexport type ImageEditResult = ImageProps;\n\nexport interface CodeBlockProps extends AttrProps {\n  lang: string;\n}\n\nexport type CodeBlockEditResult = CodeBlockProps;\n\nexport interface ListProps {\n  type: ListType;\n  tight: boolean;\n  order: number;\n  number_style: string;\n  number_delim: string;\n}\n\nexport type ListEditResult = ListProps;\n\nexport interface InsertTableResult {\n  rows: number;\n  cols: number;\n  header: boolean;\n  caption?: string;\n}\n\nexport interface InsertCiteProps {\n  doi: string;\n  existingIds: string[];\n  bibliographyFiles: string[];\n  provider?: string;\n  csl?: CSL;\n  citeUI?: InsertCiteUI;\n}\n\nexport interface InsertCiteUI {\n  suggestedId: string;\n  previewFields: CiteField[];\n}\n\nexport interface InsertCiteResult {\n  id: string;\n  bibliographyFile: string;\n  csl: CSL;\n}\n\nexport interface RawFormatProps {\n  content: string;\n  format: string;\n}\n\nexport interface RawFormatResult {\n  readonly action: 'edit' | 'remove';\n  readonly raw: RawFormatProps;\n}\n\nexport interface AttrEditInput {\n  id?: string;\n  classes?: string;\n  style?: string;\n  keyvalue?: string;\n}\n\nexport function attrInputToProps(attr: AttrEditInput): AttrProps {\n  const classes = attr.classes ? attr.classes.split(/\\s+/) : [];\n  let keyvalue: Array<[string, string]> | undefined;\n  if (attr.keyvalue || attr.style) {\n    let text = attr.keyvalue || '';\n    if (attr.style) {\n      text += `\\nstyle=${attr.style}\\n`;\n    }\n    keyvalue = pandocAttrKeyvalueFromText(text, '\\n');\n  }\n  return {\n    id: asPandocId(attr.id || ''),\n    classes: classes.map(asPandocClass),\n    keyvalue,\n  };\n}\n\nfunction asPandocId(id: string) {\n  return id.replace(/^#/, '');\n}\n\nfunction asPandocClass(clz: string) {\n  return clz.replace(/^\\./, '');\n}\n\nexport function attrPropsToInput(attr: AttrProps): AttrEditInput {\n  let style: string | undefined;\n  let keyvalue: string | undefined;\n  if (attr.keyvalue) {\n    const partitionedKeyvalue = attrPartitionKeyvalue([kStyleAttrib], attr.keyvalue);\n    if (partitionedKeyvalue.partitioned.length > 0) {\n      style = partitionedKeyvalue.partitioned[0][1];\n    }\n    keyvalue = attrTextFromKeyvalue(partitionedKeyvalue.base);\n  }\n\n  return {\n    id: asHtmlId(attr.id) || undefined,\n    classes: attr.classes ? attr.classes.map(asHtmlClass).join(' ') : undefined,\n    style,\n    keyvalue,\n  };\n}\n\nfunction attrTextFromKeyvalue(keyvalue: Array<[string, string]>) {\n  return keyvalue.map(kv => `${kv[0]}=${kv[1]}`).join('\\n');\n}\n\nfunction asHtmlId(id: string | undefined) {\n  if (id) {\n    if (id.startsWith('#')) {\n      return id;\n    } else {\n      return '#' + id;\n    }\n  } else {\n    return id;\n  }\n}\n\nfunction asHtmlClass(clz: string | undefined) {\n  if (clz) {\n    if (clz.startsWith('.')) {\n      return clz;\n    } else {\n      return '.' + clz;\n    }\n  } else {\n    return clz;\n  }\n}\n","/*\n * pandoc_attr.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeSpec, MarkSpec } from 'prosemirror-model';\n\nimport { PandocToken, PandocExtensions } from './pandoc';\nimport { extensionEnabled, extensionIfEnabled, Extension } from './extension';\n\nexport const kPandocAttrId = 0;\nexport const kPandocAttrClasses = 1;\nexport const kPandocAttrKeyvalue = 2;\n\nconst kDataPmPandocAttr = 'data-pm-pandoc-attr';\n\nexport const kWidthAttrib = 'width';\nexport const kHeightAttrib = 'height';\nexport const kStyleAttrib = 'style';\nexport const kAlignAttrib = 'align';\n\nexport const kCodeBlockAttr = 0;\nexport const kCodeBlockText = 1;\n\nexport const kSpanAttr = 0;\nexport const kSpanChildren = 1;\n\nexport interface PandocAttr {\n  id: string;\n  classes: string[];\n  keyvalue: Array<[string, string]>;\n}\n\nexport const pandocAttrSpec = {\n  id: { default: null },\n  classes: { default: [] },\n  keyvalue: { default: [] },\n};\n\nexport function pandocAttrAvailable(attrs: any) {\n  return !!attrs.id || (attrs.classes && attrs.classes.length > 0) || (attrs.keyvalue && attrs.keyvalue.length > 0);\n}\n\nexport function pandocAttrFrom(attrs: any) {\n  const pandocAttr: any = {};\n  if (attrs.id) {\n    pandocAttr.id = attrs.id;\n  }\n  if (attrs.classes) {\n    pandocAttr.classes = attrs.classes;\n  }\n  if (attrs.keyvalue) {\n    pandocAttr.keyvalue = attrs.keyvalue;\n  }\n\n  return pandocAttr;\n}\n\nexport function pandocAttrInSpec(spec: NodeSpec | MarkSpec) {\n  const keys = Object.keys((spec.attrs as object) || {});\n  return keys.includes('id') && keys.includes('classes') && keys.includes('keyvalue');\n}\n\nexport function pandocAttrReadAST(tok: PandocToken, index: number) {\n  const pandocAttr = tok.c[index];\n  return {\n    id: pandocAttr[kPandocAttrId] || undefined,\n    classes: pandocAttr[kPandocAttrClasses],\n    keyvalue: pandocAttr[kPandocAttrKeyvalue],\n  };\n}\n\nexport function pandocAttrToDomAttr(attrs: any, marker = true) {\n  // id and class\n  const domAttr: any = {};\n  if (attrs.id) {\n    domAttr.id = attrs.id;\n  }\n  if (attrs.classes && attrs.classes.length > 0) {\n    domAttr.class = attrs.classes.join(' ');\n  }\n\n  // keyvalue pairs\n  attrs.keyvalue.forEach((keyvalue: [string, string]) => {\n    domAttr[keyvalue[0]] = keyvalue[1];\n  });\n\n  // marker\n  if (marker) {\n    domAttr[kDataPmPandocAttr] = '1';\n  }\n\n  return domAttr;\n}\n\nexport function pandocAttrParseDom(el: Element, attrs: { [key: string]: string | null }, forceAttrs = false) {\n  // exclude any keys passed to us\n  const excludedNames = Object.keys(attrs);\n\n  // if this isn't from a prosemirror pandoc node then include only src and alt\n  const includedNames: string[] = [];\n  if (!forceAttrs && !el.hasAttribute(kDataPmPandocAttr)) {\n    includedNames.push('src', 'alt');\n  }\n\n  // read attributes\n  const attr: any = {};\n  attr.classes = [];\n  attr.keyvalue = [];\n  el.getAttributeNames().forEach(name => {\n    const value: string = el.getAttribute(name) as string;\n    // exclude attributes already parsed and prosemirror internal attributes\n    if (excludedNames.indexOf(name) === -1 && !name.startsWith('data-pm')) {\n      // if we have an include filter then use it\n      if (!includedNames.length || includedNames.includes(name)) {\n        if (name === 'id') {\n          attr.id = value;\n        } else if (name === 'class') {\n          attr.classes = value\n            .split(/\\s+/)\n            .filter(val => !!val.length)\n            .filter(val => !val.startsWith('pm-'));\n        } else {\n          attr.keyvalue.push([name, value]);\n        }\n      }\n    }\n  });\n  return attr;\n}\n\nexport function pandocAttrParseText(attr: string): PandocAttr | null {\n  attr = attr.trim();\n\n  let id = '';\n  const classes: string[] = [];\n  let remainder = '';\n\n  let current = '';\n  const resolveCurrent = () => {\n    const resolve = current;\n    current = '';\n\n    if (resolve.length === 0) {\n      return true;\n    } else if (resolve.startsWith('#')) {\n      if (id.length === 0 && resolve.length > 1) {\n        id = resolve.substr(1);\n        return true;\n      } else {\n        return false;\n      }\n    } else if (resolve.startsWith('.')) {\n      if (resolve.length > 1) {\n        classes.push(resolve.substr(1));\n        return true;\n      } else {\n        return false;\n      }\n    } else {\n      remainder = resolve;\n      return true;\n    }\n  };\n\n  for (let i = 0; i < attr.length; i++) {\n    let inQuotes = false;\n    const ch = attr[i];\n    inQuotes = ch === '\"' ? !inQuotes : inQuotes;\n    if (ch !== ' ' && !inQuotes) {\n      current += ch;\n    } else if (resolveCurrent()) {\n      // if we have a remainder then the rest of the string is the remainder\n      if (remainder.length > 0) {\n        remainder = remainder + attr.substr(i);\n        break;\n      }\n    } else {\n      return null;\n    }\n  }\n\n  if (resolveCurrent()) {\n    if (id.length === 0 && classes.length === 0) {\n      remainder = attr;\n    }\n    return {\n      id,\n      classes,\n      keyvalue: remainder.length > 0 ? pandocAttrKeyvalueFromText(remainder, ' ') : [],\n    };\n  } else {\n    return null;\n  }\n}\n\nexport function pandocAttrKeyvalueFromText(text: string, separator: ' ' | '\\n'): Array<[string, string]> {\n  // if the separator is a space then convert unquoted spaces to newline\n  if (separator === ' ') {\n    let convertedText = '';\n    let inQuotes = false;\n    for (let i = 0; i < text.length; i++) {\n      let ch = text.charAt(i);\n      if (ch === '\"') {\n        inQuotes = !inQuotes;\n      } else if (ch === ' ' && !inQuotes) {\n        ch = '\\n';\n      }\n      convertedText += ch;\n    }\n    text = convertedText;\n  }\n\n  const lines = text.trim().split('\\n');\n  return lines.map(line => {\n    const parts = line.trim().split('=');\n    return [parts[0], (parts[1] || '').replace(/^\"/, '').replace(/\"$/, '')];\n  });\n}\n\nexport interface AttrKeyvaluePartitioned {\n  base: Array<[string, string]>;\n  partitioned: Array<[string, string]>;\n}\n\nexport function attrPartitionKeyvalue(partition: string[], keyvalue: Array<[string, string]>): AttrKeyvaluePartitioned {\n  const base = new Array<[string, string]>();\n  const partitioned = new Array<[string, string]>();\n\n  keyvalue.forEach(kv => {\n    if (partition.includes(kv[0])) {\n      partitioned.push(kv);\n    } else {\n      base.push(kv);\n    }\n  });\n\n  return {\n    base,\n    partitioned,\n  };\n}\n\nexport function extensionIfPandocAttrEnabled(extension: Extension) {\n  return extensionIfEnabled(extension, kPandocAttrExtensions);\n}\n\nexport function pandocAttrEnabled(pandocExtensions: PandocExtensions) {\n  return extensionEnabled(pandocExtensions, kPandocAttrExtensions);\n}\n\nconst kPandocAttrExtensions = [\n  'link_attributes',\n  'mmd_link_attributes',\n  'mmd_header_identifiers',\n  'header_attributes',\n  'fenced_code_attributes',\n  'inline_code_attributes',\n  'bracketed_spans',\n  'native_spans',\n  'fenced_divs',\n  'native_divs',\n];\n","/*\n * extension.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Schema } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ProsemirrorCommand } from './command';\nimport { PandocMark } from './mark';\nimport { PandocNode } from './node';\nimport { EditorUI } from './ui';\nimport { BaseKeyBinding } from './basekeys';\nimport { AppendTransactionHandler, AppendMarkTransactionHandler } from './transaction';\nimport { EditorOptions } from './options';\nimport { PandocExtensions } from './pandoc';\nimport { FixupFn } from './fixup';\nimport { EditorEvents } from './events';\nimport { PandocCapabilities } from './pandoc_capabilities';\nimport { EditorFormat } from './format';\nimport { MarkInputRuleFilter } from './input_rule';\nimport { CompletionHandler } from './completion';\nimport { EditorNavigation } from './navigation';\nimport { EditorMath } from './math';\nimport { EditorServer } from './server';\n\nexport interface Extension {\n  marks?: PandocMark[];\n  nodes?: PandocNode[];\n  baseKeys?: (schema: Schema) => readonly BaseKeyBinding[];\n  inputRules?: (schema: Schema, markFilter: MarkInputRuleFilter) => readonly InputRule[];\n  commands?: (schema: Schema) => readonly ProsemirrorCommand[];\n  plugins?: (schema: Schema) => readonly Plugin[];\n  appendTransaction?: (schema: Schema) => readonly AppendTransactionHandler[];\n  appendMarkTransaction?: (schema: Schema) => readonly AppendMarkTransactionHandler[];\n  fixups?: (schema: Schema, view: EditorView) => Readonly<FixupFn[]>;\n  completionHandlers?: () => readonly CompletionHandler[];\n}\n\nexport interface ExtensionContext {\n  pandocExtensions: PandocExtensions;\n  pandocCapabilities: PandocCapabilities;\n  server: EditorServer;\n  ui: EditorUI;\n  math?: EditorMath;\n  format: EditorFormat;\n  options: EditorOptions;\n  events: EditorEvents;\n  navigation: EditorNavigation;\n}\n\nexport type ExtensionFn = (context: ExtensionContext) => Extension | null;\n\n// create an ExtensionFn for a given extension and format option that must be enabled\nexport function extensionIfEnabled(extension: Extension, name: string | string[]) {\n  return (context: ExtensionContext) => {\n    if (extensionEnabled(context.pandocExtensions, name)) {\n      return extension;\n    } else {\n      return null;\n    }\n  };\n}\n\nexport function extensionEnabled(pandocExtensions: PandocExtensions, name: string | string[]) {\n  // match single extension name\n  if (typeof name === 'string') {\n    if (pandocExtensions[name]) {\n      return true;\n    }\n\n    // match any one of several names\n  } else if (Array.isArray(name)) {\n    for (const nm of name) {\n      if (pandocExtensions[nm]) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n","/*\n * pandoc_capabilities.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PandocServer, parsePandocListOutput, PandocApiVersion } from './pandoc';\n\nexport interface PandocCapabilitiesResult {\n  version: string;\n  api_version: PandocApiVersion;\n  output_formats: string;\n  highlight_languages: string;\n}\n\nexport interface PandocCapabilities {\n  version: string;\n  api_version: PandocApiVersion;\n  output_formats: string[];\n  highlight_languages: string[];\n}\n\nexport async function getPandocCapabilities(server: PandocServer) {\n  const result = await server.getCapabilities();\n  return {\n    version: result.version,\n    api_version: result.api_version,\n    output_formats: parsePandocListOutput(result.output_formats),\n    highlight_languages: parsePandocListOutput(result.highlight_languages),\n  };\n}\n","/*\n * pandoc.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Node as ProsemirrorNode, Schema, NodeType } from 'prosemirror-model';\n\nimport { PandocAttr, pandocAttrReadAST, kSpanChildren, kSpanAttr } from './pandoc_attr';\nimport { PandocCapabilitiesResult } from './pandoc_capabilities';\nimport { kQuoteType, kQuoteChildren, QuoteType } from './quote';\nimport { BibliographyResult } from './bibliography/bibliography-provider_local';\n\nimport { stringifyMath } from './math';\nimport { kCodeText } from './code';\nimport { kLinkChildren } from './link';\n\nexport interface PandocServer {\n  getCapabilities(): Promise<PandocCapabilitiesResult>;\n  markdownToAst(markdown: string, format: string, options: string[]): Promise<PandocAst>;\n  astToMarkdown(ast: PandocAst, format: string, options: string[]): Promise<string>;\n  listExtensions(format: string): Promise<string>;\n  getBibliography(\n    file: string | null,\n    bibliography: string[],\n    refBlock: string | null,\n    etag: string | null,\n  ): Promise<BibliographyResult>;\n  addToBibliography(\n    bibliography: string,\n    project: boolean,\n    id: string,\n    sourceAsJson: string,\n    sourceAsBibTeX: string,\n  ): Promise<boolean>;\n  citationHTML(file: string | null, sourceAsJson: string, csl: string | null): Promise<string>;\n}\n\nexport interface PandocWriterReferencesOptions {\n  location?: string; // block | section | document\n  prefix?: string;\n}\n\nexport interface PandocWriterOptions {\n  atxHeaders?: boolean;\n  references?: PandocWriterReferencesOptions;\n  wrap?: string;\n  dpi?: number;\n}\n\nexport interface PandocExtensions {\n  abbreviations: boolean;\n  all_symbols_escapable: boolean;\n  amuse: boolean;\n  angle_brackets_escapable: boolean;\n  ascii_identifiers: boolean;\n  auto_identifiers: boolean;\n  autolink_bare_uris: boolean;\n  backtick_code_blocks: boolean;\n  blank_before_blockquote: boolean;\n  blank_before_header: boolean;\n  bracketed_spans: boolean;\n  citations: boolean;\n  compact_definition_lists: boolean;\n  definition_lists: boolean;\n  east_asian_line_breaks: boolean;\n  emoji: boolean;\n  empty_paragraphs: boolean;\n  epub_html_exts: boolean;\n  escaped_line_breaks: boolean;\n  example_lists: boolean;\n  fancy_lists: boolean;\n  fenced_code_attributes: boolean;\n  fenced_code_blocks: boolean;\n  fenced_divs: boolean;\n  footnotes: boolean;\n  four_space_rule: boolean;\n  gfm_auto_identifiers: boolean;\n  grid_tables: boolean;\n  hard_line_breaks: boolean;\n  header_attributes: boolean;\n  ignore_line_breaks: boolean;\n  implicit_figures: boolean;\n  implicit_header_references: boolean;\n  inline_code_attributes: boolean;\n  inline_notes: boolean;\n  intraword_underscores: boolean;\n  latex_macros: boolean;\n  line_blocks: boolean;\n  link_attributes: boolean;\n  lists_without_preceding_blankline: boolean;\n  literate_haskell: boolean;\n  markdown_attribute: boolean;\n  markdown_in_html_blocks: boolean;\n  mmd_header_identifiers: boolean;\n  mmd_link_attributes: boolean;\n  mmd_title_block: boolean;\n  multiline_tables: boolean;\n  native_divs: boolean;\n  native_spans: boolean;\n  native_numbering: boolean;\n  ntb: boolean;\n  old_dashes: boolean;\n  pandoc_title_block: boolean;\n  pipe_tables: boolean;\n  raw_attribute: boolean;\n  raw_html: boolean;\n  raw_tex: boolean;\n  shortcut_reference_links: boolean;\n  simple_tables: boolean;\n  smart: boolean;\n  space_in_atx_header: boolean;\n  spaced_reference_links: boolean;\n  startnum: boolean;\n  strikeout: boolean;\n  subscript: boolean;\n  superscript: boolean;\n  styles: boolean;\n  task_lists: boolean;\n  table_captions: boolean;\n  tex_math_dollars: boolean;\n  tex_math_double_backslash: boolean;\n  tex_math_single_backslash: boolean;\n  yaml_metadata_block: boolean;\n  gutenberg: boolean;\n  // attributes: boolean; (not yet)\n  [key: string]: boolean;\n}\n\nexport function imageAttributesAvailable(pandocExtensions: PandocExtensions) {\n  return pandocExtensions.link_attributes || pandocExtensions.raw_html;\n}\n\nexport function parsePandocListOutput(output: string) {\n  return output.split(/\\r?\\n/).filter(entry => entry.length);\n}\n\nexport interface PandocAst {\n  blocks: PandocToken[];\n  'pandoc-api-version': PandocApiVersion;\n  meta: any;\n  heading_ids?: string[]; // used only for reading not writing\n}\n\nexport type PandocApiVersion = number[];\n\nexport interface PandocToken {\n  t: string;\n  c?: any;\n}\n\n// https://github.com/jgm/pandoc-types/blob/master/Text/Pandoc/Definition.hs\nexport enum PandocTokenType {\n  Str = 'Str',\n  Space = 'Space',\n  Strong = 'Strong',\n  Emph = 'Emph',\n  Code = 'Code',\n  Superscript = 'Superscript',\n  Subscript = 'Subscript',\n  Strikeout = 'Strikeout',\n  SmallCaps = 'SmallCaps',\n  Underline = 'Underline',\n  Quoted = 'Quoted',\n  RawInline = 'RawInline',\n  RawBlock = 'RawBlock',\n  LineBlock = 'LineBlock',\n  Para = 'Para',\n  Plain = 'Plain',\n  Header = 'Header',\n  CodeBlock = 'CodeBlock',\n  BlockQuote = 'BlockQuote',\n  BulletList = 'BulletList',\n  OrderedList = 'OrderedList',\n  DefinitionList = 'DefinitionList',\n  Image = 'Image',\n  Link = 'Link',\n  Note = 'Note',\n  Cite = 'Cite',\n  Table = 'Table',\n  AlignRight = 'AlignRight',\n  AlignLeft = 'AlignLeft',\n  AlignDefault = 'AlignDefault',\n  AlignCenter = 'AlignCenter',\n  ColWidth = 'ColWidth',\n  ColWidthDefault = 'ColWidthDefault',\n  HorizontalRule = 'HorizontalRule',\n  LineBreak = 'LineBreak',\n  SoftBreak = 'SoftBreak',\n  Math = 'Math',\n  InlineMath = 'InlineMath',\n  DisplayMath = 'DisplayMath',\n  Div = 'Div',\n  Span = 'Span',\n  Null = 'Null',\n}\n\nexport interface PandocTokenReader {\n  // pandoc token name (e.g. \"Str\", \"Emph\", etc.)\n  readonly token: PandocTokenType;\n\n  // If present, gives a chance for the reader to decide whether it actually\n  // wants to handle the token, based on factors other than the PandocTokenType\n  readonly match?: (tok: PandocToken) => boolean;\n\n  // one and only one of these values must also be set\n  readonly text?: boolean;\n  readonly node?: string;\n  readonly block?: string;\n  readonly mark?: string;\n  readonly code_block?: boolean;\n\n  // functions for getting attributes and children\n  getAttrs?: (tok: PandocToken) => any;\n  getChildren?: (tok: PandocToken) => any[];\n  getText?: (tok: PandocToken) => string;\n\n  // lower-level handler function that overrides the above handler attributes\n  // (they are ignored when handler is specified)\n  handler?: (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => void;\n\n  // post-processor for performing fixups that rely on seeing the entire\n  // document (e.g. recognizing implicit header references)\n  postprocessor?: PandocPostprocessorFn;\n}\n\n// constants used to read the contents of raw blocks\nexport const kRawBlockFormat = 0;\nexport const kRawBlockContent = 1;\n\n// filter sequences of tokens (e.g. for reducing some adjacent tokens to a single token)\nexport type PandocTokensFilterFn = (tokens: PandocToken[], writer: ProsemirrorWriter) => PandocToken[];\n\n// special reader that gets a first shot at blocks (i.e. to convert a para w/ a single image into a figure)\nexport type PandocBlockReaderFn = (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => boolean;\n\n// reader that gets a first shot at inline html (e.g. image node parsing an <img> tag)\nexport type PandocInlineHTMLReaderFn = (schema: Schema, html: string, writer?: ProsemirrorWriter) => boolean;\n\nexport interface ProsemirrorWriter {\n  // open (then close) a node container\n  openNode(type: NodeType, attrs: {}): void;\n  closeNode(): ProsemirrorNode;\n\n  // special open call for note node containers\n  openNoteNode(ref: string): void;\n\n  // add a node to the current container\n  addNode(type: NodeType, attrs: {}, content: ProsemirrorNode[]): ProsemirrorNode | null;\n\n  // open and close marks\n  openMark(mark: Mark): void;\n  closeMark(mark: Mark): void;\n\n  // add text to the current node using the current mark set\n  writeText(text: string): void;\n\n  // write tokens into the current node\n  writeTokens(tokens: PandocToken[]): void;\n\n  // see if any inline HTML readers want to handle this html\n  hasInlineHTMLWriter(html: string): boolean;\n  writeInlineHTML(html: string): void;\n\n  // log an unrecoginzed token type\n  logUnrecognized(token: string): void;\n\n  // query whether a given node type is open\n  // (useful for e.g. conditional behavior when in a list or table)\n  isNodeOpen(type: NodeType): boolean;\n}\n\nexport interface PandocNodeWriter {\n  readonly name: string;\n  readonly write: PandocNodeWriterFn;\n}\n\nexport type PandocNodeWriterFn = (output: PandocOutput, node: ProsemirrorNode) => void;\n\nexport type PandocPreprocessorFn = (markdown: string) => string;\n\nexport type PandocPostprocessorFn = (doc: ProsemirrorNode) => ProsemirrorNode;\n\nexport interface PandocMarkWriter {\n  // pandoc mark name\n  readonly name: string;\n\n  // The 'priority' property allows us to dicate the order of nesting\n  // for marks (this is required b/c Prosemirror uses a flat structure\n  // whereby multiple marks are attached to text nodes). This allows us\n  // to e.g. ensure that strong and em always occur outside code.\n  readonly priority: number;\n\n  // writer function\n  readonly write: PandocMarkWriterFn;\n}\n\nexport type PandocMarkWriterFn = (output: PandocOutput, mark: Mark, parent: Fragment) => void;\n\nexport type PandocOutputOption = 'writeSpaces';\n\nexport interface PandocOutput {\n  extensions: PandocExtensions;\n  write(value: any): void;\n  writeToken(type: PandocTokenType, content?: (() => void) | any): void;\n  writeMark(type: PandocTokenType, parent: Fragment, expelEnclosingWhitespace?: boolean): void;\n  writeArray(content: () => void): void;\n  writeAttr(id?: string, classes?: string[], keyvalue?: [[string, string]]): void;\n  writeText(text: string | null): void;\n  writeLink(href: string, title: string, attr: PandocAttr | null, f: () => void): void;\n  writeNode(node: ProsemirrorNode): void;\n  writeNodes(parent: ProsemirrorNode): void;\n  writeNote(note: ProsemirrorNode): void;\n  writeInlines(fragment: Fragment): void;\n  writeRawMarkdown(markdown: Fragment | string, escapeSymbols?: boolean): void;\n  withOption(option: PandocOutputOption, value: boolean, f: () => void): void;\n}\n\n// collect the text from a collection of pandoc ast\n// elements (ignores marks, useful for ast elements\n// that support marks but whose prosemirror equivalent\n// does not, e.g. image alt text)\n// https://github.com/jgm/pandoc/blob/83880b0dbc318703babfbb6905b1046fa48f1216/src/Text/Pandoc/Shared.hs#L439\nexport function stringifyTokens(c: PandocToken[], unemoji = false): string {\n  return c\n    .map(elem => {\n      if (elem.t === PandocTokenType.Str) {\n        return elem.c;\n      } else if (\n        elem.t === PandocTokenType.Space ||\n        elem.t === PandocTokenType.SoftBreak ||\n        elem.t === PandocTokenType.LineBreak\n      ) {\n        return ' ';\n      } else if (elem.t === PandocTokenType.Link) {\n        return stringifyTokens(elem.c[kLinkChildren]);\n      } else if (elem.t === PandocTokenType.Span) {\n        const attr = pandocAttrReadAST(elem, kSpanAttr);\n        if (unemoji && attr.classes && attr.classes[0] === 'emoji') {\n          return attr.keyvalue[0][1];\n        } else {\n          return stringifyTokens(elem.c[kSpanChildren]);\n        }\n      } else if (elem.t === PandocTokenType.Quoted) {\n        const type = elem.c[kQuoteType].t;\n        const quote = type === QuoteType.SingleQuote ? \"'\" : '\"';\n        return quote + stringifyTokens(elem.c[kQuoteChildren]) + quote;\n      } else if (elem.t === PandocTokenType.Math) {\n        return stringifyMath(elem);\n      } else if (elem.t === PandocTokenType.Code) {\n        return elem.c[kCodeText];\n      } else if (elem.c) {\n        return stringifyTokens(elem.c);\n      } else {\n        return '';\n      }\n    })\n    .join('');\n}\n\nexport function forEachToken(tokens: PandocToken[], f: (tok: PandocToken) => void) {\n  mapTokens(tokens, (tok: PandocToken) => {\n    f(tok);\n    return tok;\n  });\n}\n\nexport function mapTokens(tokens: PandocToken[], f: (tok: PandocToken) => PandocToken) {\n  function isToken(val: any) {\n    if (val !== null && typeof val === 'object') {\n      return val.hasOwnProperty('t');\n    } else {\n      return false;\n    }\n  }\n\n  function tokenHasChildren(tok: PandocToken) {\n    return tok !== null && typeof tok === 'object' && Array.isArray(tok.c);\n  }\n\n  function mapValue(val: any): any {\n    if (isToken(val)) {\n      return mapToken(val);\n    } else if (Array.isArray(val)) {\n      return val.map(mapValue);\n    } else {\n      return val;\n    }\n  }\n\n  function mapToken(tok: PandocToken): PandocToken {\n    const mappedTok = f(tok);\n    if (tokenHasChildren(mappedTok)) {\n      mappedTok.c = mappedTok.c.map(mapValue);\n    }\n    return mappedTok;\n  }\n\n  return tokens.map(mapToken);\n}\n\nexport function tokenTextEscaped(t: PandocToken) {\n  return t.c.replace(/\\\\/g, `\\\\\\\\`);\n}\n\n// sort marks by priority (in descending order)\nexport function marksByPriority(marks: Mark[], markWriters: { [key: string]: PandocMarkWriter }) {\n  return marks.sort((a: Mark, b: Mark) => {\n    const aPriority = markWriters[a.type.name].priority;\n    const bPriority = markWriters[b.type.name].priority;\n    if (aPriority < bPriority) {\n      return 1;\n    } else if (bPriority < aPriority) {\n      return -1;\n    } else {\n      return 0;\n    }\n  });\n}\n","/*\n * quote.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kQuoteType = 0;\nexport const kQuoteChildren = 1;\n\nexport enum QuoteType {\n  SingleQuote = 'SingleQuote',\n  DoubleQuote = 'DoubleQuote',\n}\n\nexport function quotesForType(type: QuoteType) {\n  const dblQuote = type === QuoteType.DoubleQuote;\n  return {\n    begin: dblQuote ? '“' : '‘',\n    end: dblQuote ? '”' : '’',\n  };\n}\n\n// create regexs for removing quotes\nconst kSingleQuotes = quotesForType(QuoteType.SingleQuote);\nconst kSingleQuoteRegEx = new RegExp(`[${kSingleQuotes.begin}${kSingleQuotes.end}]`, 'g');\nconst kDoubleQuotes = quotesForType(QuoteType.DoubleQuote);\nconst kDoubleQuoteRegEx = new RegExp(`[${kDoubleQuotes.begin}${kDoubleQuotes.end}]`, 'g');\n\nexport function fancyQuotesToSimple(text: string) {\n  return text.replace(kSingleQuoteRegEx, \"'\").replace(kDoubleQuoteRegEx, '\"');\n}\n","/*\n * math.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUI } from './ui';\nimport { PandocToken } from './pandoc';\n\nexport const kMathType = 0;\nexport const kMathContent = 1;\n\nexport enum MathType {\n  Inline = 'InlineMath',\n  Display = 'DisplayMath',\n}\n\nexport interface EditorMath {\n  typeset: (el: HTMLElement, math: string, priority: boolean) => Promise<boolean>;\n}\n\nexport function editorMath(ui: EditorUI): EditorMath {\n  // return a promise that will typeset this node's math (including retrying as long as is\n  // required if the element is not yet connected to the DOM)\n  return {\n    typeset: (el: HTMLElement, math: string, priority: boolean): Promise<boolean> => {\n      return new Promise(resolve => {\n        // regular typeset if we are already connected\n        if (el.isConnected) {\n          ui.math.typeset!(el, math, priority).then(resolve);\n        } else {\n          // otherwise wait 100ms then retry\n          const timerId = setInterval(() => {\n            if (el.isConnected) {\n              clearInterval(timerId);\n              ui.math.typeset!(el, math, priority).then(resolve);\n            }\n          }, 100);\n        }\n      });\n    },\n  };\n}\n\nexport function delimiterForType(type: string) {\n  if (type === MathType.Inline) {\n    return '$';\n  } else {\n    return '$$';\n  }\n}\n\nexport function stringifyMath(tok: PandocToken) {\n  const delimter = delimiterForType(tok.c[kMathType].t);\n  return delimter + tok.c[kMathContent] + delimter;\n}\n","/*\n * code.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\n\nimport { CodeViewOptions, canInsertNodeAtPos } from './node';\nimport { ResolvedPos, Slice, Fragment } from 'prosemirror-model';\n\nexport const kCodeAttr = 0;\nexport const kCodeText = 1;\n\nexport function codeNodeSpec() {\n  return {\n    content: 'text*',\n    group: 'block',\n    marks: '',\n    code: true,\n    defining: true,\n    isolating: true,\n  };\n}\n\nexport function codeViewClipboardPlugin(codeViews: { [key: string]: CodeViewOptions }) {\n  return new Plugin({\n    key: new PluginKey('code-view-clipboard'),\n    props: {\n      clipboardTextParser: (text: string, $context: ResolvedPos): any => {\n        // see if any of the code views want to handle this text\n        for (const codeViewType of Object.keys(codeViews)) {\n          const codeView = codeViews[codeViewType];\n          if (codeView.createFromPastePattern && codeView.createFromPastePattern.test(text)) {\n            const schema = $context.node().type.schema;\n            const nodeType = schema.nodes[codeViewType];\n            if (canInsertNodeAtPos($context, nodeType)) {\n              const textNode = schema.text(text);\n              const codeNode = nodeType.createAndFill({}, textNode);\n              return new Slice(Fragment.from(codeNode), 0, 0);\n            }\n          }\n        }\n        return null;\n      },\n    },\n  });\n}\n","/*\n * node.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeSpec, NodeType, ResolvedPos, Slice } from 'prosemirror-model';\nimport { EditorState, Selection, NodeSelection } from 'prosemirror-state';\nimport {\n  findParentNode,\n  findSelectedNodeOfType,\n  ContentNodeWithPos,\n  NodeWithPos,\n  findParentNodeOfType,\n  findChildrenByType,\n  findChildren,\n  findParentNodeOfTypeClosestToPos,\n} from 'prosemirror-utils';\n\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n  PandocTokenReader,\n  PandocNodeWriterFn,\n  PandocPreprocessorFn,\n  PandocBlockReaderFn,\n  PandocInlineHTMLReaderFn,\n  PandocTokensFilterFn,\n} from './pandoc';\nimport { PandocBlockCapsuleFilter } from './pandoc_capsule';\n\nimport { AttrEditOptions } from './attr_edit';\nimport { CommandFn } from './command';\nimport { ExecuteRmdChunkFn } from './rmd';\n\nexport interface PandocNode {\n  readonly name: string;\n  readonly spec: NodeSpec;\n  readonly code_view?: CodeViewOptions;\n  readonly attr_edit?: () => AttrEditOptions | null;\n  readonly pandoc: {\n    readonly readers?: readonly PandocTokenReader[];\n    readonly writer?: PandocNodeWriterFn;\n    readonly preprocessor?: PandocPreprocessorFn;\n    readonly tokensFilter?: PandocTokensFilterFn;\n    readonly blockReader?: PandocBlockReaderFn;\n    readonly inlineHTMLReader?: PandocInlineHTMLReaderFn;\n    readonly blockCapsuleFilter?: PandocBlockCapsuleFilter;\n  };\n}\n\nexport interface CodeViewOptions {\n  lang: (node: ProsemirrorNode, content: string) => string | null;\n  attrEditFn?: CommandFn;\n  createFromPastePattern?: RegExp;\n  classes?: string[];\n  borderColorClass?: string;\n  firstLineMeta?: boolean;\n  lineNumbers?: boolean;\n  bookdownTheorems?: boolean;\n  lineNumberFormatter?: (lineNumber: number, lineCount?: number, line?: string) => string;\n}\n\nexport type NodeTraversalFn = (\n  node: Node,\n  pos: number,\n  parent: Node,\n  index: number,\n) => boolean | void | null | undefined;\n\nexport function findTopLevelBodyNodes(doc: ProsemirrorNode, predicate: (node: ProsemirrorNode) => boolean) {\n  const body = findChildrenByType(doc, doc.type.schema.nodes.body, false)[0];\n  const offset = body.pos + 1;\n  const nodes = findChildren(body.node, predicate, false);\n  return nodes.map(value => ({ ...value, pos: value.pos + offset }));\n}\n\nexport function findNodeOfTypeInSelection(selection: Selection, type: NodeType): ContentNodeWithPos | undefined {\n  return findSelectedNodeOfType(type)(selection) || findParentNode((n: ProsemirrorNode) => n.type === type)(selection);\n}\n\nexport function firstNode(parent: NodeWithPos, predicate: (node: ProsemirrorNode) => boolean) {\n  let foundNode: NodeWithPos | undefined;\n  parent.node.descendants((node, pos) => {\n    if (!foundNode) {\n      if (predicate(node)) {\n        foundNode = {\n          node,\n          pos: parent.pos + 1 + pos,\n        };\n        return false;\n      }\n    } else {\n      return false;\n    }\n  });\n  return foundNode;\n}\n\nexport function lastNode(parent: NodeWithPos, predicate: (node: ProsemirrorNode) => boolean) {\n  let last: NodeWithPos | undefined;\n  parent.node.descendants((node, pos) => {\n    if (predicate(node)) {\n      last = {\n        node,\n        pos: parent.pos + 1 + pos,\n      };\n    }\n  });\n  return last;\n}\n\nexport function nodeIsActive(state: EditorState, type: NodeType, attrs = {}) {\n  const predicate = (n: ProsemirrorNode) => n.type === type;\n  const node = findSelectedNodeOfType(type)(state.selection) || findParentNode(predicate)(state.selection);\n\n  if (!Object.keys(attrs).length || !node) {\n    return !!node;\n  }\n\n  return node.node.hasMarkup(type, attrs);\n}\n\nexport function canInsertNode(context: EditorState | Selection, nodeType: NodeType) {\n  const selection = asSelection(context);\n  const $from = selection.$from;\n  return canInsertNodeAtPos($from, nodeType);\n}\n\nexport function canInsertNodeAtPos($pos: ResolvedPos, nodeType: NodeType) {\n  for (let d = $pos.depth; d >= 0; d--) {\n    const index = $pos.index(d);\n    if ($pos.node(d).canReplaceWith(index, index, nodeType)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport function canInsertTextNode(context: EditorState | Selection) {\n  const selection = asSelection(context);\n  return canInsertNode(selection, selection.$head.parent.type.schema.nodes.text);\n}\n\nexport function insertAndSelectNode(view: EditorView, node: ProsemirrorNode) {\n  // create new transaction\n  const tr = view.state.tr;\n\n  // insert the node over the existing selection\n  tr.ensureMarks(node.marks);\n  tr.replaceSelectionWith(node);\n\n  // set selection to inserted node (or don't if our selection calculate was off,\n  // as can happen when we insert into a list bullet)\n  const selectionPos = tr.doc.resolve(tr.mapping.map(view.state.selection.from, -1));\n  const selectionNode = tr.doc.nodeAt(selectionPos.pos);\n  if (selectionNode && selectionNode.type === node.type) {\n    tr.setSelection(new NodeSelection(selectionPos));\n  }\n\n  // dispatch transaction\n  view.dispatch(tr);\n}\n\nexport function editingRootNode(selection: Selection) {\n  const schema = selection.$head.node().type.schema;\n  return findParentNodeOfType(schema.nodes.body)(selection) || findParentNodeOfType(schema.nodes.note)(selection);\n}\n\nexport function editingRootNodeClosestToPos($pos: ResolvedPos) {\n  const schema = $pos.node().type.schema;\n  return (\n    findParentNodeOfTypeClosestToPos($pos, schema.nodes.body) ||\n    findParentNodeOfTypeClosestToPos($pos, schema.nodes.note)\n  );\n}\n\nexport function editingRootScrollContainerElement(view: EditorView) {\n  const editingNode = editingRootNode(view.state.selection);\n  if (editingNode) {\n    const editingEl = view.domAtPos(editingNode.pos + 1).node;\n    return editingEl.parentElement;\n  } else {\n    return undefined;\n  }\n}\n\nfunction asSelection(context: EditorState | Selection) {\n  return context instanceof EditorState ? context.selection : context;\n}\n","/*\n * link.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildren, findChildrenByType } from 'prosemirror-utils';\n\nexport const kLinkTargetUrl = 0;\nexport const kLinkTargetTitle = 1;\n\nexport const kLinkAttr = 0;\nexport const kLinkChildren = 1;\nexport const kLinkTarget = 2;\n\nexport enum LinkType {\n  URL = 0,\n  Heading = 1,\n  ID = 2,\n}\n\nexport interface LinkCapabilities {\n  headings: boolean;\n  attributes: boolean;\n  text: boolean;\n}\n\nexport interface LinkTargets {\n  readonly ids: string[];\n  readonly headings: LinkHeadingTarget[];\n}\n\nexport interface LinkHeadingTarget {\n  readonly level: number;\n  readonly text: string;\n}\n\nexport async function linkTargets(doc: ProsemirrorNode) {\n  const ids = findChildren(doc, node => !!node.attrs.id).map(value => value.node.attrs.id);\n\n  const headings = findChildrenByType(doc, doc.type.schema.nodes.heading).map(heading => ({\n    level: heading.node.attrs.level,\n    text: heading.node.textContent,\n  }));\n\n  return {\n    ids,\n    headings,\n  };\n}\n","/*\n * html.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMSerializer, Fragment } from 'prosemirror-model';\n\nexport const kHTMLCommentRegEx = /(?:^|[^`])(<!--([\\s\\S]*?)-->)/;\n\nexport function isHTMLComment(html: string) {\n  return !!html.match(kHTMLCommentRegEx);\n}\n\nexport function isSingleLineHTML(html: string) {\n  return html.trimRight().split('\\n').length === 1;\n}\n\nexport function asHTMLTag(\n  tag: string,\n  attribs: { [key: string]: string },\n  selfClosing = false,\n  noEmptyAttribs = false,\n) {\n  const attribsHTML = Object.keys(attribs)\n    .filter(name => !noEmptyAttribs || attribs[name])\n    .map(name => `${name}=\"${escapeHTMLAttribute(attribs[name])}\"`)\n    .join(' ');\n  return `<${tag} ${attribsHTML}${selfClosing ? '/' : ''}>`;\n}\n\nexport function escapeHTMLAttribute(value: string) {\n  return value\n    .replace(/&/g, '&amp;') // must be first replacement\n    .replace(/'/g, '&apos;')\n    .replace(/\"/g, '&quot;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n}\n\nexport function nodeToHTML(schema: Schema, node: ProsemirrorNode) {\n  return generateHTML(() => DOMSerializer.fromSchema(schema).serializeNode(node));\n}\n\nexport function fragmentToHTML(schema: Schema, fragment: Fragment) {\n  return generateHTML(() => DOMSerializer.fromSchema(schema).serializeFragment(fragment));\n}\n\nfunction generateHTML(generator: () => Node | DocumentFragment) {\n  const div = document.createElement('div');\n  const output = generator();\n  div.appendChild(output);\n  return div.innerHTML;\n}\n","/*\n * events.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n/**\n * Represents an event type; only a single instance of this should exist per\n * event type (akin to PluginKey) and it should be visible to everyone who wants\n * to subscribe to or emit events of that type. Do not create one of these\n * directly, instead use makeEventType().\n */\nexport interface EventType<TDetail> {\n  readonly eventName: string;\n  // This field is needed only to prevent TDetail from being ignored by the type\n  // checker; if TDetail isn't used, tsc acts as if EventType isn't generic.\n  readonly dummy?: TDetail;\n}\n\n/**\n * Type signature of event-handler functions; the TDetail must match with the\n * EventType<TDetail> being subscribed to.\n *\n * (Note that the detail is always optional. I couldn't figure out how to make\n * it mandatory for some event types, forbidden for others, and optional for\n * still others, so it's just optional for everyone.)\n */\nexport type EventHandler<TDetail> = (detail?: TDetail) => void;\n\n/**\n * Generic interface for objects that support eventing.\n *\n * TODO: I don't see a reason why this interface should support both\n * subscription *and* emitting, the latter seems like something private.\n */\nexport interface EditorEvents {\n  subscribe<TDetail>(event: EventType<TDetail>, handler: EventHandler<TDetail>): VoidFunction;\n  emit<TDetail>(event: EventType<TDetail>, detail?: TDetail): void;\n}\n\n/**\n * Creates a new type of event. Use the TDetail type parameter to indicate the\n * type of data, if any, that event handlers can expect.\n */\nexport function makeEventType<TDetail = void>(eventName: string) {\n  return { eventName: `panmirror${eventName}` } as EventType<TDetail>;\n}\n\n/**\n * An implementation of EditorEvents, using the DOM event system.\n */\nexport class DOMEditorEvents implements EditorEvents {\n  private readonly el: HTMLElement;\n\n  constructor(el: HTMLElement) {\n    this.el = el;\n  }\n\n  public emit<TDetail>(eventType: EventType<TDetail>, detail?: TDetail) {\n    // Note: CustomEvent requires polyfill for IE, see\n    // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n    const event = new CustomEvent(eventType.eventName, { detail });\n    return this.el.dispatchEvent(event);\n  }\n\n  public subscribe<TDetail>(eventType: EventType<TDetail>, handler: EventHandler<TDetail>) {\n    const listener = function(this: any, evt: Event) {\n      const detail: TDetail | undefined = (evt as CustomEvent).detail;\n      handler.call(this, detail);\n    };\n    this.el.addEventListener(eventType.eventName, listener);\n    return () => {\n      this.el.removeEventListener(eventType.eventName, listener);\n    };\n  }\n}\n","/*\n * event-types.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { makeEventType } from './events';\nimport { Navigation } from './navigation';\n\nexport const UpdateEvent = makeEventType('Update');\nexport const OutlineChangeEvent = makeEventType('OutlineChange');\nexport const StateChangeEvent = makeEventType('StateChange');\nexport const ResizeEvent = makeEventType('Resize');\nexport const LayoutEvent = makeEventType('Layout');\nexport const ScrollEvent = makeEventType('Scroll');\nexport const BlurEvent = makeEventType('Blur');\nexport const FocusEvent = makeEventType<ProsemirrorNode>('Focus');\nexport const DispatchEvent = makeEventType<Transaction>('Dispatch');\nexport const NavigateEvent = makeEventType<Navigation>('Navigate');\n","/*\n * pandoc_format.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { PandocServer, PandocExtensions } from './pandoc';\nimport { EditorFormat, kHugoDocType } from './format';\nimport { firstYamlBlock, yamlMetadataNodes } from './yaml';\nimport { findValue } from './object';\n\nexport const kMarkdownFormat = 'markdown';\nexport const kMarkdownPhpextraFormat = 'markdown_phpextra';\nexport const kMarkdownGithubFormat = 'markdown_github';\nexport const kMarkdownMmdFormat = 'markdown_mmd';\nexport const kMarkdownStrictFormat = 'markdown_strict';\nexport const kGfmFormat = 'gfm';\nexport const kCommonmarkFormat = 'commonmark';\nexport const kCommonmarkXFormat = 'commonmark_x';\n\nexport interface PandocFormat {\n  mode: string;\n  baseName: string;\n  fullName: string;\n  extensions: PandocExtensions;\n  warnings: PandocFormatWarnings;\n}\n\nexport interface PandocFormatWarnings {\n  invalidFormat: string;\n  invalidOptions: string[];\n}\n\nexport interface PandocFormatConfig {\n  mode?: string;\n  extensions?: string;\n  rmdExtensions?: string;\n  wrap?: string;\n  doctypes?: string[];\n  references_location?: string;\n  references_prefix?: string;\n  canonical?: boolean;\n}\n\nexport function matchPandocFormatComment(code: string) {\n  const magicCommentRegEx = /^<!--\\s+-\\*-([\\s\\S]*?)-\\*-\\s+-->\\s*$/m;\n  return code.match(magicCommentRegEx);\n}\n\nexport function pandocFormatConfigFromDoc(doc: ProsemirrorNode, isRmd: boolean) {\n  return pandocFormatConfigFromYamlInDoc(doc, isRmd) || pandocFormatConfigFromCommentInDoc(doc) || {};\n}\n\nexport function pandocFormatConfigFromCode(code: string, isRmd: boolean): PandocFormatConfig {\n  return pandocFormatConfigFromYamlInCode(code, isRmd) || pandocFormatConfigFromCommentInCode(code) || {};\n}\n\nfunction pandocFormatConfigFromYamlInCode(code: string, isRmd: boolean): PandocFormatConfig | null {\n  // get the first yaml block in the file\n  const yaml = firstYamlBlock(code);\n\n  // did we find yaml?\n  if (yaml) {\n    // see if we have any md_extensions defined\n    const mdExtensions = isRmd ? findValue('md_extensions', yaml?.output) : undefined;\n\n    // see if we have any markdown options defined\n    let yamlFormatConfig: PandocFormatConfig | undefined;\n    const yamlMarkdownOptions = yaml?.editor_options?.markdown;\n    if (yamlMarkdownOptions instanceof Object) {\n      yamlFormatConfig = readPandocFormatConfig(yamlMarkdownOptions);\n    }\n\n    // combine and return\n    if (mdExtensions || yamlFormatConfig) {\n      const formatConfig: PandocFormatConfig = yamlFormatConfig ? yamlFormatConfig : {};\n      if (mdExtensions) {\n        formatConfig.extensions = mdExtensions + (formatConfig.extensions || '');\n      }\n      return formatConfig;\n    } else {\n      return null;\n    }\n  } else {\n    return null;\n  }\n}\n\nfunction pandocFormatConfigFromYamlInDoc(doc: ProsemirrorNode, isRmd: boolean): PandocFormatConfig | null {\n  const yamlNodes = yamlMetadataNodes(doc);\n  if (yamlNodes.length > 0) {\n    return pandocFormatConfigFromYamlInCode(yamlNodes[0].node.textContent, isRmd);\n  } else {\n    return null;\n  }\n}\n\nfunction pandocFormatConfigFromCommentInCode(code: string): PandocFormatConfig | null {\n  const keyValueRegEx = /^([^:]+):\\s*(.*)$/;\n  const match = matchPandocFormatComment(code);\n  if (match) {\n    const comment = match[1];\n    // split into semicolons\n    const fields = comment.split(/\\s*;\\s/).map(field => field.trim());\n    const variables: { [key: string]: string } = {};\n    fields.forEach(field => {\n      const keyValueMatch = field.match(keyValueRegEx);\n      if (keyValueMatch) {\n        variables[keyValueMatch[1].trim()] = keyValueMatch[2].trim();\n      }\n    });\n    return readPandocFormatConfig(variables);\n  } else {\n    return null;\n  }\n}\n\nfunction pandocFormatConfigFromCommentInDoc(doc: ProsemirrorNode): PandocFormatConfig | null {\n  let config: PandocFormatConfig | null = null;\n  let foundFirstRawInline = false;\n  doc.descendants((node, pos) => {\n    // don't search once we've found our target\n    if (foundFirstRawInline) {\n      return false;\n    }\n\n    // if it's a text node with a raw-html then scan it for the format comment\n    const schema = doc.type.schema;\n    if (\n      node.isText &&\n      schema.marks.raw_html_comment &&\n      schema.marks.raw_html_comment.isInSet(node.marks) &&\n      node.attrs.format\n    ) {\n      foundFirstRawInline = true;\n      config = pandocFormatConfigFromCommentInCode(node.textContent);\n      return false;\n    } else {\n      return true;\n    }\n  });\n  return config;\n}\n\nfunction readPandocFormatConfig(source: { [key: string]: any }) {\n  const asString = (obj: any): string => {\n    if (typeof obj === 'string') {\n      return obj;\n    } else if (obj) {\n      return obj.toString();\n    } else {\n      return '';\n    }\n  };\n\n  const asBoolean = (obj: any) => {\n    if (typeof obj === 'boolean') {\n      return obj;\n    } else {\n      const str = asString(obj).toLowerCase();\n      return str === 'true' || str === '1';\n    }\n  };\n\n  const readWrap = () => {\n    const wrap = source.wrap || source.wrap_column || source['fill-column'];\n    if (wrap) {\n      return asString(wrap);\n    } else {\n      return undefined;\n    }\n  };\n\n  const formatConfig: PandocFormatConfig = {};\n  if (source.mode) {\n    formatConfig.mode = asString(source.mode);\n  }\n  if (source.extensions) {\n    formatConfig.extensions = asString(source.extensions);\n  }\n  if (source.rmd_extensions) {\n    formatConfig.rmdExtensions = asString(source.rmd_extensions);\n  }\n  formatConfig.wrap = readWrap();\n  if (source.doctype) {\n    formatConfig.doctypes = asString(source.doctype)\n      .split(',')\n      .map(str => str.trim());\n  }\n  if (source.references) {\n    if (typeof source.references === 'string') {\n      formatConfig.references_location = source.references;\n    } else {\n      formatConfig.references_location = source.references.location;\n      formatConfig.references_prefix = source.references.prefix;\n    }\n  }\n  if (source.canonical) {\n    formatConfig.canonical = asBoolean(source.canonical);\n  }\n  return formatConfig;\n}\n\nexport async function resolvePandocFormat(pandoc: PandocServer, format: EditorFormat): Promise<PandocFormat> {\n  // additional markdown variants we support\n  const kMarkdownVariants: { [key: string]: string[] } = {\n    [kCommonmarkFormat]: commonmarkExtensions(),\n    [kCommonmarkXFormat]: commonmarkXExtensions(),\n    [kGfmFormat]: gfmExtensions(),\n    goldmark: goldmarkExtensions(format),\n    blackfriday: blackfridayExtensions(format),\n  };\n\n  // setup warnings\n  const warnings: PandocFormatWarnings = { invalidFormat: '', invalidOptions: [] };\n\n  // alias options and basename\n  let options = format.pandocExtensions;\n  let baseName = format.pandocMode;\n\n  // validate the base format (fall back to markdown if it's not known)\n  if (\n    ![\n      kMarkdownFormat,\n      kMarkdownPhpextraFormat,\n      kMarkdownGithubFormat,\n      kMarkdownMmdFormat,\n      kMarkdownStrictFormat,\n      kGfmFormat,\n      kCommonmarkFormat,\n      kCommonmarkXFormat\n    ]\n      .concat(Object.keys(kMarkdownVariants))\n      .includes(baseName)\n  ) {\n    warnings.invalidFormat = baseName;\n    baseName = 'markdown';\n  }\n\n  // format options we will be building\n  let formatOptions: string;\n\n  // if we are using a variant then get it's base options and merge with user options\n  if (kMarkdownVariants[baseName]) {\n    const variant = kMarkdownVariants[baseName];\n    options = variant.map(option => `${option}`).join('') + options;\n    baseName = 'markdown_strict';\n  }\n\n  // query for format options\n  formatOptions = await pandoc.listExtensions(baseName);\n\n  // active pandoc extensions\n  const pandocExtensions: { [key: string]: boolean } = {};\n\n  // first parse extensions for format\n  parseExtensions(formatOptions).forEach(option => {\n    pandocExtensions[option.name] = option.enabled;\n  });\n\n  // now parse extensions for user options (validate and build format name)\n  const validOptionNames = parseExtensions(formatOptions).map(option => option.name);\n\n  let fullName = baseName;\n  parseExtensions(options).forEach(option => {\n    // validate that the option is valid\n    if (validOptionNames.includes(option.name)) {\n      // add option\n      fullName += (option.enabled ? '+' : '-') + option.name;\n      pandocExtensions[option.name] = option.enabled;\n    } else {\n      warnings.invalidOptions.push(option.name);\n    }\n  });\n\n  // return format name, enabled extensiosn, and warnings\n  return {\n    mode: format.pandocMode,\n    baseName,\n    fullName,\n    extensions: (pandocExtensions as unknown) as PandocExtensions,\n    warnings,\n  };\n}\n\nfunction parseExtensions(options: string) {\n  // remove any linebreaks\n  options = options.split('\\n').join();\n\n  // parse into separate entries\n  const extensions: Array<{ name: string; enabled: boolean }> = [];\n  const re = /([+-])([a-z_]+)/g;\n  let match = re.exec(options);\n  while (match) {\n    extensions.push({ name: match[2], enabled: match[1] === '+' });\n    match = re.exec(options);\n  }\n\n  return extensions;\n}\n\nexport function pandocFormatWith(format: string, prepend: string, append: string) {\n  const split = splitPandocFormatString(format);\n  return `${split.format}${prepend}${split.options}${append}`;\n}\n\nexport function splitPandocFormatString(format: string) {\n  // split out base format from options\n  let optionsPos = format.indexOf('-');\n  if (optionsPos === -1) {\n    optionsPos = format.indexOf('+');\n  }\n  const base = optionsPos === -1 ? format : format.substr(0, optionsPos);\n  const options = optionsPos === -1 ? '' : format.substr(optionsPos);\n  return {\n    format: base,\n    options,\n  };\n}\n\nexport function hasFencedCodeBlocks(pandocExtensions: PandocExtensions) {\n  return pandocExtensions.backtick_code_blocks || pandocExtensions.fenced_code_blocks;\n}\n\n// e.g. [My Heading] to link to ## My Heading\nexport function hasShortcutHeadingLinks(pandocExtensions: PandocExtensions) {\n  return pandocExtensions.implicit_header_references && pandocExtensions.shortcut_reference_links;\n}\n\nfunction commonmarkExtensions(rawHTML = true) {\n  const extensions = [\n    rawHTML ? '+raw_html' : '-raw_html',\n    '+all_symbols_escapable',\n    '+backtick_code_blocks',\n    '+fenced_code_blocks',\n    '+space_in_atx_header',\n    '+intraword_underscores',\n    '+lists_without_preceding_blankline',\n    '+shortcut_reference_links',\n  ];\n  return extensions;\n}\n\n// https://github.com/jgm/pandoc/commit/0aed9dd589189a9bbe5cae99e0e024e2d4a92c36\nfunction commonmarkXExtensions() {\n  const extensions = [\n    '+pipe_tables',\n    '+raw_html',\n    '+auto_identifiers',\n    '+strikeout',\n    '+task_lists',\n    '+emoji',\n    '+raw_tex',\n    '+smart',\n    '+tex_math_dollars',\n    '+superscript',\n    '+subscript',\n    '+definition_lists',\n    '+footnotes',\n    '+fancy_lists',\n    '+fenced_divs',\n    '+bracketed_spans',\n    '+raw_attribute',\n    '+implicit_header_references',\n    // '+attributes' (not yet)\n  ];\n  return extensions;\n}\n\nfunction gfmExtensions() {\n  const extensions = [\n    ...commonmarkExtensions(),\n    '+auto_identifiers',\n    '+autolink_bare_uris',\n    '+emoji',\n    '+gfm_auto_identifiers',\n    '+pipe_tables',\n    '+strikeout',\n    '+task_lists',\n  ];\n  return extensions;\n}\n\n// https://gohugo.io/getting-started/configuration-markup/#goldmark\n// https://github.com/yuin/goldmark/#html-renderer-options\nfunction goldmarkExtensions(format: EditorFormat) {\n  const extensions = [\n    // start with commonmark\n    ...commonmarkExtensions(false),\n\n    // adds most of gfm\n    '+pipe_tables',\n    '+strikeout',\n    '+autolink_bare_uris',\n    '+task_lists',\n    '+backtick_code_blocks',\n\n    // plus some extras\n    '+definition_lists',\n    '+footnotes',\n    '+smart',\n\n    // hugo preprocessor supports yaml metadata\n    '+yaml_metadata_block',\n  ];\n\n  if (includeTexMathDollars(format)) {\n    extensions.push('+tex_math_dollars');\n  }\n\n  return extensions;\n}\n\n// https://github.com/russross/blackfriday/tree/v2#extensions\nfunction blackfridayExtensions(format: EditorFormat) {\n  const extensions = [\n    '+intraword_underscores',\n    '+pipe_tables',\n    '+backtick_code_blocks',\n    '+definition_lists',\n    '+footnotes',\n    '+autolink_bare_uris',\n    '+strikeout',\n    '+smart',\n    '+yaml_metadata_block',\n  ];\n\n  if (includeTexMathDollars(format)) {\n    extensions.push('+tex_math_dollars');\n  }\n\n  return extensions;\n}\n\nfunction includeTexMathDollars(format: EditorFormat) {\n  // hugo users often sort out some way to include math so we enable it for hugo\n  return format.docTypes.includes(kHugoDocType) || format.rmdExtensions.blogdownMathInCode;\n}\n","/*\n * yaml.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { EditorView } from 'prosemirror-view';\n\nimport yaml from 'js-yaml';\n\nimport { findTopLevelBodyNodes } from './node';\nimport { logException } from './log';\n\nexport const kYamlMetadataTitleRegex = /\\ntitle:(.*)\\n/;\n\n// return yaml front matter (w/o enclosing --)\nexport function yamlFrontMatter(doc: ProsemirrorNode) {\n  const firstYaml = firstYamlNode(doc);\n  if (firstYaml) {\n    return stripYamlDelimeters(firstYaml.node.textContent);\n  } else {\n    return '';\n  }\n}\n\n// set yaml front matter (w/o enclosing ---)\nexport function applyYamlFrontMatter(view: EditorView, yamlText: string) {\n  const schema = view.state.schema;\n  const updatedYaml = `---\\n${yamlText}---`;\n  const updatedYamlNode = schema.nodes.yaml_metadata.createAndFill({}, schema.text(updatedYaml));\n  const tr = view.state.tr;\n  const firstYaml = firstYamlNode(view.state.doc);\n  if (firstYaml) {\n    tr.replaceRangeWith(firstYaml.pos, firstYaml.pos + firstYaml.node.nodeSize, updatedYamlNode);\n  } else {\n    tr.insert(1, updatedYamlNode);\n  }\n  view.dispatch(tr);\n}\n\nexport function yamlMetadataNodes(doc: ProsemirrorNode) {\n  return findTopLevelBodyNodes(doc, isYamlMetadataNode);\n}\n\nexport function isYamlMetadataNode(node: ProsemirrorNode) {\n  return node.type === node.type.schema.nodes.yaml_metadata;\n}\n\nexport function titleFromYamlMetadataNode(node: ProsemirrorNode) {\n  const titleMatch = node.textContent.match(kYamlMetadataTitleRegex);\n  if (titleMatch) {\n    let title = titleMatch[1].trim();\n    title = title.replace(/^[\"']|[\"']$/g, '');\n    title = title.replace(/\\\\\"/g, '\"');\n    title = title.replace(/''/g, \"'\");\n    return title;\n  } else {\n    return null;\n  }\n}\n\nexport function valueFromYamlText(name: string, yamlText: string) {\n  // Must start and end with either a new line or the start/end of line\n  const yamlMetadataNameValueRegex = new RegExp(`(?:\\\\n|^)${name}:(.*)(?:\\\\n|$)`);\n\n  // Find the name and value\n  const valueMatch = yamlText.match(yamlMetadataNameValueRegex);\n  if (valueMatch) {\n    // Read the matched value\n    const valueStr = valueMatch[1].trim();\n\n    // Parse the value (could be string, array, etc...)\n    const value = parseYaml(valueStr);\n    return value;\n  } else {\n    return null;\n  }\n}\n\nconst kFirstYamlBlockRegex = /\\s*---[ \\t]*\\n(?![ \\t]*\\n)([\\W\\w]*?)\\n[\\t >]*(?:---|\\.\\.\\.)[ \\t]*/m;\n\nexport function firstYamlBlock(code: string): { [key: string]: any } | null {\n  const match = code.match(kFirstYamlBlockRegex);\n  if (match && match.index === 0) {\n    const yamlCode = match[1];\n    const yamlParsed = parseYaml(yamlCode);\n    if (typeof yamlParsed === 'object') {\n      return yamlParsed;\n    } else {\n      return null;\n    }\n  } else {\n    return null;\n  }\n}\n\nexport function parseYaml(yamlCode: string) {\n  try {\n    const yamlParsed = yaml.safeLoad(yamlCode, {\n      onWarning: logException,\n    });\n    return yamlParsed;\n  } catch (e) {\n    logException(e);\n    return null;\n  }\n}\n\nexport function toYamlCode(obj: any): string | null {\n  try {\n    const yamlCode = yaml.safeDump(obj);\n    return yamlCode;\n  } catch (e) {\n    logException(e);\n    return null;\n  }\n}\n\nexport function stripYamlDelimeters(yamlCode: string) {\n  return yamlCode.replace(/^[ \\t-]+\\n/, '').replace(/\\n[ \\t-\\.]+$/, '');\n}\n\nexport interface ParsedYaml {\n  yamlCode: string;\n  yaml: any;\n  node: NodeWithPos;\n}\n\nexport function parseYamlNodes(doc: ProsemirrorNode): ParsedYaml[] {\n  const yamlNodes = yamlMetadataNodes(doc);\n\n  const parsedYamlNodes = yamlNodes.map<ParsedYaml>(node => {\n    const yamlText = node.node.textContent;\n    const yamlCode = stripYamlDelimeters(yamlText);\n    return { yamlCode, yaml: parseYaml(yamlCode), node };\n  });\n  return parsedYamlNodes;\n}\n\nfunction firstYamlNode(doc: ProsemirrorNode) {\n  const yamlNodes = yamlMetadataNodes(doc);\n  if (yamlNodes && yamlNodes.length > 0) {\n    return yamlNodes[0];\n  } else {\n    return '';\n  }\n}\n","/*\n * format.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface EditorFormat {\n  readonly pandocMode: string;\n  readonly pandocExtensions: string;\n  readonly rmdExtensions: EditorRmdExtensions;\n  readonly hugoExtensions: EditorHugoExtensions;\n  readonly docTypes: EditorExtendedDocType[];\n}\n\nexport interface EditorRmdExtensions {\n  readonly codeChunks?: boolean;\n  readonly bookdownXRef?: boolean;\n  readonly bookdownXRefUI?: boolean;\n  readonly bookdownPart?: boolean;\n  readonly blogdownMathInCode?: boolean;\n}\n\nexport interface EditorHugoExtensions {\n  readonly shortcodes?: boolean;\n}\n\nexport const kBookdownDocType = 'bookdown';\nexport const kHugoDocType = 'hugo';\n\nexport type EditorExtendedDocType = 'bookdown' | 'hugo';\n","/*\n * object.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function findValue(key: string, object?: { [key: string]: any }) {\n  if (!object) {\n    return undefined;\n  }\n\n  let value;\n\n  Object.keys(object).some(k => {\n    if (k === key) {\n      value = object[k];\n      return true;\n    }\n    if (object[k] && typeof object[k] === 'object') {\n      value = findValue(key, object[k]);\n      return value !== undefined;\n    }\n    return false;\n  });\n\n  return value;\n}\n","/*\n * log.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function logException(e: Error) {\n  // TODO: log exceptions (we don't want to use console.log in production code, so this would\n  // utilize some sort of external logging facility)\n  // console.log(e);\n}\n","/*\n * basekeys.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport {\n  splitBlock,\n  liftEmptyBlock,\n  createParagraphNear,\n  selectNodeBackward,\n  joinBackward,\n  deleteSelection,\n  selectNodeForward,\n  joinForward,\n  chainCommands,\n} from 'prosemirror-commands';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { keymap } from 'prosemirror-keymap';\nimport { EditorState, Transaction, Plugin, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { CommandFn } from './command';\nimport { editingRootNodeClosestToPos, editingRootNode } from './node';\nimport { selectionIsBodyTopLevel } from './selection';\nimport { kPlatformMac } from './platform';\n\nexport enum BaseKey {\n  Home = 'Home',\n  End = 'End',\n  Enter = 'Enter',\n  ModEnter = 'Mod-Enter',\n  ShiftEnter = 'Shift-Enter',\n  Backspace = 'Backspace',\n  Delete = 'Delete|Mod-Delete', // Use pipes to register multiple commands\n  Tab = 'Tab',\n  ShiftTab = 'Shift-Tab',\n  ArrowUp = 'Up|ArrowUp',\n  ArrowDown = 'Down|ArrowDown',\n  ArrowLeft = 'Left|ArrowLeft',\n  ArrowRight = 'Right|ArrowRight',\n  ModArrowUp = 'Mod-Up|Mod-ArrowUp',\n  ModArrowDown = 'Mod-Down|Mod-ArrowDown',\n  CtrlHome = 'Ctrl-Home',\n  CtrlEnd = 'Ctrl-End',\n  ShiftArrowLeft = 'Shift-Left|Shift-ArrowLeft',\n  ShiftArrowRight = 'Shift-Right|Shift-ArrowRight',\n  AltArrowLeft = 'Alt-Left|Alt-ArrowLeft',\n  AltArrowRight = 'Alt-Right|Alt-ArrowRight',\n  CtrlArrowLeft = 'Ctrl-Left|Ctrl-ArrowLeft',\n  CtrlArrowRight = 'Ctrl-Right|Ctrl-ArrowRight',\n  CtrlShiftArrowLeft = 'Ctrl-Shift-Left|Ctrl-Shift-ArrowLeft',\n  CtrlShiftArrowRight = 'Ctrl-Shift-Right|Ctrl-Shift-ArrowRight',\n}\n\nexport interface BaseKeyBinding {\n  key: BaseKey;\n  command: CommandFn;\n}\n\nexport function baseKeysPlugin(keys: readonly BaseKeyBinding[]): Plugin {\n  // collect all keys\n  const pluginKeys = [\n    // base enter key behaviors\n    { key: BaseKey.Enter, command: splitBlock },\n    { key: BaseKey.Enter, command: liftEmptyBlock },\n    { key: BaseKey.Enter, command: createParagraphNear },\n\n    // base backspace key behaviors\n    { key: BaseKey.Backspace, command: selectNodeBackward },\n    { key: BaseKey.Backspace, command: joinBackward },\n    { key: BaseKey.Backspace, command: deleteSelection },\n\n    // base tab key behavior (ignore)\n    { key: BaseKey.Tab, command: ignoreKey },\n    { key: BaseKey.ShiftTab, command: ignoreKey },\n\n    // base delete key behaviors\n    { key: BaseKey.Delete, command: selectNodeForward },\n    { key: BaseKey.Delete, command: joinForward },\n    { key: BaseKey.Delete, command: deleteSelection },\n\n    // base home/end key behaviors (Mac desktop default behavior advances to beginning/end of\n    // document, so we provide our own implementation rather than relying on contentEditable)\n    kPlatformMac ? { key: BaseKey.Home, command: homeKey } : null,\n    kPlatformMac ? { key: BaseKey.End, command: endKey } : null,\n\n    // base arrow key behavior (prevent traversing top-level body notes)\n    { key: BaseKey.ArrowLeft, command: arrowBodyNodeBoundary('left') },\n    { key: BaseKey.ArrowUp, command: arrowBodyNodeBoundary('up') },\n    { key: BaseKey.ArrowRight, command: arrowBodyNodeBoundary('right') },\n    { key: BaseKey.ArrowDown, command: arrowBodyNodeBoundary('down') },\n    { key: BaseKey.ModArrowDown, command: endTopLevelBodyNodeBoundary() },\n    { key: BaseKey.CtrlEnd, command: endTopLevelBodyNodeBoundary() },\n\n    // merge keys provided by extensions\n    ...keys,\n\n    // undoInputRule is always the highest priority backspace key\n    { key: BaseKey.Backspace, command: undoInputRule },\n  ].filter(x => !!x);\n\n  // build arrays for each BaseKey type\n  const commandMap: { [key: string]: CommandFn[] } = {};\n  for (const baseKey of Object.values(BaseKey)) {\n    commandMap[baseKey] = [];\n  }\n  pluginKeys.forEach(key => {\n    if (key) {\n      commandMap[key.key].unshift(key.command);\n    }\n  });\n\n  const bindings: { [key: string]: CommandFn } = {};\n  for (const baseKey of Object.values(BaseKey)) {\n    const commands = commandMap[baseKey];\n    // baseKey may contain multiple keys, separated by |\n    for (const subkey of baseKey.split(/\\|/)) {\n      bindings[subkey] = chainCommands(...commands);\n    }\n  }\n\n  // return keymap\n  return keymap(bindings);\n}\n\nexport function verticalArrowCanAdvanceWithinTextBlock(selection: Selection, dir: 'up' | 'down') {\n  const $head = selection.$head;\n  const node = $head.node();\n  if (node.isTextblock) {\n    const cursorOffset = $head.parentOffset;\n    const nodeText = node.textContent;\n    if (dir === 'down' && nodeText.substr(cursorOffset).includes('\\n')) {\n      return true;\n    }\n    if (dir === 'up' && nodeText.substr(0, cursorOffset).includes('\\n')) {\n      return true;\n    }\n  }\n  return false;\n}\n\ninterface Coords {\n  left: number;\n  right: number;\n  top: number;\n  bottom: number;\n}\n\nfunction ignoreKey(state: EditorState, dispatch?: (tr: Transaction) => void) {\n  return true;\n}\n\nfunction homeKey(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n  const selection = state.selection;\n  const editingNode = editingRootNode(selection);\n  if (editingNode && dispatch && view) {\n    const head = view.coordsAtPos(selection.head);\n    const beginDocPos = editingNode.start;\n    for (let pos = selection.from - 1; pos >= beginDocPos; pos--) {\n      const coords = view.coordsAtPos(pos);\n      if (isOnPreviousLine(head, coords) || pos === beginDocPos) {\n        const tr = state.tr;\n        setTextSelection(pos + 1)(tr);\n        dispatch(tr);\n        break;\n      }\n    }\n  }\n  return true;\n}\n\nfunction endKey(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n  const selection = state.selection;\n  const editingNode = editingRootNode(selection);\n  if (editingNode && dispatch && view) {\n    const head = view.coordsAtPos(selection.head);\n    const endDocPos = editingNode.start + editingNode.node.nodeSize;\n    for (let pos = selection.from + 1; pos < endDocPos; pos++) {\n      const coords = view.coordsAtPos(pos);\n      if (isOnNextLine(head, coords) || pos === endDocPos) {\n        const tr = state.tr;\n        setTextSelection(pos - 1)(tr);\n        dispatch(tr);\n        break;\n      }\n    }\n  }\n  return true;\n}\n\n// helpers to check for a y coordinate on a diffent line that the selection\n\n// y coorinates are sometimes off by 1 or 2 due to margin/padding (e.g. for\n// inline code spans or spelling marks) so the comparision only succeeds if\n// the vertical extents of the two coords don't overlap. If this proves to\n// still have false positives, we could lookahead to the next a few dozen\n// positions to check if we ever \"return to\" the head's baseline--only a\n// permanent change would indicate that the line has truly changed.\n\nfunction isOnNextLine(head: Coords, pos: Coords) {\n  return head.bottom < pos.top;\n}\n\nfunction isOnPreviousLine(head: Coords, pos: Coords) {\n  return head.top > pos.bottom;\n}\n\nfunction arrowBodyNodeBoundary(dir: 'up' | 'down' | 'left' | 'right') {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    if (view && view.endOfTextblock(dir) && selectionIsBodyTopLevel(state.selection)) {\n      const side = dir === 'left' || dir === 'up' ? -1 : 1;\n      const $head = state.selection.$head;\n      const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n      const currentRootNode = editingRootNodeClosestToPos($head);\n      const nextRootNode = editingRootNodeClosestToPos(nextPos.$head);\n      return currentRootNode?.node?.type !== nextRootNode?.node?.type;\n    } else {\n      return false;\n    }\n  };\n}\n\nfunction endTopLevelBodyNodeBoundary() {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const editingNode = editingRootNode(state.selection);\n    if (editingNode && selectionIsBodyTopLevel(state.selection)) {\n      if (dispatch) {\n        const tr = state.tr;\n        setTextSelection(editingNode.pos + editingNode.node.nodeSize - 2)(tr).scrollIntoView();\n        dispatch(tr);\n      }\n      return true;\n    } else {\n      return false;\n    }\n  };\n}\n","/*\n * selection.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, NodeSelection } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport { NodeWithPos, setTextSelection } from 'prosemirror-utils';\n\nimport { kAddToHistoryTransaction, kRestoreLocationTransaction } from './transaction';\n\nexport function selectionIsWithin(selection: Selection, nodeWithPos: NodeWithPos) {\n  const from = nodeWithPos.pos + 1;\n  const to = from + nodeWithPos.node.nodeSize;\n  return selectionIsWithinRange(selection, { from, to });\n}\n\nexport function selectionHasRange(selection: Selection, range: { from: number; to: number }) {\n  return selection.from === range.from && selection.to === range.to;\n}\n\nexport function selectionIsWithinRange(selection: Selection, range: { from: number; to: number }) {\n  return selection.anchor >= range.from && selection.anchor <= range.to;\n}\n\nexport function selectionIsBodyTopLevel(selection: Selection) {\n  const { $head } = selection;\n  const parentNode = $head.node($head.depth - 1);\n  return parentNode && \n         (parentNode.type === parentNode.type.schema.nodes.body ||\n          (selection instanceof GapCursor && parentNode.type === parentNode.type.schema.nodes.doc));\n}\n\nexport function selectionIsImageNode(schema: Schema, selection: Selection) {\n  return selection instanceof NodeSelection && [schema.nodes.image, schema.nodes.figure].includes(selection.node.type);\n}\n\nexport function selectionIsEmptyParagraph(schema: Schema, selection: Selection) {\n  const { $head } = selection;\n  return $head.parent.type === schema.nodes.paragraph && $head.parent.childCount === 0;\n}\n\nexport function restoreSelection(view: EditorView, pos: number) {\n  const tr = view.state.tr;\n  if (pos < view.state.doc.nodeSize) {\n    setTextSelection(pos)(tr);\n    tr.setMeta(kAddToHistoryTransaction, false);\n    tr.setMeta(kRestoreLocationTransaction, true);\n    view.dispatch(tr);\n  }\n}\n","/*\n * transaction.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction, EditorState, Plugin, PluginKey, Selection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Mark, MarkType, Slice } from 'prosemirror-model';\nimport { ChangeSet } from 'prosemirror-changeset';\nimport { ReplaceStep, Step, Transform } from 'prosemirror-transform';\n\nimport { sliceContentLength } from './slice';\n\nexport const kPasteTransaction = 'paste';\nexport const kSetMarkdownTransaction = 'setMarkdown';\nexport const kAddToHistoryTransaction = 'addToHistory';\nexport const kFixupTransaction = 'docFixup';\nexport const kRestoreLocationTransaction = 'restoreLocation';\nexport const kNavigationTransaction = 'navigationTransaction';\nexport const kInsertSymbolTransaction = 'insertSymbol';\nexport const kInsertCompletionTransaction = 'insertCompletion';\n\nexport type TransactionsFilter = (transactions: Transaction[], oldState: EditorState, newState: EditorState) => boolean;\n\nexport type TransactionNodeFilter = (\n  node: ProsemirrorNode<any>,\n  pos: number,\n  parent: ProsemirrorNode<any>,\n  index: number,\n) => boolean;\n\nexport interface AppendTransactionHandler {\n  name: string;\n  filter?: TransactionsFilter;\n  nodeFilter?: TransactionNodeFilter;\n  append: (tr: Transaction, transactions: Transaction[], oldState: EditorState, newState: EditorState) => void;\n}\n\n// wrapper for transaction that is guaranteed not to modify the position of any\n// nodes in the document (useful for grouping many disparate handlers that arne't\n// aware of each other's actions onto the same trasaction)\nexport class MarkTransaction {\n  private tr: Transaction;\n\n  constructor(tr: Transaction) {\n    this.tr = tr;\n  }\n  get doc(): ProsemirrorNode {\n    return this.tr.doc;\n  }\n  get selection(): Selection {\n    return this.tr.selection;\n  }\n  public addMark(from: number, to: number, mark: Mark): this {\n    this.tr.addMark(from, to, mark);\n    return this;\n  }\n  public removeMark(from: number, to: number, mark?: Mark | MarkType): this {\n    this.tr.removeMark(from, to, mark);\n    return this;\n  }\n  public removeStoredMark(mark: Mark | MarkType): this {\n    this.tr.removeStoredMark(mark);\n    return this;\n  }\n  public insertText(text: string, from: number): this {\n    this.tr.insertText(text, from, from + text.length);\n    return this;\n  }\n}\n\nexport interface AppendMarkTransactionHandler {\n  name: string;\n  filter: (node: ProsemirrorNode, transactions: Transaction[]) => boolean;\n  append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number, state: EditorState) => void;\n}\n\nexport function appendMarkTransactionsPlugin(handlers: readonly AppendMarkTransactionHandler[]): Plugin {\n  return new Plugin({\n    key: new PluginKey('appendMarkTransactions'),\n\n    appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n      // skip for selection-only changes\n      if (!transactionsDocChanged(transactions)) {\n        return;\n      }\n\n      // create transaction\n      const tr = newState.tr;\n\n      // create markTransaction wrapper\n      const markTr = new MarkTransaction(tr);\n\n      forChangedNodes(\n        oldState,\n        newState,\n        node => true,\n        (node: ProsemirrorNode, pos: number) => {\n          for (const handler of handlers) {\n            // get a fresh view of the node\n            node = tr.doc.nodeAt(pos)!;\n\n            // call the handler\n            if (handler.filter(node, transactions)) {\n              handler.append(markTr, node, pos, newState);\n            }\n          }\n        },\n      );\n\n      // return transaction\n      if (tr.docChanged || tr.selectionSet || tr.storedMarksSet) {\n        return tr;\n      }\n    },\n  });\n}\n\nexport function appendTransactionsPlugin(handlers: readonly AppendTransactionHandler[]): Plugin {\n  return new Plugin({\n    key: new PluginKey('appendTransactions'),\n\n    appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n      // skip for selection-only changes\n      if (!transactionsDocChanged(transactions)) {\n        return;\n      }\n\n      // create transaction\n      const tr = newState.tr;\n\n      // compute the changeSet\n      if (transactionsAreTypingChange(transactions)) {\n        const changeSet = transactionsChangeSet(transactions, oldState, newState);\n\n        // call each handler\n        for (const handler of handlers) {\n          // track whether there is a change\n          let haveChange = false;\n\n          // call filters if we have them\n          if (handler.filter || handler.nodeFilter) {\n            // first the low-level transaction filter\n            if (handler.filter) {\n              haveChange = handler.filter(transactions, oldState, newState);\n            }\n\n            // if that doesn't detect a change then try the nodeFilter if we have one\n            if (!haveChange && handler.nodeFilter) {\n              const checkForChange = (\n                node: ProsemirrorNode<any>,\n                pos: number,\n                parent: ProsemirrorNode<any>,\n                index: number,\n              ) => {\n                if (handler.nodeFilter!(node, pos, parent, index)) {\n                  haveChange = true;\n                  return false;\n                }\n              };\n\n              for (const change of changeSet.changes) {\n                oldState.doc.nodesBetween(change.fromA, change.toA, checkForChange);\n                newState.doc.nodesBetween(change.fromB, change.toB, checkForChange);\n              }\n            }\n\n            // no filters means we should always run (force haveChange to true)\n          } else {\n            haveChange = true;\n          }\n\n          // run the handler if applicable\n          if (haveChange) {\n            handler.append(tr, transactions, oldState, newState);\n          }\n        }\n\n        // run them all if this is a larger change\n      } else {\n        handlers.forEach(handler => handler.append(tr, transactions, oldState, newState));\n      }\n\n      // return transaction\n      if (tr.docChanged || tr.selectionSet || tr.storedMarksSet) {\n        return tr;\n      }\n    },\n  });\n}\n\nexport function transactionsDocChanged(transactions: Transaction[]) {\n  return transactions.some(transaction => transaction.docChanged);\n}\n\nexport function transactionsChangeSet(transactions: Transaction[], oldState: EditorState, newState: EditorState) {\n  let changeSet = ChangeSet.create(oldState.doc);\n  for (const transaction of transactions) {\n    changeSet = changeSet.addSteps(newState.doc, transaction.mapping.maps);\n  }\n  return changeSet;\n}\n\nexport function trTransform(tr: Transaction, f: (transform: Transform) => void): Transaction {\n  // create a new transform so we can do position mapping relative\n  // to the actions taken here (b/c the transaction might already\n  // have other steps so we can't do tr.mapping.map)\n  const newActions = new Transform(tr.doc);\n\n  // call the function (passing it a mapping function that uses our newActions)\n  f(newActions);\n\n  // copy the contents of newActions to the actual transaction\n  for (const step of newActions.steps) {\n    tr.step(step);\n  }\n\n  // return the transaction for chaining\n  return tr;\n}\n\nexport function transactionsHaveChange(\n  transactions: Transaction[],\n  oldState: EditorState,\n  newState: EditorState,\n  predicate: (node: ProsemirrorNode<any>, pos: number, parent: ProsemirrorNode<any>, index: number) => boolean,\n) {\n  // screen out transactions with no doc changes\n  if (!transactionsDocChanged(transactions)) {\n    return false;\n  }\n\n  // function to check for whether we have a change and set a flag if we do\n  let haveChange = false;\n  const checkForChange = (node: ProsemirrorNode<any>, pos: number, parent: ProsemirrorNode<any>, index: number) => {\n    if (predicate(node, pos, parent, index)) {\n      haveChange = true;\n      return false;\n    }\n  };\n\n  // for each change in each transaction, check for a node that matches the predicate in either the old or new doc\n  const changeSet = transactionsChangeSet(transactions, oldState, newState);\n\n  for (const change of changeSet.changes) {\n    oldState.doc.nodesBetween(change.fromA, change.toA, checkForChange);\n    newState.doc.nodesBetween(change.fromB, change.toB, checkForChange);\n    if (haveChange) {\n      break;\n    }\n  }\n\n  return haveChange;\n}\n\nexport function forChangedNodes(\n  oldState: EditorState | null,\n  newState: EditorState,\n  predicate: (node: ProsemirrorNode) => boolean,\n  f: (node: ProsemirrorNode, pos: number) => boolean | void,\n) {\n  let complete = false;\n  const handler = (node: ProsemirrorNode, pos: number) => {\n    if (complete) {\n      return;\n    }\n\n    if (!predicate || predicate(node)) {\n      if (f(node, pos) === false) {\n        complete = true;\n      }\n    }\n  };\n\n  if (!oldState) {\n    newState.doc.descendants(handler);\n  } else if (oldState.doc !== newState.doc) {\n    changedDescendants(oldState.doc, newState.doc, 0, handler);\n  }\n}\n\n// Helper for iterating through the nodes in a document that changed\n// compared to the given previous document. Useful for avoiding\n// duplicate work on each transaction.\n// from: https://github.com/ProseMirror/prosemirror-tables/blob/master/src/fixtables.js\nfunction changedDescendants(\n  old: ProsemirrorNode,\n  cur: ProsemirrorNode,\n  offset: number,\n  f: (node: ProsemirrorNode, pos: number) => void,\n) {\n  const oldSize = old.childCount;\n  const curSize = cur.childCount;\n  outer: for (let i = 0, j = 0; i < curSize; i++) {\n    const child = cur.child(i);\n    for (let scan = j, e = Math.min(oldSize, i + 3); scan < e; scan++) {\n      if (old.child(scan) === child) {\n        j = scan + 1;\n        offset += child.nodeSize;\n        continue outer;\n      }\n    }\n    f(child, offset);\n    if (j < oldSize && old.child(j).sameMarkup(child)) {\n      changedDescendants(old.child(j), child, offset + 1, f);\n    } else {\n      child.nodesBetween(0, child.content.size, f, offset + 1);\n    }\n    offset += child.nodeSize;\n  }\n}\n\nexport function transactionsAreTypingChange(transactions: Transaction[]) {\n  if (\n    transactions.length === 1 &&\n    transactions[0].steps.length === 1 &&\n    transactions[0].steps[0] instanceof ReplaceStep\n  ) {\n    // step to examine\n    const step: any = transactions[0].steps[0];\n\n    // insert single chraracter or new empty slice (e.g. from enter after a paragraph)\n    if (step.from === step.to && sliceContentLength(step.slice) <= 1) {\n      return true;\n    }\n\n    // remove single character\n    if (Math.abs(step.from - step.to) === 1 && step.slice.content.size === 0) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nexport interface RangeStep extends Step {\n  from: number;\n  to: number;\n}\n\nexport interface SliceStep extends RangeStep {\n  slice: Slice;\n}\n","/*\n * slice.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Slice, Node as ProsemirrorNode } from 'prosemirror-model';\n\nexport function sliceContentLength(slice: Slice) {\n  let length = 0;\n  for (let i = 0; i < slice.content.childCount; i++) {\n    length += slice.content.child(i).textContent.length;\n  }\n  return length;\n}\n\nexport function sliceHasNode(slice: Slice, predicate: (node: ProsemirrorNode) => boolean) {\n  let hasNode = false;\n  slice.content.descendants(node => {\n    if (predicate(node)) {\n      hasNode = true;\n      return false;\n    }\n  });\n  return hasNode;\n}\n","/*\n * platform.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kPlatformMac = typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false;\n","/*\n * outline.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\n\nimport { NodeWithPos, findChildrenByType } from 'prosemirror-utils';\n\nimport { findTopLevelBodyNodes } from './node';\nimport { titleFromYamlMetadataNode } from './yaml';\nimport { rmdChunkEngineAndLabel } from './rmd';\n\nexport interface EditorOutlineItem {\n  navigation_id: string;\n  type: EditorOutlineItemType;\n  level: number;\n  sequence: number;\n  title: string;\n  children: EditorOutlineItem[];\n}\n\nexport const kHeadingOutlineItemType = 'heading';\nexport const kRmdchunkOutlineItemType = 'rmd_chunk';\nexport const kYamlMetadataOutlineItemType = 'yaml_metadata';\n\nexport type EditorOutlineItemType = 'heading' | 'rmd_chunk' | 'yaml_metadata';\n\nexport type EditorOutline = EditorOutlineItem[];\n\nexport interface EditingOutlineLocationItem {\n  type: EditorOutlineItemType;\n  level: number;\n  title: string;\n  active: boolean;\n  position: number;\n}\n\nexport interface EditingOutlineLocation {\n  items: EditingOutlineLocationItem[];\n}\n\nexport function getEditingOutlineLocation(state: EditorState): EditingOutlineLocation {\n  // traverse document outline to get base location info\n  const itemsWithPos = getDocumentOutline(state).map(nodeWithPos => {\n    const schema = state.schema;\n    const node = nodeWithPos.node;\n    const item: EditingOutlineLocationItem = {\n      type: kYamlMetadataOutlineItemType,\n      level: 0,\n      title: '',\n      active: false,\n      position: nodeWithPos.pos,\n    };\n    if (node.type === schema.nodes.yaml_metadata) {\n      item.type = kYamlMetadataOutlineItemType;\n      item.title = titleFromYamlMetadataNode(node) || '';\n    } else if (node.type === schema.nodes.rmd_chunk) {\n      item.type = kRmdchunkOutlineItemType;\n      const chunk = rmdChunkEngineAndLabel(node.textContent);\n      if (chunk) {\n        item.title = chunk.label;\n      }\n    } else if (node.type === schema.nodes.heading) {\n      item.type = kHeadingOutlineItemType;\n      item.level = node.attrs.level;\n      item.title = node.textContent;\n    }\n    return {\n      item,\n      pos: nodeWithPos.pos,\n    };\n  });\n\n  // return the location, set the active item by scanning backwards until\n  // we find an item with a position before the cursor\n  let foundActive = false;\n  const items: EditingOutlineLocationItem[] = [];\n  for (let i = itemsWithPos.length - 1; i >= 0; i--) {\n    const item = itemsWithPos[i].item;\n    if (!foundActive && itemsWithPos[i].pos < state.selection.from) {\n      item.active = true;\n      foundActive = true;\n    }\n    items.unshift(item);\n  }\n\n  // return the outline\n  return { items };\n}\n\n// get a document outline that matches the scheme provided in EditingOutlineLocation:\n//  - yaml metadata blocks\n//  - top-level headings\n//  - rmd chunks at the top level or within a top-level list\nexport function getDocumentOutline(state: EditorState): NodeWithPos[] {\n  // get top level body nodes\n  const schema = state.schema;\n  const bodyNodes = findTopLevelBodyNodes(state.doc, node => {\n    return [\n      schema.nodes.yaml_metadata,\n      schema.nodes.rmd_chunk,\n      schema.nodes.heading,\n      schema.nodes.bullet_list,\n      schema.nodes.ordered_list,\n    ].includes(node.type);\n  });\n\n  // reduce (explode lists into contained rmd chunks)\n  const outlineNodes: NodeWithPos[] = [];\n  bodyNodes.forEach(bodyNode => {\n    // explode lists\n    if ([schema.nodes.bullet_list, schema.nodes.ordered_list].includes(bodyNode.node.type)) {\n      // look for rmd chunks within list items (non-recursive, only want top level)\n      findChildrenByType(bodyNode.node, schema.nodes.list_item, false).forEach(listItemNode => {\n        findChildrenByType(listItemNode.node, schema.nodes.rmd_chunk, false).forEach(rmdChunkNode => {\n          outlineNodes.push({\n            node: rmdChunkNode.node,\n            pos: bodyNode.pos + 1 + listItemNode.pos + 1 + rmdChunkNode.pos,\n          });\n        });\n      });\n\n      // other nodes go straight through\n    } else {\n      outlineNodes.push(bodyNode);\n    }\n  });\n\n  // return outline nodes\n  return outlineNodes;\n}\n\nexport function getOutlineNodes(doc: ProsemirrorNode) {\n  return findTopLevelBodyNodes(doc, isOutlineNode);\n}\n\nexport function isOutlineNode(node: ProsemirrorNode) {\n  if (node.type.spec.attrs) {\n    return node.type.spec.attrs.hasOwnProperty('navigation_id');\n  } else {\n    return false;\n  }\n}\n","/*\n * rmd.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport {\n  findParentNodeOfType,\n  findChildrenByType,\n  findChildren,\n  findChildrenByMark,\n  setTextSelection,\n} from 'prosemirror-utils';\n\nimport { getMarkRange } from './mark';\nimport { precedingListItemInsertPos, precedingListItemInsert } from './list';\nimport { toggleBlockType } from './command';\nimport { selectionIsBodyTopLevel } from './selection';\nimport { uuidv4 } from './util';\n\nexport interface EditorRmdChunk {\n  lang: string;\n  meta: string;\n  code: string;\n}\n\nexport type ExecuteRmdChunkFn = (chunk: EditorRmdChunk) => void;\n\nexport function canInsertRmdChunk(state: EditorState) {\n  // must either be at the body top level, within a list item, within a div, or within a\n  // blockquote (and never within a table)\n  const schema = state.schema;\n  const within = (nodeType: NodeType) => !!findParentNodeOfType(nodeType)(state.selection);\n  if (within(schema.nodes.table)) {\n    return false;\n  }\n  if (\n    !selectionIsBodyTopLevel(state.selection) &&\n    !within(schema.nodes.list_item) &&\n    !within(schema.nodes.blockquote) &&\n    schema.nodes.div && !within(schema.nodes.div)\n  ) {\n    return false;\n  }\n\n  return true;\n}\n\nexport function insertRmdChunk(chunkPlaceholder: string, rowOffset = 0, colOffset = 0) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    const schema = state.schema;\n\n    if (\n      !(state.selection instanceof GapCursor) &&\n      !toggleBlockType(schema.nodes.rmd_chunk, schema.nodes.paragraph)(state) &&\n      !precedingListItemInsertPos(state.doc, state.selection)\n    ) {\n      return false;\n    }\n\n    // must either be at the body top level, within a list item, within a div, or within a\n    // blockquote (and never within a table)\n    if (!canInsertRmdChunk(state)) {\n      return false;\n    }\n\n    if (dispatch) {\n      // compute offset\n      const lines = chunkPlaceholder.split(/\\r?\\n/);\n      const lineChars = lines.slice(0, rowOffset).reduce((count, line) => count + line.length + 1, 1);\n      const offsetChars = lineChars + colOffset;\n\n      // perform insert\n      const tr = state.tr;\n      const rmdText = schema.text(chunkPlaceholder);\n      const rmdNode = schema.nodes.rmd_chunk.create({ navigation_id: uuidv4() }, rmdText);\n      const prevListItemPos = precedingListItemInsertPos(tr.doc, tr.selection);\n      if (prevListItemPos) {\n        precedingListItemInsert(tr, prevListItemPos, rmdNode);\n      } else {\n        tr.replaceSelectionWith(rmdNode);\n        const selPos = tr.selection.from - rmdNode.nodeSize - 1 + offsetChars - 1;\n        setTextSelection(selPos)(tr);\n      }\n\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nexport function activeRmdChunk(state: EditorState): EditorRmdChunk | null {\n  if (state.schema.nodes.rmd_chunk) {\n    const rmdNode = findParentNodeOfType(state.schema.nodes.rmd_chunk)(state.selection);\n    if (rmdNode) {\n      return rmdChunk(rmdNode.node.textContent);\n    }\n  }\n  return null;\n}\n\nexport function previousExecutableRmdChunks(state: EditorState, pos = state.selection.from): EditorRmdChunk[] {\n  const activeChunk = activeRmdChunk(state);\n  const lang = activeChunk ? activeChunk.lang : 'r';\n  const kEvalFalseRegEx = /eval\\s*=\\s*F(?:ALSE)?/;\n  return previousRmdChunks(state, pos, chunk => {\n    return (\n      chunk.lang.localeCompare(lang, undefined, { sensitivity: 'accent' }) === 0 && !kEvalFalseRegEx.test(chunk.meta)\n    );\n  });\n}\n\nexport function previousRmdChunks(state: EditorState, pos: number, filter?: (chunk: EditorRmdChunk) => boolean) {\n  // chunks to return\n  const chunks: EditorRmdChunk[] = [];\n\n  // find all chunks in the document and return ones before the position that pass the specified filter\n  const schema = state.schema;\n  const rmdChunkNodes = findChildrenByType(state.doc, schema.nodes.rmd_chunk);\n  for (const rmdChunkNode of rmdChunkNodes) {\n    if (rmdChunkNode.pos + rmdChunkNode.node.nodeSize > pos) {\n      break;\n    }\n    const chunk = rmdChunk(rmdChunkNode.node.textContent);\n    if (chunk && (!filter || filter(chunk))) {\n      chunks.push(chunk);\n    }\n  }\n\n  // return chunks\n  return chunks;\n}\n\nexport function rmdChunk(code: string): EditorRmdChunk | null {\n  let lines = code.trimLeft().split('\\n');\n  if (lines.length > 0) {\n    const meta = lines[0].replace(/^[\\s`\\{]*(.*?)\\}?\\s*$/, '$1');\n    const matchLang = meta.match(/\\w+/);\n    const lang = matchLang ? matchLang[0] : '';\n\n    // remove lines, other than the first, which are chunk delimiters (start\n    // with ```). these are generally unintended but can be accidentally\n    // introduced by e.g., pasting a chunk with its delimiters into visual mode,\n    // where delimiters are implicit. if these lines aren't removed, they create\n    // nested chunks that break parsing and can corrupt the document (see case\n    // 8452)\n    lines = lines.filter((line, idx) => {\n      if (idx === 0) {\n        return true;\n      }\n      return !line.startsWith(\"```\");\n    });\n\n    // a completely empty chunk (no second line) should be returned\n    // as such. if it's not completely empty then append a newline\n    // to the result of split (so that the chunk ends w/ a newline)\n    const chunkCode = lines.length > 1 ? lines.slice(1).join('\\n') + '\\n' : '';\n\n    return {\n      lang,\n      meta,\n      code: chunkCode,\n    };\n  } else {\n    return null;\n  }\n}\n\nexport function mergeRmdChunks(chunks: EditorRmdChunk[]) {\n  if (chunks.length) {\n    const merged = {\n      lang: chunks[0].lang,\n      meta: '',\n      code: '',\n    };\n    chunks.forEach(chunk => (merged.code += chunk.code + '\\n'));\n    return merged;\n  } else {\n    return null;\n  }\n}\n\n/**\n * Attempts to extract the engine name and label from a chunk header.\n * \n * @param text The chunk header, e.g. {r foo}\n * @returns An object with `engine` and `label` properties, or null.\n */\nexport function rmdChunkEngineAndLabel(text: string) {\n  // Match the engine and label with a regex\n  const match = text.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+([a-zA-Z0-9/._='\"-]+)/);\n  if (match) {\n    // The second capturing group in the regex matches the first string after\n    // the engine. This might be a label (e.g., {r label}), but could also be\n    // a chunk option (e.g., {r echo=FALSE}). If it has an =, presume that it's\n    // an option.\n    if (match[2].indexOf(\"=\") !== -1) {\n      return null;\n    }\n    return {\n      engine: match[1],\n      label: match[2],\n    };\n  } else {\n    return null;\n  }\n}\n\nexport function haveTableCellsWithInlineRcode(doc: ProsemirrorNode) {\n  const schema = doc.type.schema;\n  const haveRCode = !!doc.type.schema.nodes.rmd_chunk;\n  if (haveRCode) {\n    const isTableCell = (node: ProsemirrorNode) =>\n      node.type === schema.nodes.table_cell || node.type === schema.nodes.table_header;\n    return findChildren(doc, isTableCell).some(cell => {\n      if (doc.rangeHasMark(cell.pos, cell.pos + cell.node.nodeSize, schema.marks.code)) {\n        const markedNodes = findChildrenByMark(cell.node, schema.marks.code, true);\n        return markedNodes.some(markedNode => {\n          const from = cell.pos + 1 + markedNode.pos;\n          const markedRange = getMarkRange(doc.resolve(from), schema.marks.code);\n          if (markedRange) {\n            const text = doc.textBetween(markedRange.from, markedRange.to);\n            return /^r[ #].+$/.test(text);\n          } else {\n            return false;\n          }\n        });\n      } else {\n        return false;\n      }\n    });\n  } else {\n    return false;\n  }\n}\n","/*\n * mark.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, MarkSpec, MarkType, ResolvedPos, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Selection, Transaction } from 'prosemirror-state';\n\nimport { PandocTokenReader, PandocMarkWriterFn, PandocInlineHTMLReaderFn } from './pandoc';\nimport { mergedTextNodes } from './text';\nimport { findChildrenByMark } from 'prosemirror-utils';\nimport { MarkTransaction } from './transaction';\n\nexport interface PandocMark {\n  readonly name: string;\n  readonly spec: MarkSpec;\n  readonly noInputRules?: boolean;\n  readonly noSpelling?: boolean;\n  readonly pandoc: {\n    readonly readers: readonly PandocTokenReader[];\n    readonly inlineHTMLReader?: PandocInlineHTMLReaderFn;\n    readonly writer: {\n      priority: number;\n      write: PandocMarkWriterFn;\n    };\n  };\n}\n\nexport function markIsActive(context: EditorState | Transaction, type: MarkType) {\n  const { from, $from, to, empty } = context.selection;\n\n  if (empty) {\n    return type && !!type.isInSet(context.storedMarks || $from.marks());\n  }\n\n  return !!context.doc.rangeHasMark(from, to, type);\n}\n\nexport function getMarkAttrs(doc: ProsemirrorNode, range: { from: number; to: number }, type: MarkType) {\n  const { from, to } = range;\n  let marks: Mark[] = [];\n\n  doc.nodesBetween(from, to, node => {\n    marks = [...marks, ...node.marks];\n  });\n\n  const mark = marks.find(markItem => markItem.type.name === type.name);\n\n  if (mark) {\n    return mark.attrs;\n  }\n\n  return {};\n}\n\nexport function getMarkRange($pos?: ResolvedPos, type?: MarkType) {\n  if (!$pos || !type) {\n    return false;\n  }\n\n  const start = $pos.parent.childAfter($pos.parentOffset);\n\n  if (!start.node) {\n    return false;\n  }\n\n  const link = start.node.marks.find((mark: Mark) => mark.type === type);\n  if (!link) {\n    return false;\n  }\n\n  let startIndex = $pos.index();\n  let startPos = $pos.start() + start.offset;\n  let endIndex = startIndex + 1;\n  let endPos = startPos + start.node.nodeSize;\n\n  while (startIndex > 0 && link.isInSet($pos.parent.child(startIndex - 1).marks)) {\n    startIndex -= 1;\n    startPos -= $pos.parent.child(startIndex).nodeSize;\n  }\n\n  while (endIndex < $pos.parent.childCount && link.isInSet($pos.parent.child(endIndex).marks)) {\n    endPos += $pos.parent.child(endIndex).nodeSize;\n    endIndex += 1;\n  }\n\n  return { from: startPos, to: endPos };\n}\n\nexport function getSelectionMarkRange(selection: Selection, markType: MarkType): { from: number; to: number } {\n  let range: { from: number; to: number };\n  if (selection.empty) {\n    range = getMarkRange(selection.$head, markType) as { from: number; to: number };\n  } else {\n    range = { from: selection.from, to: selection.to };\n  }\n  return range;\n}\n\nexport function removeInvalidatedMarks(\n  tr: MarkTransaction,\n  node: ProsemirrorNode,\n  pos: number,\n  re: RegExp,\n  markType: MarkType,\n) {\n  re.lastIndex = 0;\n  const markedNodes = findChildrenByMark(node, markType, true);\n  markedNodes.forEach(markedNode => {\n    const from = pos + 1 + markedNode.pos;\n    const markedRange = getMarkRange(tr.doc.resolve(from), markType);\n    if (markedRange) {\n      const text = tr.doc.textBetween(markedRange.from, markedRange.to);\n      if (!text.match(re)) {\n        tr.removeMark(markedRange.from, markedRange.to, markType);\n        tr.removeStoredMark(markType);\n      }\n    }\n  });\n  re.lastIndex = 0;\n}\n\nexport function splitInvalidatedMarks(\n  tr: MarkTransaction,\n  node: ProsemirrorNode,\n  pos: number,\n  validLength: (text: string) => number,\n  markType: MarkType,\n  removeMark?: (from: number, to: number) => void,\n) {\n  const hasMarkType = (nd: ProsemirrorNode) => markType.isInSet(nd.marks);\n  const markedNodes = findChildrenByMark(node, markType, true);\n  markedNodes.forEach(markedNode => {\n    const mark = hasMarkType(markedNode.node);\n    if (mark) {\n      const from = pos + 1 + markedNode.pos;\n      const markRange = getMarkRange(tr.doc.resolve(from), markType);\n      if (markRange) {\n        const text = tr.doc.textBetween(markRange.from, markRange.to);\n        const length = validLength(text);\n        if (length > -1 && length !== text.length) {\n          if (removeMark) {\n            removeMark(markRange.from + length, markRange.to);\n          } else {\n            tr.removeMark(markRange.from + length, markRange.to, markType);\n          }\n        }\n      }\n    }\n  });\n}\n\nexport function detectAndApplyMarks(\n  tr: MarkTransaction,\n  node: ProsemirrorNode,\n  pos: number,\n  re: RegExp,\n  markType: MarkType,\n  attrs: (match: RegExpMatchArray) => {},\n  filter?: (from: number, to: number) => boolean,\n  text?: (match: RegExpMatchArray) => string,\n) {\n  re.lastIndex = 0;\n  const textNodes = mergedTextNodes(node, (_node: ProsemirrorNode, _pos: number, parentNode: ProsemirrorNode) =>\n    parentNode.type.allowsMarkType(markType),\n  );\n  textNodes.forEach(textNode => {\n    re.lastIndex = 0;\n    let match = re.exec(textNode.text);\n    while (match !== null) {\n      const refText = text ? text(match) : match[0];\n      const from = pos + 1 + textNode.pos + match.index + (match[0].length - refText.length);\n      const to = from + refText.length;\n      const range = getMarkRange(tr.doc.resolve(to), markType);\n      if (\n        (!range || range.from !== from || range.to !== to) &&\n        !tr.doc.rangeHasMark(from, to, markType.schema.marks.code)\n      ) {\n        if (!filter || filter(from, to)) {\n          const mark = markType.create(attrs instanceof Function ? attrs(match) : attrs);\n          tr.addMark(from, to, mark);\n          if (tr.selection.anchor === to) {\n            tr.removeStoredMark(mark.type);\n          }\n        }\n      }\n      match = re.lastIndex !== 0 ? re.exec(textNode.text) : null;\n    }\n  });\n  re.lastIndex = 0;\n}\n","/*\n * text.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nexport interface TextWithPos {\n  readonly text: string;\n  readonly pos: number;\n}\n\nexport function mergedTextNodes(\n  doc: ProsemirrorNode,\n  filter?: (node: ProsemirrorNode, pos: number, parentNode: ProsemirrorNode) => boolean,\n): TextWithPos[] {\n  const textNodes: TextWithPos[] = [];\n  let nodeIndex = 0;\n  doc.descendants((node, pos, parentNode) => {\n    if (node.isText) {\n      // apply filter\n      if (filter && !filter(node, pos, parentNode)) {\n        return false;\n      }\n\n      // join existing contiguous range of text nodes or create a new one\n      if (textNodes[nodeIndex]) {\n        textNodes[nodeIndex] = {\n          text: textNodes[nodeIndex].text + node.text,\n          pos: textNodes[nodeIndex].pos,\n        };\n      } else {\n        textNodes[nodeIndex] = {\n          text: node.text || '',\n          pos,\n        };\n      }\n    } else {\n      nodeIndex += 1;\n    }\n  });\n  return textNodes;\n}\n\nexport function stripQuotes(text: string) {\n  return text.replace(/[\"']/g, '');\n}\n\nexport function equalsIgnoreCase(str1: string, str2: string) {\n  return str1.localeCompare(str2, undefined, { sensitivity: 'accent' }) === 0;\n}\n","/*\n * list.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, Selection } from 'prosemirror-state';\n\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nexport enum ListType {\n  Ordered = 'OrderedList',\n  Bullet = 'BulletList',\n}\n\nexport interface ListCapabilities {\n  tasks: boolean;\n  fancy: boolean;\n  example: boolean;\n  order: boolean;\n}\n\nexport function isList(node: ProsemirrorNode | null | undefined) {\n  if (node) {\n    const schema = node.type.schema;\n    return node.type === schema.nodes.bullet_list || node.type === schema.nodes.ordered_list;\n  } else {\n    return false;\n  }\n}\n\nexport function precedingListItemInsertPos(doc: ProsemirrorNode, selection: Selection) {\n  // selection just be empty\n  if (!selection.empty) {\n    return null;\n  }\n\n  // check for insert position in preceding list item (only trigger when\n  // the user is at the very beginning of a new bullet)\n  const schema = doc.type.schema;\n  const $head = selection.$head;\n  const parentListItem = findParentNodeOfType(schema.nodes.list_item)(selection);\n  if (parentListItem) {\n    const $liPos = doc.resolve(parentListItem.pos);\n    const listIndex = $liPos.index();\n    const parentIndex = $head.index($head.depth - 1);\n    const parentOffset = $head.parentOffset;\n    if (listIndex > 0 && parentIndex === 0 && parentOffset === 0) {\n      const pos = $liPos.pos - 1;\n      return pos;\n    } else {\n      return null;\n    }\n  } else {\n    return null;\n  }\n}\n\nexport function precedingListItemInsert(tr: Transaction, pos: number, node: ProsemirrorNode) {\n  tr.deleteRange(tr.selection.from, tr.selection.from + 1);\n  tr.insert(pos, node);\n  setTextSelection(tr.mapping.map(pos), -1)(tr);\n  return tr;\n}\n","/*\n * command.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { lift, setBlockType, toggleMark, wrapIn } from 'prosemirror-commands';\nimport { MarkType, Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { wrapInList, liftListItem } from 'prosemirror-schema-list';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNode, findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\nimport { EditorView } from 'prosemirror-view';\n\nimport { markIsActive, getMarkRange } from './mark';\nimport { canInsertNode, nodeIsActive } from './node';\nimport { pandocAttrInSpec, pandocAttrAvailable, pandocAttrFrom } from './pandoc_attr';\nimport { isList } from './list';\nimport { OmniInsert } from './omni_insert';\nimport { EditorUIPrefs, kListSpacingTight } from './ui';\nimport { selectionIsWithinRange, selectionHasRange } from './selection';\n\nexport enum EditorCommandId {\n  // text editing\n  Undo = '201CA961-829E-4708-8FBC-8896FDE85A10',\n  Redo = 'B6272475-04E0-48C0-86E3-DAFA763BDF7B',\n  SelectAll = 'E42BF0DA-8A02-4FCE-A202-7EA8A4833FC5',\n  ClearFormatting = 'C22D8CC4-0A9F-41D5-B540-7DAAAB80F344',\n\n  // formatting\n  Strong = '83B04020-1195-4A65-8A8E-7C173C87F439',\n  Em = '9E1B73E4-8140-43C3-92E4-A5E2583F40E6',\n  Code = '32621150-F829-4B8F-B5BD-627FABBBCF53',\n  Strikeout = 'D5F0225B-EC73-4600-A1F3-01F418EE8CB4',\n  Superscript = '0200D2FC-B5AF-423B-8B7A-4A7FC3DAA6AF',\n  Subscript = '3150428F-E468-4E6E-BF53-A2713E59B4A0',\n  Smallcaps = '41D8030F-5E8B-48F2-B1EE-6BC40FD502E4',\n  Underline = '7F0E6AE2-08F4-4594-9BA2-E6B8B27FA8F7',\n  Paragraph = '20EC2695-75CE-4DCD-A644-266E9F5F5913',\n  Heading1 = '5B77642B-923D-4440-B85D-1A27C9CF9D77',\n  Heading2 = '42985A4B-6BF2-4EEF-AA30-3E84A8B9111C',\n  Heading3 = '3F84D9DF-5EF6-484C-8615-BAAE2AC9ECE2',\n  Heading4 = 'DA76731D-1D84-4DBA-9BEF-A6F73536F0B9',\n  Heading5 = '59E24247-A140-466A-BC96-3C8ADABB57A5',\n  Heading6 = 'DB495DF5-8501-43C7-AE07-59CE9D9C373D',\n  CodeBlock = '3BA12A49-3E29-4ABC-9A49-436A3B49B880',\n  CodeBlockFormat = '07A6F2AA-01DC-41D7-9F01-AA91EAD856EE',\n  Blockquote = 'AF0717E7-E4BA-4909-9F10-17EB757CDD0F',\n  LineBlock = 'F401687C-B995-49AF-B2B0-59C158174FD5',\n  AttrEdit = '0F8A254D-9272-46BF-904D-3A9D68B91032',\n  Span = '852CF3E3-8A2B-420D-BD95-F79C54118E7E',\n  Div = '15EDB8F1-6015-4DA9-AE50-5987B24C1D96',\n  InsertDiv = 'ACA1521B-8875-4113-9D43-B47F0038B19F',\n\n  // lists\n  BulletList = 'D897FD2B-D6A4-44A7-A404-57B5251FBF64',\n  OrderedList = '3B8B82D5-7B6C-4480-B7DD-CF79C6817980',\n  TightList = 'A32B668F-74F3-43D7-8759-6576DDE1D603',\n  ListItemSink = '7B503FA6-6576-4397-89EF-37887A1B2EED',\n  ListItemLift = '53F89F57-22E2-4FCC-AF71-3E382EC10FC8',\n  ListItemSplit = '19BBD87F-96D6-4276-B7B8-470652CF4106',\n  ListItemCheck = '2F6DA9D8-EE57-418C-9459-50B6FD84137F',\n  ListItemCheckToggle = '34D30F3D-8441-44AD-B75A-415DA8AC740B',\n  EditListProperties = 'E006A68C-EA39-4954-91B9-DDB07D1CBDA2',\n\n  // tables\n  TableInsertTable = 'FBE39613-2DAA-445D-9E92-E1EABFB33E2C',\n  TableToggleHeader = 'A5EDA226-A3CA-4C1B-8D4D-C2675EF51AFF',\n  TableToggleCaption = 'C598D85C-E15C-4E10-9850-95882AEC7E60',\n  TableNextCell = '14299819-3E19-4A27-8D0B-8035315CF0B4',\n  TablePreviousCell = '0F041FB5-0203-4FF1-9D13-B16606A80F3E',\n  TableAddColumnBefore = '2447B81F-E07A-4C7D-8026-F2B148D5FF4A',\n  TableAddColumnAfter = 'ED86CFAF-D0B3-4B1F-9BB8-89987A939C8C',\n  TableDeleteColumn = 'B3D077BC-DD51-4E3A-8AD4-DE5DE686F7C4',\n  TableAddRowBefore = 'E97FB318-4052-41E5-A2F5-55B64E9826A5',\n  TableAddRowAfter = '3F28FA24-4BDD-4C13-84FF-9C5E1D4B04D6',\n  TableDeleteRow = '5F3B4DCD-5006-43A5-A069-405A946CAC68',\n  TableDeleteTable = '116D1E68-9315-4FEB-B6A0-AD25B3B9C881',\n  TableAlignColumnLeft = '0CD6A2A4-06F9-435D-B8C9-070B22B19D8',\n  TableAlignColumnRight = '86D90C12-BB12-4A9D-802F-D00EB7CEF2C5',\n  TableAlignColumnCenter = '63333996-2F65-4586-8494-EA9CAB5A7751',\n  TableAlignColumnDefault = '7860A9C1-60AF-40AD-9EB8-A10F6ADF25C5',\n\n  // insert\n  OmniInsert = '12F96C13-38C1-4266-A0A1-E871D8C709FB',\n  Link = '842FCB9A-CA61-4C5F-A0A0-43507B4B3FA9',\n  RemoveLink = '072D2084-218D-4A34-AF1F-7E196AF684B2',\n  Image = '808220A3-2B83-4CB6-BCC1-46565D54FA47',\n  Footnote = '1D1A73C0-F0E1-4A0F-BEBC-08398DE14A4D',\n  ParagraphInsert = '4E68830A-3E68-450A-B3F3-2591F4EB6B9A',\n  HorizontalRule = 'EAA7115B-181C-49EC-BDB1-F0FF10369278',\n  YamlMetadata = '431B5A45-1B25-4A55-9BAF-C0FE95D9B2B6',\n  Shortcode = '0FDDA7E8-419D-4A5D-A1F5-74061466655D',\n  InlineMath = 'A35C562A-0BD6-4B14-93D5-6FF3BE1A0C8A',\n  DisplayMath = '3E36BA99-2AE9-47C3-8C85-7CC5314A88DF',\n  Citation = 'EFFCFC81-F2E7-441E-B7FA-C693146B4185',\n  CrossReference = '48CEED4F-1D18-4AF9-8686-9FEB5DF6BCC8',\n  DefinitionList = 'CFAB8F4D-3350-4398-9754-8DE0FB95167B',\n  DefinitionTerm = '204D1A8F-8EE6-424A-8E69-99768C85B39E',\n  DefinitionDescription = 'F0738D83-8E11-4CB5-B958-390190A2D7DD',\n  Symbol = '1419765F-6E4A-4A4C-8670-D9E8578EA996',\n  Emoji = 'F73896A2-02CC-4E5D-A596-78444A1D2A37',\n  EmDash = '5B0DD33B-6209-4713-B8BB-60B5CA0BC3B3',\n  EnDash = 'C32AFE32-0E57-4A16-9C39-88EB1D82B8B4',\n  NonBreakingSpace = 'CF6428AB-F36E-446C-8661-2781B2CD1169',\n  HardLineBreak = '3606FF87-866C-4729-8F3F-D065388FC339',\n\n  // raw\n  TexInline = 'CFE8E9E5-93BA-4FFA-9A77-BA7EFC373864',\n  TexBlock = 'BD11A6A7-E528-40A2-8139-3F8F5F556ED2',\n  HTMLComment = 'F973CBA4-2882-4AC5-A642-47F4733EBDD4',\n  HTMLInline = 'C682C6B5-E58D-498C-A38F-FB07BEC3A82D',\n  HTMLBlock = '6F9F64AF-711F-4F91-8642-B51C41717F31',\n  RawInline = '984167C8-8582-469C-97D8-42CB12773657',\n  RawBlock = 'F5757992-4D33-45E6-86DC-F7D7B174B1EC',\n\n  // chunk\n  RCodeChunk = 'EBFD21FF-4A6E-4D88-A2E0-B38470B00BB9',\n  BashCodeChunk = '5FBB7283-E8AB-450C-9359-A4658CBCD136',\n  D3CodeChunk = 'C73CA46C-B56F-40B6-AEFA-DDBB30CA8C08',\n  PythonCodeChunk = '42A7A138-421A-4DCF-8A88-FE2F8EC5B8F6',\n  RcppCodeChunk = '6BD2810B-6B20-4358-8AA4-74BBFFC92AC3',\n  SQLCodeChunk = '41D61FD2-B56B-48A7-99BC-2F60BC0D9F78',\n  StanCodeChunk = '65D33344-CBE9-438C-B337-A538F8D7FCE5',\n  ExecuteCurentRmdChunk = '31C799F3-EF18-4F3A-92E6-51F7A3193A1B',\n  ExecuteCurrentPreviousRmdChunks = 'D3FDE96-0264-4364-ADFF-E87A75405B0B',\n\n  // outline\n  GoToNextSection = 'AE827BDA-96F8-4E84-8030-298D98386765',\n  GoToPreviousSection = 'E6AA728C-2B75-4939-9123-0F082837ACDF',\n}\n\nexport interface EditorCommand {\n  readonly id: EditorCommandId;\n  readonly keymap: readonly string[];\n  readonly isEnabled: () => boolean;\n  readonly isActive: () => boolean;\n  readonly plural: () => number;\n  readonly execute: () => void;\n}\n\nexport class ProsemirrorCommand {\n  public readonly id: EditorCommandId;\n  public readonly keymap: readonly string[];\n  public readonly execute: CommandFn;\n  public readonly omniInsert?: OmniInsert;\n  public readonly keepFocus: boolean;\n\n  constructor(\n    id: EditorCommandId,\n    keymap: readonly string[],\n    execute: CommandFn,\n    omniInsert?: OmniInsert,\n    keepFocus?: boolean,\n  ) {\n    this.id = id;\n    this.keymap = keymap;\n    this.execute = execute;\n    this.omniInsert = omniInsert;\n    this.keepFocus = !(keepFocus === false);\n  }\n\n  public isEnabled(state: EditorState): boolean {\n    return this.execute(state);\n  }\n\n  public isActive(state: EditorState): boolean {\n    return false;\n  }\n\n  public plural(state: EditorState): number {\n    return 1;\n  }\n}\n\nexport class MarkCommand extends ProsemirrorCommand {\n  public readonly markType: MarkType;\n  public readonly attrs: object;\n\n  constructor(id: EditorCommandId, keymap: string[], markType: MarkType, attrs = {}) {\n    super(id, keymap, toggleMarkType(markType, attrs) as CommandFn);\n    this.markType = markType;\n    this.attrs = attrs;\n  }\n\n  public isActive(state: EditorState) {\n    return markIsActive(state, this.markType);\n  }\n}\n\nexport class NodeCommand extends ProsemirrorCommand {\n  public readonly nodeType: NodeType;\n  public readonly attrs: object;\n\n  constructor(\n    id: EditorCommandId,\n    keymap: string[],\n    nodeType: NodeType,\n    attrs: object,\n    execute: CommandFn,\n    omniInsert?: OmniInsert,\n  ) {\n    super(id, keymap, execute, omniInsert);\n    this.nodeType = nodeType;\n    this.attrs = attrs;\n  }\n\n  public isActive(state: EditorState) {\n    return nodeIsActive(state, this.nodeType, this.attrs);\n  }\n}\n\nexport class BlockCommand extends NodeCommand {\n  constructor(\n    id: EditorCommandId,\n    keymap: string[],\n    blockType: NodeType,\n    toggleType: NodeType,\n    attrs = {},\n    omniInsert?: OmniInsert,\n  ) {\n    super(id, keymap, blockType, attrs, toggleBlockType(blockType, toggleType, attrs), omniInsert);\n  }\n}\n\nexport class WrapCommand extends NodeCommand {\n  constructor(id: EditorCommandId, keymap: string[], wrapType: NodeType, attrs = {}, omniInsert?: OmniInsert) {\n    super(id, keymap, wrapType, attrs, toggleWrap(wrapType, attrs), omniInsert);\n  }\n}\n\nexport class InsertCharacterCommand extends ProsemirrorCommand {\n  constructor(id: EditorCommandId, ch: string, keymap: string[]) {\n    super(id, keymap, (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n      // enable/disable command\n      const schema = state.schema;\n      if (!canInsertNode(state, schema.nodes.text)) {\n        return false;\n      }\n      if (dispatch) {\n        const tr = state.tr;\n        tr.replaceSelectionWith(schema.text(ch), true).scrollIntoView();\n        dispatch(tr);\n      }\n\n      return true;\n    });\n  }\n}\n\nexport type CommandFn = (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => boolean;\n\nexport function toggleMarkType(markType: MarkType, attrs?: { [key: string]: any }) {\n  const defaultToggleMark = toggleMark(markType, attrs);\n\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // disallow non-code marks when the selection is contained within a code mark\n    // (this is a pandoc constraint). note that we can allow them if the selection\n    // contains the code mark range entirely (as in that case the code mark will\n    // nest within the other mark)\n    if (markType !== state.schema.marks.code) {\n      if (markIsActive(state, state.schema.marks.code)) {\n        const codeRange = getMarkRange(state.selection.$anchor, state.schema.marks.code);\n        if (\n          codeRange &&\n          selectionIsWithinRange(state.selection, codeRange) &&\n          !selectionHasRange(state.selection, codeRange)\n        ) {\n          return false;\n        }\n      }\n    }\n\n    // default implementation\n    return defaultToggleMark(state, dispatch);\n  };\n}\n\nexport function toggleList(listType: NodeType, itemType: NodeType, prefs: EditorUIPrefs): CommandFn {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const { selection } = state;\n    const { $from, $to } = selection;\n    const range = $from.blockRange($to);\n\n    if (!range) {\n      return false;\n    }\n\n    const parentList = findParentNode(isList)(selection);\n\n    if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n      if (isList(parentList.node) && listType.validContent(parentList.node.content)) {\n        if (parentList.node.type !== listType) {\n          if (dispatch) {\n            const tr: Transaction = state.tr;\n            const attrs: { [key: string]: any } = {};\n            if (parentList.node.attrs.tight) {\n              attrs.tight = true;\n            }\n            tr.setNodeMarkup(parentList.pos, listType, attrs);\n            dispatch(tr);\n          }\n          return true;\n        } else {\n          return liftListItem(itemType)(state, dispatch);\n        }\n      }\n    }\n\n    // if we are in a heading then this isn't valid\n    if (findParentNodeOfType(state.schema.nodes.heading)(state.selection)) {\n      return false;\n    }\n\n    // reflect tight preference\n    const tight = prefs.listSpacing() === kListSpacingTight;\n\n    return wrapInList(listType, { tight })(state, dispatch);\n  };\n}\n\nexport function toggleBlockType(type: NodeType, toggletype: NodeType, attrs = {}): CommandFn {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n    if (!dispatch) {\n      return type === toggletype || setBlockType(type, { ...attrs })(state, dispatch);\n    }\n\n    // if the type has pandoc attrs then see if we can transfer from the existing node\n    let pandocAttr: any = {};\n    if (pandocAttrInSpec(type.spec)) {\n      const predicate = (n: ProsemirrorNode) => pandocAttrAvailable(n.attrs);\n      const node = findParentNode(predicate)(state.selection);\n      if (node) {\n        pandocAttr = pandocAttrFrom(node.node.attrs);\n      }\n    }\n\n    return setBlockType(type, { ...attrs, ...pandocAttr })(state, dispatch);\n  };\n}\n\nexport function toggleWrap(type: NodeType, attrs?: { [key: string]: any }): CommandFn {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const isActive = nodeIsActive(state, type, attrs);\n\n    if (isActive) {\n      return lift(state, dispatch);\n    }\n\n    return wrapIn(type, attrs)(state, dispatch);\n  };\n}\n\nexport function insertNode(nodeType: NodeType, attrs = {}): CommandFn {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n    if (!canInsertNode(state, nodeType)) {\n      return false;\n    }\n\n    if (dispatch) {\n      dispatch(state.tr.replaceSelectionWith(nodeType.create(attrs)));\n    }\n\n    return true;\n  };\n}\n\nexport function exitNode(\n  nodeType: NodeType,\n  depth: number,\n  allowKey: boolean,\n  filter = (_node: ProsemirrorNode) => true,\n) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // must be within the node type and pass the filter\n    const { $head, $anchor } = state.selection;\n    if ($head.parent.type !== nodeType || !filter($head.parent)) {\n      return false;\n    }\n\n    // must be empty and entirely contained by the node\n    if (!$head.sameParent($anchor) || !state.selection.empty) {\n      return !allowKey;\n    }\n\n    // must be at the end of the node\n    const node = findParentNodeOfType(nodeType)(state.selection)!;\n    const endCaptionPos = node.pos + node.node.nodeSize - 1;\n    if (state.selection.from !== endCaptionPos) {\n      return !allowKey;\n    }\n\n    // insert must be valid in container above\n    const above = $head.node(depth);\n    const after = $head.indexAfter(depth);\n    const type = above.contentMatchAt(after).defaultType!;\n    if (!above.canReplaceWith(after, after, type)) {\n      return !allowKey;\n    }\n\n    // perform insert\n    if (dispatch) {\n      const tr = state.tr;\n      const pos = node.pos + node.node.nodeSize + (Math.abs(depth) - 1);\n      tr.insert(pos, type.create());\n      setTextSelection(pos, 1)(tr);\n      dispatch(tr.scrollIntoView());\n    }\n\n    return true;\n  };\n}\n","import { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { NodeWithPos } from 'prosemirror-utils';\n\nimport { bodyElement } from './dom';\nimport {\n  kYamlMetadataOutlineItemType,\n  kHeadingOutlineItemType,\n  kRmdchunkOutlineItemType,\n  EditingOutlineLocation,\n  getDocumentOutline,\n  EditingOutlineLocationItem,\n} from './outline';\nimport { restoreSelection } from './selection';\nimport { scrollToPos } from './scroll';\n\nexport interface EditingLocation {\n  pos: number;\n  scrollTop: number;\n}\n\nexport function getEditingLocation(view: EditorView): EditingLocation {\n  const pos = view.state.selection.from;\n  const bodyEl = bodyElement(view);\n  const scrollTop = bodyEl.scrollTop;\n  return { pos, scrollTop };\n}\n\nexport function setEditingLocation(\n  view: EditorView,\n  outlineLocation?: EditingOutlineLocation,\n  previousLocation?: EditingLocation,\n) {\n  // get the current document outline\n  const documentOutline = getDocumentOutline(view.state);\n\n  // if all of the types and levels match up to the active outline item,\n  // then we have a candidate match\n  let docOutlineLocationNode: NodeWithPos | undefined;\n\n  if (outlineLocation) {\n    for (let i = 0; i < outlineLocation.items.length && i < documentOutline.length; i++) {\n      // get the item and it's peer\n      const item = outlineLocation.items[i];\n      const docOutlineNode = documentOutline[i];\n\n      // if they don't match then bail (can't resolve different interpretations of the outline)\n      if (!outlineItemSimillarToNode(item, docOutlineNode.node)) {\n        break;\n      }\n\n      // if this is the active item\n      if (item.active) {\n        // see if the previous location is actually a better target (because it's between this location and\n        // the next outline node). in that case we don't set the target node and we leave the restorePos\n        // at the previous location\n        if (!locationIsBetweenDocOutlineNodes(docOutlineNode, documentOutline[i + 1], previousLocation)) {\n          // set the target\n          docOutlineLocationNode = docOutlineNode;\n\n          // if this is an rmd chunk then advance to the second line\n          if (docOutlineNode.node.type === view.state.schema.nodes.rmd_chunk) {\n            const chunkText = docOutlineNode.node.textContent;\n            const newlineIdx = chunkText.indexOf('\\n');\n            if (newlineIdx !== -1) {\n              docOutlineLocationNode.pos += newlineIdx + 2;\n            }\n          }\n        }\n\n        break;\n      }\n    }\n  }\n\n  // do the restore\n  if (docOutlineLocationNode) {\n    restoreSelection(view, docOutlineLocationNode.pos);\n    scrollToPos(view, docOutlineLocationNode.pos);\n  } else if (previousLocation) {\n    restoreSelection(view, previousLocation.pos);\n    bodyElement(view).scrollTop = previousLocation.scrollTop;\n  }\n}\n\nfunction outlineItemSimillarToNode(outlineItem: EditingOutlineLocationItem, docOutlneNode: ProsemirrorNode) {\n  const schema = docOutlneNode.type.schema;\n  if (outlineItem.type === kYamlMetadataOutlineItemType) {\n    return docOutlneNode.type === schema.nodes.yaml_metadata;\n  } else if (outlineItem.type === kRmdchunkOutlineItemType) {\n    return docOutlneNode.type === schema.nodes.rmd_chunk;\n  } else if (outlineItem.type === kHeadingOutlineItemType) {\n    return docOutlneNode.type === schema.nodes.heading && docOutlneNode.attrs.level === outlineItem.level;\n  } else {\n    return false;\n  }\n}\n\nfunction locationIsBetweenDocOutlineNodes(nodeA: NodeWithPos, nodeB?: NodeWithPos, location?: EditingLocation) {\n  // bail if we don't have all the arguments\n  if (!nodeB || !location) {\n    return false;\n  }\n  return nodeA.pos < location.pos && nodeB.pos > location.pos;\n}\n","/*\n * ui.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { SkinTone } from './emoji';\nimport { EditorRmdChunk } from './rmd';\nimport { XRef } from './xref';\n\nimport { EditorUIImages } from './ui-images';\nimport { EditorDialogs } from './ui-dialogs';\nimport { EditorUISpelling } from './spelling';\n\nexport interface EditorUI {\n  dialogs: EditorDialogs;\n  display: EditorDisplay;\n  math: EditorUIMath;\n  context: EditorUIContext;\n  prefs: EditorUIPrefs;\n  images: EditorUIImages;\n  chunks: EditorUIChunks;\n  spelling: EditorUISpelling;\n}\n\n/**\n * Callbacks supplied to the host to interact with a code chunk and its output.\n */\nexport interface EditorUIChunkCallbacks {\n  getPos: () => number;\n  scrollIntoView: (ele: HTMLElement) => void;\n  scrollCursorIntoView: () => void;\n}\n\nexport interface EditorUIChunks {\n  // create a code chunk editor\n  createChunkEditor: (type: string, index: number, callbacks: EditorUIChunkCallbacks) => ChunkEditor;\n}\n\nexport interface ChunkEditor {\n  editor: unknown;\n  setMode(mode: string): void;\n  executeSelection(): void;\n  element: HTMLElement;\n  destroy(): void;\n}\n\nexport interface EditorUIContext {\n  // check if we are the active tab\n  isActiveTab: () => boolean;\n\n  // get the path to the current document\n  getDocumentPath: () => string | null;\n\n  // ensure the edited document is saved on the server before proceeding\n  // (note this just means that the server has a copy of it for e.g.\n  // indexing xrefs, from the user's standpoint the doc is still dirty)\n  withSavedDocument: () => Promise<boolean>;\n\n  // get the default directory for resources (e.g. where relative links point to)\n  getDefaultResourceDir: () => string;\n\n  // map from a filesystem path to a resource reference\n  mapPathToResource: (path: string) => string;\n\n  // map from a resource reference (e.g. images/foo.png) to a URL we can use in the document\n  mapResourceToURL: (path: string) => string;\n\n  // watch a resource for changes (returns an unsubscribe function)\n  watchResource: (path: string, notify: VoidFunction) => VoidFunction;\n\n  // translate a string\n  translateText: (text: string) => string;\n\n  // are there dropped uris available?\n  droppedUris: () => string[] | null;\n\n  // uris from the clipboard\n  clipboardUris: () => Promise<string[] | null>;\n\n  // image from the clipboard (returned as file path)\n  clipboardImage: () => Promise<string | null>;\n\n  // resolve image uris (make relative, copy to doc local 'images' dir, etc)\n  resolveImageUris: (uris: string[]) => Promise<string[]>;\n\n  // are we running in windows desktop mode?\n  isWindowsDesktop: () => boolean;\n}\n\nexport interface EditorMenuItem {\n  text?: string;\n  exec?: VoidFunction;\n  command?: string;\n  separator?: boolean;\n  subMenu?: {\n    items: EditorMenuItem[];\n  };\n}\n\nexport interface EditorUIMath {\n  typeset?: (el: HTMLElement, text: string, priority: boolean) => Promise<boolean>;\n}\n\nexport interface EditorDisplay {\n  openURL: (url: string) => void;\n  navigateToXRef: (file: string, xref: XRef) => void;\n  showContextMenu?: (items: EditorMenuItem[], clientX: number, clientY: number) => Promise<boolean>;\n}\n\nexport const kListSpacingTight = 'tight';\nexport const kListSpacingSpaced = 'spaced';\nexport type ListSpacing = 'tight' | 'spaced';\n\nexport interface EditorUIPrefs {\n  darkMode: () => boolean;\n  listSpacing: () => ListSpacing;\n  equationPreview: () => boolean;\n  tabKeyMoveFocus: () => boolean;\n  emojiSkinTone: () => SkinTone;\n  setEmojiSkinTone: (skinTone: SkinTone) => void;\n  zoteroUseBetterBibtex: () => boolean;\n  setBibliographyDefaultType: (type: string) => void;\n  bibliographyDefaultType: () => string;\n  citationDefaultInText: () => boolean;\n  setCitationDefaultInText: (value: boolean) => void;\n}\n","/*\n * util.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// tslint:disable:no-bitwise\nexport function uuidv4() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n    const r = (Math.random() * 16) | 0;\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n","/*\n * dom.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nexport function bodyElement(view: EditorView): HTMLElement {\n  return view.dom.firstChild as HTMLElement;\n}\n\nexport function isElementVisible(el: HTMLElement) {\n  return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function elementInnerDimensions(el: HTMLElement) {\n  const cs = getComputedStyle(el);\n\n  const asNumber = (x: string | null) => (x ? parseFloat(x) : 0);\n  const paddingX = asNumber(cs.paddingLeft) + asNumber(cs.paddingRight);\n  const paddingY = asNumber(cs.paddingTop) + asNumber(cs.paddingBottom);\n  const borderX = asNumber(cs.borderLeftWidth) + asNumber(cs.borderRightWidth);\n  const borderY = asNumber(cs.borderTopWidth) + asNumber(cs.borderBottomWidth);\n\n  return {\n    width: el.offsetWidth - paddingX - borderX,\n    height: el.offsetHeight - paddingY - borderY,\n  };\n}\n\nexport function onElementRemoved(container: Node, el: HTMLElement, onRemoved: VoidFunction) {\n  const observer = new MutationObserver(mutationsList => {\n    mutationsList.forEach(mutation => {\n      mutation.removedNodes.forEach(node => {\n        if (node === el) {\n          onRemoved();\n        }\n      });\n    });\n  });\n  observer.observe(container, { attributes: false, childList: true, subtree: true });\n}\n","/*\n * scroll.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nimport zenscroll from 'zenscroll';\n\nimport { editingRootNodeClosestToPos, editingRootNode } from './node';\n\nexport function scrollIntoView(\n  view: EditorView,\n  pos: number,\n  center = true,\n  duration?: number,\n  offset?: number,\n  onDone?: VoidFunction,\n) {\n  // resolve position and determine container\n  const $pos = view.state.doc.resolve(pos);\n  const container = editingRootNodeClosestToPos($pos);\n\n  // if we have a container then do the scroll\n  if (container) {\n    const schema = view.state.schema;\n    const containerEl = view.nodeDOM(container.pos) as HTMLElement;\n    const parentList = findParentNodeOfTypeClosestToPos($pos, [schema.nodes.ordered_list, schema.nodes.bullet_list]);\n    const parentDiv = schema.nodes.div ? findParentNodeOfTypeClosestToPos($pos, schema.nodes.div) : undefined;\n    const resultPos = parentList || parentDiv ? $pos.before(2) : $pos.before();\n    const resultNode = view.nodeDOM(resultPos) as HTMLElement;\n    if (container && resultNode) {\n      const scroller = zenscroll.createScroller(containerEl, duration, offset);\n      if (center) {\n        scroller.center(resultNode, duration, offset, onDone);\n      } else {\n        scroller.intoView(resultNode, duration, onDone);\n      }\n    }\n  }\n}\n\nexport function scrollToPos(view: EditorView, pos: number, duration?: number, offset?: number, onDone?: VoidFunction) {\n  const node = view.nodeDOM(pos);\n  if (node instanceof HTMLElement) {\n    const editingRoot = editingRootNode(view.state.selection)!;\n    const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n    const scroller = zenscroll.createScroller(container, duration, offset);\n    if (duration) {\n      scroller.to(node, duration, onDone);\n    } else {\n      scroller.to(node, 0, onDone);\n    }\n  }\n}\n","/*\n * navigation.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection, Predicate, findChildren, findDomRefAtPos } from 'prosemirror-utils';\n\nimport zenscroll from 'zenscroll';\n\nimport { editingRootNode } from './node';\nimport { kNavigationTransaction } from './transaction';\nimport { xrefPosition } from './xref';\n\nexport interface EditorNavigation {\n  navigate: (type: NavigationType, location: string, animate?: boolean) => void;\n}\n\nexport enum NavigationType {\n  Pos = 'pos',\n  Id = 'id',\n  Href = 'href',\n  Heading = 'heading',\n  XRef = 'xref',\n}\n\nexport interface Navigation {\n  pos: number;\n  prevPos: number;\n}\n\nexport function navigateTo(\n  view: EditorView,\n  type: NavigationType,\n  location: string,\n  animate = true,\n): Navigation | null {\n  switch (type) {\n    case NavigationType.Pos:\n      return navigateToPos(view, parseInt(location, 10), animate);\n    case NavigationType.Id:\n      return navigateToId(view, location, animate);\n    case NavigationType.Href:\n      return navigateToHref(view, location, animate);\n    case NavigationType.Heading:\n      return navigateToHeading(view, location, animate);\n    case NavigationType.XRef:\n      return navigateToXRef(view, location, animate);\n    default:\n      return null;\n  }\n}\n\nexport function navigateToId(view: EditorView, id: string, animate = true): Navigation | null {\n  return navigate(view, node => id === node.attrs.navigation_id, animate);\n}\n\nexport function navigateToHref(view: EditorView, href: string, animate = true): Navigation | null {\n  return navigate(view, node => node.attrs.id === href, animate);\n}\n\nexport function navigateToHeading(view: EditorView, heading: string, animate = true): Navigation | null {\n  return navigate(\n    view,\n    node => {\n      return (\n        node.type === view.state.schema.nodes.heading &&\n        node.textContent.localeCompare(heading, undefined, { sensitivity: 'accent' }) === 0\n      );\n    },\n    animate,\n  );\n}\n\nexport function navigateToXRef(view: EditorView, xref: string, animate = true): Navigation | null {\n  const xrefPos = xrefPosition(view.state.doc, xref);\n  if (xrefPos !== -1) {\n    return navigateToPos(view, xrefPos, animate);\n  } else {\n    return null;\n  }\n}\n\nexport function navigateToPos(view: EditorView, pos: number, animate = true): Navigation | null {\n  // get previous position\n  const prevPos = view.state.selection.from;\n\n  // need to target at least the body\n  pos = Math.max(pos, 2);\n\n  // set selection\n  const tr = view.state.tr;\n  setTextSelection(pos)(tr);\n  tr.setMeta(kNavigationTransaction, true);\n  view.dispatch(tr);\n\n  // find a targetable dom node at the position\n  const node = findDomRefAtPos(pos, view.domAtPos.bind(view));\n  if (node instanceof HTMLElement) {\n    // auto-scroll to position (delay so we can grab the focus, as autoscrolling\n    // doesn't seem to work unless you have the focus)\n    setTimeout(() => {\n      view.focus();\n      const editingRoot = editingRootNode(view.state.selection)!;\n      const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n      const scroller = zenscroll.createScroller(container, 700, 20);\n      // some nodes' DOM elements are grandchildren rather than direct children\n      // of the scroll container; move up a level if this is the case\n      let dest = node;\n      if (node.parentElement && \n          node.parentElement.parentElement &&\n          node.parentElement.parentElement.parentElement === container) {\n         dest = node.parentElement;\n      }\n      if (animate) {\n        scroller.to(dest);\n      } else {\n        scroller.to(dest, 0);\n      }\n    }, 200);\n\n    return { pos, prevPos };\n  } else {\n    return null;\n  }\n}\n\nfunction navigate(view: EditorView, predicate: Predicate, animate = true): Navigation | null {\n  const result = findChildren(view.state.doc, predicate);\n  if (result.length) {\n    // pos points immediately before the node so add 1 to it\n    const pos = result[0].pos + 1;\n    return navigateToPos(view, pos, animate);\n  } else {\n    return null;\n  }\n}\n","/*\n * xref.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, MarkType } from 'prosemirror-model';\n\nimport { findChildrenByMark } from 'prosemirror-utils';\n\nimport { pandocAutoIdentifier } from './pandoc_id';\nimport { rmdChunkEngineAndLabel } from './rmd';\nimport { kTexFormat } from './raw';\n\nexport interface XRefServer {\n  indexForFile: (file: string) => Promise<XRefs>;\n  xrefForId: (file: string, id: string) => Promise<XRefs>;\n}\n\nexport interface XRefs {\n  baseDir: string;\n  refs: XRef[];\n}\n\nexport interface XRef {\n  file: string;\n  type: string;\n  id: string;\n  suffix: string;\n  title?: string;\n}\n\nexport function xrefKey(xref: XRef) {\n  // headings don't include their type in the key\n  const key = /^h\\d$/.test(xref.type)\n    ? xref.id\n    : // no colon if there is no type\n    xref.type.length > 0\n    ? `${xref.type}:${xref.id}`\n    : xref.id;\n\n  // return key with suffix\n  return key + xref.suffix;\n}\n\nexport function xrefPosition(doc: ProsemirrorNode, xref: string): number {\n  // -1 if not found\n  let xrefPos = -1;\n\n  // get type and id\n  const xrefInfo = xrefTypeAndId(xref);\n  if (xrefInfo) {\n    const { type, id } = xrefInfo;\n    const locator = xrefPositionLocators[type];\n    if (locator) {\n      // if this locator finds by mark then look at doc for marks\n      if (locator.markType) {\n        const schema = doc.type.schema;\n        const markType = schema.marks[locator.markType];\n        const markedNodes = findChildrenByMark(doc, markType, true);\n        markedNodes.forEach(markedNode => {\n          // bail if we already found it\n          if (xrefPos !== -1) {\n            return false;\n          }\n          // see if we can locate the xref\n          if (locator.hasXRef(markedNode.node, id, markType)) {\n            xrefPos = markedNode.pos;\n          }\n        });\n      } \n      if (xrefPos === -1 && locator.nodeTypes) {\n        // otherwise recursively examine nodes to find the xref\n        doc.descendants((node, pos) => {\n          // bail if we already found it\n          if (xrefPos !== -1) {\n            return false;\n          }\n          // see if we can locate the xref\n          if (locator.nodeTypes!.includes(node.type.name) && locator.hasXRef(node, id)) {\n            xrefPos = pos;\n            return false;\n          }\n        });\n      }\n    }\n  }\n\n  // return the position\n  return xrefPos;\n}\n\nfunction xrefTypeAndId(xref: string) {\n  const colonPos = xref.indexOf(':');\n  if (colonPos !== -1) {\n    return {\n      type: xref.substring(0, colonPos),\n      id: xref.substring(colonPos + 1),\n    };\n  } else {\n    return null;\n  }\n}\n\ninterface XRefPositionLocator {\n  markType?: string;\n  nodeTypes?: string[];\n  hasXRef: (node: ProsemirrorNode, id: string, markType?: MarkType) => boolean;\n}\n\nconst xrefPositionLocators: { [key: string]: XRefPositionLocator } = {\n  h1: headingLocator(),\n  h2: headingLocator(),\n  h3: headingLocator(),\n  h4: headingLocator(),\n  h5: headingLocator(),\n  h6: headingLocator(),\n  fig: {\n    nodeTypes: ['rmd_chunk'],\n    hasXRef: (node: ProsemirrorNode, id: string) => rmdChunkHasXRef(node, 'r', id, /^\\{.*[ ,].*fig\\.cap\\s*=.*\\}\\s*\\n/m),\n  },\n  tab: {\n    nodeTypes: ['rmd_chunk', 'table_container'],\n    hasXRef: (node: ProsemirrorNode, id: string) => {\n      if (node.type.name === 'rmd_chunk') {\n        return rmdChunkHasXRef(node, 'r', id, /kable\\s*\\([\\s\\S]*caption/);\n      } else if (node.type.name === 'table_container') {\n        const caption = node.child(1);\n        const match = caption.textContent.match(/^\\s*\\(#tab\\:([a-zA-Z0-9\\/-]+)\\)\\s*(.*)$/);\n        return !!match && match[1].localeCompare(id, undefined, { sensitivity: 'accent' }) === 0;\n      } else {\n        return false;\n      }\n    },\n  },\n  eq: {\n    nodeTypes: ['raw_block'],\n    markType: 'math',\n    hasXRef: (node: ProsemirrorNode, id: string, markType?: MarkType) => {\n      // if it's not a mark then ensure it is tex format before proceeding\n      if (!markType && (node.attrs.format !== kTexFormat)) {\n        return false;\n      }\n      const match = node.textContent.match(/^.*\\(\\\\#eq:([a-zA-Z0-9\\/-]+)\\).*$/m);\n      return !!match && match[1].localeCompare(id, undefined, { sensitivity: 'accent' }) === 0;\n    },\n  },\n  thm: thereomLocator('theorem'),\n  lem: thereomLocator('lemma'),\n  cor: thereomLocator('corollary'),\n  prp: thereomLocator('proposition'),\n  cnj: thereomLocator('conjecture'),\n  def: thereomLocator('definition'),\n  exr: thereomLocator('exercise'),\n};\n\nfunction rmdChunkHasXRef(node: ProsemirrorNode, engine: string, label: string, pattern?: RegExp) {\n  const chunk = rmdChunkEngineAndLabel(node.textContent);\n  const match = node.textContent.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+([a-zA-Z0-9/-]+)/);\n  if (chunk) {\n    return (\n      chunk.engine.localeCompare(engine, undefined, { sensitivity: 'accent' }) === 0 &&\n      chunk.label === label &&\n      (!pattern || !!node.textContent.match(pattern))\n    );\n  } else {\n    return false;\n  }\n}\n\nfunction headingLocator() {\n  return {\n    nodeTypes: ['heading'],\n    hasXRef: (node: ProsemirrorNode, id: string) => {\n      // note we use default pandoc auto id semantics here no matter what the documnet\n      // happens to use b/c our xref indexing code also does this (so only ids generated\n      // using the 'standard' rules will be in the index)\n      return node.attrs.id === id || pandocAutoIdentifier(node.textContent, false) === id;\n    },\n  };\n}\n\nfunction thereomLocator(engine: string) {\n  return {\n    nodeTypes: ['rmd_chunk'],\n    hasXRef: (node: ProsemirrorNode, id: string) => {\n      // look for conventional engine/label\n      if (rmdChunkHasXRef(node, engine, id)) {\n        return true;\n      } else {\n        // look for explicit label= syntax\n        const match = node.textContent.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+label\\s*=\\s*['\"]([^\"']+)['\"].*\\}/);\n        return !!match && match[1].localeCompare(engine, undefined, { sensitivity: 'accent' }) === 0 && match[2] === id;\n      }\n    },\n  };\n}\n","/*\n * pandoc_id.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// emulate pandoc behavior (https://pandoc.org/MANUAL.html#headings-and-sections)\nexport function pandocAutoIdentifier(text: string, asciify: boolean) {\n  if (asciify) {\n    text = pandocAsciify(text);\n  }\n\n  return (\n    text\n      // Remove all non-alphanumeric characters, except underscores, hyphens, and periods.\n      .replace(/[!\"#$%&')*+,\\/:;<=>?@\\[\\\\\\]^`{|}~]/g, '') // filterPunct\n\n      // Replace all spaces with hyphens\n      .replace(/\\s/g, '-')\n\n      // Convert all alphabetic characters to lowercase\n      .toLowerCase()\n\n      // Remove everything up to the first letter\n      .replace(/^[^A-Za-z]+/, '')\n  );\n}\n\n// emulate github behavior (note that unemoji should be done prior to calling this)\n// https://pandoc.org/MANUAL.html#extension-gfm_auto_identifiers\n// https://github.com/jgm/pandoc/blob/83880b0dbc318703babfbb6905b1046fa48f1216/src/Text/Pandoc/Shared.hs#L539\nexport function gfmAutoIdentifier(text: string, asciify: boolean) {\n  if (asciify) {\n    text = pandocAsciify(text);\n  }\n\n  return text\n    .replace(/[!\"#$%&')*+,\\.\\/:;<=>?@\\[\\\\\\]^`{|}~]/g, '') // filterPunct (all but underscore and hyphen)\n    .replace(/\\s/g, '-') // spaceToDash\n    .toLowerCase(); // toLower\n}\n\n// https://github.com/jgm/pandoc/blob/a5fa55969f1b4afc0ca3e38be50b69c65d43a460/src/Text/Pandoc/Asciify.hs\nexport function pandocAsciify(text: string) {\n  const chars: number[] = [];\n  const len = text.length;\n  let newch;\n  for (let i = 0; i < len; i++) {\n    newch = '';\n    const ch = text.charCodeAt(i);\n    switch (ch) {\n      case 192:\n      case 193:\n      case 194:\n      case 195:\n      case 196:\n      case 197:\n      case 256:\n      case 258:\n      case 260:\n      case 461:\n      case 512:\n      case 514:\n      case 550:\n      case 7680:\n      case 7840:\n      case 7842:\n        newch = 'A';\n        break;\n\n      case 7682:\n      case 7684:\n      case 7686:\n        newch = 'B';\n        break;\n\n      case 199:\n      case 262:\n      case 264:\n      case 266:\n      case 268:\n        newch = 'C';\n        break;\n\n      case 270:\n      case 7690:\n      case 7692:\n      case 7694:\n      case 7696:\n      case 7698:\n        newch = 'D';\n        break;\n\n      case 200:\n      case 201:\n      case 203:\n      case 274:\n      case 276:\n      case 278:\n      case 280:\n      case 282:\n      case 516:\n      case 518:\n      case 552:\n      case 7704:\n      case 7706:\n      case 7864:\n      case 7866:\n      case 7868:\n        newch = 'E';\n        break;\n\n      case 7710:\n        newch = 'F';\n        break;\n\n      case 284:\n      case 286:\n      case 288:\n      case 290:\n      case 486:\n      case 500:\n      case 7712:\n        newch = 'G';\n        break;\n\n      case 292:\n      case 542:\n      case 7714:\n      case 7716:\n      case 7718:\n      case 7720:\n      case 7722:\n        newch = 'H';\n        break;\n\n      case 204:\n      case 205:\n      case 206:\n      case 207:\n      case 296:\n      case 298:\n      case 300:\n      case 302:\n      case 304:\n      case 463:\n      case 520:\n      case 522:\n      case 7724:\n      case 7880:\n      case 7882:\n        newch = 'I';\n        break;\n\n      case 308:\n        newch = 'J';\n        break;\n\n      case 310:\n      case 488:\n      case 7728:\n      case 7730:\n      case 7732:\n      case 8490:\n        newch = 'K';\n        break;\n\n      case 313:\n      case 315:\n      case 317:\n      case 7734:\n      case 7738:\n      case 7740:\n        newch = 'L';\n        break;\n\n      case 7742:\n      case 7744:\n      case 7746:\n        newch = 'M';\n        break;\n\n      case 209:\n      case 323:\n      case 325:\n      case 327:\n      case 504:\n      case 7748:\n      case 7750:\n      case 7752:\n      case 7754:\n        newch = 'N';\n        break;\n\n      case 210:\n      case 211:\n      case 212:\n      case 213:\n      case 214:\n      case 332:\n      case 334:\n      case 336:\n      case 416:\n      case 465:\n      case 490:\n      case 524:\n      case 526:\n      case 558:\n      case 7884:\n      case 7886:\n        newch = 'O';\n        break;\n\n      case 7764:\n      case 7766:\n        newch = 'P';\n        break;\n\n      case 340:\n      case 342:\n      case 344:\n      case 528:\n      case 530:\n      case 7768:\n      case 7770:\n      case 7774:\n        newch = 'R';\n        break;\n\n      case 346:\n      case 348:\n      case 350:\n      case 352:\n      case 536:\n      case 7776:\n      case 7778:\n        newch = 'S';\n        break;\n\n      case 354:\n      case 356:\n      case 538:\n      case 7786:\n      case 7788:\n      case 7790:\n      case 7792:\n        newch = 'T';\n        break;\n\n      case 217:\n      case 218:\n      case 219:\n      case 220:\n      case 360:\n      case 362:\n      case 364:\n      case 366:\n      case 368:\n      case 370:\n      case 431:\n      case 467:\n      case 532:\n      case 534:\n      case 7794:\n      case 7796:\n      case 7798:\n      case 7908:\n      case 7910:\n        newch = 'U';\n        break;\n\n      case 7804:\n      case 7806:\n        newch = 'V';\n        break;\n\n      case 372:\n      case 7808:\n      case 7810:\n      case 7812:\n      case 7814:\n      case 7816:\n        newch = 'W';\n        break;\n\n      case 7818:\n      case 7820:\n        newch = 'X';\n        break;\n\n      case 221:\n      case 374:\n      case 376:\n      case 562:\n      case 7822:\n      case 7922:\n      case 7924:\n      case 7926:\n      case 7928:\n        newch = 'Y';\n        break;\n\n      case 377:\n      case 379:\n      case 381:\n      case 7824:\n      case 7826:\n      case 7828:\n        newch = 'Z';\n        break;\n\n      case 224:\n      case 225:\n      case 226:\n      case 227:\n      case 228:\n      case 229:\n      case 257:\n      case 259:\n      case 261:\n      case 462:\n      case 513:\n      case 515:\n      case 551:\n      case 553:\n      case 7681:\n      case 7841:\n      case 7843:\n        newch = 'a';\n        break;\n\n      case 7683:\n      case 7685:\n      case 7687:\n        newch = 'b';\n        break;\n\n      case 231:\n      case 263:\n      case 265:\n      case 267:\n      case 269:\n        newch = 'c';\n        break;\n\n      case 271:\n      case 7691:\n      case 7693:\n      case 7695:\n      case 7697:\n      case 7699:\n        newch = 'd';\n        break;\n\n      case 232:\n      case 233:\n      case 234:\n      case 235:\n      case 275:\n      case 277:\n      case 279:\n      case 281:\n      case 283:\n      case 517:\n      case 519:\n      case 7705:\n      case 7707:\n      case 7865:\n      case 7867:\n      case 7869:\n        newch = 'e';\n        break;\n\n      case 7711:\n        newch = 'f';\n        break;\n\n      case 285:\n      case 287:\n      case 289:\n      case 291:\n      case 487:\n      case 501:\n      case 7713:\n        newch = 'g';\n        break;\n\n      case 293:\n      case 543:\n      case 7715:\n      case 7717:\n      case 7719:\n      case 7721:\n      case 7723:\n      case 7830:\n        newch = 'h';\n        break;\n\n      case 236:\n      case 237:\n      case 238:\n      case 239:\n      case 297:\n      case 299:\n      case 301:\n      case 303:\n      case 305:\n      case 464:\n      case 521:\n      case 523:\n      case 7725:\n      case 7881:\n      case 7883:\n        newch = 'i';\n        break;\n\n      case 309:\n      case 496:\n        newch = 'j';\n        break;\n\n      case 311:\n      case 489:\n      case 7729:\n      case 7731:\n      case 7733:\n        newch = 'k';\n        break;\n\n      case 314:\n      case 316:\n      case 318:\n      case 7735:\n      case 7739:\n      case 7741:\n        newch = 'l';\n        break;\n\n      case 7743:\n      case 7745:\n      case 7747:\n        newch = 'm';\n        break;\n\n      case 241:\n      case 324:\n      case 326:\n      case 328:\n      case 505:\n      case 7749:\n      case 7751:\n      case 7753:\n      case 7755:\n        newch = 'n';\n        break;\n\n      case 242:\n      case 243:\n      case 244:\n      case 245:\n      case 246:\n      case 333:\n      case 335:\n      case 337:\n      case 417:\n      case 432:\n      case 466:\n      case 491:\n      case 525:\n      case 527:\n      case 559:\n      case 7885:\n      case 7887:\n        newch = 'o';\n        break;\n\n      case 7765:\n      case 7767:\n        newch = 'p';\n        break;\n\n      case 341:\n      case 343:\n      case 345:\n      case 529:\n      case 531:\n      case 7769:\n      case 7771:\n      case 7775:\n        newch = 'r';\n        break;\n\n      case 347:\n      case 349:\n      case 351:\n      case 353:\n      case 537:\n      case 7777:\n      case 7779:\n        newch = 's';\n        break;\n\n      case 355:\n      case 357:\n      case 539:\n      case 7787:\n      case 7789:\n      case 7791:\n      case 7793:\n      case 7831:\n        newch = 't';\n        break;\n\n      case 249:\n      case 250:\n      case 251:\n      case 252:\n      case 361:\n      case 363:\n      case 365:\n      case 367:\n      case 369:\n      case 371:\n      case 468:\n      case 533:\n      case 535:\n      case 7795:\n      case 7797:\n      case 7799:\n      case 7909:\n      case 7911:\n        newch = 'u';\n        break;\n\n      case 7805:\n      case 7807:\n        newch = 'v';\n        break;\n\n      case 373:\n      case 7809:\n      case 7811:\n      case 7813:\n      case 7815:\n      case 7817:\n      case 7832:\n        newch = 'w';\n        break;\n\n      case 7819:\n      case 7821:\n        newch = 'x';\n        break;\n\n      case 253:\n      case 255:\n      case 375:\n      case 563:\n      case 7833:\n      case 7923:\n      case 7925:\n      case 7927:\n      case 7929:\n        newch = 'y';\n        break;\n\n      case 378:\n      case 380:\n      case 382:\n      case 7825:\n      case 7827:\n      case 7829:\n        newch = 'z';\n        break;\n\n      case 894:\n        newch = ';';\n        break;\n\n      case 8175:\n        newch = '`';\n        break;\n\n      case 8800:\n        newch = '=';\n        break;\n\n      case 8814:\n        newch = '<';\n        break;\n\n      case 8815:\n        newch = '>';\n        break;\n    }\n    if (newch) {\n      chars.push(newch.charCodeAt(0));\n    } else {\n      chars.push(ch);\n    }\n  }\n\n  // return string\n  return String.fromCharCode(...chars);\n}\n","/*\n * raw.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nimport { EditorUI } from './ui';\nimport { setBlockType } from 'prosemirror-commands';\n\nexport const kTexFormat = 'tex';\nexport const kHTMLFormat = 'html';\nexport const kHTML4Format = 'html4';\nexport const kHTML5Format = 'html5';\n\nexport function isRawHTMLFormat(format: string) {\n  return [kHTMLFormat, kHTML4Format, kHTML5Format].includes(format);\n}\n\nexport function editRawBlockCommand(ui: EditorUI, outputFormats: string[]) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    const schema = state.schema;\n\n    // enable if we are either inside a raw block or we can insert a raw block\n    const rawBlock = findParentNodeOfType(schema.nodes.raw_block)(state.selection);\n\n    if (!rawBlock && !setBlockType(schema.nodes.raw_block, { format: 'html' })(state)) {\n      return false;\n    }\n\n    async function asyncEditRawBlock() {\n      if (dispatch) {\n        // get existing attributes (if any)\n        const raw = {\n          format: '',\n          content: '',\n        };\n        if (rawBlock) {\n          raw.format = rawBlock.node.attrs.format;\n        }\n\n        // show dialog\n        const result = await ui.dialogs.editRawBlock(raw, outputFormats);\n        if (result) {\n          const tr = state.tr;\n\n          // remove means convert the block to text\n          if (rawBlock) {\n            const range = { from: rawBlock.pos, to: rawBlock.pos + rawBlock.node.nodeSize };\n            if (result.action === 'remove') {\n              tr.setBlockType(range.from, range.to, schema.nodes.paragraph);\n            } else if (result.action === 'edit') {\n              tr.setNodeMarkup(range.from, rawBlock.node.type, { format: result.raw.format });\n              setTextSelection(tr.selection.from - 1, -1)(tr);\n            }\n          } else {\n            insertRawNode(tr, result.raw.format);\n          }\n\n          dispatch(tr);\n        }\n      }\n\n      if (view) {\n        view.focus();\n      }\n    }\n    asyncEditRawBlock();\n\n    return true;\n  };\n}\n\n// function to create a raw node\nfunction createRawNode(schema: Schema, format: string) {\n  return schema.nodes.raw_block.create({ format })!;\n}\n\n// function to create and insert a raw node, then set selection inside of it\nfunction insertRawNode(tr: Transaction, format: string) {\n  const schema = tr.doc.type.schema;\n  const prevSel = tr.selection;\n  tr.replaceSelectionWith(createRawNode(schema, format), false);\n  setTextSelection(tr.mapping.map(prevSel.from), -1)(tr);\n}\n","/*\n * image.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { kPixelUnit, kPercentUnit } from './css';\n\nconst kDpi = 96;\n\n// https://github.com/jgm/pandoc/blob/master/src/Text/Pandoc/ImageSize.hs\nexport const kValidUnits = [kPixelUnit, 'in', 'cm', 'mm', kPercentUnit];\n\nexport enum ImageType {\n  Image,\n  Figure,\n}\n\nexport interface ImageDimensions {\n  naturalWidth: number | null;\n  naturalHeight: number | null;\n  containerWidth: number;\n}\n\nexport function isValidImageSizeUnit(unit: string) {\n  return kValidUnits.includes(unit);\n}\n\nexport function imageSizePropWithUnit(prop: string | null) {\n  if (prop) {\n    const match = prop.match(/(^\\d*\\.?\\d*)(.*)$/);\n    if (match) {\n      return {\n        size: parseFloat(match[1]),\n        unit: match[2],\n      };\n    } else {\n      return null;\n    }\n  } else {\n    return null;\n  }\n}\n\nexport function isNaturalAspectRatio(width: number, height: number, dims: ImageDimensions, defaultValue: boolean) {\n  if (dims.naturalWidth && dims.naturalHeight) {\n    const diff = Math.abs(width / height - dims.naturalWidth / dims.naturalHeight);\n    return diff <= 0.01 * (width / height);\n  } else {\n    // no naturalWidth or naturalHeight, return default\n    return defaultValue;\n  }\n}\n\nexport function unitToPixels(value: number, unit: string, containerWidth: number) {\n  let pixels;\n  switch (unit) {\n    case 'in':\n      pixels = value * kDpi;\n      break;\n    case 'mm':\n      pixels = value * (kDpi / 25.4);\n      break;\n    case 'cm':\n      pixels = value * (kDpi / 2.54);\n      break;\n    case kPercentUnit:\n      pixels = (value / 100) * ensureContainerWidth(containerWidth);\n      break;\n    case kPixelUnit:\n    default:\n      pixels = value;\n      break;\n  }\n  return Math.round(pixels);\n}\n\nexport function pixelsToUnit(pixels: number, unit: string, containerWidth: number) {\n  switch (unit) {\n    case 'in':\n      return pixels / kDpi;\n    case 'mm':\n      return (pixels / kDpi) * 25.4;\n    case 'cm':\n      return (pixels / kDpi) * 2.54;\n    case kPercentUnit:\n      return (pixels / ensureContainerWidth(containerWidth)) * 100;\n    case kPixelUnit:\n    default:\n      return pixels;\n  }\n}\n\nexport function roundUnit(value: number, unit: string) {\n  switch (unit) {\n    case 'in':\n      return value.toFixed(2);\n    case 'cm':\n      return value.toFixed(1);\n    default:\n      return Math.round(value).toString();\n  }\n}\n\n// sometime when we are called before the DOM renders the containerWidth\n// is 0, in this case provide a default of 1000\nexport function ensureContainerWidth(containerWidth: number) {\n  return containerWidth || 1000;\n}\n","/*\n * extension.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\n\nexport enum FixupContext {\n  Load,\n  Save,\n  Resize,\n}\n\nexport type FixupFn = (tr: Transaction, fixupContext: FixupContext) => Transaction;\n","/*\n * css.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { kWidthAttrib, kHeightAttrib, kStyleAttrib } from './pandoc_attr';\n\nexport const kPercentUnit = '%';\nexport const kPixelUnit = 'px';\nexport function removeStyleAttrib(style: string, attrib: string, handler?: (attrib: string, value: string) => void) {\n  const pattern = '(' + attrib + ')\\\\:\\\\s*([^;]+);?';\n  const regex = new RegExp(pattern, 'g');\n  return style.replace(regex, (_match, p1, p2) => {\n    if (handler) {\n      handler(p1, p2);\n    }\n    return '';\n  });\n}\n\nexport function extractSizeStyles(keyvalues: Array<[string, string]> | undefined) {\n  if (!keyvalues) {\n    return keyvalues;\n  }\n\n  let newKeyvalues = keyvalues;\n\n  const getValue = (key: string) => {\n    const pair = newKeyvalues.find(keyvalue => keyvalue[0] === key);\n    return pair ? pair[1] : null;\n  };\n\n  const setValue = (key: string, value: string | null) => {\n    newKeyvalues = newKeyvalues.filter(keyvalue => keyvalue[0] !== key);\n    if (value) {\n      newKeyvalues.push([key, value]);\n    }\n  };\n\n  let width = getValue(kWidthAttrib);\n  let height = getValue(kHeightAttrib);\n  let style = getValue(kStyleAttrib);\n\n  if (style) {\n    style = removeStyleAttrib(style, kWidthAttrib, (_attrib, value) => {\n      if (!width) {\n        width = value;\n      }\n    });\n    style = removeStyleAttrib(style, kHeightAttrib, (_attrib, value) => {\n      if (!height) {\n        height = value;\n      }\n    });\n\n    // remove leading ; from style\n    style = style.replace(/^\\s*;+\\s*/, '').trimLeft();\n  }\n\n  setValue(kWidthAttrib, width);\n  setValue(kHeightAttrib, height);\n  setValue(kStyleAttrib, style);\n\n  return newKeyvalues;\n}\n\nexport function applyStyles(el: HTMLElement, classes?: string[], style?: { [key: string]: string }) {\n  if (classes) {\n    if (classes) {\n      classes.forEach(clz => el.classList.add(clz));\n    }\n  }\n  if (style) {\n    Object.keys(style).forEach(name => {\n      el.style.setProperty(name, style[name]);\n    });\n  }\n}\n\nexport function replaceClassWithStyle(el: HTMLElement, className: string, style: { [key: string]: string }) {\n  if (el.classList.contains(className)) {\n    el.classList.remove(className);\n    if (el.classList.length === 0) {\n      el.removeAttribute('class');\n    }\n\n    Object.keys(style).forEach(name => {\n      el.style.setProperty(name, style[name]);\n    });\n  }\n  const children: any = el.children;\n  for (const child of children) {\n    replaceClassWithStyle(child, className, style);\n  }\n}\n","/*\n * diff.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { diff_match_patch, DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT } from 'diff-match-patch';\n\nexport enum EditorChangeType {\n  Insert = 1,\n  Equal = 0,\n  Delete = -1,\n}\n\nexport interface EditorChange {\n  type: EditorChangeType;\n  value: string;\n}\n\nexport function diffChars(from: string, to: string, timeout: number): EditorChange[] {\n  const dmp = new diff_match_patch();\n  dmp.Diff_Timeout = timeout;\n  const diff = dmp.diff_main(from, to);\n  dmp.diff_cleanupSemantic(diff);\n  return diff.map(d => {\n    let type: EditorChangeType;\n    switch (d[0]) {\n      case DIFF_INSERT:\n        type = EditorChangeType.Insert;\n        break;\n      case DIFF_EQUAL:\n        type = EditorChangeType.Equal;\n        break;\n      case DIFF_DELETE:\n        type = EditorChangeType.Delete;\n        break;\n      default:\n        throw new Error('Unexpected diff type: ' + d[0]);\n    }\n    return {\n      type,\n      value: d[1],\n    };\n  });\n}\n","/*\n * input_rule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, MarkType, NodeType, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { InputRule, wrappingInputRule } from 'prosemirror-inputrules';\n\nimport { PandocMark, markIsActive } from './mark';\n\nexport function markInputRule(\n  regexp: RegExp,\n  markType: MarkType,\n  filter: MarkInputRuleFilter,\n  getAttrs?: ((match: string[]) => object) | object,\n) {\n  return new InputRule(regexp, (state: EditorState, match: string[], start: number, end: number) => {\n    if (!filter(state, start, end)) {\n      return null;\n    }\n\n    const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n    const tr = state.tr;\n    if (match[1]) {\n      const textStart = start + match[0].indexOf(match[1]);\n      const textEnd = textStart + match[1].length;\n      if (textEnd < end) {\n        tr.delete(textEnd, end);\n      }\n      if (textStart > start) {\n        tr.delete(start, textStart);\n      }\n      end = start + match[1].length;\n    }\n    const mark = markType.create(attrs);\n    tr.addMark(start, end, mark);\n    tr.removeStoredMark(mark); // Do not continue with mark.\n    return tr;\n  });\n}\n\nexport function delimiterMarkInputRule(\n  delim: string,\n  markType: MarkType,\n  filter: MarkInputRuleFilter,\n  prefixMask?: string,\n  noEnclosingWhitespace?: boolean,\n) {\n  // create distinct patterns depending on whether we allow enclosing whitespace\n  const contentPattern = noEnclosingWhitespace\n    ? `[^\\\\s${delim}][^${delim}]+[^\\\\s${delim}]|[^\\\\s${delim}]{1,2}`\n    : `[^${delim}]+`;\n\n  // if there is no prefix mask then this is simple regex we can pass to markInputRule\n  if (!prefixMask) {\n    const regexp = `(?:${delim})(${contentPattern})(?:${delim})$`;\n    return markInputRule(new RegExp(regexp), markType, filter);\n\n    // otherwise we need custom logic to get mark placement/eliding right\n  } else {\n    // build regex\n    const regexp = `(^|[^${prefixMask}])(?:${delim})(${contentPattern})(?:${delim})$`;\n\n    // return rule\n    return new InputRule(new RegExp(regexp), (state: EditorState, match: string[], start: number, end: number) => {\n      if (!filter(state, start, end)) {\n        return null;\n      }\n\n      // init transaction\n      const tr = state.tr;\n\n      // compute offset for mask (should be zero if this was the beginning of a line,\n      // in all other cases it would be the length of the any mask found).\n      const maskOffset = match[1].length;\n\n      // position of text to be formatted\n      const textStart = start + match[0].indexOf(match[2]);\n      const textEnd = textStart + match[2].length;\n\n      // remove trailing markdown\n      tr.delete(textEnd, end);\n\n      // update start/end to reflect the leading mask which we want to leave alone\n      start = start + maskOffset;\n      end = start + match[2].length;\n\n      // remove leading markdown\n      tr.delete(start, textStart);\n\n      // add mark\n      const mark = markType.create();\n      tr.addMark(start, end, mark);\n\n      // remove stored mark so typing continues w/o the mark\n      tr.removeStoredMark(mark);\n\n      // return transaction\n      return tr;\n    });\n  }\n}\n\nexport type MarkInputRuleFilter = (context: EditorState | Transaction, from?: number, to?: number) => boolean;\n\nexport function markInputRuleFilter(schema: Schema, marks: readonly PandocMark[]): MarkInputRuleFilter {\n  const maskedMarkTypes = marksWithNoInputRules(schema, marks);\n\n  return (context: EditorState | Transaction, from?: number, to?: number) => {\n    if (from !== undefined && to !== undefined && from !== to) {\n      const marksInRange: MarkType[] = [];\n      context.doc.nodesBetween(from, to, node => {\n        node.marks.forEach(mark => marksInRange.push(mark.type));\n      });\n      return !marksInRange.some(markType => maskedMarkTypes.includes(markType));\n    }\n    if (from === undefined) {\n      for (const markType of maskedMarkTypes) {\n        if (markIsActive(context, markType)) {\n          return false;\n        }\n      }\n    }\n    return true;\n  };\n}\n\nexport function conditionalWrappingInputRule(\n  regexp: RegExp,\n  nodeType: NodeType,\n  predicate: (state: EditorState) => boolean,\n  getAttrs?: { [key: string]: any } | ((p: string[]) => { [key: string]: any } | null | undefined),\n  joinPredicate?: (p1: string[], p2: ProsemirrorNode) => boolean,\n): InputRule {\n  const wrappingRule: any = wrappingInputRule(regexp, nodeType, getAttrs, joinPredicate);\n  return new InputRule(regexp, (state: EditorState, match: string[], start: number, end: number) => {\n    if (!predicate(state)) {\n      return null;\n    }\n    return wrappingRule.handler(state, match, start, end);\n  });\n}\n\nfunction marksWithNoInputRules(schema: Schema, marks: readonly PandocMark[]): MarkType[] {\n  const disabledMarks: MarkType[] = [];\n  marks.forEach((mark: PandocMark) => {\n    if (mark.noInputRules) {\n      disabledMarks.push(schema.marks[mark.name]);\n    }\n  });\n  return disabledMarks;\n}\n","/*\n * wrap.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\n\nimport { split } from 'sentence-splitter';\n\nimport { trTransform } from './transaction';\nimport { findChildrenByType, findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nexport function wrapSentences(tr: Transaction) {\n  trTransform(tr, wrapSentencesTransform);\n}\n\nfunction wrapSentencesTransform(tr: Transform) {\n  // find all paragraphs in doc\n  const schema = tr.doc.type.schema;\n  const paragraphs = findChildrenByType(tr.doc, schema.nodes.paragraph);\n\n  // insert linebreaks in paragraphs (go backwards to preserve positions)\n  paragraphs.reverse().forEach(paragraph => {\n    // don't break sentences inside tight list items\n    const $pos = tr.doc.resolve(paragraph.pos);\n    const parent = $pos.node($pos.depth);\n    if (parent.type === schema.nodes.list_item && $pos.node($pos.depth - 1).attrs.tight) {\n      return;\n    }\n\n    // don't break sentences inside tables\n    if (schema.nodes.table && findParentNodeOfTypeClosestToPos($pos, schema.nodes.table)) {\n      return;\n    }\n\n    // don't break bookdown text references\n    const textContent = paragraph.node.textContent;\n    if (/^\\(ref\\:[^\\s]+\\)\\s+[^\\s]/.test(textContent)) {\n      return;\n    }\n\n    // break sentences in text\n    const parts = split(textContent);\n    parts\n      .reverse()\n      .filter(part => part.type === 'Sentence')\n      .forEach(sentence => {\n        // don't break sentence if at least one mark is active\n        if (tr.doc.resolve(paragraph.pos + sentence.range[1] + 1).marks().length === 0) {\n          const hardBreak = schema.text('\\n');\n          const hardBreakPos = paragraph.pos + sentence.range[1] + 2;\n          tr.insert(hardBreakPos, hardBreak);\n        }\n      });\n  });\n}\n","/*\n * yaml_metadata-title.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\n\nimport { transactionsAreTypingChange, transactionsHaveChange } from '../../api/transaction';\nimport {\n  isYamlMetadataNode,\n  yamlMetadataNodes,\n  kYamlMetadataTitleRegex,\n  titleFromYamlMetadataNode,\n} from '../../api/yaml';\n\nconst plugin = new PluginKey<string>('yaml-metadata-title');\n\nexport function yamlMetadataTitlePlugin() {\n  return new Plugin<string>({\n    key: plugin,\n    state: {\n      init(_config, state: EditorState) {\n        return titleFromState(state);\n      },\n\n      apply(tr: Transaction, title: string, oldState: EditorState, newState: EditorState) {\n        const transactions = [tr];\n\n        // doc didn't change, return existing title\n        if (!tr.docChanged) {\n          return title;\n\n          // non-typing change, do a full rescan\n        } else if (!transactionsAreTypingChange(transactions)) {\n          return titleFromState(newState);\n\n          // change that affects a yaml metadata block, do a full rescan\n        } else if (transactionsHaveChange(transactions, oldState, newState, isYamlMetadataNode)) {\n          return titleFromState(newState);\n        }\n\n        // otherwise return the existing title\n        else {\n          return title;\n        }\n      },\n    },\n  });\n}\n\nexport function getTitle(state: EditorState) {\n  return plugin.getState(state);\n}\n\nexport function setTitle(state: EditorState, title: string) {\n  // alias schema\n  const schema = state.schema;\n\n  // no-op if yaml_metadata isn't available\n  if (!schema.nodes.yaml_metadata) {\n    return;\n  }\n\n  // create transaction\n  const tr = state.tr;\n\n  // escape quotes in title then build the title line\n  const escapedTitle = title.replace(/\"/g, `\\\\\"`);\n  const titleLine = `\\ntitle: \"${escapedTitle}\"\\n`;\n\n  // attempt to update existing title\n  const yamlNodes = yamlMetadataNodes(tr.doc);\n  let foundTitle = false;\n  for (const yaml of yamlNodes) {\n    const titleMatch = yaml.node.textContent.match(kYamlMetadataTitleRegex);\n    if (titleMatch) {\n      const updatedMetadata = yaml.node.textContent.replace(kYamlMetadataTitleRegex, titleLine);\n      const updatedNode = schema.nodes.yaml_metadata.createAndFill({}, schema.text(updatedMetadata));\n      tr.replaceRangeWith(yaml.pos, yaml.pos + yaml.node.nodeSize, updatedNode);\n      foundTitle = true;\n      break;\n    }\n  }\n\n  // if we didn't find a title then inject one at the top\n  if (!foundTitle) {\n    const yamlText = schema.text(`---${titleLine}---`);\n    const yamlNode = schema.nodes.yaml_metadata.create({}, yamlText);\n    tr.insert(1, yamlNode);\n  }\n\n  // return transaction\n  return tr;\n}\n\nfunction titleFromState(state: EditorState) {\n  const yamlNodes = yamlMetadataNodes(state.doc);\n  for (const yaml of yamlNodes) {\n    const title = titleFromYamlMetadataNode(yaml.node);\n    if (title) {\n      return title;\n    }\n  }\n  return '';\n}\n","/*\n * oultine.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { NodeWithPos } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { transactionsHaveChange, kSetMarkdownTransaction } from '../api/transaction';\nimport { findTopLevelBodyNodes } from '../api/node';\nimport { uuidv4 } from '../api/util';\nimport {\n  EditorOutlineItem,\n  EditorOutlineItemType,\n  EditorOutline,\n  isOutlineNode,\n  getEditingOutlineLocation,\n  getDocumentOutline,\n} from '../api/outline';\nimport { navigateToPos } from '../api/navigation';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { rmdChunkEngineAndLabel } from '../api/rmd';\n\nconst kOutlineIdsTransaction = 'OutlineIds';\n\nconst plugin = new PluginKey<EditorOutline>('outline');\n\nconst extension: Extension = {\n  appendTransaction: (schema: Schema) => {\n    return [\n      {\n        name: 'outline',\n        filter: hasOutlineIdsTransaction,\n        nodeFilter: isOutlineNode,\n        append: (tr: Transaction) => {\n          const usedIds = new Set<string>();\n          const needsOutlineId = (node: ProsemirrorNode) => {\n            if (isOutlineNode(node)) {\n              if (node.attrs.navigation_id === null) {\n                return true;\n              } else if (usedIds.has(node.attrs.navigation_id)) {\n                return true;\n              } else {\n                usedIds.add(node.attrs.navigation_id);\n                return false;\n              }\n            } else {\n              return false;\n            }\n          };\n          const needsOutlineIdNodes = findTopLevelBodyNodes(tr.doc, needsOutlineId);\n          needsOutlineIdNodes.forEach(outlineId => {\n            tr.setNodeMarkup(outlineId.pos, outlineId.node.type, {\n              ...outlineId.node.attrs,\n              navigation_id: uuidv4(),\n            });\n            tr.setMeta(kOutlineIdsTransaction, true);\n          });\n        },\n      },\n    ];\n  },\n\n  commands: () => {\n    return [\n      new ProsemirrorCommand(EditorCommandId.GoToNextSection, ['Mod-PageDown'], goToSectionCommand('next')),\n      new ProsemirrorCommand(EditorCommandId.GoToPreviousSection, ['Mod-PageUp'], goToSectionCommand('previous')),\n    ];\n  },\n\n  plugins: (schema: Schema) => {\n    return [\n      new Plugin<EditorOutline>({\n        key: plugin,\n\n        // track editor outline as state changes\n        state: {\n          init: (_config, state: EditorState) => {\n            return editorOutline(state);\n          },\n          apply: (tr: Transaction, value: EditorOutline, oldState: EditorState, newState: EditorState) => {\n            if (transactionsAffectOutline([tr], oldState, newState)) {\n              return editorOutline(newState);\n            } else {\n              return value; // don't need to map b/c there are no positions in the data structure\n            }\n          },\n        },\n      }),\n    ];\n  },\n};\n\nexport function goToSectionCommand(dir: 'next' | 'previous') {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    if (dispatch && view) {\n      let outline = getDocumentOutline(state);\n      if (dir === 'previous') {\n        outline = outline.reverse();\n      }\n      const target = outline.find(nodeWithPos => {\n        if (dir === 'next') {\n          return nodeWithPos.pos > state.selection.head;\n        } else {\n          return nodeWithPos.pos < state.selection.head - 1;\n        }\n      });\n      if (target) {\n        navigateToPos(view, target.pos, false);\n      }\n    }\n    return true;\n  };\n}\n\nfunction editorOutline(state: EditorState): EditorOutline {\n  // get all of the headings (bail if there are none)\n  const doc = state.doc;\n  const outlineNodes = findTopLevelBodyNodes(doc, isOutlineNode);\n  if (!outlineNodes.length) {\n    return [];\n  }\n\n  // create mapping of node type names to their current sequence\n  const sequence = new Map<string, number>();\n\n  // function to create an outline item from a node\n  const editorOutlineItem = (nodeWithPos: NodeWithPos, defaultLevel: number) => {\n    const typename = nodeWithPos.node.type.name;\n\n    // build sequence (ordinal of entry within node type)\n    let sequenceLast = sequence.get(typename);\n    if (sequenceLast === undefined) {\n      sequenceLast = 0;\n    }\n    const sequenceNext = sequenceLast + 1;\n    sequence.set(typename, sequenceNext);\n\n    const item = {\n      navigation_id: nodeWithPos.node.attrs.navigation_id,\n      type: nodeWithPos.node.type.name as EditorOutlineItemType,\n      level: nodeWithPos.node.attrs.level || defaultLevel,\n      title: nodeWithPos.node.type.spec.code ? nodeWithPos.node.type.name : nodeWithPos.node.textContent,\n      sequence: sequenceNext,\n      children: [],\n    };\n    \n    // if this is an R Markdown chunk, extract the title from the chunk\n    if (nodeWithPos.node.type.name === 'rmd_chunk') {\n      const chunk = rmdChunkEngineAndLabel(nodeWithPos.node.textContent);\n      if (chunk) {\n        item.title = chunk.label;\n      }\n    }\n    return item; \n  };\n\n  // extract the outline\n  const rootOutlineItem: EditorOutlineItem = {\n    navigation_id: '',\n    type: '' as EditorOutlineItemType,\n    level: 0,\n    sequence: 0,\n    title: '',\n    children: [],\n  };\n  const containers: EditorOutlineItem[] = [];\n  containers.push(rootOutlineItem);\n  const top = () => containers[containers.length - 1];\n  outlineNodes.forEach(nodeWithPos => {\n    // get outline item from document node\n    const outlineItem = editorOutlineItem(nodeWithPos, top().level + 1);\n\n    // pop containers until we reach <= our level\n    while (outlineItem.level <= top().level) {\n      containers.pop();\n    }\n\n    // add the outline node\n    top().children.push(outlineItem);\n\n    // make it the the active container if it's a heading\n    if (outlineItem.type === 'heading') {\n      containers.push(outlineItem);\n    }\n  });\n\n  // return children of root\n  return rootOutlineItem.children;\n}\n\nfunction hasOutlineIdsTransaction(transactions: Transaction[]) {\n  return transactions.some(tr => tr.getMeta(kOutlineIdsTransaction));\n}\n\nfunction transactionsAffectOutline(transactions: Transaction[], oldState: EditorState, newState: EditorState) {\n  return (\n    transactions.some(tr => tr.getMeta(kSetMarkdownTransaction)) ||\n    hasOutlineIdsTransaction(transactions) ||\n    transactionsHaveChange(transactions, oldState, newState, isOutlineNode)\n  );\n}\n\nexport function getOutline(state: EditorState): EditorOutline {\n  return plugin.getState(state)!;\n}\n\nexport default extension;\n","/*\n * find.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Extension } from '../api/extension';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { mergedTextNodes } from '../api/text';\nimport { kAddToHistoryTransaction } from '../api/transaction';\nimport { editingRootNode } from '../api/node';\nimport zenscroll from 'zenscroll';\n\nconst key = new PluginKey<DecorationSet>('find-plugin');\n\nclass FindPlugin extends Plugin<DecorationSet> {\n  private term: string = '';\n  private options: FindOptions = {};\n  private updating: boolean = false;\n\n  // The HTML element containing the last known selected search result\n  private resultElement: HTMLElement|null = null;\n\n  // A DOM mutation observer that watches for search results to be rendered\n  private resultObserver: MutationObserver|null = null;\n\n  // The ID for a timer that ensures the resultObserver completes quickly\n  private resultObserverTimer: number = 0;\n\n  constructor() {\n    super({\n      key,\n      state: {\n        init: (_config: { [key: string]: any }, instance: EditorState) => {\n          return DecorationSet.empty;\n        },\n        apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n          if (this.updating) {\n            return this.resultDecorations(tr);\n          } else {\n            return DecorationSet.empty;\n          }\n        },\n      },\n      view: () => ({\n        update: (view: EditorView, prevState: EditorState) => {\n          // Clear any previous search result observer\n          this.clearResultObserver();\n\n          // If there is a search result selected, navigate to it\n          if (this.isResultSelected(view.state)) {\n            this.scrollToSelectedResult(view, null);\n          }\n        },\n      }),\n      props: {\n        decorations: (state: EditorState) => {\n          return key.getState(state);\n        },\n      },\n    });\n  }\n\n  public find(term: string, options: FindOptions) {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      if (dispatch) {\n        this.term = !options.regex ? term.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') : term;\n        this.options = options;\n        this.updateResults(state, dispatch);\n      }\n      return true;\n    };\n  }\n\n  public matchCount(state: EditorState) {\n    return key.getState(state)!.find().length;\n  }\n\n  public selectFirst() {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      const decorations: Decoration[] = key.getState(state)!.find(0);\n      if (decorations.length === 0) {\n        return false;\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n        this.selectResult(tr, decorations[0]);\n        this.withResultUpdates(() => {\n          dispatch(tr);\n        });\n      }\n\n      return true;\n    };\n  }\n\n  public selectCurrent() {\n    return this.selectNext(false);\n  }\n\n  public selectNext(afterSelection = true) {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n      const searchFrom = afterSelection\n        ? this.matchesTerm(selectedText)\n          ? state.selection.to + 1\n          : state.selection.to\n        : state.selection.from;\n\n      const decorationSet = key.getState(state)!;\n      let decorations: Decoration[] = decorationSet.find(searchFrom);\n      if (decorations.length === 0) {\n        // check for wrapping\n        if (this.options.wrap) {\n          const searchTo = this.matchesTerm(selectedText) ? state.selection.from - 1 : state.selection.from;\n          decorations = decorationSet.find(0, searchTo);\n          if (decorations.length === 0) {\n            return false;\n          }\n          // no wrapping\n        } else {\n          return false;\n        }\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n        this.selectResult(tr, decorations[0]);\n        this.withResultUpdates(() => {\n          dispatch(tr);\n        });\n      }\n      return true;\n    };\n  }\n\n  public selectPrevious() {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      // sort out where we are searching up to\n      const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n      const searchTo = this.matchesTerm(selectedText) ? state.selection.from - 1 : state.selection.from;\n\n      // get all decorations up to the current selection\n      const decorationSet = key.getState(state)!;\n      let decorations: Decoration[] = decorationSet.find(0, searchTo);\n      if (decorations.length === 0) {\n        // handle wrapping\n        if (this.options.wrap) {\n          const searchFrom = this.matchesTerm(selectedText) ? state.selection.to + 1 : state.selection.to;\n          decorations = decorationSet.find(searchFrom);\n          if (decorations.length === 0) {\n            return false;\n          }\n          // no wrapping\n        } else {\n          return false;\n        }\n      }\n\n      // find the one closest to the beginning of the current selection\n      if (dispatch) {\n        // now we need to find the decoration with the largest from value\n        const decoration = decorations.reduce((lastDecoration, nextDecoration) => {\n          if (nextDecoration.from > lastDecoration.from) {\n            return nextDecoration;\n          } else {\n            return lastDecoration;\n          }\n        });\n\n        const tr = state.tr;\n        this.selectResult(tr, decoration);\n        this.withResultUpdates(() => {\n          dispatch(tr);\n        });\n      }\n      return true;\n    };\n  }\n\n  public replace(text: string) {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      if (!this.isResultSelected(state)) {\n        return false;\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n        const selectionMarks = tr.selection.$from.marksAcross(tr.selection.$to);\n        tr.replaceSelectionWith(state.schema.text(text, selectionMarks), false);\n        this.withResultUpdates(() => {\n          dispatch(tr);\n        });\n      }\n\n      return true;\n    };\n  }\n\n  public replaceAll(text: string) {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      \n      let replaced = 0;\n\n      if (!this.hasTerm()) {\n        return replaced;\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n\n        const decorationSet = key.getState(state)!;\n\n        const decorations: Decoration[] = decorationSet.find(0);\n        decorations.forEach(decoration => {\n          const from = tr.mapping.map(decoration.from);\n          const to = tr.mapping.map(decoration.to);\n          tr.insertText(text, from, to);\n          replaced += 1;\n        });\n        this.withResultUpdates(() => {\n          dispatch(tr);\n        });\n      }\n\n      return replaced;\n    };\n  }\n\n  public clear() {\n    return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n      if (dispatch) {\n        this.term = '';\n        this.options = {};\n        this.updateResults(state, dispatch);\n      }\n      return true;\n    };\n  }\n\n  private updateResults(state: EditorState, dispatch: (tr: Transaction<any>) => void) {\n    this.withResultUpdates(() => {\n      const tr = state.tr;\n      tr.setMeta(kAddToHistoryTransaction, false);\n      dispatch(tr);\n    });\n  }\n\n  private resultDecorations(tr: Transaction): DecorationSet {\n    // bail if no search term\n    if (!this.hasTerm()) {\n      return DecorationSet.empty;\n    }\n\n    // decorations to return\n    const decorations: Decoration[] = [];\n\n    // merge text nodes\n    const textNodes = mergedTextNodes(tr.doc);\n\n    textNodes.forEach(textNode => {\n      const search = this.findRegEx();\n      if (!search) {\n        return;\n      }\n\n      let m;\n      // tslint:disable-next-line no-conditional-assignment\n      while ((m = search.exec(textNode.text))) {\n        if (m[0] === '') {\n          break;\n        }\n        const from = textNode.pos + m.index;\n        const to = textNode.pos + m.index + m[0].length;\n        const classes = ['pm-find-text'];\n        if (from === tr.selection.from && to === tr.selection.to) {\n          classes.push('pm-selected-text');\n        }\n        decorations.push(Decoration.inline(from, to, { class: classes.join(' ') }));\n      }\n    });\n\n    // return as decoration set\n    return decorations.length ? DecorationSet.create(tr.doc, decorations) : DecorationSet.empty;\n  }\n\n  private withResultUpdates(f: () => void) {\n    this.updating = true;\n    f();\n    this.updating = false;\n  }\n\n  private selectResult(tr: Transaction, decoration: Decoration) {\n    const selection = new TextSelection(tr.doc.resolve(decoration.from), tr.doc.resolve(decoration.to));\n    return tr.setSelection(selection).scrollIntoView();\n  }\n\n  private isResultSelected(state: EditorState) {\n    if (this.hasTerm()) {\n      const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n      return this.matchesTerm(selectedText);\n    } else {\n      return false;\n    }\n  }\n\n  /**\n   * Watch for a search result to appear in the DOM. When it does, scroll it\n   * into view.\n   * \n   * @param view The current EditorView \n   */\n  private watchForSelectedResult(view: EditorView) {\n    // Clear any previous result observer\n    this.clearResultObserver();\n\n    // Create a new result observer to watch for results to be rendered\n    this.resultObserver = new MutationObserver((records: MutationRecord[], observer: MutationObserver) => {\n      let resultElement:HTMLElement|null = null;\n\n      // Predicate for testing a node to see if it looks like the active search result\n      const isResultNode = (node: Node): boolean => {\n        if (node.nodeType !== node.ELEMENT_NODE) {\n          return false;\n        }\n        const ele = node as HTMLElement;\n        return ele.classList.contains('pm-find-text') && \n               ele.classList.contains('pm-selected-text');\n      };\n\n      // Examine each mutation record to see if it's the one we're looking for\n      records.forEach((mutation) => {\n        switch(mutation.type) {\n          case 'childList':\n            // Case 1: a new search result node was added to the DOM\n            mutation.addedNodes.forEach((node) => {\n              if (isResultNode(node)) {\n                resultElement = node as HTMLElement;\n              }\n            });\n            break;\n          case 'attributes':\n            // Case 2: an existing node gained a \"class\" attribute and is now an\n            // active search result\n            if (isResultNode(mutation.target)) {\n              resultElement = mutation.target as HTMLElement;\n            }\n            break;\n        }\n      });\n\n      // If we found a result element, scroll it into view and turn off the DOM\n      // observer. (If we didn't find one, it may be an irrelevant DOM mutation,\n      // so ignore it.)\n      if (resultElement) {\n        this.scrollToSelectedResult(view, resultElement);\n        this.clearResultObserver();\n      }\n    });\n\n    const editingRoot = editingRootNode(view.state.selection);\n    if (editingRoot) {\n      const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n\n      // Begin observing the editing surface for DOM mutations\n      this.resultObserver.observe(container, {\n        subtree: true,\n        childList: true,\n        attributeFilter: ['class']  // Only interested in changes to the \"class\" attribute\n      });\n\n      // The search results should appear quickly (we're really just waiting for\n      // a render loop). If the observer runs for longer than 1s, just cancel\n      // it, as it consumes resources and anything observed is likely to be\n      // spurious.\n      this.resultObserverTimer = window.setTimeout(() => {\n        this.clearResultObserver();\n      }, 1000);\n    }\n  }\n\n  /**\n   * Cleans all state related to the search result DOM observer\n   */\n  private clearResultObserver() {\n    // Disconnect the result observer if running\n    if (this.resultObserver !== null) {\n      this.resultObserver.disconnect();\n      this.resultObserver = null;\n    }\n\n    // Remove the result observer timer if running\n    if (this.resultObserverTimer !== 0) {\n      window.clearTimeout(this.resultObserverTimer);\n      this.resultObserverTimer = 0;\n    }\n  }\n\n  /**\n   * Scrolls the selected search result into view.\n   * \n   * @param view The EditorView on which to act\n   * @param resultElement The HTML element containing the search result, if known\n   */\n  private scrollToSelectedResult(view: EditorView, resultElement: HTMLElement|null) {\n    const editingRoot = editingRootNode(view.state.selection);\n    if (editingRoot) {\n      const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n\n      if (resultElement === null) {\n        // Attempt to find a result element to scroll to if we weren't given one\n        resultElement = container.querySelector(\".pm-find-text.pm-selected-text\");\n      }\n\n      if (resultElement === null || resultElement === this.resultElement) {\n        // If we didn't find a result element, or if we found a stale one\n        // (hasn't changed), defer scrolling until it has been rendered. This is\n        // most common when the search result is inside an Ace editor chunk,\n        // which puts the result in the DOM on a deferred render loop.\n        this.watchForSelectedResult(view);\n        return;\n      } \n\n      this.resultElement = resultElement;\n\n      // Starting offset for scroll position \n      let offset = 100;\n\n      // Zenscroll can only scroll to a direct child element of the scroll\n      // container, but the element containing the search result may be deeply\n      // nested in the container. Walk up the DOM tree, summing the offsets,\n      // until we get to an element that's actually a child of the scroll\n      // container. \n      let scrollElement = resultElement;\n      while (scrollElement.offsetParent?.parentElement !== container) {\n        offset += scrollElement.offsetTop;\n        const nextParent = scrollElement.offsetParent;\n        if (nextParent === null) {\n          break;\n        } \n        scrollElement = nextParent as HTMLElement;\n      }\n\n      // Perform the scroll to the element's container plus its offset inside\n      // the container.\n      const scroller = zenscroll.createScroller(container);\n      scroller.center(scrollElement, 350, offset);\n    }\n  }\n\n  private hasTerm() {\n    return this.term.length > 0;\n  }\n\n  private matchesTerm(text: string) {\n    if (this.hasTerm()) {\n      const regex = this.findRegEx();\n      if (regex) {\n        return regex.test(text);\n      } else {\n        return false;\n      }\n    } else {\n      return false;\n    }\n  }\n\n  private findRegEx() {\n    try {\n      return new RegExp(this.term, !this.options.caseSensitive ? 'gui' : 'gu');\n    } catch {\n      return null;\n    }\n  }\n}\n\nconst extension: Extension = {\n  plugins: () => {\n    return [new FindPlugin()];\n  },\n};\n\nexport interface FindOptions {\n  regex?: boolean;\n  caseSensitive?: boolean;\n  wrap?: boolean;\n}\n\nexport function find(view: EditorView, term: string, options: FindOptions): boolean {\n  return findPlugin(view).find(term, options)(view.state, view.dispatch);\n}\n\nexport function matchCount(view: EditorView): number {\n  return findPlugin(view).matchCount(view.state);\n}\n\nexport function selectFirst(view: EditorView): boolean {\n  return findPlugin(view).selectFirst()(view.state, view.dispatch);\n}\n\nexport function selectCurrent(view: EditorView): boolean {\n  return findPlugin(view).selectCurrent()(view.state, view.dispatch);\n}\n\nexport function selectNext(view: EditorView): boolean {\n  return findPlugin(view).selectNext()(view.state, view.dispatch);\n}\n\nexport function selectPrevious(view: EditorView): boolean {\n  return findPlugin(view).selectPrevious()(view.state, view.dispatch);\n}\n\nexport function replace(view: EditorView, text: string): boolean {\n  return findPlugin(view).replace(text)(view.state, view.dispatch);\n}\n\nexport function replaceAll(view: EditorView, text: string) {\n  return findPlugin(view).replaceAll(text)(view.state, view.dispatch);\n}\n\nexport function clear(view: EditorView): boolean {\n  return findPlugin(view).clear()(view.state, view.dispatch);\n}\n\nexport function findPluginState(state: EditorState): DecorationSet | null | undefined {\n  return key.getState(state);\n}\n\nfunction findPlugin(view: EditorView): FindPlugin {\n  return key.get(view.state) as FindPlugin;\n}\n\nexport default extension;\n","/*\n * omni_insert.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { DOMOutputSpecArray, Mark, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { PandocOutput } from '../../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { selectionAllowsCompletions } from '../../api/completion';\nimport { OmniInserter } from '../../api/omni_insert';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\nimport { EditorUI } from '../../api/ui';\n\nimport { omniInsertCompletionHandler } from './omni_insert-completion';\nimport { Extension } from '../../api/extension';\nimport { markIsActive } from '../../api/mark';\n\nexport function markOmniInsert() {\n  return {\n    marks: [\n      {\n        name: 'omni_insert',\n        spec: {\n          inclusive: true,\n          noInputRules: true,\n          parseDOM: [{ tag: \"span[class*='omni_insert']\" }],\n          toDOM(): DOMOutputSpecArray {\n            return ['span', { class: 'omni_insert' }];\n          },\n        },\n        pandoc: {\n          readers: [],\n          writer: {\n            priority: 30,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              output.writeInlines(parent);\n            },\n          },\n        },\n      },\n    ],\n  };\n}\n\nexport function omniInsertExtension(\n  omniInserters: OmniInserter[],\n  inputRuleFilter: MarkInputRuleFilter,\n  ui: EditorUI,\n): Extension {\n  return {\n    commands: () => [new OmniInsertCommand(inputRuleFilter)],\n    completionHandlers: () => [omniInsertCompletionHandler(omniInserters, ui)],\n  };\n}\n\nclass OmniInsertCommand extends ProsemirrorCommand {\n  constructor(markFilter: MarkInputRuleFilter) {\n    super(\n      EditorCommandId.OmniInsert,\n      ['Mod-/'],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        // check whether selection allows completions\n        if (!selectionAllowsCompletions(state.selection)) {\n          return false;\n        }\n\n        // if the marks is already active then bail\n        if (markIsActive(state, state.schema.marks.omni_insert)) {\n          return false;\n        }\n\n        // check the mark filter\n        if (!markFilter(state)) {\n          return false;\n        }\n\n        if (dispatch) {\n          const mark = state.schema.marks.omni_insert.create();\n          const node = state.schema.text('/', [mark]);\n          const tr = state.tr;\n          tr.replaceSelectionWith(node, false);\n          dispatch(tr);\n        }\n\n        return true;\n      },\n    );\n  }\n}\n","/*\n * completion.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { EditorView, DecorationSet } from 'prosemirror-view';\n\nimport { canInsertNode } from './node';\nimport { EditorUI } from './ui';\nimport { kInsertCompletionTransaction } from './transaction';\n\nexport const kCompletionDefaultItemHeight = 22;\nexport const kCompletionDefaultMaxVisible = 10;\nexport const kCompletionDefaultWidth = 180;\n\nexport interface CompletionContext {\n  isPaste: boolean;\n}\n\nexport interface CompletionsStream<T = any> {\n  items: T[];\n  stream: () => T[] | null;\n}\n\nexport type Completions<T = any> = T[] | CompletionsStream<T>;\n\nexport interface CompletionResult<T = any> {\n  pos: number;\n  offset?: number;\n  token: string;\n  completions: (state: EditorState, context: CompletionContext) => Promise<Completions>;\n  decorations?: DecorationSet;\n}\n\nexport interface CompletionHeaderProps {\n  ui: EditorUI;\n  message?: string;\n}\n\nexport interface CompletionHandler<T = any> {\n  // unique id\n  id: string;\n\n  // An optional scope for this completion handler. Completions\n  // triggered by a transaction will filter completion handlers\n  // that share a scope with the completion handler that originated\n  // a transaction.\n  scope?: string;\n\n  // filter for determing whether we can call this handler from a given context (default is to\n  // never offer completions if a mark with noInputRules is active). set to null to\n  // allow completion anywhere\n  enabled?: ((context: EditorState | Transaction) => boolean) | null;\n\n  // return a set of completions for the given context. text is the text before\n  // before the cursor in the current node (but no more than 500 characters)\n  completions(text: string, context: EditorState | Transaction): CompletionResult | null;\n\n  // filter a previously returned set of completions\n  filter?: (completions: T[], state: EditorState, token: string, prevToken?: string) => T[] | null;\n\n  // provide a completion replacement as a string or node (can be passed null if the popup was dismissed)\n  replacement?(schema: Schema, completion: T | null): string | ProsemirrorNode | null;\n\n  // lower level replacement handler (can be passed null if the popup was dismissed)\n  replace?(view: EditorView, pos: number, completion: T | null): Promise<any>;\n\n  // completion view\n  view: {\n    // optional header component (will go inside a <th>)\n    header?: () =>\n      | {\n          component: React.FC<CompletionHeaderProps> | React.ComponentClass<CompletionHeaderProps>;\n          height: number;\n          message?: string;\n        }\n      | undefined;\n\n    // react compontent type for viewing the item\n    component: React.FC<T> | React.ComponentClass<T>;\n\n    key: (completion: T) => any;\n\n    // width of completion item (defaults to 180).\n    width?: number;\n\n    // height of completion item (defaults to 22px)\n    height?: number;\n\n    // use horizontal orientation (defaults to false)\n    // (optionally provide a set of item widths)\n    horizontal?: boolean;\n    horizontalItemWidths?: number[];\n\n    // maximum number of visible items (defaults to 10). note that\n    // this only applies to completion poupups w/ vertical orientation\n    // (scrolling is not supported for horizontal orientation)\n    maxVisible?: number;\n\n    // hide 'no results' (default false)\n    hideNoResults?: boolean;\n  };\n}\n\nexport function selectionAllowsCompletions(selection: Selection) {\n  const schema = selection.$head.parent.type.schema;\n\n  // non empty selections don't have completions\n  if (!selection.empty) {\n    return false;\n  }\n\n  // must be able to insert text\n  if (!canInsertNode(selection, schema.nodes.text)) {\n    return false;\n  }\n\n  // must not be in a code mark\n  if (schema.marks.code && !!schema.marks.code.isInSet(selection.$from.marks())) {\n    return false;\n  }\n\n  // must not be in a code node\n  if (selection.$head.parent.type.spec.code) {\n    return false;\n  }\n\n  return true;\n}\n\n// Determine whether two completionHandlers share the same scope. By default\n// completion handlers will share scope only if they share an id, but handlers\n// can provide a scope if they'd like to coordinate.\nexport function completionsShareScope(handler: CompletionHandler, prevHandler?: CompletionHandler) {\n  // There is no previous handler, not shared\n  if (!prevHandler) {\n    return false;\n  }\n\n  // Previous handler with the same scope as the current handler\n  if (prevHandler.scope && prevHandler.scope === handler.scope) {\n    return true;\n  } else {\n    // Previous handler has the same id as the current handler\n    return prevHandler.id === handler.id;\n  }\n}\n\nexport function performCompletionReplacement(tr: Transaction, pos: number, replacement: ProsemirrorNode | string) {\n  // set selection to area we will be replacing\n  tr.setSelection(new TextSelection(tr.doc.resolve(pos), tr.selection.$head));\n\n  // ensure we have a node\n  if (replacement instanceof ProsemirrorNode) {\n    // combine it's marks w/ whatever is active at the selection\n    const marks = tr.selection.$head.marks();\n\n    // set selection and replace it\n    tr.replaceSelectionWith(replacement, false);\n\n    // propapate marks\n    marks.forEach(mark => tr.addMark(pos, tr.selection.to, mark));\n  } else {\n    tr.insertText(replacement);\n  }\n\n  // mark the transaction as an completion insertion\n  tr.setMeta(kInsertCompletionTransaction, true);\n}\n","/*\n * omni_insert.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Selection, Transaction } from 'prosemirror-state';\nimport { EditorView, DecorationSet } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport React from 'react';\nimport { firstBy } from 'thenby';\n\nimport { OmniInserter, omniInsertGroupCompare, omniInsertPriorityCompare } from '../../api/omni_insert';\nimport { CompletionHandler, CompletionResult } from '../../api/completion';\n\nimport { EditorUI } from '../../api/ui';\nimport { placeholderDecoration, emptyNodePlaceholderPlugin } from '../../api/placeholder';\nimport { kAddToHistoryTransaction } from '../../api/transaction';\n\nimport './omni_insert-completion.css';\n\nexport function omniInsertCompletionHandler(\n  omniInserters: OmniInserter[],\n  ui: EditorUI,\n): CompletionHandler<OmniInserter> {\n  return {\n    id: 'E305158D-20D6-474D-84E6-06607CA58578',\n\n    completions: omniInsertCompletions(omniInserters, ui),\n\n    filter: (completions: OmniInserter[], state: EditorState, token: string) => {\n      // match contents of name or keywords (and verify the command is enabled)\n      return completions\n        .filter(inserter => {\n          return (\n            token.length === 0 ||\n            inserter.name.toLowerCase().indexOf(token) !== -1 ||\n            inserter.keywords?.some(keyword => keyword.indexOf(token) !== -1)\n          );\n        })\n        .filter(inserter => {\n          return inserter.command(state);\n        })\n        .sort(\n          firstBy(omniInsertGroupCompare)\n            .thenBy(omniInsertPriorityCompare, { direction: 'desc' })\n            .thenBy('name'),\n        );\n    },\n\n    replace(view: EditorView, pos: number, completion: OmniInserter | null) {\n      // helper to remove command text\n      const removeCommandText = () => {\n        const tr = view.state.tr;\n        tr.deleteRange(pos, view.state.selection.head);\n        tr.setMeta(kAddToHistoryTransaction, false);\n        view.dispatch(tr);\n      };\n\n      // execute command if provided\n      if (completion) {\n        // remove existing text\n        removeCommandText();\n\n        // execute the command\n        completion.command(view.state, view.dispatch, view);\n\n        // perform any requested selection offset\n        if (completion.selectionOffset) {\n          const tr = view.state.tr;\n          setTextSelection(tr.selection.from + completion.selectionOffset)(tr);\n          tr.setMeta(kAddToHistoryTransaction, false);\n          view.dispatch(tr);\n        }\n\n        // if this is a dismiss of an omni_insert mark then the command\n        // isn't part of 'natural' typing into the document, so remove it\n      } else if (isOmniInsertCommandActive(view.state.selection)) {\n        removeCommandText();\n      }\n      return Promise.resolve();\n    },\n\n    view: {\n      component: OmniInserterView,\n      key: command => command.id,\n      width: 320,\n      height: 46,\n      maxVisible: 5,\n    },\n  };\n}\n\nconst kOmniInsertRegex = /\\/([\\w]*)$/;\n\nfunction omniInsertCompletions(omniInserters: OmniInserter[], ui: EditorUI) {\n  return (text: string, context: EditorState | Transaction): CompletionResult<OmniInserter> | null => {\n    const match = text.match(kOmniInsertRegex);\n    if (match) {\n      // we need to either be at the beginning of our parent, OR the omni_insert mark needs\n      // to be active (that indicates that we entered omni insert mode via a user command)\n      if (match.index !== 0 && !isOmniInsertCommandActive(context.selection)) {\n        return null;\n      }\n\n      // capture query (note that no query returns all).\n      const query = match[1].toLowerCase();\n\n      // include a decoration if the query is empty\n      const decorations =\n        query.length === 0\n          ? DecorationSet.create(context.doc, [\n              placeholderDecoration(context.selection.head, ui.context.translateText(' type to search...')),\n            ])\n          : undefined;\n\n      // return the completion result\n      return {\n        // match at the /\n        pos: context.selection.head - match[0].length,\n\n        // unique identifier for this request\n        token: query,\n\n        // return all omniInserters (will refine via filter)\n        completions: (state: EditorState) => {\n          return Promise.resolve(omniInserters);\n        },\n\n        // search placehodler decorator if there is no query\n        decorations,\n      };\n    } else {\n      return null;\n    }\n  };\n}\n\nconst OmniInserterView: React.FC<OmniInserter> = inserter => {\n  return (\n    <table className={'pm-omni-insert-completion'}>\n      <tbody>\n        <tr>\n          <td className={'pm-omni-insert-icon'}>\n            <img className={'pm-block-border-color'} src={inserter.image()} alt=\"\" />\n          </td>\n          <td>\n            <div className={'pm-omni-insert-name pm-completion-list-item-text'}>{inserter.name}</div>\n            <div className={'pm-omni-insert-description pm-completion-list-item-text'}>{inserter.description}</div>\n          </td>\n        </tr>\n      </tbody>\n    </table>\n  );\n};\n\nfunction isOmniInsertCommandActive(selection: Selection) {\n  const schema = selection.$head.parent.type.schema;\n  return schema.marks.omni_insert.isInSet(selection.$head.marks());\n}\n","/*\n * omni_insert.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CommandFn } from './command';\n\n// descriptive info for omni insert\nexport interface OmniInsert {\n  name: string;\n  keywords?: string[];\n  description: string;\n  group: OmniInsertGroup;\n  priority?: number;\n  selectionOffset?: number;\n  image: () => string;\n}\n\n// descriptive info + ability to identify/execute\nexport interface OmniInserter extends OmniInsert {\n  id: string;\n  command: CommandFn;\n}\n\nexport enum OmniInsertGroup {\n  Headings = 'Headings',\n  Chunks = 'Chunks',\n  Lists = 'Lists',\n  Math = 'Math',\n  References = 'References',\n  Content = 'Content',\n  Blocks = 'Blocks',\n}\n\nconst omniInsertGroupOrder = new Map<string, number>(Object.keys(OmniInsertGroup).map((key, index) => [key, index]));\n\nexport function omniInsertGroupCompare(a: OmniInsert, b: OmniInsert) {\n  return omniInsertGroupOrder.get(a.group)! - omniInsertGroupOrder.get(b.group)!;\n}\n\nexport function omniInsertPriorityCompare(a: OmniInsert, b: OmniInsert) {\n  return (a.priority || 0) - (b.priority || 0);\n}\n","/*\n * placeholder.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { EditorState, Transaction, Plugin, PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { findParentNode } from 'prosemirror-utils';\n\nimport { EditorUI } from './ui';\n\nexport function emptyNodePlaceholderPlugin(nodeType: NodeType, placeholder: (node: ProsemirrorNode) => string) {\n  const pluginKey = new PluginKey(nodeType.name + '-empty-placeholder');\n\n  return new Plugin<DecorationSet>({\n    key: pluginKey,\n    state: {\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return DecorationSet.empty;\n      },\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        // check for empty parent of our type\n        const emptyNode = findParentNode(node => node.type === nodeType && node.childCount === 0)(tr.selection);\n        if (emptyNode) {\n          const decoration = placeholderDecoration(emptyNode.pos + 1, placeholder(emptyNode.node));\n          return DecorationSet.create(tr.doc, [decoration]);\n        } else {\n          return DecorationSet.empty;\n        }\n      },\n    },\n    props: {\n      decorations(state: EditorState) {\n        return pluginKey.getState(state);\n      },\n    },\n  });\n}\n\nexport function placeholderDecoration(pos: number, text: string) {\n  return Decoration.widget(pos, (_view: EditorView, _getPos: () => number) => {\n    const placeholder = window.document.createElement('span');\n    placeholder.classList.add('pm-placeholder-text-color');\n    placeholder.innerText = text;\n    return placeholder;\n  });\n}\n\nexport function iconAndTextPlaceholderDecoration(pos: number, icon: string, text: string) {\n  return Decoration.widget(pos, (_view: EditorView, _getPos: () => number) => {\n    const container = window.document.createElement('span');\n\n    const iconImg = window.document.createElement('img');\n    iconImg.classList.add('pm-placeholder-icon');\n    iconImg.setAttribute('src', icon);\n\n    const message = window.document.createElement('span');\n    message.classList.add('pm-placeholder-text-color');\n    message.classList.add('pm-placeholder-text');\n    message.innerText = text;\n\n    container.appendChild(iconImg);\n    container.appendChild(message);\n    return container;\n  });\n}\n\nexport function searchPlaceholderDecoration(pos: number, ui: EditorUI, text?: string) {\n  return iconAndTextPlaceholderDecoration(pos, ui.images.search!, text || '');\n}\n","/*\n * completion.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// TODO: it may be that we need to not do full re-requests from the filter\n// when we have streamed results (as they can cause reset of the allCompletions)\n\nimport { Plugin, PluginKey, Transaction, Selection, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n  CompletionHandler,\n  selectionAllowsCompletions,\n  kCompletionDefaultMaxVisible,\n  completionsShareScope,\n  performCompletionReplacement,\n  CompletionResult,\n  Completions,\n  CompletionsStream,\n} from '../../api/completion';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent } from '../../api/event-types';\n\nimport { createCompletionPopup, renderCompletionPopup, destroyCompletionPopup } from './completion-popup';\nimport { EditorUI } from '../../api/ui';\nimport { PromiseQueue } from '../../api/promise';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\nimport { kInsertCompletionTransaction, kPasteTransaction } from '../../api/transaction';\n\ninterface CompletionState {\n  handler?: CompletionHandler;\n  result?: CompletionResult;\n  prevToken?: string;\n  isPaste?: boolean;\n}\n\nexport function completionExtension(\n  handlers: readonly CompletionHandler[],\n  inputRuleFilter: MarkInputRuleFilter,\n  ui: EditorUI,\n  events: EditorEvents,\n) {\n  return {\n    plugins: () => [new CompletionPlugin(handlers, inputRuleFilter, ui, events)],\n  };\n}\n\nconst key = new PluginKey<CompletionState>('completion');\n\nclass CompletionPlugin extends Plugin<CompletionState> {\n  // editor ui\n  private readonly ui: EditorUI;\n\n  // editor view\n  private view: EditorView | null = null;\n\n  // popup elemeent\n  private completionPopup: HTMLElement | null = null;\n\n  // currently selected index and last set of completions are held as transient\n  // state because they can't be derived from the document state (selectedIndex\n  // is derived from out of band user keyboard gestures and completions may\n  // have required fulfilling an external promise). also use a version counter\n  // used to invalidate async completion requests that are fulfilled after\n  // an update has occurred\n  private version = 0;\n  private allCompletions: any[] = [];\n  private completions: any[] = [];\n  private horizontal = false;\n  private selectedIndex = 0;\n\n  // serialize async completion requests\n  private completionQueue = new PromiseQueue();\n\n  // events we need to unsubscribe from\n  private readonly scrollUnsubscribe: VoidFunction;\n\n  constructor(\n    handlers: readonly CompletionHandler[],\n    inputRuleFilter: MarkInputRuleFilter,\n    ui: EditorUI,\n    events: EditorEvents,\n  ) {\n    super({\n      key,\n      state: {\n        init: () => ({}),\n        apply: (tr: Transaction, prevState: CompletionState) => {\n          // if we don't have a view then bail\n          if (!this.view) {\n            return {};\n          }\n\n          // selection only changes dismiss any active completion\n          if (!tr.docChanged && !tr.storedMarksSet && tr.selectionSet) {\n            return {};\n          }\n\n          // check whether completions are valid here\n          if (!selectionAllowsCompletions(tr.selection)) {\n            return {};\n          }\n\n          // calcluate text before cursor\n          const textBefore = completionTextBeforeCursor(tr.selection);\n\n          // if there is no text then don't handle it\n          if (textBefore.length === 0) {\n            return {};\n          }\n\n          const isPaste = tr.getMeta(kPasteTransaction) === true;\n\n          // check for a handler that can provide completions at the current selection\n          for (const handler of handlers) {\n            // first check if the handler is enabled (null means use inputRuleFilter)\n            if (handler.enabled === null || (handler.enabled ? handler.enabled(tr) : inputRuleFilter(tr))) {\n              const result = handler.completions(textBefore, tr);\n              if (result) {\n                // check if the previous state had a completion from the same handler\n                let prevToken: string | undefined;\n\n                // If this completion shares scope with the previous completion\n                // and this is a completion transaction, skip\n                if (tr.getMeta(kInsertCompletionTransaction) && completionsShareScope(handler, prevState.handler)) {\n                  continue;\n                }\n\n                if (handler.id === prevState.handler?.id) {\n                  // pass the prevToken on if the completion was for the same position\n                  if (result.pos === prevState.result?.pos) {\n                    prevToken = prevState.result.token;\n                  }\n                }\n\n                // return state\n                return { handler, result, prevToken, isPaste };\n              }\n            }\n          }\n\n          // no handler found\n          return {};\n        },\n      },\n\n      view: () => ({\n        update: (view: EditorView) => {\n          // increment version\n          this.version++;\n\n          // set view\n          this.view = view;\n\n          // update completions\n          this.updateCompletions(view, true);\n        },\n\n        destroy: () => {\n          // unsubscribe from events\n          this.scrollUnsubscribe();\n          window.document.removeEventListener('focusin', this.clearCompletions);\n\n          // tear down the popup\n          this.clearCompletions();\n        },\n      }),\n\n      props: {\n        decorations: (state: EditorState) => {\n          const pluginState = key.getState(state);\n          return pluginState?.result?.decorations;\n        },\n\n        handleDOMEvents: {\n          keydown: (view: EditorView, event: Event) => {\n            const kbEvent = event as KeyboardEvent;\n\n            let handled = false;\n\n            // determine meaning of keys based on orientation\n            const forwardKey = this.horizontal ? 'ArrowRight' : 'ArrowDown';\n            const backwardKey = this.horizontal ? 'ArrowLeft' : 'ArrowUp';\n\n            if (this.completionsActive()) {\n              switch (kbEvent.key) {\n                case 'Escape':\n                  this.dismissCompletions();\n                  handled = true;\n                  break;\n                case 'Enter':\n                case 'Tab':\n                  this.insertCompletion(view, this.selectedIndex);\n                  handled = true;\n                  break;\n                case backwardKey:\n                  this.selectedIndex = Math.max(this.selectedIndex - 1, 0);\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n                case forwardKey:\n                  this.selectedIndex = Math.min(this.selectedIndex + 1, this.completions.length - 1);\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n                case 'PageUp':\n                  this.selectedIndex = Math.max(this.selectedIndex - this.completionPageSize(), 0);\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n                case 'PageDown':\n                  this.selectedIndex = Math.min(\n                    this.selectedIndex + this.completionPageSize(),\n                    this.completions.length - 1,\n                  );\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n                case 'End':\n                  this.selectedIndex = this.completions.length - 1;\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n                case 'Home':\n                  this.selectedIndex = 0;\n                  this.renderCompletions(view);\n                  handled = true;\n                  break;\n              }\n            }\n\n            // supress event if we handled it\n            if (handled) {\n              event.preventDefault();\n              event.stopPropagation();\n            }\n\n            // return status\n            return handled;\n          },\n        },\n      },\n    });\n\n    // capture reference to ui\n    this.ui = ui;\n\n    // hide completions when we scroll or the focus changes\n    this.clearCompletions = this.clearCompletions.bind(this);\n    this.scrollUnsubscribe = events.subscribe(ScrollEvent, this.clearCompletions);\n    window.document.addEventListener('focusin', this.clearCompletions);\n  }\n\n  private updateCompletions(view: EditorView, resetSelection: boolean) {\n    const state = key.getState(view.state);\n\n    if (state?.handler && state?.result) {\n      // track the request version to invalidate the result if an\n      // update happens after it goes into flight\n      const requestVersion = this.version;\n\n      // make an async request for the completions, update allCompletions,\n      // and then apply any filter we have (allows the completer to just return\n      // everything from the aysnc query and fall back to the filter for refinement)\n      const requestAllCompletions = async () => {\n        // fetch completions\n        const completions = await state.result!.completions(view.state, { isPaste: state.isPaste === true });\n\n        // if we don't have a handler or result then return\n        if (!state.handler || !state.result) {\n          return;\n        }\n\n        // function to update completions\n        const updateCompletions = (updatedCompletions: any[]) => {\n          // save completions\n          this.setAllCompletions(updatedCompletions, !!state.handler?.view.horizontal, resetSelection);\n\n          // display if the request still maps to the current state\n          if (state.handler && state.result && this.version === requestVersion) {\n            // if there is a filter then call it and update displayed completions\n            const displayedCompletions = state.handler.filter\n              ? state.handler.filter(this.allCompletions, view.state, state.result.token)\n              : null;\n            if (displayedCompletions) {\n              this.setDisplayedCompletions(displayedCompletions, !!state.handler.view.horizontal, resetSelection);\n            }\n\n            this.renderCompletions(view);\n          }\n        };\n\n        // if we got an array, just set it. if we got a stream then poll it for it's update\n        if (Array.isArray(completions)) {\n          updateCompletions(completions);\n        } else {\n          const completionStream = completions as CompletionsStream;\n          updateCompletions(completionStream.items);\n          const pollingInterval = setInterval(() => {\n            // if the document has been updated then invalidate\n            if (this.version !== requestVersion) {\n              clearInterval(pollingInterval);\n            } else {\n              // otherwise check the stream\n              const result = completionStream.stream();\n              if (result) {\n                clearInterval(pollingInterval);\n                updateCompletions(result);\n              }\n            }\n          }, 300);\n        }\n      };\n\n      // first see if we can do this exclusively via filter\n      if (state.prevToken && state.handler.filter) {\n        this.completionQueue.enqueue(async () => {\n          // display if the request still maps to the current state\n          if (state.handler && state.result && this.version === requestVersion) {\n            const filteredCompletions = state.handler.filter!(\n              this.allCompletions,\n              view.state,\n              state.result.token,\n              state.prevToken,\n            );\n\n            // got a hit from the filter!\n            if (filteredCompletions) {\n              this.setDisplayedCompletions(filteredCompletions, !!state.handler.view.horizontal, resetSelection);\n              this.renderCompletions(view);\n\n              // couldn't use the filter, do a full request for all completions (so long as we aren't\n              // already waiting on a strea,)\n            } else {\n              await requestAllCompletions();\n            }\n          }\n        });\n      } else {\n        // no prevToken or no filter for this handler, request everything\n        this.completionQueue.enqueue(requestAllCompletions);\n      }\n    } else {\n      // no handler/result for this document state\n      this.clearCompletions();\n    }\n  }\n\n  private renderCompletions(view: EditorView) {\n    const state = key.getState(view.state);\n\n    if (state && state.handler && (this.completions.length > 0 || !state.handler.view.hideNoResults)) {\n      const props = {\n        handler: state.handler!,\n        pos: state.result!.pos + (state.result!.offset || 0),\n        completions: this.completions,\n        selectedIndex: this.selectedIndex,\n        noResults: this.ui.context.translateText('No Results'),\n        onClick: (index: number) => {\n          this.insertCompletion(view, index);\n        },\n        onHover: (index: number) => {\n          this.selectedIndex = index;\n          this.renderCompletions(view);\n        },\n        ui: this.ui,\n      };\n\n      // create the completion popup if we need to\n      if (this.completionPopup === null) {\n        this.completionPopup = createCompletionPopup();\n        window.document.body.appendChild(this.completionPopup);\n      }\n\n      // render\n      renderCompletionPopup(view, props, this.completionPopup);\n    } else {\n      // hide\n      this.hideCompletionPopup();\n    }\n  }\n\n  private async insertCompletion(view: EditorView, index: number) {\n    // default index if not specified\n    index = index || this.selectedIndex;\n\n    const state = key.getState(view.state);\n    if (state && state.handler) {\n      // perform replacement\n      const result = state.result!;\n\n      // check low level handler first\n      if (state.handler.replace) {\n        // execute replace\n        await state.handler.replace(view, result.pos, this.completions[index]);\n\n        // use higher level handler\n      } else if (state.handler.replacement) {\n        // get replacement from handler\n        const replacement = state.handler.replacement(view.state.schema, this.completions[index]);\n        if (replacement) {\n          const tr = view.state.tr;\n          performCompletionReplacement(tr, result.pos, replacement);\n          view.dispatch(tr);\n        }\n      }\n      // set focus\n      view.focus();\n    }\n    this.clearCompletions();\n  }\n\n  // explicit user dismiss of completion (e.g. Esc key)\n  private async dismissCompletions() {\n    // call lower-level replace on any active handler (w/ null). this gives\n    // them a chance to dismiss any artifacts that were explicitly inserted\n    // to trigger the handler (e.g. a cmd+/ for omni-insert)\n    if (this.view) {\n      const state = key.getState(this.view.state);\n      if (state?.result && state.handler) {\n        if (state.handler.replace) {\n          await state.handler.replace(this.view, state.result.pos, null);\n        } else if (state.handler.replacement) {\n          state.handler.replacement(this.view.state.schema, null);\n        }\n      }\n    }\n\n    this.clearCompletions();\n  }\n\n  private clearCompletions() {\n    this.setAllCompletions([], false, true);\n    this.hideCompletionPopup();\n  }\n\n  private hideCompletionPopup() {\n    if (this.completionPopup) {\n      destroyCompletionPopup(this.completionPopup);\n      this.completionPopup = null;\n    }\n  }\n\n  private completionsActive() {\n    return !!this.completionPopup;\n  }\n\n  private setAllCompletions(completions: any[], horizontal: boolean, resetSelection: boolean) {\n    this.allCompletions = completions;\n    this.setDisplayedCompletions(completions, horizontal, resetSelection);\n  }\n\n  private setDisplayedCompletions(completions: any[], horizontal: boolean, resetSelection: boolean) {\n    this.completions = completions;\n    this.horizontal = !!horizontal;\n\n    // reset selection if requested or if the current index exceeds the # of completions\n    if (resetSelection || this.selectedIndex > this.completions.length - 1) {\n      this.selectedIndex = 0;\n    }\n  }\n\n  private completionPageSize() {\n    if (this.view) {\n      const state = key.getState(this.view.state);\n      return state?.handler?.view.maxVisible || kCompletionDefaultMaxVisible;\n    } else {\n      return kCompletionDefaultMaxVisible;\n    }\n  }\n}\n\n// extract the text before the cursor, dealing with block separators and\n// non-text leaf chracters (this is based on code in prosemirror-inputrules)\nfunction completionTextBeforeCursor(selection: Selection, maxLength = 500) {\n  const { $head } = selection;\n  return $head.parent.textBetween(\n    Math.max(0, $head.parentOffset - maxLength), // start\n    $head.parentOffset, // end\n    undefined, // block separator\n    '\\ufffc', // leaf char\n  );\n}\n","/*\n * completion-popup.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport React, { useEffect } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport zenscroll from 'zenscroll';\n\nimport { applyStyles } from '../../api/css';\nimport {\n  CompletionHandler,\n  kCompletionDefaultItemHeight,\n  kCompletionDefaultMaxVisible,\n  kCompletionDefaultWidth,\n} from '../../api/completion';\nimport { Popup } from '../../api/widgets/popup';\n\nimport './completion-popup.css';\nimport { EditorUI } from '../../api/ui';\n\nconst kNoResultsHeight = 22;\n\nexport interface CompletionListProps {\n  handler: CompletionHandler;\n  pos: number;\n  completions: any[];\n  selectedIndex: number;\n  noResults: string;\n  onHover: (index: number) => void;\n  onClick: (index: number) => void;\n  ui: EditorUI;\n}\n\nexport function createCompletionPopup(): HTMLElement {\n  const popup = window.document.createElement('div');\n  popup.style.position = 'absolute';\n  popup.style.zIndex = '900';\n  return popup;\n}\n\nexport function renderCompletionPopup(view: EditorView, props: CompletionListProps, popup: HTMLElement) {\n  // position popup\n  const size = completionPopupSize(props);\n  const positionStyles = completionPopupPositionStyles(view, props.pos, size.width, size.height);\n  applyStyles(popup, [], positionStyles);\n\n  // render popup\n  ReactDOM.render(<CompletionPopup {...props} />, popup);\n}\n\nexport function destroyCompletionPopup(popup: HTMLElement) {\n  ReactDOM.unmountComponentAtNode(popup);\n  popup.remove();\n}\n\nconst CompletionPopup: React.FC<CompletionListProps> = props => {\n  // main completion popup + class + dark mode if appropriate\n  const classes = ['pm-completion-popup'].concat(props.ui.prefs.darkMode() ? ['pm-dark-mode'] : []);\n  return (\n    <Popup classes={classes}>\n      <CompletionList {...props} />\n    </Popup>\n  );\n};\n\nconst CompletionList: React.FC<CompletionListProps> = props => {\n  const size = completionPopupSize(props);\n  const itemHeight = props.handler.view.height || kCompletionDefaultItemHeight;\n\n  // keep selected index in view\n  const containerRef = React.useRef<HTMLDivElement>(null);\n  useEffect(() => {\n    const containerEl = containerRef.current;\n    if (containerEl) {\n      const rows = containerEl.getElementsByClassName('pm-completion-list-item-row');\n      const scrollToRow = rows.item(props.selectedIndex);\n      if (scrollToRow) {\n        const scroller = zenscroll.createScroller(containerEl);\n        scroller.intoView(scrollToRow as HTMLElement);\n      }\n    }\n  }, [props.selectedIndex]);\n\n  // item event handler\n  const itemEventHandler = (index: number, handler: (index: number) => void) => {\n    return (event: React.MouseEvent) => {\n      event.preventDefault();\n      event.stopPropagation();\n      handler(index);\n    };\n  };\n\n  // completion source based on orientation\n  const completions = props.handler.view.horizontal ? horizontalCompletions : verticalCompletions;\n\n  const classes = ['pm-completion-list'].concat(props.handler.view.horizontal ? ['pm-completion-list-horizontal'] : []);\n\n  return (\n    <div\n      ref={containerRef}\n      className={classes.join(' ')}\n      style={{ width: size.width + 'px', height: size.height + 'px' }}\n    >\n      <table>\n        {completionsHeader(props.handler, props.completions.length, props)}\n        <tbody>\n          {completions(props, itemHeight, itemEventHandler)}\n          {props.completions.length === 0 ? completionsNoResults(props) : null}\n        </tbody>\n      </table>\n    </div>\n  );\n};\n\nfunction completionsHeader(handler: CompletionHandler, completionCount: number, props: CompletionListProps) {\n  if (handler.view.header) {\n    const completionHeader = handler.view.header ? handler.view.header() : undefined;\n    const headerProps = { message: completionHeader?.message, ...props };\n\n    if (completionHeader) {\n      const header = React.createElement(completionHeader.component, headerProps);\n      return (\n        <thead>\n          <tr>\n            <th\n              style={{ lineHeight: completionHeader.height + 'px' }}\n              colSpan={props.handler.view.horizontal ? completionCount : undefined}\n            >\n              {header}\n            </th>\n          </tr>\n        </thead>\n      );\n    } else {\n      return null;\n    }\n  } else {\n    return null;\n  }\n}\n\ntype ItemEventHandler = (index: number, handler: (index: number) => void) => (event: React.MouseEvent) => void;\n\nfunction verticalCompletions(props: CompletionListProps, itemHeight: number, itemEventHandler: ItemEventHandler) {\n  return props.completions.map((completion, index) => {\n    const { key, cell } = completionItemCell(props, completion, index);\n    return (\n      <tr\n        key={key}\n        style={{ lineHeight: itemHeight + 'px' }}\n        className={'pm-completion-list-item-row'}\n        onClick={itemEventHandler(index, props.onClick)}\n        onMouseMove={itemEventHandler(index, props.onHover)}\n      >\n        {cell}\n      </tr>\n    );\n  });\n}\n\nfunction horizontalCompletions(props: CompletionListProps, itemHeight: number, itemEventHandler: ItemEventHandler) {\n  const cellWidths = horizontalCellWidths(props);\n  return (\n    <tr style={{ lineHeight: itemHeight + 'px' }}>\n      {props.completions.map((completion, index) => {\n        const { cell } = completionItemCell(props, completion, index, cellWidths[index], itemEventHandler);\n        return cell;\n      })}\n    </tr>\n  );\n}\n\nfunction completionItemCell(\n  props: CompletionListProps,\n  completion: any,\n  index: number,\n  width?: number,\n  itemEventHandler?: ItemEventHandler,\n) {\n  // need to provide key for both wrapper and item\n  // https://stackoverflow.com/questions/28329382/understanding-unique-keys-for-array-children-in-react-js#answer-28329550\n  const key = props.handler.view.key(completion);\n  const item = React.createElement(props.handler.view.component, { ...completion, key });\n  const className = 'pm-completion-list-item' + (index === props.selectedIndex ? ' pm-selected-list-item' : '');\n  const cell = (\n    <td\n      key={key}\n      style={width ? { width: width + 'px' } : undefined}\n      className={className}\n      onClick={itemEventHandler ? itemEventHandler(index, props.onClick) : undefined}\n      onMouseMove={itemEventHandler ? itemEventHandler(index, props.onHover) : undefined}\n    >\n      {item}\n    </td>\n  );\n  return { key, cell };\n}\n\nfunction completionsNoResults(props: CompletionListProps) {\n  return (\n    <tr\n      className={'pm-completion-no-results pm-placeholder-text-color'}\n      style={{ lineHeight: kNoResultsHeight + 'px' }}\n    >\n      <td>{props.noResults}</td>\n    </tr>\n  );\n}\n\nfunction completionPopupSize(props: CompletionListProps) {\n  // kicker for list margins/border/etc\n  const kCompletionsChrome = 8;\n\n  // get view props (apply defaults)\n  let { height: itemHeight = kCompletionDefaultItemHeight } = props.handler.view;\n  const { maxVisible = kCompletionDefaultMaxVisible, width = kCompletionDefaultWidth } = props.handler.view;\n\n  // add 2px for the border to item heights\n  const kBorderPad = 2;\n  itemHeight += kBorderPad;\n\n  // compute header height\n  let headerHeight = 0;\n  if (props.handler.view.header) {\n    const completionHeader = props.handler.view.header();\n    if (completionHeader) {\n      headerHeight = completionHeader.height + kBorderPad;\n    }\n  }\n\n  // complete based on horizontal vs. vertical\n  if (props.handler.view.horizontal) {\n    // horizontal mode can provide explicit item widths\n    const kTablePadding = 8;\n    const kCellPadding = 8;\n    const kCellBorders = 2;\n    const totalWidth =\n      horizontalCellWidths(props).reduce((total, current) => {\n        return total + (current + kCellPadding + kCellBorders);\n      }, 0) + kTablePadding;\n\n    return {\n      width: totalWidth,\n      height: headerHeight + itemHeight + kCompletionsChrome,\n    };\n  } else {\n    // compute height (subject it to a minimum require to display 'no results')\n    const height =\n      headerHeight +\n      kCompletionsChrome +\n      Math.max(itemHeight * Math.min(maxVisible, props.completions.length), kNoResultsHeight);\n\n    // return\n    return { width, height };\n  }\n}\n\nfunction horizontalCellWidths(props: CompletionListProps) {\n  const { width = kCompletionDefaultWidth } = props.handler.view;\n  return props.completions.map((_completion, index) => {\n    if (props.handler.view.horizontalItemWidths) {\n      return props.handler.view.horizontalItemWidths[index] || width;\n    } else {\n      return width;\n    }\n  });\n}\n\nfunction completionPopupPositionStyles(view: EditorView, pos: number, width: number, height: number) {\n  // some constants\n  const kMinimumPaddingToEdge = 5;\n  const kCompletionsVerticalPadding = 5;\n\n  // default position\n  const selectionCoords = view.coordsAtPos(pos);\n\n  let top = selectionCoords.bottom + kCompletionsVerticalPadding;\n  let left = selectionCoords.left;\n\n  // see if we need to be above\n  if (top + height + kMinimumPaddingToEdge >= window.innerHeight) {\n    top = selectionCoords.top - height - kCompletionsVerticalPadding;\n  }\n\n  // see if we need to be to the left (use cursor as pos in this case)\n  if (left + width + kMinimumPaddingToEdge >= window.innerWidth) {\n    const cursorCoords = view.coordsAtPos(view.state.selection.head);\n    left = cursorCoords.right - width;\n  }\n\n  return {\n    left: left + 'px',\n    top: top + 'px',\n  };\n}\n","/*\n * popup.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nexport type PopupProps = WidgetProps;\n\nexport const Popup: React.FC<PopupProps> = props => {\n  const className = ['pm-popup', 'pm-text-color', 'pm-proportional-font', 'pm-pane-border-color', 'pm-background-color']\n    .concat(props.classes || [])\n    .join(' ');\n\n  const style: React.CSSProperties = {\n    ...props.style,\n    position: 'absolute',\n    zIndex: 10,\n  };\n\n  return (\n    <div className={className} style={style} contentEditable={false} suppressContentEditableWarning={true}>\n      {props.children}\n    </div>\n  );\n};\n","/*\n * promise.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\ninterface PendingPromise<T> {\n  promise: () => Promise<T>;\n  resolve: (result: T) => void;\n  reject: (reason: any) => void;\n}\n\nexport class PromiseQueue<T = unknown> {\n  private queue = new Array<PendingPromise<T>>();\n  private running = false;\n\n  public enqueue(promise: () => Promise<T>) {\n    return new Promise<T>((resolve, reject) => {\n      this.queue.push({\n        promise,\n        resolve,\n        reject,\n      });\n      this.dequeue();\n    });\n  }\n\n  private dequeue() {\n    if (this.running) {\n      return false;\n    }\n    const item = this.queue.shift();\n    if (!item) {\n      return false;\n    }\n    try {\n      this.running = true;\n      item\n        .promise()\n        .then(value => {\n          this.running = false;\n          item.resolve(value);\n          this.dequeue();\n        })\n        .catch(err => {\n          this.running = false;\n          item.reject(err);\n          this.dequeue();\n        });\n    } catch (err) {\n      this.running = false;\n      item.reject(err);\n      this.dequeue();\n    }\n    return true;\n  }\n}\n","/*\n * spelling-doc.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView, DecorationSet, Decoration } from 'prosemirror-view';\nimport { TextSelection, Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocMark } from '../../api/mark';\nimport {\n  EditorWordRange,\n  EditorSpellingDoc,\n  EditorWordSource,\n  EditorAnchor,\n  EditorRect,\n  EditorUISpelling,\n} from '../../api/spelling';\nimport { scrollIntoView } from '../../api/scroll';\n\nimport { excludedMarks, getWords, spellcheckerWord } from './spelling';\n\n// get the document interface required by interactive spellchecking\n\nexport function getSpellingDoc(\n  view: EditorView,\n  marks: readonly PandocMark[],\n  spelling: EditorUISpelling,\n): EditorSpellingDoc {\n  // alias schema\n  const schema = view.state.schema;\n\n  // intialize marks we don't want to check\n  const excluded = excludedMarks(schema, marks);\n\n  // check begin\n  spellingDocPlugin(view.state).onCheckBegin();\n\n  return {\n    getWords: (start: number, end: number): EditorWordSource => {\n      return getWords(view.state, start, end, spelling, excluded);\n    },\n\n    createAnchor: (pos: number): EditorAnchor => {\n      return spellingDocPlugin(view.state).createAnchor(pos);\n    },\n\n    shouldCheck: (_wordRange: EditorWordRange): boolean => {\n      return true;\n    },\n\n    setSelection: (wordRange: EditorWordRange) => {\n      const tr = view.state.tr;\n      tr.setSelection(TextSelection.create(tr.doc, wordRange.start, wordRange.end));\n      view.dispatch(tr);\n    },\n\n    getText: (wordRange: EditorWordRange): string => {\n      const word = view.state.doc.textBetween(wordRange.start, wordRange.end);\n      return spellcheckerWord(word);\n    },\n\n    replaceSelection: (text: string) => {\n      const tr = view.state.tr;\n      const selectionMarks = tr.selection.$from.marks();\n      tr.replaceSelectionWith(view.state.schema.text(text, selectionMarks), false);\n      view.dispatch(tr);\n    },\n\n    getCursorPosition: (): number => {\n      return view.state.selection.to;\n    },\n\n    getSelectionStart: (): number => {\n      return view.state.selection.from;\n    },\n\n    getSelectionEnd: (): number => {\n      return view.state.selection.to;\n    },\n\n    getCursorBounds: (): EditorRect => {\n      const fromCoords = view.coordsAtPos(view.state.selection.from);\n      const toCoords = view.coordsAtPos(view.state.selection.to);\n\n      return {\n        x: Math.min(fromCoords.left, toCoords.left),\n        y: fromCoords.top,\n        width: Math.abs(fromCoords.left - toCoords.left),\n        height: toCoords.bottom - fromCoords.top,\n      };\n    },\n\n    moveCursorNearTop: () => {\n      scrollIntoView(view, view.state.selection.from, false, undefined, 100);\n    },\n\n    dispose: () => {\n      spellingDocPlugin(view.state).onCheckEnd(view);\n    },\n  };\n}\n\n// companion plugin for SpellingDoc provided above (shows 'fake' selection during\n// interactive spell check dialog and maintains anchor position(s) across\n// transactions that occur while the dialog/doc is active)\n\nconst spellingDocKey = new PluginKey<DecorationSet>('spelling-doc-plugin');\n\nfunction spellingDocPlugin(state: EditorState) {\n  return spellingDocKey.get(state) as SpellingDocPlugin;\n}\n\nexport class SpellingDocPlugin extends Plugin<DecorationSet> {\n  private checking = false;\n  private anchors: SpellingAnchor[] = [];\n\n  constructor() {\n    super({\n      key: spellingDocKey,\n      state: {\n        init: () => {\n          return DecorationSet.empty;\n        },\n        apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n          if (this.checking) {\n            // map anchors\n            this.anchors.forEach(anchor => {\n              anchor.setPosition(tr.mapping.map(anchor.getPosition()));\n            });\n\n            // show selection\n            if (!tr.selection.empty) {\n              return DecorationSet.create(tr.doc, [\n                Decoration.inline(tr.selection.from, tr.selection.to, { class: 'pm-selected-text' }),\n              ]);\n            }\n          }\n\n          return DecorationSet.empty;\n        },\n      },\n      props: {\n        decorations: (state: EditorState) => {\n          return spellingDocKey.getState(state);\n        },\n      },\n    });\n  }\n\n  public createAnchor(pos: number) {\n    const anchor = new SpellingAnchor(pos);\n    this.anchors.push(anchor);\n    return anchor;\n  }\n\n  public onCheckBegin() {\n    this.checking = true;\n  }\n\n  public onCheckEnd(view: EditorView) {\n    this.checking = false;\n    this.anchors = [];\n\n    if (!view.state.selection.empty) {\n      const tr = view.state.tr;\n      setTextSelection(tr.selection.to)(tr);\n      view.dispatch(tr);\n    }\n  }\n}\n\nclass SpellingAnchor implements EditorAnchor {\n  private pos = 0;\n  constructor(pos: number) {\n    this.pos = pos;\n  }\n  public getPosition() {\n    return this.pos;\n  }\n  public setPosition(pos: number) {\n    this.pos = pos;\n  }\n}\n\nconst extension = () => {\n  return {\n    plugins: () => {\n      return [new SpellingDocPlugin()];\n    },\n  };\n};\n\nexport default extension;\n","/*\n * spelling.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { MarkType, Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\n\nimport { EditorWordSource, EditorWordRange, EditorUISpelling, kCharClassNonWord } from '../../api/spelling';\nimport { PandocMark, getMarkRange } from '../../api/mark';\n\nexport const beginDocPos = () => 1;\nexport const endDocPos = (doc: ProsemirrorNode) => doc.nodeSize - 2;\n\nexport function getWords(\n  state: EditorState,\n  start: number,\n  end: number,\n  spelling: EditorUISpelling,\n  excluded: MarkType[],\n): EditorWordSource {\n  // provide defaults\n  if (start === -1) {\n    start = beginDocPos();\n  }\n  if (end === -1) {\n    end = endDocPos(state.doc);\n  }\n\n  // enlarge range to begin/end\n  const beginPos = findBeginWord(state, start, spelling.classifyCharacter);\n  const endPos = findEndWord(state, end, spelling.classifyCharacter);\n\n  const words: EditorWordRange[] = [];\n  let currentPos = beginPos;\n  while (currentPos <= endPos) {\n    // advance until we find a word\n    currentPos = advanceToWord(state, currentPos, spelling.classifyCharacter);\n    if (currentPos >= endPos) {\n      break;\n    }\n\n    // find end of word\n    const endWordPos = findEndWord(state, currentPos, spelling.classifyCharacter);\n    if (endWordPos === currentPos) {\n      break;\n    }\n\n    // add word if it doesn't have an excluded type\n    if (!excludeWord(state.doc, currentPos, endWordPos, excluded)) {\n      const wordText = state.doc.textBetween(currentPos, endWordPos);\n      words.push(\n        ...spelling.breakWords(wordText).map(wordRange => {\n          return {\n            start: currentPos + wordRange.start,\n            end: currentPos + wordRange.end,\n          };\n        }),\n      );\n    }\n\n    // next word\n    currentPos = endWordPos;\n  }\n\n  // return iterator over word range\n  return {\n    hasNext: () => {\n      return words.length > 0;\n    },\n    next: () => {\n      if (words.length > 0) {\n        return words.shift()!;\n      } else {\n        return null;\n      }\n    },\n  };\n}\n\nfunction excludeWord(doc: ProsemirrorNode, from: number, to: number, excluded: MarkType[]) {\n  // does it have one of our excluded mark types?\n  if (excluded.some(markType => doc.rangeHasMark(from, to, markType))) {\n    return true;\n  }\n\n  // it is in a link mark where the link text is a url?\n  const schema = doc.type.schema;\n  if (schema.marks.link && doc.rangeHasMark(from, to, schema.marks.link)) {\n    const range = getMarkRange(doc.resolve(from), schema.marks.link);\n    if (range && /^[a-z]+:\\/\\/.*$/.test(doc.textBetween(range.from, range.to))) {\n      return true;\n    }\n  }\n\n  // don't exclude\n  return false;\n}\n\nexport function advanceToWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n  while (pos < endDocPos(state.doc)) {\n    const nextChar = charAt(state.doc, pos);\n    if (classifier(nextChar) !== kCharClassNonWord) {\n      break;\n    } else {\n      pos++;\n    }\n  }\n  return pos;\n}\n\nexport function findBeginWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n  // scan backwards until a non-word character is encountered\n  while (pos >= beginDocPos()) {\n    const prevChar = charAt(state.doc, pos - 1);\n    if (classifier(prevChar) === kCharClassNonWord) {\n      break;\n    } else {\n      pos--;\n    }\n  }\n  // return the position\n  return pos;\n}\n\nexport function findEndWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n  // scan forwards until a non-word character is encountered\n  while (pos < endDocPos(state.doc)) {\n    const nextChar = charAt(state.doc, pos);\n    if (classifier(nextChar) === kCharClassNonWord) {\n      break;\n    } else {\n      pos++;\n    }\n  }\n\n  // return the position\n  return pos;\n}\n\n// get the chracter code at the specified position, returning character code 32 (a space)\n// for begin/end of document, block boundaries, and non-text leaf nodes\nexport function charAt(doc: ProsemirrorNode, pos: number) {\n  if (pos < beginDocPos() || pos >= endDocPos(doc)) {\n    return 32; // space for doc boundary\n  } else {\n    return (doc.textBetween(pos, pos + 1, ' ', ' ') || ' ').charCodeAt(0);\n  }\n}\n\nexport function excludedMarks(schema: Schema, marks: readonly PandocMark[]): MarkType[] {\n  return marks.filter(mark => mark.noSpelling).map(mark => schema.marks[mark.name]);\n}\n\nexport function spellcheckerWord(word: string) {\n  return word.replace(/’/g, \"'\");\n}\n","/*\n * spelling.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kCharClassWord = 0;\nexport const kCharClassBoundary = 1;\nexport const kCharClassNonWord = 2;\n\nexport interface EditorUISpelling {\n  // realtime interface\n  realtimeEnabled: () => boolean;\n  checkWord: (word: string) => boolean;\n  suggestionList: (word: string) => string[];\n\n  // dictionary\n  isWordIgnored: (word: string) => boolean;\n  ignoreWord: (word: string) => void;\n  unignoreWord: (word: string) => void;\n  addToDictionary: (word: string) => void;\n\n  // word breaking\n  breakWords: (text: string) => EditorWordRange[];\n  classifyCharacter: (ch: number) => number;\n}\n\nexport interface EditorAnchor {\n  getPosition: () => number;\n}\n\nexport interface EditorRect {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\nexport interface EditorWordRange {\n  start: number;\n  end: number;\n}\n\nexport interface EditorWordSource {\n  hasNext: () => boolean;\n  next: () => EditorWordRange | null;\n}\n\nexport interface EditorSpellingDoc {\n  getWords: (start: number, end: number) => EditorWordSource;\n\n  createAnchor: (pos: number) => EditorAnchor;\n\n  shouldCheck: (wordRange: EditorWordRange) => boolean;\n  setSelection: (wordRange: EditorWordRange) => void;\n  getText: (wordRange: EditorWordRange) => string;\n\n  getCursorPosition: () => number;\n  replaceSelection: (text: string) => void;\n  getSelectionStart: () => number;\n  getSelectionEnd: () => number;\n\n  getCursorBounds: () => EditorRect;\n  moveCursorNearTop: () => void;\n\n  dispose: () => void;\n}\n","/*\n * spelling-realtime.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, MarkType } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, EditorView, Decoration, DecorationAttrs } from 'prosemirror-view';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\nimport { ChangeSet } from 'prosemirror-changeset';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { FocusEvent } from '../../api/event-types';\nimport { PandocMark } from '../../api/mark';\nimport { EditorUISpelling, kCharClassWord } from '../../api/spelling';\nimport { EditorEvents } from '../../api/events';\nimport { kAddToHistoryTransaction } from '../../api/transaction';\nimport { EditorUI, EditorMenuItem } from '../../api/ui';\n\nimport { excludedMarks, getWords, spellcheckerWord, findBeginWord, findEndWord, charAt } from './spelling';\n\nconst kUpdateSpellingTransaction = 'updateSpelling';\nconst kInvalidateSpellingWordTransaction = 'invalidateSpellingWord';\nconst kSpellingErrorClass = 'pm-spelling-error';\n\nconst realtimeSpellingKey = new PluginKey<DecorationSet>('spelling-realtime-plugin');\n\nexport function realtimeSpellingPlugin(\n  schema: Schema,\n  marks: readonly PandocMark[],\n  ui: EditorUI,\n  events: EditorEvents,\n) {\n  return new RealtimeSpellingPlugin(excludedMarks(schema, marks), ui, events);\n}\n\nexport function invalidateAllWords(view: EditorView) {\n  updateSpelling(view);\n}\n\nexport function invalidateWord(view: EditorView, word: string) {\n  const tr = view.state.tr;\n  tr.setMeta(kInvalidateSpellingWordTransaction, word);\n  tr.setMeta(kAddToHistoryTransaction, false);\n  view.dispatch(tr);\n}\n\nclass RealtimeSpellingPlugin extends Plugin<DecorationSet> {\n  // track whether we've ever had the focus (don't do any spelling operaitons until then)\n  private hasBeenFocused = true;\n\n  private view: EditorView | null = null;\n  private readonly ui: EditorUI;\n\n  constructor(excluded: MarkType[], ui: EditorUI, events: EditorEvents) {\n    super({\n      key: realtimeSpellingKey,\n      view: (view: EditorView) => {\n        this.view = view;\n        return {};\n      },\n      state: {\n        init: (_config, state: EditorState) => {\n          return DecorationSet.empty;\n        },\n        apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n          // if we somehow manage to get focus w/o our FocusEvent (below) being called then also\n          // flip the hasBeenFocused bit here\n          if (this.view?.hasFocus()) {\n            this.hasBeenFocused = true;\n          }\n\n          // don't continue if either realtime spelling is disabled or we have never been focused\n          if (!this.ui.spelling.realtimeEnabled() || !this.hasBeenFocused) {\n            return DecorationSet.empty;\n          }\n\n          if (tr.getMeta(kUpdateSpellingTransaction)) {\n            // explicit update request invalidates any existing decorations (this can happen when\n            // we get focus for the very firs time or when the main or secondary dictionaries change)\n            return DecorationSet.create(newState.doc, spellingDecorations(newState, ui.spelling, excluded));\n          } else if (tr.getMeta(kInvalidateSpellingWordTransaction)) {\n            // for word invalidations we search through the decorations and remove words that match\n            const word = tr.getMeta(kInvalidateSpellingWordTransaction) as string;\n\n            // find decorations that have this word and remove them\n            const wordDecos = old.find(undefined, undefined, spec => spec.word === word);\n\n            // return decorators w/ those words removed\n            return old.remove(wordDecos);\n          } else if (tr.docChanged) {\n            // perform an incremental update of spelling decorations (invalidate and re-scan\n            // for decorations in changed ranges)\n\n            // start w/ previous state\n            let decos = old;\n\n            // create change set from transaction\n            let changeSet = ChangeSet.create(oldState.doc);\n            changeSet = changeSet.addSteps(newState.doc, tr.mapping.maps);\n\n            // collect ranges that had mark changes\n            const markRanges: Array<{ from: number; to: number }> = [];\n            for (const step of tr.steps) {\n              if (step instanceof AddMarkStep || step instanceof RemoveMarkStep) {\n                const markStep = step as any;\n                markRanges.push({ from: markStep.from, to: markStep.to });\n              }\n            }\n\n            // remove ranges = mark ranges + deleted ranges\n            const removeRanges = markRanges.concat(\n              changeSet.changes.map(change => ({ from: change.fromA, to: change.toA })),\n            );\n\n            // remove decorations from deleted ranges (expanding ranges to word boundaries)\n            for (const range of removeRanges) {\n              const fromPos = findBeginWord(oldState, range.from, ui.spelling.classifyCharacter);\n              const toPos = findEndWord(oldState, range.to, ui.spelling.classifyCharacter);\n              decos = decos.remove(decos.find(fromPos, toPos));\n            }\n\n            // map decoration positions to new document\n            decos = decos.map(tr.mapping, tr.doc);\n\n            // add ranges = mark ranges + inserted ranges\n            const addRanges = markRanges.concat(\n              changeSet.changes.map(change => ({ from: change.fromB, to: change.toB })),\n            );\n\n            // scan inserted ranges for spelling decorations (don't need to find word boundaries\n            // b/c spellingDecorations already does that)\n            for (const range of addRanges) {\n              decos = decos.add(\n                tr.doc,\n                spellingDecorations(newState, ui.spelling, excluded, true, range.from, range.to),\n              );\n            }\n\n            // return decorators\n            return decos;\n          } else if (tr.selectionSet) {\n            // if we had previously suppressed a decoration due to typing at the cursor, restore it\n            // whenever the selection changes w/o the doc changing\n\n            // start with previous state\n            let decos = old;\n\n            // find any special 'at cursor' errors\n            const cursorDecos = decos.find(undefined, undefined, spec => !!spec.cursor);\n            if (cursorDecos.length) {\n              // there will only be one cursor, capture it's position then remove it\n              const word = cursorDecos[0].spec.word as string;\n              const { from, to } = cursorDecos[0];\n              decos = decos.remove(cursorDecos);\n\n              // add it back in as a real spelling error\n              decos = decos.add(tr.doc, [Decoration.inline(from, to, { class: kSpellingErrorClass }, { word })]);\n            }\n\n            // return decorators\n            return decos;\n          } else {\n            // no content or selection change, return old w/o mapping\n            return old;\n          }\n        },\n      },\n      props: {\n        decorations: (state: EditorState) => {\n          return realtimeSpellingKey.getState(state);\n        },\n        handleDOMEvents: {\n          contextmenu: spellingSuggestionContextMenuHandler(ui),\n        },\n      },\n    });\n\n    // save reference to ui\n    this.ui = ui;\n\n    // trigger update on first focus\n    const focusUnsubscribe = events.subscribe(FocusEvent, () => {\n      if (this.view) {\n        focusUnsubscribe();\n        this.hasBeenFocused = true;\n        updateSpelling(this.view);\n      }\n    });\n  }\n}\n\nfunction spellingDecorations(\n  state: EditorState,\n  spelling: EditorUISpelling,\n  excluded: MarkType[],\n  excludeCursor = false,\n  from = -1,\n  to = -1,\n): Decoration[] {\n  // break words\n  const words = getWords(state, from, to, spelling, excluded);\n\n  // spell check and return decorations for misspellings\n  const decorations: Decoration[] = [];\n  while (words.hasNext()) {\n    const word = words.next()!;\n    const wordText = state.doc.textBetween(word.start, word.end);\n    const wordCheck = spellcheckerWord(wordText);\n    if (!spelling.checkWord(wordCheck)) {\n      const attrs: DecorationAttrs = {};\n      const spec: { [key: string]: any } = {\n        word: wordCheck,\n      };\n      if (excludeCursor && state.selection.head > word.start && state.selection.head <= word.end) {\n        spec.cursor = true;\n      } else {\n        attrs.class = kSpellingErrorClass;\n      }\n      decorations.push(Decoration.inline(word.start, word.end, attrs, spec));\n    }\n  }\n  return decorations;\n}\n\nfunction spellingSuggestionContextMenuHandler(ui: EditorUI) {\n  return (view: EditorView, event: Event) => {\n    if (!ui.display.showContextMenu) {\n      return false;\n    }\n\n    // helper to create a menu action\n    const menuAction = (text: string, action: VoidFunction) => {\n      return {\n        text,\n        exec: () => {\n          action();\n          view.focus();\n        },\n      };\n    };\n\n    // helper to show a context menu and prevetn further event handling\n    const showContextMenu = (menuItems: EditorMenuItem[]) => {\n      // show the menu\n      const { clientX, clientY } = event as MouseEvent;\n      ui.display.showContextMenu!(menuItems, clientX, clientY);\n\n      // prevent default handling\n      event.stopPropagation();\n      event.preventDefault();\n    };\n\n    if (event.target && event.target instanceof Node) {\n      // alias schema\n      const schema = view.state.schema;\n\n      // find the spelling decoration at this position (if any)\n      const pos = view.posAtDOM(event.target, 0);\n      const deco = realtimeSpellingKey.getState(view.state)!.find(pos, pos);\n      if (deco.length) {\n        // get word\n        const { from, to } = deco[0];\n        const word = spellcheckerWord(view.state.doc.textBetween(from, to));\n\n        // get suggetions\n        const kMaxSuggetions = 5;\n        const suggestions = ui.spelling.suggestionList(word);\n\n        // create menu w/ suggestions\n        const menuItems: EditorMenuItem[] = suggestions.slice(0, kMaxSuggetions).map(suggestion => {\n          return {\n            text: suggestion,\n            exec: () => {\n              const tr = view.state.tr;\n              tr.setSelection(TextSelection.create(tr.doc, from, to));\n              const marks = tr.selection.$from.marks();\n              tr.replaceSelectionWith(schema.text(suggestion, marks), false);\n              setTextSelection(from + suggestion.length)(tr);\n              view.dispatch(tr);\n              view.focus();\n            },\n          };\n        });\n        if (menuItems.length) {\n          menuItems.push({ separator: true });\n        }\n\n        menuItems.push(menuAction(ui.context.translateText('Ignore All'), () => ui.spelling.ignoreWord(word)));\n        menuItems.push({ separator: true });\n        menuItems.push(\n          menuAction(ui.context.translateText('Add to Dictionary'), () => ui.spelling.addToDictionary(word)),\n        );\n\n        // show context menu\n        showContextMenu(menuItems);\n        return true;\n      }\n\n      // find the word at this position and see if it's ignored. if so provide an unignore context menu\n      const classify = ui.spelling.classifyCharacter;\n      const mouseEvent = event as MouseEvent;\n      const clickPos = view.posAtCoords({ left: mouseEvent.clientX, top: mouseEvent.clientY });\n      if (clickPos) {\n        const ch = charAt(view.state.doc, clickPos.pos);\n        if (classify(ch) === kCharClassWord) {\n          const from = findBeginWord(view.state, clickPos.pos, classify);\n          const to = findEndWord(view.state, clickPos.pos, classify);\n          const word = spellcheckerWord(view.state.doc.textBetween(from, to));\n          if (ui.spelling.isWordIgnored(word)) {\n            showContextMenu([\n              menuAction(`${ui.context.translateText('Unignore')} \\'${word}\\'`, () => ui.spelling.unignoreWord(word)),\n            ]);\n            return true;\n          }\n        }\n      }\n    }\n\n    return false;\n  };\n}\n\nfunction updateSpelling(view: EditorView) {\n  const tr = view.state.tr;\n  tr.setMeta(kUpdateSpellingTransaction, true);\n  tr.setMeta(kAddToHistoryTransaction, false);\n  view.dispatch(tr);\n}\n","/*\n * pandoc_converter.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport {\n  PandocServer,\n  PandocTokenReader,\n  PandocNodeWriter,\n  PandocMarkWriter,\n  PandocPreprocessorFn,\n  PandocBlockReaderFn,\n  PandocPostprocessorFn,\n  PandocInlineHTMLReaderFn,\n  PandocWriterOptions,\n  PandocTokensFilterFn,\n} from '../api/pandoc';\n\nimport { haveTableCellsWithInlineRcode } from '../api/rmd';\n\nimport { pandocFormatWith, PandocFormat, kGfmFormat, kCommonmarkFormat } from '../api/pandoc_format';\nimport { PandocCapabilities } from '../api/pandoc_capabilities';\nimport { PandocBlockCapsuleFilter, pandocMarkdownWithBlockCapsules } from '../api/pandoc_capsule';\n\nimport { ExtensionManager } from '../editor/editor-extensions';\n\nimport { pandocToProsemirror } from './pandoc_to_prosemirror';\nimport { pandocFromProsemirror } from './pandoc_from_prosemirror';\n\nexport type PandocLineWrapping = 'none' | 'column' | 'sentence';\n\nexport interface PandocToProsemirrorResult {\n  doc: ProsemirrorNode;\n  line_wrapping: PandocLineWrapping;\n  unrecognized: string[];\n  unparsed_meta: { [key: string]: any };\n}\n\nexport class PandocConverter {\n  private readonly schema: Schema;\n  private readonly preprocessors: readonly PandocPreprocessorFn[];\n  private readonly postprocessors: readonly PandocPostprocessorFn[];\n  private readonly readers: readonly PandocTokenReader[];\n  private readonly tokensFilters: readonly PandocTokensFilterFn[];\n  private readonly blockReaders: readonly PandocBlockReaderFn[];\n  private readonly inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[];\n  private readonly blockCapsuleFilters: readonly PandocBlockCapsuleFilter[];\n  private readonly nodeWriters: readonly PandocNodeWriter[];\n  private readonly markWriters: readonly PandocMarkWriter[];\n  private readonly pandoc: PandocServer;\n  private readonly pandocCapabilities: PandocCapabilities;\n\n  constructor(\n    schema: Schema,\n    extensions: ExtensionManager,\n    pandoc: PandocServer,\n    pandocCapabilities: PandocCapabilities,\n  ) {\n    this.schema = schema;\n\n    this.preprocessors = extensions.pandocPreprocessors();\n    this.postprocessors = extensions.pandocPostprocessors();\n    this.readers = extensions.pandocReaders();\n    this.tokensFilters = extensions.pandocTokensFilters();\n    this.blockReaders = extensions.pandocBlockReaders();\n    this.inlineHTMLReaders = extensions.pandocInlineHTMLReaders();\n    this.blockCapsuleFilters = extensions.pandocBlockCapsuleFilters();\n    this.nodeWriters = extensions.pandocNodeWriters();\n    this.markWriters = extensions.pandocMarkWriters();\n\n    this.pandoc = pandoc;\n    this.pandocCapabilities = pandocCapabilities;\n  }\n\n  public async toProsemirror(markdown: string, format: PandocFormat): Promise<PandocToProsemirrorResult> {\n    // save original markdown (for aligning capsule positions)\n    const original = markdown;\n\n    // adjust format. we always need to *read* raw_html, raw_attribute, and backtick_code_blocks b/c\n    // that's how preprocessors hoist content through pandoc into our prosemirror token parser.\n    // we always need to read with auto_identifiers so we can catch any auto-generated ids\n    // required to fulfill links inside the document (we will strip out heading ids that\n    // aren't explicit or a link target using the heading_ids returned with the ast). we also\n    // disable 'smart' b/c that causes pandoc to insert non-breaking spaces before selected\n    // abbreviations like e.g. rather, we do our own implementation of 'smart' when we read\n    // PandocTokenType.Str from the ast\n\n    // determine type of auto_ids\n    const autoIds = format.extensions.gfm_auto_identifiers ? 'gfm_auto_identifiers' : 'auto_identifiers';\n    const targetFormat = adjustedFormat(\n      format.fullName,\n      ['raw_html', 'raw_attribute', 'backtick_code_blocks', autoIds],\n      ['smart'],\n    );\n\n    // run preprocessors\n    this.preprocessors.forEach(preprocessor => {\n      markdown = preprocessor(markdown);\n    });\n\n    // create source capsules\n    this.blockCapsuleFilters.forEach(filter => {\n      markdown = pandocMarkdownWithBlockCapsules(original, markdown, filter);\n    });\n\n    const ast = await this.pandoc.markdownToAst(markdown, targetFormat, []);\n    const result = pandocToProsemirror(\n      ast,\n      this.schema,\n      format.extensions,\n      this.readers,\n      this.tokensFilters,\n      this.blockReaders,\n      this.inlineHTMLReaders,\n      this.blockCapsuleFilters,\n    );\n\n    // run post-processors\n    this.postprocessors.forEach(postprocessor => {\n      result.doc = postprocessor(result.doc);\n    });\n\n    // return the doc\n    return result;\n  }\n\n  // NOTE: For a plain markdown file, this is the closest we can come to cannonicalizing w/ just pandoc:\n  //\n  //   pandoc MANUAL.md --to markdown-auto_identifiers-smart -o MANUAL.md --self-contained --atx-headers --wrap=none\n  //\n  // For R Mardown files, we would need to pull out the Rmd chunks before sending to pandoc.\n  //\n\n  public async fromProsemirror(\n    doc: ProsemirrorNode,\n    pandocFormat: PandocFormat,\n    options: PandocWriterOptions,\n  ): Promise<string> {\n    // generate pandoc ast\n    const output = pandocFromProsemirror(\n      doc,\n      this.pandocCapabilities.api_version,\n      pandocFormat,\n      this.nodeWriters,\n      this.markWriters,\n    );\n\n    // adjust format. we always need to be able to write raw_attribute b/c that's how preprocessors\n    // hoist content through pandoc into our prosemirror token parser. since we open this door when\n    // reading, users could end up writing raw inlines, and in that case we want them to echo back\n    // to the source document just the way they came in. for writing markdown from pm we don't\n    // ever want to generate auto identifiers so we disable them here. we also disable smart b/c\n    // we do this manually above in pandocFromProsemirror (so we can avoid pandoc's insertion of\n    // nbsp's after abbreviations, which is more approriate for final output than editing)\n    let format = adjustedFormat(\n      pandocFormat.fullName,\n      ['raw_html', 'raw_attribute'], // always enable\n      ['auto_identifiers', 'gfm_auto_identifiers', 'smart'],\n    ); // always disable\n\n    // disable selected format options\n    format = pandocFormatWith(format, disabledFormatOptions(format, doc), '');\n\n    // prepare pandoc options\n    let pandocOptions: string[] = [];\n    if (!options.atxHeaders) {\n      pandocOptions.push('--markdown-headings=setext');\n    }\n    if (options.dpi) {\n      pandocOptions.push('--dpi');\n    }\n    // default to block level references (validate known types)\n    let referenceLocation = 'block';\n    if (options.references?.location) {\n      referenceLocation = ['block', 'section', 'document'].includes(options.references.location)\n        ? options.references.location\n        : 'block';\n    }\n    pandocOptions.push(`--reference-location=${referenceLocation}`);\n\n    // references prefix (if any)\n    if (options.references?.prefix) {\n      pandocOptions.push('--id-prefix', options.references.prefix);\n    }\n\n    // provide wrap options\n    pandocOptions = pandocOptions.concat(wrapOptions(options));\n\n    // render to markdown\n    const markdown = await this.pandoc.astToMarkdown(output.ast, format, pandocOptions);\n\n    // normalize newlines (don't know if pandoc uses \\r\\n on windows)\n    return markdown.replace(/\\r\\n|\\n\\r|\\r/g, '\\n');\n  }\n}\n\n// adjust the specified format\nfunction adjustedFormat(format: string, extensions: string[], disabled: string[]) {\n  let newFormat = pandocFormatWith(\n    format,\n    '',\n    extensions.map(ext => `+${ext}`).join('') + disabled.map(ext => `-${ext}`).join(''),\n  );\n\n  // any extension specified needs to not have a - anywhere in the format\n  extensions.forEach(ext => {\n    newFormat = newFormat.replace('-' + ext, '');\n  });\n\n  return newFormat;\n}\n\nfunction disabledFormatOptions(format: string, doc: ProsemirrorNode) {\n  // (prefer pipe and grid tables). users can still force the availability of these by\n  // adding those format flags but all known markdown variants that support tables also\n  // support pipe tables so this seems unlikely to ever be required.\n  let disabledTableTypes = '-simple_tables-multiline_tables';\n\n  // if there are tables with inline R code then disable grid tables (as the inline\n  // R code will mess up the column boundaries)\n  if (haveTableCellsWithInlineRcode(doc)) {\n    disabledTableTypes += '-grid_tables';\n  }\n\n  // gfm and commonmark variants don't allow simple/multiline/grid tables (just pipe tables)\n  // and it's an error to even include these in the markdown format specifier -- so for\n  // these modes we just nix the disabling\n  if (format.startsWith(kGfmFormat) || format.startsWith(kCommonmarkFormat)) {\n    disabledTableTypes = '';\n  }\n\n  // return\n  return disabledTableTypes;\n}\n\nfunction wrapOptions(options: PandocWriterOptions) {\n  const pandocOptions: string[] = [];\n  if (options.wrap) {\n    if (options.wrap === 'none' || options.wrap === 'sentence') {\n      pandocOptions.push('--wrap=none');\n    } else {\n      const column = parseInt(options.wrap, 10);\n      if (column) {\n        pandocOptions.push('--wrap=auto');\n        pandocOptions.push(`--columns=${column}`);\n      } else {\n        pandocOptions.push('--wrap=none');\n      }\n    }\n  } else {\n    pandocOptions.push('--wrap=none');\n  }\n  return pandocOptions;\n}\n","/*\n * pandoc_capsule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { base64Encode, base64Decode } from './base64';\n\nimport { PandocToken, ProsemirrorWriter, mapTokens, PandocTokenType } from './pandoc';\n\n// constants used for creating/consuming capsules\nconst kFieldDelimiter = '\\n';\nconst kValueDelimiter = ':';\nconst kTypeField = 'type';\nconst kPositionField = 'position';\nconst kPrefixField = 'prefix';\nconst kSourceField = 'source';\nconst kSuffixField = 'suffix';\nconst kBlockCapsuleSentinel = '31B8E172-B470-440E-83D8-E6B185028602'.toLowerCase();\n\n// block capsule\nexport interface PandocBlockCapsule {\n  type: string;\n  position: number;\n  prefix: string;\n  source: string;\n  suffix: string;\n}\n\n// preserve block source code through markdown parsing (e.g. for yaml metadata or rmd chunks).\n// block capsules remove markdown from the document before pandoc parses it (placing it into\n// a base64 encoded 'capsule'), then unwraps the capsule from the AST. All of this is done\n// by the function in this interface.\nexport interface PandocBlockCapsuleFilter {\n  // unique type id for this capsule\n  type: string;\n\n  // regex that matches a prefix (match[1]), the source to preserve (match[2]), and a suffix (match[3])\n  // we need the prefix/suffix for the cases where the preserved source needs to be put back exactly\n  // where it came from (e.g. in a multi-line html comment). we also need it to fixup indentation in\n  // cases where capsules are unwrapped within a code block or raw block. the prefix and suffix\n  // must begin and end (respectively) with newlines, and consist entirely of whitespace (e.g. leading\n  // space for indented block or incidental whitespace after block delimiter)\n  match: RegExp;\n\n  // optional seconary filter expression (applied to a successful match to ensure\n  // that matching wasn't overly greedy)\n  discard?: RegExp;\n\n  // custom function for pulling out the 3 parts from a match (defaults to p1,p2,p3)\n  extract?: (\n    match: string,\n    p1: string,\n    p2: string,\n    p3: string,\n    p4: string,\n  ) => { prefix: string; source: string; suffix: string };\n\n  // provide a (text) envelope around the capsule, e.g.\n  //  - newlines to ensure that yaml is parsed as a standalone paragraph;\n  //  - backticks to ensure an Rmd is structurally parsed by pandoc as a codeblock\n  enclose: (capsuleText: string, capsule: PandocBlockCapsule) => string;\n\n  // examine a piece of text from within the pandoc ast and, if approproate, substitute any\n  // capsules of my type for the original text (otherwise just return the passed string).\n  // this method will generally use encodedBlockCapsuleRegex to create a regex to search\n  // with, then upon finding a capsule, will unpack it with parsePandocBlockCapsule, compare\n  // the type against our own type, and in the case they match do the substitution.\n  handleText: (text: string, tok: PandocToken) => string;\n\n  // do you want to handle this token as a capsule object? if so return the capsule text\n  // (only the filter will know how to extract it from a pandoc token b/c it knows\n  // where it was parsed from and what happened in the 'enclose' method)\n  handleToken: (tok: PandocToken) => string | null;\n\n  // write a capsule as a pandoc node\n  writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => void;\n}\n\n// transform the passed markdown to include base64 encoded block capsules as specified by the\n// provided capsule filter. capsules are used to hoist block types that we don't want pandoc\n// to see (e.g. yaml metadata or Rmd chunks) out of the markdown, only to be re-inserted\n// after pandoc has yielded an ast. block capsules are a single base64 encoded pieced of\n// text that include the original content, the matched prefix and suffix, and a type\n// identifier for orchestrating the unpacking.\nexport function pandocMarkdownWithBlockCapsules(\n  original: string,\n  markdown: string,\n  capsuleFilter: PandocBlockCapsuleFilter,\n) {\n  // default extractor\n  const defaultExtractor = (match: string, p1: string, p2: string, p3: string) => {\n    return {\n      prefix: p1,\n      source: p2,\n      suffix: p3,\n    };\n  };\n\n  // find the original position of all the matches\n  const positions: number[] = [];\n  let match = capsuleFilter.match.exec(original);\n  while (match != null) {\n    positions.push(match.index);\n    match = capsuleFilter.match.exec(original);\n  }\n\n  // reset capsule filter match index\n  capsuleFilter.match.lastIndex = 0;\n\n  // replace all w/ source preservation capsules\n  return markdown.replace(capsuleFilter.match, (match: string, p1: string, p2: string, p3: string, p4: string) => {\n    // read the original position of the match\n    let position = 0;\n    const originalPos = positions.shift();\n    if (originalPos) {\n      position = originalPos;\n    }\n\n    // if the capsuleFilter has a discard expression then check it\n    if (capsuleFilter.discard && !!match.match(capsuleFilter.discard)) {\n      return match;\n    }\n\n    // extract matches\n    const extract = capsuleFilter.extract || defaultExtractor;\n    const { prefix, source, suffix } = extract(match, p1, p2, p3, p4);\n\n    // make the capsule\n    const capsule: PandocBlockCapsule = {\n      [kTypeField]: capsuleFilter.type,\n      [kPositionField]: position,\n      [kPrefixField]: prefix,\n      [kSourceField]: source,\n      [kSuffixField]: suffix,\n    };\n\n    // construct a field\n    const field = (name: string, value: string) => `${name}${kValueDelimiter}${base64Encode(value)}`;\n\n    // construct a record\n    const record =\n      field(kTypeField, capsule.type) +\n      kFieldDelimiter +\n      field(kPositionField, capsule.position.toString()) +\n      kFieldDelimiter +\n      field(kPrefixField, capsule.prefix) +\n      kFieldDelimiter +\n      field(kSourceField, capsule.source) +\n      kFieldDelimiter +\n      field(kSuffixField, capsule.suffix);\n\n    // now base64 encode the entire record (so it can masquerade as a paragraph)\n    const encodedRecord = base64Encode(record);\n\n    // return capsule, which is:\n    //   - a base64 encoded record surrounded with a sentinel value\n    //   - enclosed in a filter specific envelope (used to influence pandoc parsing),\n    //   - surrounded by the original prefix and suffix\n    return (\n      prefix +\n      capsuleFilter.enclose(\n        `${kBlockCapsuleSentinel}${kValueDelimiter}${encodedRecord}${kValueDelimiter}${kBlockCapsuleSentinel}`,\n        capsule,\n      ) +\n      suffix\n    );\n  });\n}\n\n// block capsules can also end up not as block tokens, but rather as text within another\n// token (e.g. within a backtick code block or raw_block). this function takes a set\n// of pandoc tokens and recursively converts block capsules that aren't of type\n// PandocTokenType.Str (which is what we'd see in a paragraph) into their original form\nexport function resolvePandocBlockCapsuleText(\n  tokens: PandocToken[],\n  filters: readonly PandocBlockCapsuleFilter[],\n): PandocToken[] {\n  // process all tokens\n  return mapTokens(tokens, token => {\n    // look for non-string pandoc tokens\n    if (token.t !== PandocTokenType.Str && token.c) {\n      if (typeof token.c === 'string') {\n        token.c = decodeBlockCapsuleText(token.c, token, filters);\n      } else if (Array.isArray(token.c)) {\n        const children = token.c.length;\n        for (let i = 0; i < children; i++) {\n          if (typeof token.c[i] === 'string') {\n            token.c[i] = decodeBlockCapsuleText(token.c[i], token, filters);\n          }\n        }\n      }\n    }\n\n    return token;\n  });\n}\n\n// decode the text capsule by running all of the filters (as there could be nesting)\nexport function decodeBlockCapsuleText(text: string, tok: PandocToken, filters: readonly PandocBlockCapsuleFilter[]) {\n  filters.forEach(filter => {\n    text = filter.handleText(text, tok);\n  });\n  return text;\n}\n\nexport function blockCapsuleTextHandler(type: string, pattern: RegExp, textFilter?: (text: string) => string) {\n  return (text: string, tok: PandocToken): string => {\n    // if this is a code block or raw block then we need to strip the prefix\n    // (b/c it could in a blockquote or indented in a list)\n    const stripPrefix = tok.t === PandocTokenType.CodeBlock || tok.t === PandocTokenType.RawBlock;\n\n    // replace text\n    return text.replace(pattern, match => {\n      const capsuleText = textFilter ? textFilter(match) : match;\n      const capsule = parsePandocBlockCapsule(capsuleText);\n      if (capsule.type === type) {\n        if (stripPrefix) {\n          return blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n        } else {\n          return capsule.source;\n        }\n      } else {\n        return match;\n      }\n    });\n  };\n}\n\n// token handler that looks for a paragraph token consisting entirely of a block capsule of our type.\n// if we find that then return the block capsule text\nexport function blockCapsuleParagraphTokenHandler(type: string) {\n  const tokenRegex = encodedBlockCapsuleRegex('^', '$');\n  return (tok: PandocToken) => {\n    if (tok.t === PandocTokenType.Para) {\n      if (tok.c.length === 1 && tok.c[0].t === PandocTokenType.Str) {\n        const text = tok.c[0].c as string;\n        const match = text.match(tokenRegex);\n        if (match) {\n          const capsuleRecord = parsePandocBlockCapsule(match[0]);\n          if (capsuleRecord.type === type) {\n            return match[0];\n          }\n        }\n      }\n    }\n    return null;\n  };\n}\n\n// create a regex that can be used to match a block capsule\nexport function encodedBlockCapsuleRegex(prefix?: string, suffix?: string, flags?: string) {\n  return new RegExp(\n    (prefix || '') +\n      kBlockCapsuleSentinel +\n      kValueDelimiter +\n      '((?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?)' +\n      kValueDelimiter +\n      kBlockCapsuleSentinel +\n      (suffix || ''),\n    flags,\n  );\n}\n\n// remove encoding envelope then parse the remaining text into a block capsule\nexport function parsePandocBlockCapsule(text: string): PandocBlockCapsule {\n  const envelopeLen = kBlockCapsuleSentinel.length + kFieldDelimiter.length;\n  const record = text.substring(envelopeLen, text.length - envelopeLen);\n  const decodedRecord = base64Decode(record);\n  const fields = decodedRecord.split(kFieldDelimiter);\n  const fieldValue = (i: number) => base64Decode(fields[i].split(kValueDelimiter)[1]);\n  return {\n    [kTypeField]: fieldValue(0),\n    [kPositionField]: parseInt(fieldValue(1), 10),\n    [kPrefixField]: fieldValue(2),\n    [kSourceField]: fieldValue(3),\n    [kSuffixField]: fieldValue(4),\n  };\n}\n\n// provide a version of the block capsule source with the prefix removed\n// from all but the very first line. this allows us to restore the text\n// to the level of indentation implied by the markdown (as opposed to the\n// level found literally in the source file)\nexport function blockCapsuleSourceWithoutPrefix(source: string, prefix: string) {\n  // prefix represents the indentation level of the block's source code, strip that\n  // same prefix from all the lines of code save for the first one\n  const prefixStripRegEx = new RegExp('^' + prefix);\n  const lines = source.split('\\n').map((line, index) => {\n    return index > 0 ? line.replace(prefixStripRegEx, '') : line;\n  });\n  return lines.join('\\n');\n}\n","/*\n * base_64.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// btoa and atob don't handle unicode strings, see\n// https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa#Unicode_strings\n\n// these functions implement the suggested workaround ()\n\nexport function base64Encode(text: string) {\n  const binary = toBinary(text);\n  return window.btoa(binary);\n}\n\nexport function base64Decode(encoded: string) {\n  const decoded = atob(encoded);\n  return fromBinary(decoded);\n}\n\n// convert a Unicode string to a string in which each 16-bit unit occupies only one byte\nfunction toBinary(text: string) {\n  const codeUnits = new Uint16Array(text.length);\n  for (let i = 0; i < codeUnits.length; i++) {\n    codeUnits[i] = text.charCodeAt(i);\n  }\n  const charCodes = Array.from(new Uint8Array(codeUnits.buffer)).map(code => String.fromCharCode(code));\n  return charCodes.join('');\n}\n\n// reverse the conversion\nfunction fromBinary(binary: string) {\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < bytes.length; i++) {\n    bytes[i] = binary.charCodeAt(i);\n  }\n  const charCodes = Array.from(new Uint16Array(bytes.buffer)).map(code => String.fromCharCode(code));\n  return charCodes.join('');\n}\n","/*\n * pandoc_to_prosemirror.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Node as ProsemirrorNode, NodeType, Schema } from 'prosemirror-model';\n\nimport {\n  PandocTokenReader,\n  PandocToken,\n  PandocAst,\n  ProsemirrorWriter,\n  PandocBlockReaderFn,\n  PandocInlineHTMLReaderFn,\n  PandocTokensFilterFn,\n  PandocTokenType,\n  mapTokens,\n  stringifyTokens,\n  PandocExtensions,\n  forEachToken,\n} from '../api/pandoc';\nimport {\n  pandocAttrReadAST,\n  kCodeBlockAttr,\n  kCodeBlockText,\n  kPandocAttrClasses,\n  kPandocAttrKeyvalue,\n} from '../api/pandoc_attr';\nimport {\n  PandocBlockCapsuleFilter,\n  parsePandocBlockCapsule,\n  resolvePandocBlockCapsuleText,\n  decodeBlockCapsuleText,\n} from '../api/pandoc_capsule';\n\nimport { PandocToProsemirrorResult, PandocLineWrapping } from './pandoc_converter';\nimport { kLinkTarget, kLinkTargetUrl, kLinkChildren, kLinkAttr, kLinkTargetTitle } from '../api/link';\nimport { kHeadingAttr, kHeadingLevel, kHeadingChildren } from '../api/heading';\nimport { pandocAutoIdentifier, gfmAutoIdentifier } from '../api/pandoc_id';\nimport { equalsIgnoreCase } from '../api/text';\nimport { hasShortcutHeadingLinks } from '../api/pandoc_format';\n\nexport function pandocToProsemirror(\n  ast: PandocAst,\n  schema: Schema,\n  extensions: PandocExtensions,\n  readers: readonly PandocTokenReader[],\n  tokensFilters: readonly PandocTokensFilterFn[],\n  blockReaders: readonly PandocBlockReaderFn[],\n  inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[],\n  blockCapsuleFilters: readonly PandocBlockCapsuleFilter[],\n): PandocToProsemirrorResult {\n  const parser = new Parser(\n    schema,\n    extensions,\n    readers,\n    tokensFilters,\n    blockReaders,\n    inlineHTMLReaders,\n    blockCapsuleFilters,\n  );\n  return parser.parse(ast);\n}\n\nclass Parser {\n  private readonly schema: Schema;\n  private readonly extensions: PandocExtensions;\n  private readonly tokensFilters: readonly PandocTokensFilterFn[];\n  private readonly inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[];\n  private readonly blockCapsuleFilters: readonly PandocBlockCapsuleFilter[];\n  private readonly handlers: { [token: string]: ParserTokenHandlerCandidate[] };\n\n  constructor(\n    schema: Schema,\n    extensions: PandocExtensions,\n    readers: readonly PandocTokenReader[],\n    tokensFilters: readonly PandocTokensFilterFn[],\n    blockReaders: readonly PandocBlockReaderFn[],\n    inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[],\n    blockCapsuleFilters: readonly PandocBlockCapsuleFilter[],\n  ) {\n    this.schema = schema;\n    this.extensions = extensions;\n    this.tokensFilters = tokensFilters;\n    this.inlineHTMLReaders = inlineHTMLReaders;\n    // apply block capsule filters in reverse order\n    this.blockCapsuleFilters = blockCapsuleFilters.slice().reverse();\n    this.handlers = this.createHandlers(readers, blockReaders);\n  }\n\n  public parse(ast: PandocAst) {\n    // create state\n    const state: ParserState = new ParserState(this.schema);\n    // create writer (compose state w/ writeTokens function)\n    const parser = this;\n    const writer: ProsemirrorWriter = {\n      openNode: state.openNode.bind(state),\n      closeNode: state.closeNode.bind(state),\n      openNoteNode: state.openNoteNode.bind(state),\n      addNode: state.addNode.bind(state),\n      openMark: state.openMark.bind(state),\n      closeMark: state.closeMark.bind(state),\n      writeText: state.writeText.bind(state),\n      hasInlineHTMLWriter(html: string) {\n        return parser.hasInlineHTMLWriter(html);\n      },\n      writeInlineHTML(html: string) {\n        return parser.writeInlineHTML(this, html);\n      },\n      writeTokens(tokens: PandocToken[]) {\n        parser.writeTokens(this, tokens);\n      },\n      logUnrecognized: state.logUnrecognized.bind(state),\n      isNodeOpen: state.isNodeOpen.bind(state),\n    };\n\n    // process raw text capsules\n    let targetAst = {\n      ...ast,\n      blocks: resolvePandocBlockCapsuleText(ast.blocks, this.blockCapsuleFilters),\n    };\n\n    // detect line wrapping\n    const lineWrapping = detectLineWrapping(targetAst);\n\n    // resolve heading ids\n    targetAst = resolveHeadingIds(targetAst, this.extensions);\n\n    // write all tokens\n    writer.writeTokens(targetAst.blocks);\n\n    // return\n    return {\n      doc: state.doc(),\n      line_wrapping: lineWrapping,\n      unrecognized: state.unrecognized(),\n      unparsed_meta: ast.meta,\n    };\n  }\n\n  private writeTokens(writer: ProsemirrorWriter, tokens: PandocToken[]) {\n    // pass through tokens filters\n    let targetTokens = tokens;\n    this.tokensFilters.forEach(filter => {\n      targetTokens = filter(targetTokens, writer);\n    });\n\n    // process tokens\n    targetTokens.forEach(tok => this.writeToken(writer, tok));\n  }\n\n  private writeToken(writer: ProsemirrorWriter, tok: PandocToken) {\n    // process block-level capsules\n    for (const filter of this.blockCapsuleFilters) {\n      const capsuleText = filter.handleToken?.(tok);\n      if (capsuleText) {\n        const blockCapsule = parsePandocBlockCapsule(capsuleText);\n        // run all of the text filters in case there was nesting\n        blockCapsule.source = decodeBlockCapsuleText(blockCapsule.source, tok, this.blockCapsuleFilters);\n        filter.writeNode(this.schema, writer, blockCapsule);\n        return;\n      }\n    }\n\n    // look for a handler.match function that wants to handle this token\n    const handlers = this.handlers[tok.t] || [];\n    for (const handler of handlers) {\n      // It's not enough for a pandoc reader's preferred token to match the\n      // current token; it's possible based on the `match` method for the\n      // reader to decline to handle it.\n      if (handler.match && handler.match(tok)) {\n        handler.handler(writer, tok);\n        return;\n      }\n    }\n\n    // if we didn't find one, look for the default handler\n    for (const handler of handlers) {\n      if (!handler.match) {\n        handler.handler(writer, tok);\n        return;\n      }\n    }\n\n    // log unrecognized token\n    writer.logUnrecognized(tok.t);\n  }\n\n  private hasInlineHTMLWriter(html: string) {\n    for (const reader of this.inlineHTMLReaders) {\n      if (reader(this.schema, html)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private writeInlineHTML(writer: ProsemirrorWriter, html: string) {\n    for (const reader of this.inlineHTMLReaders) {\n      if (reader(this.schema, html, writer)) {\n        return;\n      }\n    }\n  }\n\n  // create parser token handler functions based on the passed readers\n  private createHandlers(readers: readonly PandocTokenReader[], blockReaders: readonly PandocBlockReaderFn[]) {\n    const handlers: { [token: string]: ParserTokenHandlerCandidate[] } = {};\n\n    for (const reader of readers) {\n      // resolve children (provide default impl)\n      const getChildren = reader.getChildren || ((tok: PandocToken) => tok.c);\n\n      // resolve getAttrs (provide default imple)\n      const getAttrs = reader.getAttrs ? reader.getAttrs : (tok: PandocToken) => ({});\n\n      let handler: ParserTokenHandler;\n\n      // see if there is a low-level handler\n      if (reader.handler) {\n        handler = reader.handler(this.schema);\n      }\n\n      // text\n      else if (reader.text) {\n        handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n          if (reader.getText) {\n            const text = reader.getText(tok);\n            writer.writeText(text);\n          }\n        };\n\n        // marks\n      } else if (reader.mark) {\n        handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n          const markType = this.schema.marks[reader.mark as string];\n          const mark = markType.create(getAttrs(tok));\n          writer.openMark(mark);\n          if (reader.getText) {\n            writer.writeText(reader.getText(tok));\n          } else {\n            writer.writeTokens(getChildren(tok));\n          }\n          writer.closeMark(mark);\n        };\n\n        // blocks\n      } else if (reader.block) {\n        const nodeType = this.schema.nodes[reader.block];\n        handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n          // give the block readers first crack (e.g. handle a paragraph node with\n          // a single image as a figure node)\n          for (const blockReader of blockReaders) {\n            if (blockReader(this.schema, tok, writer)) {\n              return;\n            }\n          }\n\n          writer.openNode(nodeType, getAttrs(tok));\n          if (reader.getText) {\n            writer.writeText(reader.getText(tok));\n          } else {\n            writer.writeTokens(getChildren(tok));\n          }\n          writer.closeNode();\n        };\n\n        // nodes\n      } else if (reader.node) {\n        const nodeType = this.schema.nodes[reader.node];\n        handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n          if (reader.getChildren) {\n            writer.openNode(nodeType, getAttrs(tok));\n            writer.writeTokens(getChildren(tok));\n            writer.closeNode();\n          } else {\n            let content: ProsemirrorNode[] = [];\n            if (reader.getText) {\n              content = [this.schema.text(reader.getText(tok))];\n            }\n            writer.addNode(nodeType, getAttrs(tok), content);\n          }\n        };\n\n        // code blocks\n      } else if (reader.code_block) {\n        handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n          // type/attr/text\n          const nodeType = this.schema.nodes.code_block;\n          const attr: {} = pandocAttrReadAST(tok, kCodeBlockAttr);\n          const text = tok.c[kCodeBlockText] as string;\n\n          // write node\n          writer.openNode(nodeType, attr);\n          writer.writeText(text);\n          writer.closeNode();\n        };\n      } else {\n        throw new Error('pandoc reader was malformed or unrecognized');\n      }\n\n      // Ensure an array exists\n      handlers[reader.token] = handlers[reader.token] || [];\n\n      handlers[reader.token].push({\n        match: reader.match,\n        handler,\n      });\n    }\n    return handlers;\n  }\n}\n\nclass ParserState {\n  private readonly schema: Schema;\n  private readonly stack: ParserStackElement[];\n  private readonly notes: ProsemirrorNode[];\n  private marks: Mark[];\n  private footnoteNumber: number;\n  private unrecognizedTokens: string[];\n\n  constructor(schema: Schema) {\n    this.schema = schema;\n    this.stack = [{ type: this.schema.nodes.body, attrs: {}, content: [] }];\n    this.notes = [];\n    this.marks = Mark.none;\n    this.footnoteNumber = 1;\n    this.unrecognizedTokens = [];\n  }\n\n  public doc(): ProsemirrorNode {\n    const content: ProsemirrorNode[] = [];\n    content.push(this.top().type.createAndFill(null, this.top().content) as ProsemirrorNode);\n    content.push(this.schema.nodes.notes.createAndFill(null, this.notes) as ProsemirrorNode);\n    return this.schema.topNodeType.createAndFill({}, content) as ProsemirrorNode;\n  }\n\n  public unrecognized(): string[] {\n    return this.unrecognizedTokens;\n  }\n\n  public writeText(text: string) {\n    if (!text) {\n      return;\n    }\n    const nodes: ProsemirrorNode[] = this.top().content;\n    const last: ProsemirrorNode = nodes[nodes.length - 1];\n    const node: ProsemirrorNode = this.schema.text(text, this.marks);\n    const merged: ProsemirrorNode | undefined = this.maybeMerge(last, node);\n    if (last && merged) {\n      nodes[nodes.length - 1] = merged;\n    } else {\n      nodes.push(node);\n    }\n  }\n\n  public addNode(type: NodeType, attrs: {}, content: ProsemirrorNode[]) {\n    const node: ProsemirrorNode | null | undefined = type.createAndFill(attrs, content, this.marks);\n    if (!node) {\n      return null;\n    }\n    if (this.stack.length) {\n      if (type === this.schema.nodes.note) {\n        this.notes.push(node);\n      } else {\n        this.top().content.push(node);\n      }\n    }\n    return node;\n  }\n\n  public openNode(type: NodeType, attrs: {}) {\n    this.stack.push({ type, attrs, content: [] });\n  }\n\n  public closeNode(): ProsemirrorNode {\n    // get node info\n    const info: ParserStackElement = this.stack.pop() as ParserStackElement;\n\n    // clear marks if the node type isn't inline\n    if (!info.type.isInline) {\n      if (this.marks.length) {\n        this.marks = Mark.none;\n      }\n    }\n\n    return this.addNode(info.type, info.attrs, info.content) as ProsemirrorNode;\n  }\n\n  public openMark(mark: Mark) {\n    this.marks = mark.addToSet(this.marks);\n  }\n\n  public closeMark(mark: Mark) {\n    this.marks = mark.removeFromSet(this.marks);\n  }\n\n  public openNoteNode(ref: string) {\n    this.openNode(this.schema.nodes.note, { ref, number: this.footnoteNumber++ });\n  }\n\n  public logUnrecognized(type: string) {\n    if (!this.unrecognizedTokens.includes(type)) {\n      this.unrecognizedTokens.push(type);\n    }\n  }\n\n  public isNodeOpen(type: NodeType) {\n    return this.stack.some(value => value.type === type);\n  }\n\n  private top(): ParserStackElement {\n    return this.stack[this.stack.length - 1];\n  }\n\n  private maybeMerge(a: ProsemirrorNode, b: ProsemirrorNode): ProsemirrorNode | undefined {\n    if (a && a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n      return this.schema.text(((a.text as string) + b.text) as string, a.marks);\n    } else {\n      return undefined;\n    }\n  }\n}\n\n// determine what sort of line wrapping is used within the file\nfunction detectLineWrapping(ast: PandocAst): PandocLineWrapping {\n  // look for soft breaks and classify them as column or sentence breaks\n  let columnBreaks = 0;\n  let sentenceBreaks = 0;\n  let prevTok: PandocToken = { t: PandocTokenType.Null };\n  forEachToken(ast.blocks, tok => {\n    if (tok.t === PandocTokenType.SoftBreak) {\n      if (\n        prevTok.t === PandocTokenType.Str &&\n        typeof prevTok.c === 'string' &&\n        ['.', '?', '!'].includes(prevTok.c.charAt(prevTok.c.length - 1))\n      ) {\n        sentenceBreaks++;\n      } else {\n        columnBreaks++;\n      }\n    }\n    prevTok = tok;\n  });\n\n  // need to have > 5 line breaks or more line breaks than blocks to trigger detection\n  // (prevents 'over-detection' if there are stray few soft breaks)\n  const lineBreaks = columnBreaks + sentenceBreaks;\n  if (lineBreaks > 5 || lineBreaks > ast.blocks.length) {\n    if (sentenceBreaks > columnBreaks) {\n      return 'sentence';\n    } else {\n      return 'column';\n    }\n  } else {\n    return 'none';\n  }\n}\n\n// determine which heading ids are valid based on explicit headings contained in the\n// document and any headings targeted by links. remove any heading ids not so identified\nfunction resolveHeadingIds(ast: PandocAst, extensions: PandocExtensions) {\n  // determine function we will use to create auto-identifiers\n  const autoIdentifier = extensions.gfm_auto_identifiers ? gfmAutoIdentifier : pandocAutoIdentifier;\n\n  // start with ids we know are valid (i.e. ones the user added to the doc)\n  const headingIds = new Set<string>((ast.heading_ids || []).map(id => id.toLocaleLowerCase()));\n\n  // find ids referenced in links\n  let astBlocks = mapTokens(ast.blocks, tok => {\n    if (tok.t === PandocTokenType.Link) {\n      const target = tok.c[kLinkTarget];\n      const href = target[kLinkTargetUrl] as string;\n      if (href.startsWith('#')) {\n        // if we have support for implicit header references and shortcut reference links,\n        // also check to see whether the link text resolves to the target (in that case\n        // we don't need the explicit id). note that if that heading has an explicit\n        // id defined then we also leave it alone.\n        const text = stringifyTokens(tok.c[kLinkChildren], extensions.gfm_auto_identifiers);\n        if (\n          hasShortcutHeadingLinks(extensions) &&\n          equalsIgnoreCase('#' + autoIdentifier(text, extensions.ascii_identifiers), href) &&\n          !headingIds.has(href.toLocaleLowerCase())\n        ) {\n          // return a version of the link w/o the target\n          return {\n            t: PandocTokenType.Link,\n            c: [tok.c[kLinkAttr], tok.c[kLinkChildren], ['#', tok.c[kLinkTarget][kLinkTargetTitle]]],\n          };\n\n          // otherwise note that it's a valid id\n        } else {\n          headingIds.add(href.toLocaleLowerCase());\n        }\n      }\n    }\n    // default to return token unmodified\n    return tok;\n  });\n\n  // remove any heading ids not created by the user or required by a link\n  astBlocks = mapTokens(ast.blocks, tok => {\n    if (tok.t === PandocTokenType.Header) {\n      const attr = pandocAttrReadAST(tok, kHeadingAttr);\n      if (attr.id && !headingIds.has('#' + attr.id.toLocaleLowerCase())) {\n        return {\n          t: PandocTokenType.Header,\n          c: [\n            tok.c[kHeadingLevel],\n            ['', tok.c[kHeadingAttr][kPandocAttrClasses], tok.c[kHeadingAttr][kPandocAttrKeyvalue]],\n            tok.c[kHeadingChildren],\n          ],\n        };\n      }\n    }\n    // default to just reflecting back the token\n    return tok;\n  });\n\n  // return the ast\n  return {\n    ...ast,\n    blocks: astBlocks,\n    heading_ids: undefined,\n  };\n}\n\ninterface ParserStackElement {\n  type: NodeType;\n  attrs: {};\n  content: ProsemirrorNode[];\n}\n\ntype ParserTokenHandler = (writer: ProsemirrorWriter, tok: PandocToken) => void;\n\ninterface ParserTokenHandlerCandidate {\n  match?: (tok: PandocToken) => boolean;\n  handler: ParserTokenHandler;\n}\n","/*\n * pandoc_from_prosemirror.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Fragment, MarkType, Mark } from 'prosemirror-model';\n\nimport {\n  PandocAst,\n  PandocToken,\n  PandocOutput,\n  PandocNodeWriterFn,\n  PandocNodeWriter,\n  PandocMarkWriter,\n  PandocApiVersion,\n  PandocTokenType,\n  PandocOutputOption,\n  PandocExtensions,\n  marksByPriority,\n} from '../api/pandoc';\n\nimport { PandocFormat, kGfmFormat } from '../api/pandoc_format';\nimport { PandocAttr } from '../api/pandoc_attr';\nimport { fragmentText } from '../api/fragment';\nimport { fancyQuotesToSimple } from '../api/quote';\n\nexport function pandocFromProsemirror(\n  doc: ProsemirrorNode,\n  apiVersion: PandocApiVersion,\n  format: PandocFormat,\n  nodeWriters: readonly PandocNodeWriter[],\n  markWriters: readonly PandocMarkWriter[],\n) {\n  const bodyNode = doc.child(0);\n  const notesNode = doc.child(1);\n  const writer = new PandocWriter(apiVersion, format, nodeWriters, markWriters, notesNode);\n  writer.writeNodes(bodyNode);\n  return writer.output();\n}\n\nclass PandocWriter implements PandocOutput {\n  private readonly ast: PandocAst;\n  private readonly format: PandocFormat;\n  private readonly nodeWriters: { [key: string]: PandocNodeWriterFn };\n  private readonly markWriters: { [key: string]: PandocMarkWriter };\n  private readonly notes: { [key: string]: ProsemirrorNode };\n  private readonly containers: any[][];\n  private readonly activeMarks: MarkType[];\n  private options: { [key: string]: boolean };\n\n  public readonly extensions: PandocExtensions;\n\n  private readonly escapeCharacters: string[] = [];\n  private readonly manualEscapeCharacters: Map<string, string> = new Map<string, string>();\n  private readonly preventEscapeCharacters: string[] = [];\n\n  constructor(\n    apiVersion: PandocApiVersion,\n    format: PandocFormat,\n    nodeWriters: readonly PandocNodeWriter[],\n    markWriters: readonly PandocMarkWriter[],\n    notes: ProsemirrorNode,\n  ) {\n    // save format and extensions\n    this.format = format;\n    this.extensions = format.extensions;\n    // compute escape characters based on format\n    this.initEscapeCharacters();\n    // create maps of node and mark writers\n    this.nodeWriters = {};\n    nodeWriters.forEach((writer: PandocNodeWriter) => {\n      this.nodeWriters[writer.name] = writer.write;\n    });\n    this.markWriters = {};\n    markWriters.forEach((writer: PandocMarkWriter) => {\n      this.markWriters[writer.name] = writer;\n    });\n    // create map of notes\n    this.notes = {};\n    notes.forEach((note: ProsemirrorNode) => {\n      this.notes[note.attrs.ref] = note;\n    });\n\n    this.ast = {\n      blocks: [],\n      'pandoc-api-version': apiVersion,\n      meta: {},\n    };\n    this.containers = [this.ast.blocks];\n    this.activeMarks = [];\n    this.options = {\n      writeSpaces: true,\n    };\n  }\n\n  public output() {\n    return {\n      ast: this.ast,\n    };\n  }\n\n  public write(value: any) {\n    const container = this.containers[this.containers.length - 1];\n    container.push(value);\n  }\n\n  public writeToken(type: PandocTokenType, content?: (() => void) | any) {\n    const token: PandocToken = {\n      t: type,\n    };\n    if (content !== undefined) {\n      if (typeof content === 'function') {\n        token.c = [];\n        this.fill(token.c, content);\n      } else {\n        token.c = content;\n      }\n    }\n    this.write(token);\n  }\n\n  public writeMark(type: PandocTokenType, parent: Fragment, expelEnclosingWhitespace = true) {\n    // expel enclosing whitepsace if requested and if the fragment isn't 100% spaces\n    if (expelEnclosingWhitespace) {\n      // build output spec\n      const output = {\n        spaceBefore: false,\n        nodes: new Array<ProsemirrorNode>(),\n        spaceAfter: false,\n      };\n\n      // if we see leading or trailing spaces we need to output them as tokens\n      // and substitute text nodes\n      parent.forEach((node: ProsemirrorNode, offset: number, index: number) => {\n        // check for leading/trailing space in first/last nodes\n        if (node.isText) {\n          let outputText = node.textContent;\n\n          // checking for leading space in first node\n          if (output.nodes.length === 0 && node.textContent.match(/^\\s+/)) {\n            output.spaceBefore = true;\n            outputText = outputText.trimLeft();\n          }\n\n          // check for trailing space in last node\n          if (index === parent.childCount - 1 && node.textContent.match(/\\s+$/)) {\n            output.spaceAfter = true;\n            outputText = outputText.trimRight();\n          }\n\n          // check for an entirely blank node\n          if (outputText.match(/^\\s*$/)) {\n            outputText = '';\n          }\n\n          // skip the node if it has nothing in it\n          if (outputText.length > 0) {\n            // if we modified the node's text then create a new node\n            if (outputText !== node.textContent) {\n              output.nodes.push(node.type.schema.text(outputText, node.marks));\n            } else {\n              output.nodes.push(node);\n            }\n          }\n        } else {\n          output.nodes.push(node);\n        }\n      });\n\n      // output space tokens before/after mark as necessary\n      if (output.nodes.length > 0) {\n        if (output.spaceBefore) {\n          this.writeToken(PandocTokenType.Space);\n        }\n        this.writeToken(type, () => {\n          this.writeInlines(Fragment.from(output.nodes));\n        });\n        if (output.spaceAfter) {\n          this.writeToken(PandocTokenType.Space);\n        }\n      }\n\n      // normal codepath (not expelling existing whitespace)\n    } else {\n      this.writeToken(type, () => {\n        this.writeInlines(parent);\n      });\n    }\n  }\n\n  public writeArray(content: () => void) {\n    const arr: any[] = [];\n    this.fill(arr, content);\n    this.write(arr);\n  }\n\n  public writeAttr(id?: string, classes?: string[], keyvalue?: Array<[string, string]>) {\n    this.write([id || '', classes || [], keyvalue || []]);\n  }\n\n  public writeText(text: string | null) {\n    // determine which characters we shouldn't escape\n    const preventEscapeCharacters = this.preventEscapeCharacters;\n\n    if (text) {\n      let textRun = '';\n      const flushTextRun = () => {\n        if (textRun) {\n          // if this is a line block, convert leading nbsp to regular space,\n          if (!this.options.writeSpaces) {\n            textRun = textRun.replace(/(^|\\n)+(\\u00A0+)/g, (_match, p1, p2) => {\n              return p1 + Array(p2.length + 1).join(' ');\n            });\n          }\n\n          // reverse smart punctuation. pandoc does this autmoatically for markdown\n          // writing w/ +smart, however this also results in nbsp's being inserted\n          // after selected abbreviations like e.g. and Mr., and we don't want that\n          // to happen for editing (b/c the nbsp's weren't put there by the user\n          // and are not obviously visible)\n          if (this.extensions.smart) {\n            textRun = textRun\n              .replace(/—/g, '---')\n              .replace(/–/g, '--')\n              .replace(/…/g, '...');\n          }\n\n          // we explicitly don't want fancy quotes in the editor\n          textRun = fancyQuotesToSimple(textRun);\n\n          this.writeToken(PandocTokenType.Str, textRun);\n          textRun = '';\n        }\n      };\n      for (let i = 0; i < text.length; i++) {\n        const ch = text.charAt(i);\n        if (this.options.writeSpaces && ch === ' ') {\n          flushTextRun();\n          this.writeToken(PandocTokenType.Space);\n        } else if (preventEscapeCharacters.includes(ch)) {\n          flushTextRun();\n          this.writeRawMarkdown(ch);\n        } else if (this.manualEscapeCharacters.has(ch)) {\n          flushTextRun();\n          this.writeRawMarkdown(this.manualEscapeCharacters.get(ch)!);\n        } else {\n          textRun += ch;\n        }\n      }\n      flushTextRun();\n    }\n  }\n\n  public writeLink(href: string, title: string, attr: PandocAttr | null, content: VoidFunction) {\n    this.writeToken(PandocTokenType.Link, () => {\n      // write attr if provided\n      if (attr) {\n        this.writeAttr(attr.id, attr.classes, attr.keyvalue);\n      } else {\n        this.writeAttr();\n      }\n      // write content\n      this.writeArray(() => {\n        content();\n      });\n\n      // write href\n      this.write([href || '', title || '']);\n    });\n  }\n\n  public writeNote(note: ProsemirrorNode) {\n    // get corresponding note body\n    const noteBody = this.notes[note.attrs.ref];\n\n    // don't write empty footnotes (otherwise in block or section mode they gobble up the section below them)\n    if (noteBody.textContent.trim().length > 0) {\n      this.writeToken(PandocTokenType.Note, () => {\n        this.writeNodes(noteBody);\n      });\n    }\n  }\n\n  public writeNode(node: ProsemirrorNode) {\n    this.nodeWriters[node.type.name](this, node);\n  }\n\n  public writeNodes(parent: ProsemirrorNode) {\n    parent.forEach(this.writeNode.bind(this));\n  }\n\n  public writeInlines(fragment: Fragment) {\n    // get the marks from a node that are not already on the stack of active marks\n    const nodeMarks = (node: ProsemirrorNode) => {\n      // get marks ordered by writer priority\n      let marks = marksByPriority(node.marks, this.markWriters);\n\n      // remove active marks\n      for (const activeMark of this.activeMarks) {\n        marks = activeMark.removeFromSet(marks);\n      }\n\n      // return marks\n      return marks;\n    };\n\n    // helpers to iterate through the nodes (sans any marks already on the stack)\n    let currentChild = 0;\n    const nextNode = () => {\n      const childIndex = currentChild;\n      currentChild++;\n      return {\n        node: fragment.child(childIndex),\n        marks: nodeMarks(fragment.child(childIndex)),\n      };\n    };\n    const putBackNode = () => {\n      currentChild--;\n    };\n\n    // iterate through the nodes\n    while (currentChild < fragment.childCount) {\n      // get the next node\n      let next = nextNode();\n\n      // if there are active marks then collect them up and call the mark handler\n      // with all nodes that it contains, otherwise just process it as a plain\n      // unmarked node\n      if (next.marks.length > 0) {\n        // get the mark and start building a list of marked nodes\n        const mark = next.marks[0];\n        const markedNodes: ProsemirrorNode[] = [next.node];\n\n        // inner iteration to find nodes that have this mark\n        while (currentChild < fragment.childCount) {\n          next = nextNode();\n          if (mark.type.isInSet(next.marks)) {\n            markedNodes.push(next.node);\n          } else {\n            // no mark found, \"put back\" the node\n            putBackNode();\n            break;\n          }\n        }\n\n        // call the mark writer after noting that this mark is active (which\n        // will cause subsequent recursive invocations of this function to\n        // not re-process this mark)\n        this.activeMarks.push(mark.type);\n        this.markWriters[mark.type.name].write(this, mark, Fragment.from(markedNodes));\n        this.activeMarks.pop();\n      } else {\n        // ordinary unmarked node, call the node writer\n        this.nodeWriters[next.node.type.name](this, next.node);\n      }\n    }\n  }\n\n  public writeRawMarkdown(markdown: Fragment | string, escapeSymbols?: boolean) {\n    // collect markdown text if necessary\n    let md = markdown instanceof Fragment ? fragmentText(markdown) : markdown;\n\n    // escape symbols if requested\n    if (escapeSymbols) {\n      const escaped: string[] = [];\n      for (let i = 0; i < md.length; i++) {\n        const ch = md.charAt(i);\n        if (this.escapeCharacters.includes(ch)) {\n          escaped.push('\\\\' + ch);\n        } else {\n          escaped.push(ch);\n        }\n      }\n      md = escaped.join('');\n    }\n\n    this.writeToken(PandocTokenType.RawInline, () => {\n      this.write('markdown');\n      this.write(md);\n    });\n  }\n\n  public withOption(option: PandocOutputOption, value: boolean, f: () => void) {\n    const previousValue = this.options[option];\n    this.options[option] = value;\n    f();\n    this.options[option] = previousValue;\n  }\n\n  private fill(container: any[], content: () => void) {\n    this.containers.push(container);\n    content();\n    this.containers.pop();\n  }\n\n  private initEscapeCharacters() {\n    // gfm disallows [] escaping so that MediaWiki style page links (e.g. [[MyPage]]) work as expected\n    // tex_math_single_backslash does not allow escaping of [] or () (as that conflicts with the math syntax)\n    if (this.format.mode === kGfmFormat || this.format.extensions.tex_math_single_backslash) {\n      this.preventEscapeCharacters.push('[', ']');\n    }\n\n    // tex_math_single_backslash does not allow escaping of [] or () (as that conflicts with the math syntax)\n    if (this.format.extensions.tex_math_single_backslash) {\n      this.preventEscapeCharacters.push('(', ')');\n    }\n\n    // filter standard escape characters w/ preventEscapeCharacters\n    const allEscapeCharacters = ['\\\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!'];\n    if (this.format.extensions.angle_brackets_escapable) {\n      allEscapeCharacters.push('<');\n    }\n    this.escapeCharacters.push(...allEscapeCharacters.filter(ch => !this.preventEscapeCharacters.includes(ch)));\n\n    // Manual escape characters are ones we can't rely on pandoc to automatically escape (b/c\n    // they represent valid syntax for a markdown extension, e.g. '@' for citations).\n    // For '@', since we already do special writing for spans we know are citation ids, we can\n    // globally prescribe escaping behavior and never stomp over a citation. We also check\n    // that '@' can be escaped in the current markdown format, and if not use an html escape.\n    const atEscape = this.extensions.all_symbols_escapable ? '\\\\@' : '&#x0040;';\n    this.manualEscapeCharacters.set('@', atEscape);\n  }\n}\n","/*\n * fragment.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment } from 'prosemirror-model';\n\nexport function fragmentText(fragment: Fragment, unemoji = false) {\n  let text = '';\n  fragment.forEach(node => {\n    const emjojiMark = node.marks.find(mark => mark.type === node.type.schema.marks.emoji);\n    if (unemoji && emjojiMark) {\n      return (text = text + (emjojiMark.attrs.emojihint || node.textContent));\n    } else {\n      return (text = text + node.textContent);\n    }\n  });\n  return text;\n}\n","/*\n * editor-extensions.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Schema } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { ProsemirrorCommand } from '../api/command';\nimport { PandocMark } from '../api/mark';\nimport { PandocNode, CodeViewOptions } from '../api/node';\nimport { Extension, ExtensionFn, ExtensionContext } from '../api/extension';\nimport { BaseKeyBinding } from '../api/basekeys';\nimport { OmniInserter } from '../api/omni_insert';\nimport { AppendTransactionHandler, AppendMarkTransactionHandler } from '../api/transaction';\nimport { FixupFn } from '../api/fixup';\nimport {\n  PandocTokenReader,\n  PandocMarkWriter,\n  PandocNodeWriter,\n  PandocPreprocessorFn,\n  PandocPostprocessorFn,\n  PandocBlockReaderFn,\n  PandocInlineHTMLReaderFn,\n  PandocTokensFilterFn,\n} from '../api/pandoc';\nimport { PandocBlockCapsuleFilter } from '../api/pandoc_capsule';\nimport { markInputRuleFilter } from '../api/input_rule';\nimport { CompletionHandler } from '../api/completion';\n\n// required extensions (base non-customiziable pandoc nodes/marks + core behaviors)\nimport nodeText from '../nodes/text';\nimport nodeParagraph from '../nodes/paragraph';\nimport nodeHeading from '../nodes/heading';\nimport nodeBlockquote from '../nodes/blockquote';\nimport nodeCodeBlock from '../nodes/code_block';\nimport nodeLists from '../nodes/list/list';\nimport nodeImage from '../nodes/image/image';\nimport nodeFigure from '../nodes/image/figure';\nimport nodeHr from '../nodes/hr';\nimport nodeHardBreak from '../nodes/hard_break';\nimport nodeNull from '../nodes/null';\nimport markEm from '../marks/em';\nimport markStrong from '../marks/strong';\nimport markCode from '../marks/code';\nimport markLink from '../marks/link/link';\nimport behaviorHistory from '../behaviors/history';\nimport behaviorSelectAll from '../behaviors/select_all';\nimport behaviorCursor from '../behaviors/cursor';\nimport behaviorFind from '../behaviors/find';\nimport behaviorSpellingInteractive from '../behaviors/spelling/spelling-interactive';\nimport behaviorClearFormatting from '../behaviors/clear_formatting';\n\n// behaviors\nimport behaviorSmarty from '../behaviors/smarty';\nimport behaviorAttrDuplicateId from '../behaviors/attr_duplicate_id';\nimport behaviorTrailingP from '../behaviors/trailing_p';\nimport behaviorEmptyMark from '../behaviors/empty_mark';\nimport behaviorEscapeMark from '../behaviors/escape_mark';\nimport behaviorOutline from '../behaviors/outline';\nimport beahviorCodeBlockInput from '../behaviors/code_block_input';\nimport behaviorPasteText from '../behaviors/paste_text';\nimport behaviorBottomPadding from '../behaviors/bottom_padding';\nimport behaviorInsertSymbol from '../behaviors/insert_symbol/insert_symbol-plugin-symbol';\nimport behaviorInsertSymbolEmoji from '../behaviors/insert_symbol/insert_symbol-plugin-emoji';\nimport beahviorInsertSpecialCharacters from '../behaviors/insert_symbol/insert_special_characters';\nimport behaviorNbsp from '../behaviors/nbsp';\nimport behaviorRemoveSection from '../behaviors/remove_section';\n\n// marks\nimport markStrikeout from '../marks/strikeout';\nimport markSuperscript from '../marks/superscript';\nimport markSubscript from '../marks/subscript';\nimport markSmallcaps from '../marks/smallcaps';\nimport markUnderline from '../marks/underline';\nimport markRawInline from '../marks/raw_inline/raw_inline';\nimport markRawTex from '../marks/raw_inline/raw_tex';\nimport markRawHTML from '../marks/raw_inline/raw_html';\nimport markMath from '../marks/math/math';\nimport markCite from '../marks/cite/cite';\nimport markSpan from '../marks/span';\nimport markXRef from '../marks/xref/xref';\nimport markHTMLComment from '../marks/raw_inline/raw_html_comment';\nimport markShortcode from '../marks/shortcode';\nimport markEmoji from '../marks/emoji/emoji';\nimport { markOmniInsert } from '../behaviors/omni_insert/omni_insert';\n\n// nodes\nimport nodeFootnote from '../nodes/footnote/footnote';\nimport nodeRawBlock from '../nodes/raw_block';\nimport nodeYamlMetadata from '../nodes/yaml_metadata/yaml_metadata';\nimport nodeRmdCodeChunk from '../nodes/rmd_chunk/rmd_chunk';\nimport nodeDiv from '../nodes/div';\nimport nodeLineBlock from '../nodes/line_block';\nimport nodeTable from '../nodes/table/table';\nimport nodeDefinitionList from '../nodes/definition_list/definition_list';\nimport nodeShortcodeBlock from '../nodes/shortcode_block';\nimport nodeHtmlPreserve from '../nodes/html_preserve';\n\n// extension/plugin factories\nimport { acePlugins } from '../optional/ace/ace';\nimport { attrEditExtension } from '../behaviors/attr_edit/attr_edit';\nimport { codeViewClipboardPlugin } from '../api/code';\n\nexport function initExtensions(context: ExtensionContext, extensions?: readonly Extension[]): ExtensionManager {\n  // create extension manager\n  const manager = new ExtensionManager(context);\n\n  // required extensions\n  manager.register([\n    nodeText,\n    nodeParagraph,\n    nodeHeading,\n    nodeBlockquote,\n    nodeLists,\n    nodeCodeBlock,\n    nodeImage,\n    nodeFigure,\n    nodeHr,\n    nodeHardBreak,\n    nodeNull,\n    markEm,\n    markStrong,\n    markCode,\n    markLink,\n    behaviorHistory,\n    behaviorSelectAll,\n    behaviorCursor,\n    behaviorFind,\n    behaviorSpellingInteractive,\n    behaviorClearFormatting,\n  ]);\n\n  // optional extensions\n  manager.register([\n    // behaviors\n    behaviorSmarty,\n    behaviorAttrDuplicateId,\n    behaviorTrailingP,\n    behaviorEmptyMark,\n    behaviorEscapeMark,\n    behaviorOutline,\n    beahviorCodeBlockInput,\n    behaviorPasteText,\n    behaviorBottomPadding,\n    behaviorInsertSymbol,\n    behaviorInsertSymbolEmoji,\n    beahviorInsertSpecialCharacters,\n    behaviorNbsp,\n    behaviorRemoveSection,\n\n    // nodes\n    nodeDiv,\n    nodeFootnote,\n    nodeYamlMetadata,\n    nodeRmdCodeChunk,\n    nodeTable,\n    nodeDefinitionList,\n    nodeLineBlock,\n    nodeRawBlock,\n    nodeShortcodeBlock,\n    nodeHtmlPreserve,\n\n    // marks\n    markUnderline,\n    markStrikeout,\n    markSuperscript,\n    markSubscript,\n    markSmallcaps,\n    markHTMLComment,\n    markRawTex,\n    markRawHTML,\n    markRawInline,\n    markMath,\n    markCite,\n    markSpan,\n    markXRef,\n    markShortcode,\n    markEmoji,\n    markOmniInsert,\n  ]);\n\n  // register external extensions\n  if (extensions) {\n    manager.register(extensions);\n  }\n\n  // additional extensions dervied from other extensions (e.g. extensions that have registered attr editors)\n  // note that all of these take a callback to access the manager -- this is so that if an extension earlier\n  // in the chain registers something the later extensions are able to see it\n  manager.register([\n    // bindings to 'Edit Attribute' command and UI adornment\n    attrEditExtension(context.pandocExtensions, context.ui, manager.attrEditors()),\n  ]);\n\n  // additional plugins derived from extensions\n  const codeViews = manager.codeViews();\n  const plugins: Plugin[] = [];\n  if (context.options.codeEditor === 'ace') {\n    plugins.push(...acePlugins(codeViews, context));\n  }\n  plugins.push(codeViewClipboardPlugin(codeViews));\n\n  // register plugins\n  manager.registerPlugins(plugins);\n\n  // return manager\n  return manager;\n}\n\nexport class ExtensionManager {\n  private context: ExtensionContext;\n  private extensions: Extension[];\n\n  public constructor(context: ExtensionContext) {\n    this.context = context;\n    this.extensions = [];\n  }\n\n  public register(extensions: ReadonlyArray<Extension | ExtensionFn>, priority = false): void {\n    extensions.forEach(extension => {\n      if (typeof extension === 'function') {\n        const ext = extension(this.context);\n        if (ext) {\n          if (priority) {\n            this.extensions.unshift(ext);\n          } else {\n            this.extensions.push(ext);\n          }\n        }\n      } else {\n        if (priority) {\n          this.extensions.unshift(extension);\n        } else {\n          this.extensions.push(extension);\n        }\n      }\n    });\n  }\n\n  public registerPlugins(plugins: Plugin[], priority = false) {\n    this.register([{ plugins: () => plugins }], priority);\n  }\n\n  public pandocMarks(): readonly PandocMark[] {\n    return this.collect(extension => extension.marks);\n  }\n\n  public pandocNodes(): readonly PandocNode[] {\n    return this.collect(extension => extension.nodes);\n  }\n\n  public pandocPreprocessors(): readonly PandocPreprocessorFn[] {\n    return this.collectFrom({\n      node: node => [node.pandoc.preprocessor],\n    });\n  }\n\n  public pandocPostprocessors(): readonly PandocPostprocessorFn[] {\n    return this.pandocReaders().flatMap(reader => (reader.postprocessor ? [reader.postprocessor] : []));\n  }\n\n  public pandocTokensFilters(): readonly PandocTokensFilterFn[] {\n    return this.collectFrom({\n      node: node => [node.pandoc.tokensFilter],\n    });\n  }\n\n  public pandocBlockReaders(): readonly PandocBlockReaderFn[] {\n    return this.collectFrom({\n      node: node => [node.pandoc.blockReader],\n    });\n  }\n\n  public pandocInlineHTMLReaders(): readonly PandocInlineHTMLReaderFn[] {\n    return this.collectFrom({\n      mark: mark => [mark.pandoc.inlineHTMLReader],\n      node: node => [node.pandoc.inlineHTMLReader],\n    });\n  }\n\n  public pandocBlockCapsuleFilters(): readonly PandocBlockCapsuleFilter[] {\n    return this.collectFrom({\n      node: node => [node.pandoc.blockCapsuleFilter],\n    });\n  }\n\n  public pandocReaders(): readonly PandocTokenReader[] {\n    return this.collectFrom({\n      mark: mark => mark.pandoc.readers,\n      node: node => node.pandoc.readers ?? [],\n    });\n  }\n\n  public pandocMarkWriters(): readonly PandocMarkWriter[] {\n    return this.collectFrom({\n      mark: mark => [{ name: mark.name, ...mark.pandoc.writer }],\n    });\n  }\n\n  public pandocNodeWriters(): readonly PandocNodeWriter[] {\n    return this.collectFrom({\n      node: node => {\n        return node.pandoc.writer ? [{ name: node.name, write: node.pandoc.writer! }] : [];\n      },\n    });\n  }\n\n  public commands(schema: Schema): readonly ProsemirrorCommand[] {\n    return this.collect<ProsemirrorCommand>(extension => extension.commands?.(schema));\n  }\n\n  public omniInserters(schema: Schema): OmniInserter[] {\n    const omniInserters: OmniInserter[] = [];\n    const commands = this.commands(schema);\n    commands.forEach(command => {\n      if (command.omniInsert) {\n        omniInserters.push({\n          ...command.omniInsert,\n          id: command.id,\n          command: command.execute,\n        });\n      }\n    });\n    return omniInserters;\n  }\n\n  public codeViews() {\n    const views: { [key: string]: CodeViewOptions } = {};\n    this.pandocNodes().forEach((node: PandocNode) => {\n      if (node.code_view) {\n        views[node.name] = node.code_view;\n      }\n    });\n    return views;\n  }\n\n  public attrEditors() {\n    return this.collectFrom({\n      node: node => [node.attr_edit?.()],\n    });\n  }\n\n  public baseKeys(schema: Schema): readonly BaseKeyBinding[] {\n    return this.collect(extension => extension.baseKeys?.(schema));\n  }\n\n  public appendTransactions(schema: Schema): readonly AppendTransactionHandler[] {\n    return this.collect(extension => extension.appendTransaction?.(schema));\n  }\n\n  public appendMarkTransactions(schema: Schema): readonly AppendMarkTransactionHandler[] {\n    return this.collect(extension => extension.appendMarkTransaction?.(schema));\n  }\n\n  public plugins(schema: Schema): readonly Plugin[] {\n    return this.collect(extension => extension.plugins?.(schema));\n  }\n\n  public fixups(schema: Schema, view: EditorView): readonly FixupFn[] {\n    return this.collect(extension => extension.fixups?.(schema, view));\n  }\n\n  public completionHandlers(): readonly CompletionHandler[] {\n    return this.collect(extension => extension.completionHandlers?.());\n  }\n\n  // NOTE: return value not readonly b/c it will be fed directly to a\n  // Prosemirror interface that doesn't take readonly\n  public inputRules(schema: Schema): InputRule[] {\n    const markFilter = markInputRuleFilter(schema, this.pandocMarks());\n    return this.collect<InputRule>(extension => extension.inputRules?.(schema, markFilter));\n  }\n\n  private collect<T>(collector: (extension: Extension) => readonly T[] | undefined) {\n    return this.collectFrom({\n      extension: extension => collector(extension) ?? [],\n    });\n  }\n\n  /**\n   * Visits extensions in order of registration, providing optional callbacks\n   * for extension, mark, and node. The return value of callbacks should be\n   * arrays of (T | undefined | null); these will all be concatenated together,\n   * with the undefined and nulls filtered out.\n   *\n   * @param visitor Object containing callback methods for the different\n   * extension parts.\n   */\n  private collectFrom<T>(visitor: {\n    extension?: (extension: Extension) => ReadonlyArray<T | undefined | null>;\n    mark?: (mark: PandocMark) => ReadonlyArray<T | undefined | null>;\n    node?: (node: PandocNode) => ReadonlyArray<T | undefined | null>;\n  }): T[] {\n    const results: Array<T | undefined | null> = [];\n\n    this.extensions.forEach(extension => {\n      if (visitor.extension) {\n        results.push(...visitor.extension(extension));\n      }\n      if (visitor.mark && extension.marks) {\n        results.push(...extension.marks.flatMap(visitor.mark));\n      }\n      if (visitor.node && extension.nodes) {\n        results.push(...extension.nodes.flatMap(visitor.node));\n      }\n    });\n\n    return results.filter(value => typeof value !== 'undefined' && value !== null) as T[];\n  }\n}\n","/*\n * text.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { PandocOutput, PandocToken, PandocTokenType, ProsemirrorWriter } from '../api/pandoc';\nimport { ExtensionContext } from '../api/extension';\nimport { kQuoteType, QuoteType, kQuoteChildren, fancyQuotesToSimple } from '../api/quote';\n\nconst extension = (context: ExtensionContext) => {\n  const readText = (text: string) => {\n    // we explicitly don't want fancy quotes in the editor\n    text = fancyQuotesToSimple(text);\n\n    if (context.pandocExtensions.smart) {\n      return text\n        .replace(/---/g, '—')\n        .replace(/--/g, '–')\n        .replace(/\\.\\.\\./g, '…');\n    } else {\n      return text;\n    }\n  };\n\n  return {\n    nodes: [\n      {\n        name: 'text',\n        spec: {\n          group: 'inline',\n          toDOM(node: ProsemirrorNode): any {\n            return node.text;\n          },\n        },\n        pandoc: {\n          readers: [\n            { token: PandocTokenType.Str, text: true, getText: (t: PandocToken) => readText(t.c) },\n            { token: PandocTokenType.Space, text: true, getText: () => ' ' },\n            { token: PandocTokenType.SoftBreak, text: true, getText: () => ' ' },\n            {\n              token: PandocTokenType.Quoted,\n              handler: () => (writer: ProsemirrorWriter, tok: PandocToken) => {\n                const type = tok.c[kQuoteType].t;\n                const quote = type === QuoteType.SingleQuote ? \"'\" : '\"';\n                writer.writeTokens([{ t: 'Str', c: quote }, ...tok.c[kQuoteChildren], { t: 'Str', c: quote }]);\n              },\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            const text = node.textContent;\n            output.writeText(text);\n          },\n        },\n      },\n    ],\n  };\n};\n\nexport default extension;\n","/*\n * paragraph.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { BlockCommand, EditorCommandId, ProsemirrorCommand } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { insertParagraph } from '../api/paragraph';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nconst extension: Extension = {\n  nodes: [\n    {\n      name: 'paragraph',\n      spec: {\n        content: 'inline*',\n        group: 'block list_item_block',\n        parseDOM: [{ tag: 'p' }],\n        toDOM() {\n          return ['p', 0];\n        },\n      },\n      pandoc: {\n        readers: [\n          { token: PandocTokenType.Para, block: 'paragraph' },\n          { token: PandocTokenType.Plain, block: 'paragraph' },\n        ],\n        writer: (output: PandocOutput, node: ProsemirrorNode) => {\n          output.writeToken(PandocTokenType.Para, () => {\n            output.writeInlines(node.content);\n          });\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [\n      new BlockCommand(EditorCommandId.Paragraph, ['Mod-Alt-0'], schema.nodes.paragraph, schema.nodes.paragraph),\n      new InsertParagraphCommand(),\n    ];\n  },\n};\n\nclass InsertParagraphCommand extends ProsemirrorCommand {\n  constructor() {\n    super(EditorCommandId.ParagraphInsert, [], insertParagraph);\n  }\n}\n\nexport default extension;\n","/*\n * paragraph.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { canInsertNode } from './node';\n\nexport function insertParagraph(state: EditorState, dispatch?: (tr: Transaction) => void) {\n  const schema = state.schema;\n\n  if (!canInsertNode(state, schema.nodes.paragraph)) {\n    return false;\n  }\n\n  if (dispatch) {\n    const tr = state.tr;\n    tr.replaceSelectionWith(schema.nodes.paragraph.create());\n    setTextSelection(state.selection.from + 1, 1)(tr);\n    dispatch(tr);\n  }\n\n  return true;\n}\n","/*\n * heading.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { textblockTypeInputRule, InputRule } from 'prosemirror-inputrules';\nimport { Node as ProsemirrorNode, Schema, NodeType, Fragment } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\nimport { findParentNode, findParentNodeOfType } from 'prosemirror-utils';\n\nimport { PandocOutput, PandocToken, PandocTokenType } from '../api/pandoc';\nimport { EditorCommandId, toggleBlockType, ProsemirrorCommand } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport {\n  pandocAttrSpec,\n  pandocAttrParseDom,\n  pandocAttrToDomAttr,\n  pandocAttrReadAST,\n  pandocAttrParseText,\n} from '../api/pandoc_attr';\nimport { uuidv4 } from '../api/util';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsert, OmniInsertGroup } from '../api/omni_insert';\nimport { emptyNodePlaceholderPlugin } from '../api/placeholder';\nimport { kHeadingLevel, kHeadingAttr, kHeadingChildren } from '../api/heading';\n\nconst kHeadingLevels = [1, 2, 3, 4, 5, 6];\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, format, ui } = context;\n\n  const headingAttr = pandocExtensions.header_attributes || pandocExtensions.mmd_header_identifiers;\n\n  return {\n    nodes: [\n      {\n        name: 'heading',\n        spec: {\n          attrs: {\n            level: { default: 1 },\n            link: { default: null },\n            navigation_id: { default: null },\n            ...(headingAttr ? pandocAttrSpec : {}),\n          },\n          content: 'inline*',\n          group: 'block',\n          defining: true,\n          parseDOM: [\n            { tag: 'h1', getAttrs: headingAttrs(1, headingAttr) },\n            { tag: 'h2', getAttrs: headingAttrs(2, headingAttr) },\n            { tag: 'h3', getAttrs: headingAttrs(3, headingAttr) },\n            { tag: 'h4', getAttrs: headingAttrs(4, headingAttr) },\n            { tag: 'h5', getAttrs: headingAttrs(5, headingAttr) },\n            { tag: 'h6', getAttrs: headingAttrs(6, headingAttr) },\n          ],\n          toDOM(node) {\n            const attr = headingAttr ? pandocAttrToDomAttr(node.attrs) : {};\n            attr.class = (attr.class || '').concat(' pm-heading');\n            return [\n              'h' + node.attrs.level,\n              {\n                'data-link': node.attrs.link,\n                ...attr,\n              },\n\n              0,\n            ];\n          },\n        },\n\n        attr_edit: () => {\n          if (headingAttr) {\n            return {\n              type: (schema: Schema) => schema.nodes.heading,\n              offset: {\n                top: 5,\n                right: 10,\n              },\n            };\n          } else {\n            return null;\n          }\n        },\n\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Header,\n              block: 'heading',\n              getAttrs: (tok: PandocToken) => ({\n                level: tok.c[kHeadingLevel],\n                navigation_id: uuidv4(),\n                ...(headingAttr ? pandocAttrReadAST(tok, kHeadingAttr) : {}),\n              }),\n              getChildren: (tok: PandocToken) => tok.c[kHeadingChildren],\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Header, () => {\n              output.write(node.attrs.level);\n              if (headingAttr) {\n                output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n              } else {\n                output.writeAttr();\n              }\n              output.writeArray(() => {\n                if (node.attrs.level === 1 && format.rmdExtensions.bookdownPart) {\n                  writeBookdownH1(output, node);\n                } else {\n                  output.writeInlines(node.content);\n                }\n              });\n            });\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [\n        new HeadingCommand(schema, EditorCommandId.Heading1, 1, heading1OmniInsert(ui)),\n        new HeadingCommand(schema, EditorCommandId.Heading2, 2, heading2OmniInsert(ui)),\n        new HeadingCommand(schema, EditorCommandId.Heading3, 3, heading3OmniInsert(ui)),\n        new HeadingCommand(schema, EditorCommandId.Heading4, 4, heading4OmniInsert(ui)),\n        new HeadingCommand(schema, EditorCommandId.Heading5, 5),\n        new HeadingCommand(schema, EditorCommandId.Heading6, 6),\n      ];\n    },\n\n    inputRules: (schema: Schema) => {\n      const rules = [\n        textblockTypeInputRule(\n          new RegExp('^(#{1,' + kHeadingLevels.length + '})\\\\s$'),\n          schema.nodes.heading,\n          match => ({\n            level: match[1].length,\n            navigation_id: uuidv4(),\n          }),\n        ),\n      ];\n\n      if (headingAttr) {\n        rules.push(headingAttributeInputRule(schema));\n      }\n\n      return rules;\n    },\n\n    plugins: (schema: Schema) => {\n      return [emptyHeadingPlaceholderPlugin(schema.nodes.heading, ui)];\n    },\n  };\n};\n\nfunction headingAttributeInputRule(schema: Schema) {\n  return new InputRule(/ {([^}]+)}$/, (state: EditorState, match: string[], start: number, end: number) => {\n    // only fire in headings\n    const heading = findParentNodeOfType(schema.nodes.heading)(state.selection);\n    if (heading) {\n      // try to parse the attributes\n      const attrs = pandocAttrParseText(match[1]);\n      if (attrs) {\n        const tr = state.tr;\n        tr.setNodeMarkup(heading.pos, undefined, {\n          ...heading.node.attrs,\n          ...attrs,\n        });\n        tr.deleteRange(start + 1, end);\n        return tr;\n      } else {\n        return null;\n      }\n    } else {\n      return null;\n    }\n  });\n}\n\nclass HeadingCommand extends ProsemirrorCommand {\n  public readonly nodeType: NodeType;\n  public readonly level: number;\n\n  constructor(schema: Schema, id: EditorCommandId, level: number, omniInsert?: OmniInsert) {\n    super(id, ['Mod-Alt-' + level], headingCommandFn(schema, level), omniInsert);\n    this.nodeType = schema.nodes.heading;\n    this.level = level;\n  }\n\n  public isActive(state: EditorState) {\n    const predicate = (n: ProsemirrorNode) => n.type === this.nodeType && n.attrs.level === this.level;\n    const node = findParentNode(predicate)(state.selection);\n    return !!node;\n  }\n}\n\nfunction heading1OmniInsert(ui: EditorUI) {\n  return headingOmniInsert(ui, 1, ui.context.translateText('Top level heading'), [\n    ui.images.omni_insert?.heading1!,\n    ui.images.omni_insert?.heading1_dark!,\n  ]);\n}\n\nfunction heading2OmniInsert(ui: EditorUI) {\n  return headingOmniInsert(ui, 2, ui.context.translateText('Section heading'), [\n    ui.images.omni_insert?.heading2!,\n    ui.images.omni_insert?.heading2_dark!,\n  ]);\n}\n\nfunction heading3OmniInsert(ui: EditorUI) {\n  return headingOmniInsert(ui, 3, ui.context.translateText('Sub-section heading'), [\n    ui.images.omni_insert?.heading3!,\n    ui.images.omni_insert?.heading3_dark!,\n  ]);\n}\n\nfunction heading4OmniInsert(ui: EditorUI) {\n  return headingOmniInsert(ui, 4, ui.context.translateText('Smaller heading'), [\n    ui.images.omni_insert?.heading4!,\n    ui.images.omni_insert?.heading4_dark!,\n  ]);\n}\n\nfunction headingOmniInsert(ui: EditorUI, level: number, description: string, images: [string, string]): OmniInsert {\n  return {\n    name: headingName(ui, level),\n    description,\n    group: OmniInsertGroup.Headings,\n    image: () => (ui.prefs.darkMode() ? images[1] : images[0]),\n  };\n}\n\nfunction headingName(ui: EditorUI, level: number) {\n  const kHeadingPrefix = ui.context.translateText('Heading');\n  return `${kHeadingPrefix} ${level}`;\n}\n\nfunction headingCommandFn(schema: Schema, level: number) {\n  return toggleBlockType(schema.nodes.heading, schema.nodes.paragraph, { level });\n}\n\n// function for getting attrs\nfunction headingAttrs(level: number, pandocAttrSupported: boolean) {\n  return (dom: Node | string) => {\n    const el = dom as Element;\n    return {\n      level,\n      'data-link': el.getAttribute('data-link'),\n      ...(pandocAttrSupported ? pandocAttrParseDom(el, {}) : {}),\n    };\n  };\n}\n\nfunction emptyHeadingPlaceholderPlugin(nodeType: NodeType, ui: EditorUI) {\n  return emptyNodePlaceholderPlugin(nodeType, node => headingName(ui, node.attrs.level));\n}\n\n// write a bookdown (PART) H1 w/o spurious \\\nfunction writeBookdownH1(output: PandocOutput, node: ProsemirrorNode) {\n  // see if this is a (PART\\*). note we also match and replay any text\n  // before the first ( in case the cursor sentinel ended up there\n  const partMatch = node.textContent.match(/^([^()]*)\\(PART\\\\\\*\\)/);\n  if (partMatch) {\n    const schema = node.type.schema;\n    output.writeInlines(Fragment.from(schema.text(partMatch[1] + '(PART*)')));\n    output.writeInlines(node.content.cut(partMatch[0].length));\n  } else {\n    output.writeInlines(node.content);\n  }\n}\n\nexport default extension;\n","/*\n * blockquote.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { wrappingInputRule } from 'prosemirror-inputrules';\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { WrapCommand, EditorCommandId } from '../api/command';\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nconst extension = (context: ExtensionContext) => {\n  const { ui } = context;\n\n  return {\n    nodes: [\n      {\n        name: 'blockquote',\n        spec: {\n          content: 'block+',\n          group: 'block',\n          defining: true,\n          parseDOM: [{ tag: 'blockquote' }],\n          toDOM(): DOMOutputSpec {\n            return ['blockquote', { class: 'pm-blockquote pm-block-border-color' }, 0];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.BlockQuote,\n              block: 'blockquote',\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.BlockQuote, () => {\n              output.writeNodes(node);\n            });\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [new WrapCommand(EditorCommandId.Blockquote, [], schema.nodes.blockquote, {}, blockquoteOmniInsert(ui))];\n    },\n\n    inputRules: (schema: Schema) => {\n      return [wrappingInputRule(/^\\s*>\\s$/, schema.nodes.blockquote)];\n    },\n  };\n};\n\nfunction blockquoteOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Blockquote'),\n    description: ui.context.translateText('Section quoted from another source'),\n    group: OmniInsertGroup.Blocks,\n    priority: 8,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.blockquote_dark! : ui.images.omni_insert?.blockquote!),\n  };\n}\n\nexport default extension;\n","/*\n * code_block.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { newlineInCode, exitCode } from 'prosemirror-commands';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { BlockCommand, EditorCommandId, ProsemirrorCommand, toggleBlockType } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { BaseKey } from '../api/basekeys';\nimport { codeNodeSpec } from '../api/code';\nimport { PandocOutput, PandocTokenType, PandocExtensions } from '../api/pandoc';\nimport { pandocAttrSpec, pandocAttrParseDom, pandocAttrToDomAttr } from '../api/pandoc_attr';\nimport { PandocCapabilities } from '../api/pandoc_capabilities';\nimport { EditorUI } from '../api/ui';\nimport { CodeBlockProps } from '../api/ui-dialogs';\nimport { hasFencedCodeBlocks } from '../api/pandoc_format';\nimport { precedingListItemInsertPos, precedingListItemInsert } from '../api/list';\nimport { EditorOptions } from '../api/options';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, pandocCapabilities, ui, options } = context;\n\n  const hasAttr = hasFencedCodeBlocks(pandocExtensions);\n\n  return {\n    nodes: [\n      {\n        name: 'code_block',\n\n        spec: {\n          ...codeNodeSpec(),\n          attrs: { ...(hasAttr ? pandocAttrSpec : {}) },\n          parseDOM: [\n            {\n              tag: 'pre',\n              preserveWhitespace: 'full',\n              getAttrs: (node: Node | string) => {\n                if (hasAttr) {\n                  const el = node as Element;\n                  return pandocAttrParseDom(el, {});\n                } else {\n                  return {};\n                }\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            const fontClass = 'pm-fixedwidth-font';\n            const attrs = hasAttr\n              ? pandocAttrToDomAttr({\n                  ...node.attrs,\n                  classes: [...node.attrs.classes, fontClass],\n                })\n              : {\n                  class: fontClass,\n                };\n            return ['pre', attrs, ['code', 0]];\n          },\n        },\n\n        code_view: {\n          lang: (node: ProsemirrorNode) => {\n            return codeBlockLang(node, options);\n          },\n          attrEditFn: codeBlockFormatCommandFn(pandocExtensions, ui, pandocCapabilities.highlight_languages),\n        },\n\n        attr_edit: codeBlockAttrEdit(pandocExtensions, pandocCapabilities, ui),\n\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.CodeBlock,\n              code_block: true,\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.CodeBlock, () => {\n              if (hasAttr) {\n                const id = pandocExtensions.fenced_code_attributes ? node.attrs.id : '';\n                const keyvalue = pandocExtensions.fenced_code_attributes ? node.attrs.keyvalue : [];\n                output.writeAttr(id, node.attrs.classes, keyvalue);\n              } else {\n                output.writeAttr();\n              }\n              output.write(node.textContent);\n            });\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      const commands: ProsemirrorCommand[] = [\n        new BlockCommand(EditorCommandId.CodeBlock, [], schema.nodes.code_block, schema.nodes.paragraph, {}),\n      ];\n      if (hasAttr) {\n        commands.push(new CodeBlockFormatCommand(pandocExtensions, ui, pandocCapabilities.highlight_languages));\n      }\n      return commands;\n    },\n\n    baseKeys: () => {\n      return [\n        { key: BaseKey.Enter, command: newlineInCode },\n        { key: BaseKey.ModEnter, command: exitCode },\n        { key: BaseKey.ShiftEnter, command: exitCode },\n      ];\n    },\n  };\n};\n\nclass CodeBlockFormatCommand extends ProsemirrorCommand {\n  constructor(pandocExtensions: PandocExtensions, ui: EditorUI, languages: string[]) {\n    super(\n      EditorCommandId.CodeBlockFormat,\n      ['Shift-Mod-\\\\'],\n      codeBlockFormatCommandFn(pandocExtensions, ui, languages),\n      {\n        name: ui.context.translateText('Code Block...'),\n        description: ui.context.translateText('Source code display'),\n        group: OmniInsertGroup.Blocks,\n        priority: 7,\n        image: () =>\n          ui.prefs.darkMode() ? ui.images.omni_insert?.code_block_dark! : ui.images.omni_insert?.code_block!,\n      },\n    );\n  }\n}\n\nfunction codeBlockFormatCommandFn(pandocExtensions: PandocExtensions, ui: EditorUI, languages: string[]) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    // enable if we are either inside a code block or we can toggle to a code block\n    const schema = state.schema;\n    const codeBlock = findParentNodeOfType(schema.nodes.code_block)(state.selection);\n    if (\n      !codeBlock &&\n      !toggleBlockType(schema.nodes.code_block, schema.nodes.paragraph)(state) &&\n      !precedingListItemInsertPos(state.doc, state.selection)\n    ) {\n      return false;\n    }\n\n    async function asyncEditCodeBlock() {\n      if (dispatch) {\n        // get props to edit\n        const codeBlockProps = codeBlock\n          ? { ...(codeBlock.node.attrs as CodeBlockProps), lang: '' }\n          : defaultCodeBlockProps();\n\n        // set lang if the first class is from available languages\n        // (alternatively if we don't support attributes then it's\n        // automatically considered the language)\n        if (codeBlockProps.classes && codeBlockProps.classes.length) {\n          const potentialLang = codeBlockProps.classes[0];\n          if (!pandocExtensions.fenced_code_attributes || languages.includes(potentialLang)) {\n            codeBlockProps.lang = potentialLang;\n            codeBlockProps.classes = codeBlockProps.classes.slice(1);\n          }\n        }\n\n        // show dialog\n        const result = await ui.dialogs.editCodeBlock(\n          codeBlockProps,\n          pandocExtensions.fenced_code_attributes,\n          languages,\n        );\n        if (result) {\n          // extract lang\n          const applyProps = propsWithLangClass(result);\n\n          // edit or toggle as appropriate\n          if (codeBlock) {\n            const tr = state.tr;\n            tr.setNodeMarkup(codeBlock.pos, schema.nodes.code_block, applyProps);\n            dispatch(tr);\n          } else {\n            const prevListItemPos = precedingListItemInsertPos(state.doc, state.selection);\n            if (prevListItemPos) {\n              const tr = state.tr;\n              const block = schema.nodes.code_block.create(applyProps);\n              precedingListItemInsert(tr, prevListItemPos, block);\n              dispatch(tr);\n            } else {\n              toggleBlockType(schema.nodes.code_block, schema.nodes.paragraph, applyProps)(state, dispatch, view);\n            }\n          }\n        }\n      }\n\n      if (view) {\n        view.focus();\n      }\n    }\n\n    asyncEditCodeBlock();\n\n    return true;\n  };\n}\n\nfunction defaultCodeBlockProps() {\n  return { id: '', classes: [], keyvalue: [], lang: '' };\n}\n\nfunction propsWithLangClass(props: CodeBlockProps) {\n  const newProps = { ...props };\n  if (newProps.classes && newProps.lang) {\n    newProps.classes.unshift(props.lang);\n  }\n  return newProps;\n}\n\n// determine the code block language. if it's an Rmd example (i.e. with `r ''`) and\n// we have rmdExampleHighlight enabled then use the Rmd chunk language for highlighting\nfunction codeBlockLang(node: ProsemirrorNode, options: EditorOptions) {\n  if (node.attrs.classes && node.attrs.classes.length) {\n    const lang = node.attrs.classes[0];\n    if (options.rmdExampleHighlight && lang === 'md') {\n      const match = node.textContent.match(/^```+\\s*\\{([a-zA-Z0-9_]+)( *[ ,].*)?\\}`r ''`/);\n      if (match) {\n        return match[1];\n      }\n    }\n    return lang;\n  } else {\n    return null;\n  }\n}\n\nfunction codeBlockAttrEdit(pandocExtensions: PandocExtensions, pandocCapabilities: PandocCapabilities, ui: EditorUI) {\n  return () => {\n    if (hasFencedCodeBlocks(pandocExtensions)) {\n      return {\n        type: (schema: Schema) => schema.nodes.code_block,\n        tags: (node: ProsemirrorNode) => {\n          const tags: string[] = [];\n          if (node.attrs.id) {\n            tags.push(`#${node.attrs.id}`);\n          }\n          if (node.attrs.classes && node.attrs.classes.length) {\n            const lang = node.attrs.classes[0];\n            if (pandocCapabilities.highlight_languages.includes(lang) || lang === 'tex') {\n              tags.push(lang);\n            } else {\n              tags.push(`.${lang}`);\n            }\n          }\n          return tags;\n        },\n        offset: {\n          top: 3,\n          right: 0,\n        },\n        editFn: () => codeBlockFormatCommandFn(pandocExtensions, ui, pandocCapabilities.highlight_languages),\n      };\n    } else {\n      return null;\n    }\n  };\n}\n\nexport default extension;\n","/*\n * list.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { liftListItem, sinkListItem, splitListItem } from 'prosemirror-schema-list';\nimport { Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { BaseKey } from '../../api/basekeys';\nimport { EditorUI, kListSpacingTight } from '../../api/ui';\nimport { ListCapabilities } from '../../api/list';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocTokenType } from '../../api/pandoc';\nimport { kPlatformMac } from '../../api/platform';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { conditionalWrappingInputRule } from '../../api/input_rule';\n\nimport { ListCommand, TightListCommand, EditListPropertiesCommand, editListPropertiesCommandFn } from './list-commands';\n\nimport {\n  CheckedListItemNodeView,\n  checkedListItemInputRule,\n  checkedListInputRule,\n  CheckedListItemCommand,\n  CheckedListItemToggleCommand,\n} from './list-checked';\n\nimport { writePandocBulletList, writePandocOrderedList, readPandocList } from './list-pandoc';\n\nimport './list-styles.css';\n\nexport enum ListNumberStyle {\n  DefaultStyle = 'DefaultStyle',\n  Decimal = 'Decimal',\n  LowerRoman = 'LowerRoman',\n  UpperRoman = 'UpperRoman',\n  LowerAlpha = 'LowerAlpha',\n  UpperAlpha = 'UpperAlpha',\n  Example = 'Example',\n}\n\n// NOTE: HTML output doesn't currently respect this and it's difficult to\n// do with CSS (especially for nested lists). So we allow the user to edit\n// it but it isn't reflected in the editor.\nexport enum ListNumberDelim {\n  DefaultDelim = 'DefaultDelim',\n  Period = 'Period',\n  OneParen = 'OneParen',\n  TwoParens = 'TwoParens',\n}\n\nconst plugin = new PluginKey('list');\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, ui } = context;\n\n  // determine list capabilities based on active format options\n  const capabilities: ListCapabilities = {\n    tasks: pandocExtensions.task_lists,\n    fancy: pandocExtensions.fancy_lists,\n    /*\n     Always disable example lists b/c they don't round trip through the AST:\n      - (@good) referenced elsewhere via (@good) just becomes a generic example (@) with \n        a literal numeric reference.\n      - The writer doesn't preserve the (@) or the (@good) when writing\n    */\n    // example: pandocExtensions.fancy_lists && pandocExtensions.example_lists,\n    example: false,\n    order: pandocExtensions.startnum,\n  };\n\n  return {\n    nodes: [\n      {\n        name: 'list_item',\n        spec: {\n          content: 'list_item_block block*',\n          attrs: {\n            checked: { default: null },\n          },\n          defining: true,\n          parseDOM: [\n            {\n              tag: 'li',\n              getAttrs: (dom: Node | string) => {\n                const el = dom as Element;\n                const attrs: any = {};\n                if (capabilities.tasks && el.hasAttribute('data-checked')) {\n                  attrs.checked = el.getAttribute('data-checked') === 'true';\n                }\n                return attrs;\n              },\n            },\n          ],\n          toDOM(node) {\n            const attrs: any = {\n              class: 'pm-list-item',\n            };\n            if (capabilities.tasks && node.attrs.checked !== null) {\n              attrs['data-checked'] = node.attrs.checked ? 'true' : 'false';\n            }\n            return ['li', attrs, 0];\n          },\n        },\n        pandoc: {},\n      },\n      {\n        name: 'bullet_list',\n        spec: {\n          content: 'list_item+',\n          group: 'block',\n          attrs: {\n            tight: { default: false },\n          },\n          parseDOM: [\n            {\n              tag: 'ul',\n              getAttrs: (dom: Node | string) => {\n                const el = dom as Element;\n                const attrs: any = {};\n                if (el.hasAttribute('data-tight')) {\n                  attrs.tight = true;\n                }\n                return attrs;\n              },\n            },\n          ],\n          toDOM(node) {\n            const attrs: { [key: string]: string } = {};\n            attrs.class = 'pm-list pm-bullet-list';\n            if (node.attrs.tight) {\n              attrs['data-tight'] = 'true';\n            }\n            return ['ul', attrs, 0];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.BulletList,\n              handler: (schema: Schema) => readPandocList(schema.nodes.bullet_list, capabilities),\n            },\n          ],\n          writer: writePandocBulletList(capabilities),\n        },\n\n        attr_edit: listAttrEdit('bullet_list', capabilities, ui),\n      },\n      {\n        name: 'ordered_list',\n        spec: {\n          content: 'list_item+',\n          group: 'block',\n          attrs: {\n            tight: { default: false },\n            order: { default: 1 },\n            number_style: { default: ListNumberStyle.DefaultStyle },\n            number_delim: { default: ListNumberDelim.DefaultDelim },\n          },\n          parseDOM: [\n            {\n              tag: 'ol',\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n\n                const attrs: any = {};\n                attrs.tight = el.hasAttribute('data-tight');\n\n                if (capabilities.order) {\n                  const order: string | null = el.getAttribute('start');\n                  if (!order) {\n                    attrs.order = 1;\n                  } else {\n                    attrs.order = parseInt(order, 10) || 1;\n                  }\n                }\n\n                if (capabilities.fancy) {\n                  if (capabilities.example && el.getAttribute('data-example')) {\n                    attrs.number_style = ListNumberStyle.Example;\n                  } else {\n                    attrs.number_style = typeToNumberStyle(el.getAttribute('type'));\n                  }\n                  const numberDelim = el.getAttribute('data-number-delim');\n                  if (numberDelim) {\n                    attrs.number_delim = numberDelim;\n                  }\n                }\n\n                return attrs;\n              },\n            },\n          ],\n          toDOM(node) {\n            const attrs: { [key: string]: string } = {};\n            attrs.class = 'pm-list pm-ordered-list';\n            if (node.attrs.tight) {\n              attrs['data-tight'] = 'true';\n            }\n            if (capabilities.order && node.attrs.order !== 1) {\n              attrs.start = node.attrs.order;\n            }\n            if (capabilities.fancy) {\n              const type = numberStyleToType(node.attrs.number_style);\n              if (type) {\n                attrs.type = type;\n              }\n              if (capabilities.example) {\n                if (node.attrs.number_style === ListNumberStyle.Example) {\n                  attrs['data-example'] = '1';\n                }\n              }\n              attrs['data-number-delim'] = node.attrs.number_delim;\n            }\n            return ['ol', attrs, 0];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.OrderedList,\n              handler: (schema: Schema) => readPandocList(schema.nodes.ordered_list, capabilities),\n            },\n          ],\n          writer: writePandocOrderedList(capabilities),\n        },\n\n        attr_edit: listAttrEdit('ordered_list', capabilities, ui),\n      },\n    ],\n\n    plugins: (schema: Schema) => {\n      const plugins: Plugin[] = [];\n      if (capabilities.tasks) {\n        plugins.push(\n          new Plugin({\n            key: plugin,\n            props: {\n              nodeViews: {\n                list_item(node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) {\n                  return new CheckedListItemNodeView(node, view, getPos as () => number);\n                },\n              },\n            },\n          }),\n        );\n      }\n      return plugins;\n    },\n\n    commands: (schema: Schema) => {\n      const commands = [\n        new ListCommand(\n          EditorCommandId.BulletList,\n          kPlatformMac ? ['Shift-Mod-8'] : [],\n          schema.nodes.bullet_list,\n          schema.nodes.list_item,\n          bulletListOmniInsert(ui),\n          ui.prefs,\n        ),\n        new ListCommand(\n          EditorCommandId.OrderedList,\n          kPlatformMac ? ['Shift-Mod-7'] : [],\n          schema.nodes.ordered_list,\n          schema.nodes.list_item,\n          orderedListOmniInsert(ui),\n          ui.prefs,\n        ),\n        new ProsemirrorCommand(EditorCommandId.ListItemSink, ['Tab'], sinkListItem(schema.nodes.list_item)),\n        new ProsemirrorCommand(EditorCommandId.ListItemLift, ['Shift-Tab'], liftListItem(schema.nodes.list_item)),\n        new ProsemirrorCommand(EditorCommandId.ListItemSplit, ['Enter'], splitListItem(schema.nodes.list_item)),\n        new TightListCommand(),\n      ];\n      if (capabilities.fancy) {\n        commands.push(new EditListPropertiesCommand(ui, capabilities));\n      }\n      if (capabilities.tasks) {\n        commands.push(\n          new CheckedListItemCommand(schema.nodes.list_item),\n          new CheckedListItemToggleCommand(schema.nodes.list_item),\n        );\n      }\n      return commands;\n    },\n\n    baseKeys: (schema: Schema) => {\n      return [\n        { key: BaseKey.Enter, command: splitListItem(schema.nodes.list_item) },\n        { key: BaseKey.Tab, command: sinkListItem(schema.nodes.list_item) },\n        { key: BaseKey.ShiftTab, command: liftListItem(schema.nodes.list_item) },\n      ];\n    },\n\n    inputRules: (schema: Schema) => {\n      // reflect tight pref\n      const tightFn = () => {\n        return {\n          tight: ui.prefs.listSpacing() === kListSpacingTight,\n        };\n      };\n\n      const isNotInHeading = (state: EditorState) => {\n        return !findParentNodeOfType(schema.nodes.heading)(state.selection);\n      };\n\n      const rules = [\n        conditionalWrappingInputRule(/^\\s*([-+*])\\s$/, schema.nodes.bullet_list, isNotInHeading, tightFn),\n        conditionalWrappingInputRule(\n          /^(\\d+)\\.\\s$/,\n          schema.nodes.ordered_list,\n          isNotInHeading,\n          match => ({ order: +match[1], tight: tightFn() }),\n          (match, node) => node.childCount + node.attrs.order === +match[1],\n        ),\n      ];\n      if (capabilities.tasks) {\n        rules.push(checkedListItemInputRule(), checkedListInputRule(schema));\n      }\n      return rules;\n    },\n  };\n};\n\nfunction listAttrEdit(type: string, capabilities: ListCapabilities, ui: EditorUI) {\n  return () => {\n    return {\n      type: (schema: Schema) => schema.nodes[type],\n      editFn: () => editListPropertiesCommandFn(ui, capabilities),\n      offset: {\n        top: 5,\n        right: 5,\n      },\n    };\n  };\n}\n\nfunction numberStyleToType(style: ListNumberStyle): string | null {\n  switch (style) {\n    case ListNumberStyle.DefaultStyle:\n    case ListNumberStyle.Decimal:\n    case ListNumberStyle.Example:\n      return 'l';\n    case ListNumberStyle.LowerAlpha:\n      return 'a';\n    case ListNumberStyle.UpperAlpha:\n      return 'A';\n    case ListNumberStyle.LowerRoman:\n      return 'i';\n    case ListNumberStyle.UpperRoman:\n      return 'I';\n    default:\n      return null;\n  }\n}\n\nfunction typeToNumberStyle(type: string | null): ListNumberStyle {\n  switch (type) {\n    case 'l':\n      return ListNumberStyle.Decimal;\n    case 'a':\n      return ListNumberStyle.LowerAlpha;\n    case 'A':\n      return ListNumberStyle.UpperAlpha;\n    case 'i':\n      return ListNumberStyle.LowerRoman;\n    case 'I':\n      return ListNumberStyle.UpperRoman;\n    default:\n      return ListNumberStyle.Decimal;\n  }\n}\n\nfunction bulletListOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Bullet List'),\n    description: ui.context.translateText('List using bullets for items'),\n    group: OmniInsertGroup.Lists,\n    priority: 5,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.bullet_list_dark! : ui.images.omni_insert?.bullet_list!),\n  };\n}\n\nfunction orderedListOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Numbered List'),\n    description: ui.context.translateText('List using numbers for items'),\n    group: OmniInsertGroup.Lists,\n    priority: 4,\n    image: () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.ordered_list_dark! : ui.images.omni_insert?.ordered_list!,\n  };\n}\n\nexport default extension;\n","/*\n * list-commands.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeType, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { autoJoin } from 'prosemirror-commands';\nimport { NodeWithPos, findParentNode } from 'prosemirror-utils';\n\nimport { NodeCommand, toggleList, ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { EditorUI, EditorUIPrefs } from '../../api/ui';\nimport { ListProps } from '../../api/ui-dialogs';\nimport { ListType, ListCapabilities, isList } from '../../api/list';\nimport { OmniInsert } from '../../api/omni_insert';\n\nexport class ListCommand extends NodeCommand {\n  constructor(\n    id: EditorCommandId,\n    keymap: string[],\n    listType: NodeType,\n    listItemType: NodeType,\n    omniInsert: OmniInsert,\n    prefs: EditorUIPrefs,\n  ) {\n    super(id, keymap, listType, {}, autoJoin(toggleList(listType, listItemType, prefs), [listType.name]), omniInsert);\n  }\n}\n\nexport class TightListCommand extends ProsemirrorCommand {\n  constructor() {\n    super(\n      EditorCommandId.TightList,\n      ['Mod-Alt-9'],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        const parentList = findParentNode(isList)(state.selection);\n        if (!parentList) {\n          return false;\n        }\n\n        if (dispatch) {\n          const tr = state.tr;\n          const node = parentList.node;\n          tr.setNodeMarkup(parentList.pos, node.type, {\n            ...node.attrs,\n            tight: !node.attrs.tight,\n          });\n          dispatch(tr);\n        }\n\n        return true;\n      },\n    );\n  }\n\n  public isActive(state: EditorState): boolean {\n    if (this.isEnabled(state)) {\n      const itemNode = findParentNode(isList)(state.selection) as NodeWithPos;\n      return itemNode.node.attrs.tight;\n    } else {\n      return false;\n    }\n  }\n}\n\nexport function editListPropertiesCommandFn(ui: EditorUI, capabilities: ListCapabilities) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    // see if a parent node is a list\n    let node: ProsemirrorNode | null = null;\n    let pos: number = 0;\n    const nodeWithPos = findParentNode(isList)(state.selection);\n    if (nodeWithPos) {\n      node = nodeWithPos.node;\n      pos = nodeWithPos.pos;\n    }\n\n    // return false (disabled) for no targets\n    if (!node) {\n      return false;\n    }\n\n    // execute command when requested\n    async function asyncEditList() {\n      if (dispatch) {\n        await editList(node as ProsemirrorNode, pos, state, dispatch, ui, capabilities);\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncEditList();\n\n    return true;\n  };\n}\n\nexport class EditListPropertiesCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI, capabilities: ListCapabilities) {\n    super(EditorCommandId.EditListProperties, [], editListPropertiesCommandFn(ui, capabilities));\n  }\n}\n\nasync function editList(\n  node: ProsemirrorNode,\n  pos: number,\n  state: EditorState,\n  dispatch: (tr: Transaction<any>) => void,\n  ui: EditorUI,\n  capabilities: ListCapabilities,\n): Promise<void> {\n  // get list properties\n  const schema = node.type.schema;\n  const attrs = node.attrs;\n  const props = {\n    ...attrs,\n    type: node.type === schema.nodes.ordered_list ? ListType.Ordered : ListType.Bullet,\n  } as ListProps;\n\n  // edit list\n  const result = await ui.dialogs.editList(props, capabilities);\n\n  // apply result\n  if (result) {\n    const tr = state.tr;\n    const listType = result.type === ListType.Ordered ? schema.nodes.ordered_list : schema.nodes.bullet_list;\n    tr.setNodeMarkup(pos, listType, {\n      ...attrs,\n      ...result,\n    });\n    dispatch(tr);\n  }\n}\n","/*\n * list-checked.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, NodeType } from 'prosemirror-model';\nimport { NodeView, EditorView } from 'prosemirror-view';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNodeOfType, NodeWithPos, setTextSelection } from 'prosemirror-utils';\nimport { InputRule, wrappingInputRule } from 'prosemirror-inputrules';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocToken, mapTokens } from '../../api/pandoc';\n\n// custom NodeView that accomodates display / interaction with item check boxes\nexport class CheckedListItemNodeView implements NodeView {\n  public readonly dom: HTMLElement;\n  public readonly contentDOM: HTMLElement;\n\n  private readonly node: ProsemirrorNode;\n  private readonly view: EditorView;\n  private readonly getPos: () => number;\n\n  constructor(node: ProsemirrorNode, view: EditorView, getPos: () => number) {\n    this.node = node;\n    this.view = view;\n    this.getPos = getPos;\n\n    // create root li element\n    this.dom = window.document.createElement('li');\n    if (node.attrs.tight) {\n      this.dom.setAttribute('data-tight', 'true');\n    }\n\n    const container = window.document.createElement('div');\n    container.classList.add('list-item-container');\n    this.dom.appendChild(container);\n\n    // add checkbox for checked items\n    if (node.attrs.checked !== null) {\n      this.dom.setAttribute('data-checked', node.attrs.checked ? 'true' : 'false');\n\n      // checkbox for editing checked state\n      const input = window.document.createElement('input');\n      input.classList.add('list-item-checkbox');\n      input.setAttribute('type', 'checkbox');\n      input.checked = node.attrs.checked;\n      input.contentEditable = 'false';\n      input.disabled = !(view as any).editable;\n      input.addEventListener('mousedown', (ev: Event) => {\n        ev.preventDefault(); // don't steal focus\n      });\n      input.addEventListener('change', (ev: Event) => {\n        const tr = view.state.tr;\n        tr.setNodeMarkup(getPos(), node.type, {\n          ...node.attrs,\n          checked: (ev.target as HTMLInputElement).checked,\n        });\n        setTextSelection(getPos() + 1)(tr);\n        view.dispatch(tr);\n      });\n      container.appendChild(input);\n    }\n\n    // content div\n    const content = window.document.createElement('div');\n    content.classList.add('list-item-content');\n    this.contentDOM = content;\n    container.appendChild(content);\n  }\n}\n\n// command to toggle checked list items\nexport function checkedListItemCommandFn(itemType: NodeType) {\n  return (state: EditorState, dispatch?: ((tr: Transaction) => void) | undefined) => {\n    const itemNode = findParentNodeOfType(itemType)(state.selection);\n    if (!itemNode) {\n      return false;\n    }\n\n    if (dispatch) {\n      const tr = state.tr;\n      if (itemNode.node.attrs.checked !== null) {\n        setItemChecked(tr, itemNode, null);\n      } else {\n        setItemChecked(tr, itemNode, false);\n      }\n\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nexport function checkedListItemToggleCommandFn(itemType: NodeType) {\n  return (state: EditorState, dispatch?: ((tr: Transaction) => void) | undefined) => {\n    const itemNode = findParentNodeOfType(itemType)(state.selection);\n    if (!itemNode || itemNode.node.attrs.checked === null) {\n      return false;\n    }\n\n    if (dispatch) {\n      const tr = state.tr;\n      setItemChecked(tr, itemNode, !itemNode.node.attrs.checked);\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nexport class CheckedListItemCommand extends ProsemirrorCommand {\n  constructor(itemType: NodeType) {\n    super(EditorCommandId.ListItemCheck, [], checkedListItemCommandFn(itemType));\n  }\n\n  public isActive(state: EditorState): boolean {\n    if (this.isEnabled(state)) {\n      const itemNode = findParentNodeOfType(state.schema.nodes.list_item)(state.selection) as NodeWithPos;\n      return itemNode.node.attrs.checked !== null;\n    } else {\n      return false;\n    }\n  }\n}\n\nexport class CheckedListItemToggleCommand extends ProsemirrorCommand {\n  private itemType: NodeType;\n\n  constructor(itemType: NodeType) {\n    super(EditorCommandId.ListItemCheckToggle, [], checkedListItemToggleCommandFn(itemType));\n    this.itemType = itemType;\n  }\n\n  public isActive(state: EditorState): boolean {\n    const itemNode = findParentNodeOfType(this.itemType)(state.selection);\n    return itemNode && itemNode.node.attrs.checked;\n  }\n}\n\n// allow users to type [x] or [ ] to define a checked list item\nexport function checkedListItemInputRule() {\n  return new InputRule(/\\[([ x])\\]\\s$/, (state: EditorState, match: string[], start: number, end: number) => {\n    const schema = state.schema;\n\n    const itemNode = findParentNodeOfType(schema.nodes.list_item)(state.selection);\n    if (itemNode) {\n      // create transaction\n      const tr = state.tr;\n\n      // set checked\n      setItemChecked(tr, itemNode, match[1]);\n\n      // delete entered text\n      tr.delete(start, end);\n\n      // return transaction\n      return tr;\n    } else {\n      return null;\n    }\n  });\n}\n\n// allow users to begin a new checked list by typing [x] or [ ] at the beginning of a line\nexport function checkedListInputRule(schema: Schema) {\n  // regex to match checked list at the beginning of a line\n  const regex = /^\\s*\\[([ x])\\]\\s$/;\n\n  // we are going to steal the handler from the base bullet list wrapping input rule\n  const baseInputRule: any = wrappingInputRule(regex, schema.nodes.bullet_list);\n\n  return new InputRule(regex, (state: EditorState, match: string[], start: number, end: number) => {\n    // call the base handler to create the bullet list\n    const tr = baseInputRule.handler(state, match, start, end);\n    if (tr) {\n      // set the checkbox\n      const itemNode = findParentNodeOfType(schema.nodes.list_item)(tr.selection);\n      if (itemNode) {\n        setItemChecked(tr, itemNode, match[1]);\n      }\n\n      return tr;\n    } else {\n      return null;\n    }\n  });\n}\n\nfunction setItemChecked(tr: Transaction, itemNode: NodeWithPos, check: null | boolean | string) {\n  tr.setNodeMarkup(itemNode.pos, itemNode.node.type, {\n    ...itemNode.node.attrs,\n    checked: check === null ? null : typeof check === 'string' ? check === 'x' : check,\n  });\n}\n// prepend a check mark to the provided fragment\nexport function fragmentWithCheck(schema: Schema, fragment: Fragment, checked: boolean) {\n  // create a raw markdown node with [x] or [ ]\n  const mark = schema.marks.raw_inline.create({ format: 'markdown' });\n  const check = schema.text((checked ? '[x]' : '[ ]') + ' ', [mark]);\n  return Fragment.from(check).append(fragment);\n}\n\nconst kCheckedChar = '☒';\nconst kUncheckedChar = '☐';\n\nexport function tokensWithChecked(tokens: PandocToken[]): { checked: null | boolean; tokens: PandocToken[] } {\n  // will set this flag based on inspecting the first Str token\n  let checked: null | boolean | undefined;\n  let lastWasChecked = false;\n\n  // map tokens\n  const mappedTokens = mapTokens(tokens, tok => {\n    // if the last token was checked then strip the next space\n    if (tok.t === 'Space' && lastWasChecked) {\n      lastWasChecked = false;\n      return {\n        t: 'Str',\n        c: '',\n      };\n    }\n\n    // derive 'checked' from first chraracter of first Str token encountered\n    // if we find checked or unchecked then set the flag and strip off\n    // the first 2 chraracters (the check and the space after it)\n    else if (tok.t === 'Str' && checked === undefined) {\n      let text = tok.c as string;\n      if (text.charAt(0) === kCheckedChar) {\n        checked = true;\n        lastWasChecked = true;\n        text = text.slice(1);\n      } else if (text.charAt(0) === kUncheckedChar) {\n        checked = false;\n        lastWasChecked = true;\n        text = text.slice(1);\n      } else {\n        checked = null;\n      }\n      return {\n        t: 'Str',\n        c: text,\n      };\n    } else {\n      return tok;\n    }\n  });\n\n  // return\n  return {\n    checked: checked !== undefined ? checked : null,\n    tokens: mappedTokens,\n  };\n}\n","/*\n * list-pandoc.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType, Fragment } from 'prosemirror-model';\n\nimport { PandocOutput, PandocToken, ProsemirrorWriter, PandocTokenType } from '../../api/pandoc';\n\nimport { fragmentWithCheck, tokensWithChecked } from './list-checked';\nimport { ListNumberDelim, ListNumberStyle } from './list';\nimport { ListCapabilities } from '../../api/list';\n\nconst LIST_ATTRIBS = 0;\nconst LIST_CHILDREN = 1;\n\nconst LIST_ATTRIB_ORDER = 0;\nconst LIST_ATTRIB_NUMBER_STYLE = 1;\nconst LIST_ATTRIB_NUMBER_DELIM = 2;\n\n// Note that we are planning on eliminating the markdownOutputFilter after this commit\n// as there will be no more uses of it and it plays poorly w/ e.g. pandoc table output\n// which needs to reliably know the number of characters wide each column will be).\n// (previous uses of markdownOutputFilter were converted to use output.writeRawMarkdown).\n// So, if we are attempting to re-enable example lists b/c there is now round tripping\n// of example lists through the pandoc AST we need an alternative way to fixup\n// example list output (likely a more robust pandoc AST).\nconst kListItemExampleSentinel = '20543127-1873-4833-AC49-5B352CFA2AF5';\nconst kListItemExampleRegex = new RegExp(`\\\\(\\\\d+\\\\) ${kListItemExampleSentinel}`, 'g');\n\nexport function readPandocList(nodeType: NodeType, capabilities: ListCapabilities) {\n  // alias schema\n  const schema = nodeType.schema;\n\n  // default extraction functions\n  let getChildren = (tok: PandocToken) => tok.c;\n  let getAttrs = (tok: PandocToken): { [key: string]: any } => ({});\n\n  // function to read the number style (convert example to default if we\n  // don't support example lists)\n  const readNumberStyle = (attribs: any) => {\n    if (capabilities.fancy) {\n      const style = attribs[LIST_ATTRIB_NUMBER_STYLE].t;\n      if (style === ListNumberStyle.Example && !capabilities.example) {\n        return ListNumberStyle.DefaultStyle;\n      } else {\n        return style;\n      }\n    } else {\n      return ListNumberStyle.DefaultStyle;\n    }\n  };\n\n  // specialize for ordered_list\n  if (nodeType === schema.nodes.ordered_list) {\n    getAttrs = (tok: PandocToken) => {\n      const attribs = tok.c[LIST_ATTRIBS];\n      return {\n        order: capabilities.order ? attribs[LIST_ATTRIB_ORDER] : 1,\n        number_style: readNumberStyle(attribs),\n        number_delim: capabilities.fancy ? attribs[LIST_ATTRIB_NUMBER_DELIM].t : ListNumberDelim.DefaultDelim,\n      };\n    };\n    getChildren = (tok: PandocToken) => tok.c[LIST_CHILDREN];\n  }\n\n  const listItemNodeType = schema.nodes.list_item;\n  return (writer: ProsemirrorWriter, tok: PandocToken) => {\n    const children = getChildren(tok);\n    const attrs = getAttrs(tok);\n    attrs.tight = children.length && children[0].length && children[0][0].t === 'Plain';\n    writer.openNode(nodeType, attrs);\n    children.forEach((child: PandocToken[]) => {\n      // setup tokens/attribs for output\n      let tokens = child;\n      const childAttrs: { checked: null | boolean } = { checked: null };\n\n      // special task list processing if the current format supports task lists\n      if (capabilities.tasks) {\n        // look for checkbox in first character of child tokens\n        // if we see it, remove it and set childAttrs.checked as appropriate\n        const childWithChecked = tokensWithChecked(child);\n        childAttrs.checked = childWithChecked.checked;\n        tokens = childWithChecked.tokens;\n      }\n\n      // process children\n      writer.openNode(listItemNodeType, childAttrs);\n      writer.writeTokens(tokens);\n      writer.closeNode();\n    });\n    writer.closeNode();\n  };\n}\n\nexport function writePandocOrderedList(capabilities: ListCapabilities) {\n  return (output: PandocOutput, node: ProsemirrorNode) => {\n    // alias some list options\n    const options = listNodeOptions(node, capabilities);\n\n    // force delim to two parens for example styles. we do this\n    // to simplify the search/replace of example list sentinels\n    // during conversion post-processing\n    const delim = options.example ? ListNumberDelim.TwoParens : node.attrs.number_delim;\n\n    output.writeToken(PandocTokenType.OrderedList, () => {\n      output.writeArray(() => {\n        output.write(capabilities.order ? node.attrs.order : 1);\n        output.writeToken(capabilities.fancy ? node.attrs.number_style : ListNumberStyle.DefaultStyle);\n        output.writeToken(capabilities.fancy ? delim : ListNumberDelim.DefaultDelim);\n      });\n      output.writeArray(() => {\n        node.forEach(item => writePandocListItem(output, options, item));\n      });\n    });\n  };\n}\n\nexport function writePandocBulletList(capabilities: ListCapabilities) {\n  return (output: PandocOutput, node: ProsemirrorNode) => {\n    output.writeToken(PandocTokenType.BulletList, () => {\n      node.forEach(item => writePandocListItem(output, listNodeOptions(node, capabilities), item));\n    });\n  };\n}\n\nexport function exampleListPandocMarkdownOutputFilter(markdown: string) {\n  return markdown.replace(kListItemExampleRegex, '(@) ');\n}\n\ninterface ListNodeOptions {\n  tight: boolean;\n  example: boolean;\n}\n\nfunction listNodeOptions(node: ProsemirrorNode, capabilities: ListCapabilities): ListNodeOptions {\n  const options = {\n    tight: node.attrs.tight,\n    example: capabilities.example ? node.attrs.number_style === ListNumberStyle.Example : false,\n  };\n\n  // if it's tight see if we need to override b/c of multiple blocks\n  node.forEach(item => {\n    if (options.tight && item.childCount > 1) {\n      options.tight = false;\n    }\n  });\n\n  return options;\n}\n\nfunction writePandocListItem(output: PandocOutput, options: ListNodeOptions, node: ProsemirrorNode) {\n  const checked = node.attrs.checked;\n\n  output.writeArray(() => {\n    node.forEach((itemNode: ProsemirrorNode, _offset, index) => {\n      if (itemNode.type === node.type.schema.nodes.paragraph) {\n        const paraItemBlockType = options.tight ? PandocTokenType.Plain : PandocTokenType.Para;\n        output.writeToken(paraItemBlockType, () => {\n          // for first item block, prepend check mark if we have one\n          if (checked !== null && index === 0) {\n            writeListItemInlines(\n              output,\n              options.example,\n              fragmentWithCheck(node.type.schema, itemNode.content, checked),\n              index,\n            );\n          } else {\n            writeListItemInlines(output, options.example, itemNode.content, index);\n          }\n        });\n      } else {\n        output.writeNode(itemNode);\n      }\n    });\n  });\n}\n\nfunction writeListItemInlines(output: PandocOutput, example: boolean, fragment: Fragment, index: number) {\n  if (index === 0 && example) {\n    output.writeToken(PandocTokenType.Str, kListItemExampleSentinel);\n  }\n  output.writeInlines(fragment);\n}\n","/*\n * image.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { EditorState, NodeSelection, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { canInsertNode } from '../../api/node';\nimport { selectionIsImageNode, selectionIsEmptyParagraph } from '../../api/selection';\nimport {\n  pandocAttrSpec,\n  pandocAttrParseDom,\n  pandocAttrToDomAttr,\n  pandocAttrReadAST,\n  pandocAttrAvailable,\n} from '../../api/pandoc_attr';\nimport {\n  PandocOutput,\n  PandocTokenType,\n  ProsemirrorWriter,\n  PandocToken,\n  stringifyTokens,\n  imageAttributesAvailable,\n} from '../../api/pandoc';\nimport { EditorUI } from '../../api/ui';\nimport { ImageDimensions } from '../../api/image';\nimport { asHTMLTag } from '../../api/html';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { imageDialog } from './image-dialog';\nimport { imageDimensionsFromImg, imageContainerWidth, inlineHTMLIsImage } from './image-util';\nimport { imageTextSelectionPlugin } from './image-textsel';\nimport { posHasProhibitedFigureParent } from './figure';\nimport { imageEventsPlugin } from './image-events';\nimport { imageNodeViewPlugins } from './image-view';\n\nconst TARGET_URL = 0;\nconst TARGET_TITLE = 1;\n\nconst IMAGE_ATTR = 0;\nconst IMAGE_ALT = 1;\nconst IMAGE_TARGET = 2;\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, ui, events } = context;\n\n  const imageAttr = imageAttributesAvailable(pandocExtensions);\n\n  return {\n    nodes: [\n      {\n        name: 'image',\n        spec: {\n          inline: true,\n          attrs: imageNodeAttrsSpec(false, imageAttr),\n          group: 'inline',\n          draggable: true,\n          parseDOM: [\n            {\n              tag: 'img[src]',\n              getAttrs(dom: Node | string) {\n                return imageAttrsFromDOM(dom as Element, imageAttr);\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return imageDOMOutputSpec(node, imageAttr);\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Image,\n              handler: pandocImageHandler(false, imageAttr),\n            },\n          ],\n          inlineHTMLReader: pandocExtensions.raw_html ? imageInlineHTMLReader : undefined,\n          writer: imagePandocOutputWriter(false, ui),\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.image,\n          noDecorator: true,\n          editFn: () => imageCommand(ui, imageAttr),\n        }),\n      },\n    ],\n\n    commands: (_schema: Schema) => {\n      return [\n        new ProsemirrorCommand(\n          EditorCommandId.Image,\n          ['Shift-Mod-i'],\n          imageCommand(ui, imageAttr),\n          imageOmniInsert(ui),\n        ),\n      ];\n    },\n\n    plugins: (schema: Schema) => {\n      return [\n        imageTextSelectionPlugin(),\n        imageEventsPlugin(ui),\n        ...imageNodeViewPlugins('image', ui, events, pandocExtensions),\n      ];\n    },\n  };\n};\n\nexport function pandocImageHandler(figure: boolean, imageAttributes: boolean) {\n  return (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => {\n    // get attributes\n    const target = tok.c[IMAGE_TARGET];\n    const attrs = {\n      src: decodeURI(target[TARGET_URL]),\n      title: readPandocTitle(target[TARGET_TITLE]),\n      alt: '',\n      ...(imageAttributes ? pandocAttrReadAST(tok, IMAGE_ATTR) : {}),\n    };\n\n    // add alt as plain text if it's not a figure\n    if (!figure) {\n      attrs.alt = stringifyTokens(tok.c[IMAGE_ALT]);\n    }\n\n    // read image and (if appropriate) children\n    writer.openNode(figure ? schema.nodes.figure : schema.nodes.image, attrs);\n    if (figure) {\n      writer.writeTokens(tok.c[IMAGE_ALT]);\n    }\n    writer.closeNode();\n  };\n}\n\nexport function imagePandocOutputWriter(figure: boolean, ui: EditorUI) {\n  return (output: PandocOutput, node: ProsemirrorNode) => {\n    // default writer for markdown images\n    let writer = () => {\n      output.writeToken(PandocTokenType.Image, () => {\n        if (output.extensions.link_attributes) {\n          output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n        } else {\n          output.writeAttr();\n        }\n        output.writeArray(() => {\n          if (figure) {\n            output.writeInlines(node.content);\n          } else {\n            output.writeText(node.attrs.alt);\n          }\n        });\n        output.write([encodeURI(node.attrs.src), node.attrs.title || '']);\n      });\n    };\n\n    // see if we need to write raw html\n    const requireHTML =\n      pandocAttrAvailable(node.attrs) && // attribs need to be written\n      !output.extensions.link_attributes && // markdown attribs not supported\n      output.extensions.raw_html; // raw html is supported\n\n    // if we do, then substitute a raw html writer\n    if (node.attrs.raw || requireHTML) {\n      writer = () => {\n        const imgAttr = imageDOMAttributes(node, true, false);\n        const html = asHTMLTag('img', imgAttr, true, true);\n        output.writeRawMarkdown(html);\n      };\n    }\n\n    // write (wrap in paragraph and possibly link for  figures)\n    if (figure) {\n      let writeFigure = writer;\n      if (node.attrs.linkTo) {\n        writeFigure = () => {\n          output.writeLink(node.attrs.linkTo, '', null, writer);\n        };\n      }\n      output.writeToken(PandocTokenType.Para, writeFigure);\n    } else {\n      writer();\n    }\n  };\n}\n\n// parse inline html with <img> as image node\nfunction imageInlineHTMLReader(schema: Schema, html: string, writer?: ProsemirrorWriter) {\n  const isImage = inlineHTMLIsImage(html);\n  if (!isImage) {\n    return false;\n  }\n\n  if (writer) {\n    const attrs = imageAttrsFromHTML(html);\n    if (attrs) {\n      attrs.raw = true;\n      writer.addNode(schema.nodes.image, attrs, []);\n    } else {\n      return false;\n    }\n  }\n\n  return isImage;\n}\n\nexport function imageDOMOutputSpec(node: ProsemirrorNode, imageAttributes: boolean): DOMOutputSpec {\n  return ['img', imageDOMAttributes(node, imageAttributes)];\n}\n\nexport function imageDOMAttributes(\n  node: ProsemirrorNode,\n  imageAttributes: boolean,\n  marker = true,\n): { [key: string]: string } {\n  const attr: { [key: string]: string } = {\n    src: node.attrs.src,\n  };\n  const title = node.attrs.title;\n  if (title) {\n    attr.title = title;\n  }\n  const alt = node.attrs.alt || node.textContent;\n  if (alt) {\n    attr.alt = alt;\n  }\n\n  return {\n    ...attr,\n    ...(imageAttributes ? pandocAttrToDomAttr(node.attrs, marker) : {}),\n  };\n}\n\nexport function imageNodeAttrsSpec(linkTo: boolean, imageAttributes: boolean) {\n  return {\n    src: {},\n    title: { default: null },\n    alt: { default: null },\n    raw: { default: false },\n    ...(linkTo ? { linkTo: { default: null } } : {}),\n    ...(imageAttributes ? pandocAttrSpec : {}),\n  };\n}\n\nexport function imageAttrsFromDOM(el: Element, imageAttributes: boolean, forceAttrs = false) {\n  const attrs: { [key: string]: string | null } = {\n    src: el.getAttribute('src') || null,\n    title: el.getAttribute('title') || null,\n    alt: el.getAttribute('alt') || null,\n  };\n  return {\n    ...attrs,\n    ...(imageAttributes ? pandocAttrParseDom(el, attrs, forceAttrs) : {}),\n  };\n}\n\nexport function imageAttrsFromHTML(html: string) {\n  const parser = new window.DOMParser();\n  const doc = parser.parseFromString(html, 'text/html');\n  if (doc.body && doc.body.firstChild instanceof HTMLImageElement) {\n    return imageAttrsFromDOM(doc.body.firstChild, true, true);\n  } else {\n    return null;\n  }\n}\n\nexport function imageCommand(editorUI: EditorUI, imageAttributes: boolean) {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const schema = state.schema;\n\n    if (!canInsertNode(state, schema.nodes.image) && !canInsertNode(state, schema.nodes.figure)) {\n      return false;\n    }\n\n    if (dispatch && view) {\n      // see if we are editing an existing node\n      let node: ProsemirrorNode | null = null;\n      let nodeType = schema.nodes.image;\n      let img: HTMLImageElement | null = null;\n      let imgDimensions: ImageDimensions | null = null;\n      if (selectionIsImageNode(schema, state.selection)) {\n        node = (state.selection as NodeSelection).node;\n        nodeType = node.type;\n        if (nodeType === schema.nodes.figure) {\n          const figure = view.nodeDOM(state.selection.from) as HTMLElement;\n          img = figure.firstChild!.firstChild as HTMLImageElement;\n        } else {\n          const span = view.nodeDOM(state.selection.from) as HTMLElement;\n          img = span.firstChild! as HTMLImageElement;\n        }\n        if (img) {\n          const containerWidth = imageContainerWidth(state.selection.from, view);\n          imgDimensions = imageDimensionsFromImg(img, containerWidth);\n        }\n      }\n\n      // see if we are in an empty paragraph (in that case insert a figure)\n      if (\n        selectionIsEmptyParagraph(schema, state.selection) &&\n        !posHasProhibitedFigureParent(schema, state.selection.$head)\n      ) {\n        nodeType = schema.nodes.figure;\n      }\n\n      // show dialog\n      imageDialog(node, imgDimensions, nodeType, view, editorUI, imageAttributes);\n    }\n\n    return true;\n  };\n}\n\nfunction imageOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Image...'),\n    description: ui.context.translateText('Figure or inline image'),\n    group: OmniInsertGroup.Content,\n    priority: 10,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.image_dark! : ui.images.omni_insert?.image!),\n  };\n}\n\nfunction readPandocTitle(title: string | null) {\n  if (title) {\n    return title.replace(/^(fig:)/, '');\n  } else {\n    return title;\n  }\n}\n\nexport default extension;\n","/*\n * image-dialog.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType, Fragment, Mark } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { insertAndSelectNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { ImageProps } from '../../api/ui-dialogs';\nimport { extractSizeStyles, kPercentUnit, kPixelUnit } from '../../api/css';\nimport { ImageType, ImageDimensions, isNaturalAspectRatio } from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib } from '../../api/pandoc_attr';\n\nimport { imagePropsWithSizes, hasPercentWidth } from './image-util';\n\nexport async function imageDialog(\n  node: ProsemirrorNode | null,\n  dims: ImageDimensions | null,\n  nodeType: NodeType,\n  view: EditorView,\n  editorUI: EditorUI,\n  imageAttributes: boolean,\n) {\n  // alias schema\n  const schema = view.state.schema;\n\n  // if we are being called with an existing node then read it's attributes\n  let content = Fragment.empty;\n  let image: ImageProps = { src: null };\n  let linkMark: Mark | undefined;\n  let marks: Mark[] = [];\n  if (node && dims && node.type === nodeType) {\n    // base attributess\n    image = {\n      ...(node.attrs as ImageProps),\n      alt: nodeType === schema.nodes.figure ? node.textContent : node.attrs.alt,\n    };\n\n    // move width and height out of style and into keyvalue if necessary\n    image = {\n      ...image,\n      keyvalue: extractSizeStyles(image.keyvalue),\n    };\n\n    // move width, height, and units out of keyvalue into explicit\n    // top level image properties if necessary\n    image = imagePropsWithSizes(image, dims);\n\n    // record marks / linkTo\n    if (nodeType === schema.nodes.image) {\n      marks = node.marks;\n      linkMark = node.marks.find(mark => mark.type === schema.marks.link);\n      if (linkMark) {\n        image.linkTo = linkMark.attrs.href;\n      }\n    }\n\n    // content (will be caption for figures)\n    content = node.content;\n  } else {\n    // create a new image\n    image = nodeType.create(image).attrs as ImageProps;\n  }\n\n  // determine the type\n  const type = nodeType === view.state.schema.nodes.image ? ImageType.Image : ImageType.Figure;\n\n  // edit the image\n  const result = await editorUI.dialogs.editImage(image, dims, imageAttributes);\n  if (result) {\n    // figures treat 'alt' as their content (the caption), but since captions support\n    // inline formatting (and the dialog doesn't) we only want to update the\n    // content if the alt/caption actually changed (as it will blow away formatting)\n    if (type === ImageType.Figure && image.alt !== result.alt) {\n      if (result.alt) {\n        content = Fragment.from(view.state.schema.text(result.alt));\n      } else {\n        content = Fragment.empty;\n      }\n    }\n\n    // if we have width and height move them into keyvalue\n    let keyvalue = result.keyvalue;\n    if (result.units) {\n      // no units for px\n      const units = result.units && result.units === kPixelUnit ? '' : result.units;\n      // width\n      if (result.width) {\n        let width = result.width;\n        if (hasPercentWidth(units)) {\n          width = Math.min(width, 100);\n        }\n        keyvalue = keyvalue || [];\n        keyvalue.push([kWidthAttrib, width + units]);\n      }\n      // only record height if it's not % units and it's not at it's natural height\n      if (result.height && units !== kPercentUnit && !isNaturalHeight(result.width, result.height, dims)) {\n        keyvalue = keyvalue || [];\n        keyvalue.push([kHeightAttrib, result.height + units]);\n      }\n    }\n\n    // merge updated keyvalue\n    const imageProps = { ...result, keyvalue };\n\n    // update or create link mark as necessary\n    if (nodeType === schema.nodes.image) {\n      if (linkMark) {\n        marks = linkMark.removeFromSet(marks);\n        if (imageProps.linkTo) {\n          linkMark = linkMark.type.create({ ...linkMark.attrs, href: imageProps.linkTo });\n        }\n      } else if (imageProps.linkTo) {\n        linkMark = schema.marks.link.create({ href: imageProps.linkTo });\n      }\n      if (imageProps.linkTo && linkMark) {\n        marks = linkMark.addToSet(marks);\n      }\n    }\n\n    // create the image\n    const newImage = nodeType.createAndFill(imageProps, content, marks);\n\n    // insert and select\n    if (newImage) {\n      insertAndSelectNode(view, newImage);\n    }\n  }\n\n  if (view) {\n    view.focus();\n  }\n}\n\n// wrapper for isNaturalHeight that handles potentially undefined params\nfunction isNaturalHeight(width: number | undefined, height: number | undefined, dims: ImageDimensions | null) {\n  if (width && height && dims) {\n    return isNaturalAspectRatio(width, height, dims, false);\n  } else {\n    return false;\n  }\n}\n","/*\n * image-util.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeClosestToPos } from 'prosemirror-utils';\n\nimport { ImageProps } from '../../api/ui-dialogs';\nimport {\n  imageSizePropWithUnit,\n  isValidImageSizeUnit,\n  ensureContainerWidth,\n  isNaturalAspectRatio,\n  ImageDimensions,\n} from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib, attrPartitionKeyvalue } from '../../api/pandoc_attr';\nimport { kPercentUnit, kPixelUnit } from '../../api/css';\nimport { elementInnerDimensions } from '../../api/dom';\n\nexport function imagePropsWithSizes(image: ImageProps, dims: ImageDimensions) {\n  // pull width, height, and units out of keyvalue if necessary\n  // (enables front-ends to provide dedicated UI for width/height)\n  // note that if the value doesn't use a unit supported by the\n  // UI it's kept within the original keyvalue prop\n  if (image.keyvalue) {\n    let width: number | undefined;\n    let height: number | undefined;\n    let units: string | undefined;\n    let lockRatio = true;\n    const partitionedKeyvalue = attrPartitionKeyvalue([kWidthAttrib, kHeightAttrib], image.keyvalue);\n    for (const kv of partitionedKeyvalue.partitioned) {\n      const [key, value] = kv;\n      let partitioned = false;\n      const sizeWithUnit = imageSizePropWithUnit(value);\n      if (sizeWithUnit) {\n        sizeWithUnit.unit = sizeWithUnit.unit || kPixelUnit;\n        if (isValidImageSizeUnit(sizeWithUnit.unit)) {\n          if (key === kWidthAttrib) {\n            width = sizeWithUnit.size;\n            units = sizeWithUnit.unit;\n          } else if (key === kHeightAttrib) {\n            height = sizeWithUnit.size;\n            units = units || sizeWithUnit.unit;\n          }\n          partitioned = true;\n        }\n      }\n      if (!partitioned) {\n        partitionedKeyvalue.base.push(kv);\n      }\n    }\n    if (width && height) {\n      lockRatio = isNaturalAspectRatio(width, height, dims, lockRatio);\n    }\n    return {\n      ...image,\n      width,\n      height,\n      units,\n      lockRatio,\n      keyvalue: partitionedKeyvalue.base,\n    };\n  } else {\n    return image;\n  }\n}\n\nexport function imageDimensionsFromImg(img: HTMLImageElement, containerWidth: number) {\n  return {\n    naturalWidth: img.naturalWidth || null,\n    naturalHeight: img.naturalHeight || null,\n    containerWidth: ensureContainerWidth(containerWidth),\n  };\n}\n\nexport function hasPercentWidth(size: string | null) {\n  return !!size && size.endsWith(kPercentUnit);\n}\n\nexport function imageContainerWidth(pos: number, view: EditorView) {\n  let containerWidth = (view.dom as HTMLElement).offsetWidth;\n  if (containerWidth > 0) {\n    if (pos) {\n      const imagePos = view.state.doc.resolve(pos);\n      const resizeContainer = findParentNodeClosestToPos(imagePos, nd => nd.isBlock);\n      if (resizeContainer) {\n        const resizeEl = view.domAtPos(resizeContainer.pos + 1);\n        containerWidth = elementInnerDimensions(resizeEl.node as HTMLElement).width;\n      }\n    }\n  }\n\n  return containerWidth;\n}\n\nexport function inlineHTMLIsImage(html: string) {\n  return html\n    .trimLeft()\n    .toLowerCase()\n    .startsWith('<img');\n}\n","/*\n * image-textsel.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection, Plugin, PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { nodeDecoration } from '../../api/decoration';\n\nconst pluginKey = new PluginKey('image-text-selection');\n\nexport function imageTextSelectionPlugin() {\n  return new Plugin<DecorationSet>({\n    key: pluginKey,\n    state: {\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return DecorationSet.empty;\n      },\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        // no decorations for empty or node selection\n        if (tr.selection.empty || tr.selection instanceof NodeSelection) {\n          return DecorationSet.empty;\n        }\n\n        const schema = newState.schema;\n        const decorations: Decoration[] = [];\n        tr.doc.nodesBetween(tr.selection.from, tr.selection.to, (node, pos) => {\n          if ([schema.nodes.image, schema.nodes.figure].includes(node.type)) {\n            decorations.push(nodeDecoration({ node, pos }, { class: 'pm-image-text-selection' }));\n          }\n        });\n\n        return DecorationSet.create(tr.doc, decorations);\n      },\n    },\n    props: {\n      decorations(state: EditorState) {\n        return pluginKey.getState(state);\n      },\n    },\n  });\n}\n","/*\n * figure.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, ResolvedPos } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\n\nimport { findChildrenByType, findParentNodeClosestToPos } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { FixupContext } from '../../api/fixup';\nimport { isSingleLineHTML } from '../../api/html';\nimport { getMarkAttrs } from '../../api/mark';\nimport {\n  PandocToken,\n  PandocTokenType,\n  ProsemirrorWriter,\n  kRawBlockContent,\n  kRawBlockFormat,\n  imageAttributesAvailable,\n} from '../../api/pandoc';\nimport { trTransform } from '../../api/transaction';\n\nimport {\n  imageAttrsFromDOM,\n  imageNodeAttrsSpec,\n  imageDOMOutputSpec,\n  imagePandocOutputWriter,\n  pandocImageHandler,\n  imageAttrsFromHTML,\n  imageCommand,\n} from './image';\nimport { inlineHTMLIsImage } from './image-util';\nimport { imageNodeViewPlugins } from './image-view';\nimport { figureKeys } from './figure-keys';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, ui, events } = context;\n\n  const imageAttr = imageAttributesAvailable(pandocExtensions);\n\n  return {\n    nodes: [\n      {\n        name: 'figure',\n        spec: {\n          attrs: imageNodeAttrsSpec(true, imageAttr),\n          content: 'inline*',\n          group: 'block',\n          draggable: true,\n          selectable: true,\n          defining: true,\n          parseDOM: [\n            {\n              tag: 'figure',\n              contentElement: 'figcaption',\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                const img = el.querySelector('img');\n                if (img && img.parentNode === dom) {\n                  return imageAttrsFromDOM(img, imageAttr);\n                } else {\n                  return {\n                    src: null,\n                    title: null,\n                  };\n                }\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return ['figure', imageDOMOutputSpec(node, imageAttr), ['figcaption', { class: 'pm-figcaption' }, 0]];\n          },\n        },\n        pandoc: {\n          writer: imagePandocOutputWriter(true, ui),\n\n          // intercept  paragraphs with a single image and process them as figures\n          blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n            // helper to process html image\n            const handleHTMLImage = (html: string) => {\n              const attrs = imageAttrsFromHTML(html);\n              if (attrs) {\n                attrs.raw = true;\n                writer.addNode(schema.nodes.figure, attrs, []);\n                return true;\n              } else {\n                return false;\n              }\n            };\n\n            // unroll figure from paragraph with single image\n            if (isParaWrappingFigure(tok) && !writerHasProhibitedFigureParent(schema, writer)) {\n              const handler = pandocImageHandler(true, imageAttr)(schema);\n              handler(writer, tok.c[0]);\n              return true;\n              // unroll figure from html RawBlock with single <img> tag\n            } else if (isHTMLImageBlock(tok)) {\n              return handleHTMLImage(tok.c[kRawBlockContent]);\n            } else {\n              return false;\n            }\n          },\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.figure,\n          editFn: () => imageCommand(ui, imageAttr),\n        }),\n      },\n    ],\n\n    fixups: (_schema: Schema) => {\n      return [\n        (tr: Transaction, fixupContext: FixupContext) => {\n          if (fixupContext === FixupContext.Load) {\n            return convertImagesToFigure(tr);\n          } else {\n            return tr;\n          }\n        },\n      ];\n    },\n\n    appendTransaction: (schema: Schema) => {\n      return [\n        {\n          name: 'figure-convert',\n          nodeFilter: node => node.type === schema.nodes.image,\n          append: convertImagesToFigure,\n        },\n      ];\n    },\n\n    baseKeys: figureKeys,\n\n    plugins: (schema: Schema) => {\n      return [...imageNodeViewPlugins('figure', ui, events, pandocExtensions)];\n    },\n  };\n};\n\nexport function posHasProhibitedFigureParent(schema: Schema, $pos: ResolvedPos) {\n  return prohibitedFigureParents(schema).some(type => {\n    return !!findParentNodeClosestToPos($pos, node => node.type === type);\n  });\n}\n\nexport function writerHasProhibitedFigureParent(schema: Schema, writer: ProsemirrorWriter) {\n  return prohibitedFigureParents(schema).some(writer.isNodeOpen);\n}\n\nfunction prohibitedFigureParents(schema: Schema) {\n  return [schema.nodes.table_cell, schema.nodes.list_item, schema.nodes.definition_list];\n}\n\nfunction convertImagesToFigure(tr: Transaction) {\n  return trTransform(tr, imagesToFiguresTransform);\n}\n\nfunction imagesToFiguresTransform(tr: Transform) {\n  const schema = tr.doc.type.schema;\n  const images = findChildrenByType(tr.doc, schema.nodes.image);\n  images.forEach(image => {\n    // position reflecting steps already taken in this handler\n    const mappedImagePos = tr.mapping.mapResult(image.pos);\n\n    // process image so long as it wasn't deleted by a previous step\n    if (!mappedImagePos.deleted) {\n      // resolve image pos\n      const imagePos = tr.doc.resolve(mappedImagePos.pos);\n\n      // if it's an image in a standalone paragraph, convert it to a figure\n      if (\n        imagePos.parent.type === schema.nodes.paragraph &&\n        imagePos.parent.childCount === 1 &&\n        !posHasProhibitedFigureParent(schema, imagePos)\n      ) {\n        // figure attributes\n        const attrs = image.node.attrs;\n\n        // extract linkTo from link mark (if any)\n        if (schema.marks.link.isInSet(image.node.marks)) {\n          const linkAttrs = getMarkAttrs(\n            tr.doc,\n            { from: mappedImagePos.pos, to: mappedImagePos.pos + image.node.nodeSize },\n            schema.marks.link,\n          );\n          if (linkAttrs && linkAttrs.href) {\n            attrs.linkTo = linkAttrs.href;\n          }\n        }\n\n        // figure content\n        const content = attrs.alt ? Fragment.from(schema.text(attrs.alt)) : Fragment.empty;\n\n        // replace image with figure\n        const figure = schema.nodes.figure.createAndFill(attrs, content);\n        if (figure) {\n          tr.replaceRangeWith(mappedImagePos.pos, mappedImagePos.pos + image.node.nodeSize, figure);\n        }\n      }\n    }\n  });\n}\n\nfunction isParaWrappingFigure(tok: PandocToken) {\n  return isSingleChildParagraph(tok) && tok.c[0].t === PandocTokenType.Image;\n}\n\nfunction isHTMLImageBlock(tok: PandocToken) {\n  if (tok.t === PandocTokenType.RawBlock) {\n    const format = tok.c[kRawBlockFormat];\n    const text = tok.c[kRawBlockContent] as string;\n    return format === 'html' && isSingleLineHTML(text) && inlineHTMLIsImage(text);\n  } else {\n    return false;\n  }\n}\n\nfunction isSingleChildParagraph(tok: PandocToken) {\n  return tok.t === PandocTokenType.Para && tok.c && tok.c.length === 1;\n}\n\nexport default extension;\n","/*\n * decoration.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { DecorationAttrs, Decoration } from 'prosemirror-view';\n\nexport function nodeDecoration(nodeWithPos: NodeWithPos, attrs: DecorationAttrs) {\n  return Decoration.node(nodeWithPos.pos, nodeWithPos.pos + nodeWithPos.node.nodeSize, attrs);\n}\n","/*\n * image-view.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { NodeView, EditorView } from 'prosemirror-view';\nimport { NodeSelection, PluginKey, Plugin } from 'prosemirror-state';\n\nimport { EditorUI } from '../../api/ui';\nimport { ImageType } from '../../api/image';\nimport { PandocExtensions, imageAttributesAvailable } from '../../api/pandoc';\nimport { isElementVisible } from '../../api/dom';\nimport { EditorEvents } from '../../api/events';\nimport { ResizeEvent } from '../../api/event-types';\n\nimport { imageDialog } from './image-dialog';\nimport {\n  attachResizeUI,\n  initResizeContainer,\n  ResizeUI,\n  isResizeUICompatible,\n  updateImageViewSize,\n} from './image-resize';\nimport { imageDimensionsFromImg, imageContainerWidth } from './image-util';\n\nimport './image-styles.css';\n\nexport function imageNodeViewPlugins(\n  type: string,\n  ui: EditorUI,\n  events: EditorEvents,\n  pandocExtensions: PandocExtensions,\n): Plugin[] {\n  return [\n    new Plugin({\n      key: new PluginKey(`${type}-node-view`),\n      props: {\n        nodeViews: {\n          [type]: (node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) => {\n            return new ImageNodeView(node, view, getPos as () => number, ui, events, pandocExtensions);\n          },\n        },\n      },\n    }),\n  ];\n}\n\nclass ImageNodeView implements NodeView {\n  // ProseMirror context\n  private readonly type: ImageType;\n  private node: ProsemirrorNode;\n  private readonly view: EditorView;\n  private readonly getPos: () => number;\n  private readonly editorUI: EditorUI;\n  private readonly imageAttributes: boolean;\n  private readonly implicitFigures: boolean;\n\n  // DOM elements\n  public readonly dom: HTMLElement;\n  private readonly img: HTMLImageElement;\n  public readonly contentDOM: HTMLElement | null;\n  private readonly figcaption: HTMLElement | null;\n\n  // transient state\n  private imgBroken: boolean;\n\n  // things to clean up\n  private resizeUI: ResizeUI | null;\n  private sizeOnVisibleTimer?: number;\n  private unregisterOnResize: VoidFunction;\n  private unregisterWatchImg: VoidFunction | null = null;\n\n  constructor(\n    node: ProsemirrorNode,\n    view: EditorView,\n    getPos: () => number,\n    editorUI: EditorUI,\n    editorEvents: EditorEvents,\n    pandocExtensions: PandocExtensions,\n  ) {\n    // determine type\n    const schema = node.type.schema;\n    this.type = node.type === schema.nodes.image ? ImageType.Image : ImageType.Figure;\n\n    // save references\n    this.node = node;\n    this.view = view;\n    this.getPos = getPos;\n    this.imageAttributes = imageAttributesAvailable(pandocExtensions);\n    this.implicitFigures = pandocExtensions.implicit_figures;\n    this.editorUI = editorUI;\n    this.resizeUI = null;\n    this.imgBroken = false;\n\n    // set node selection on click\n    const selectOnClick = () => {\n      const tr = view.state.tr;\n      tr.setSelection(NodeSelection.create(view.state.doc, getPos()));\n      view.dispatch(tr);\n    };\n\n    // show image dialog on double-click\n    const editOnDblClick = () => {\n      selectOnClick();\n      imageDialog(\n        this.node,\n        imageDimensionsFromImg(this.img, this.containerWidth()),\n        this.node.type,\n        this.view,\n        editorUI,\n        this.imageAttributes,\n      );\n    };\n\n    // stop propagation from child elmeents that need to handle click\n    // (e.g. figcaption element)\n    const noPropagateClick = (ev: MouseEvent) => {\n      ev.stopPropagation();\n    };\n\n    // create the image (used by both image and figure node types)\n    this.img = document.createElement('img');\n    this.img.classList.add('pm-img');\n    this.img.onload = () => {\n      this.imgBroken = false;\n    };\n    this.img.onerror = () => {\n      this.imgBroken = true;\n    };\n    this.img.onclick = selectOnClick;\n    this.img.ondblclick = editOnDblClick;\n\n    // wrap in figure if appropriate\n    if (this.type === ImageType.Figure) {\n      // create figure wrapper\n      this.dom = document.createElement('figure');\n      this.dom.classList.add('pm-figure');\n\n      // create container\n      const container = document.createElement('div');\n      container.contentEditable = 'false';\n      this.dom.append(container);\n\n      // initialize the image\n      container.append(this.img);\n      this.updateImg();\n\n      // create the caption and make it our contentDOM\n      this.figcaption = document.createElement('figcaption');\n      this.figcaption.classList.add('pm-figcaption');\n      this.figcaption.classList.add('pm-node-caption');\n      this.figcaption.onclick = noPropagateClick;\n      this.figcaption.ondblclick = noPropagateClick;\n      this.contentDOM = this.figcaption;\n      this.dom.append(this.figcaption);\n\n      // manage visibility\n      this.manageFigcaption();\n\n      // standard inline image\n    } else {\n      this.dom = document.createElement('span');\n\n      this.dom.append(this.img);\n      this.updateImg();\n\n      this.contentDOM = null;\n      this.figcaption = null;\n    }\n\n    // prevent drag/drop if the event doesn't target the image\n    this.dom.ondragstart = (event: DragEvent) => {\n      if (event.target !== this.img) {\n        event.preventDefault();\n        event.stopPropagation();\n      }\n    };\n\n    // init resize if we support imageAttributes\n    if (this.imageAttributes) {\n      initResizeContainer(this.dom);\n    }\n\n    // update image size when the image first becomes visible\n    this.updateSizeOnVisible();\n\n    // update image size whenever the container is resized\n    this.unregisterOnResize = editorEvents.subscribe(ResizeEvent, () => {\n      this.updateImageSize();\n    });\n  }\n\n  public destroy() {\n    if (this.unregisterWatchImg) {\n      this.unregisterWatchImg();\n    }\n    this.unregisterOnResize();\n    this.clearSizeOnVisibleTimer();\n    this.detachResizeUI();\n  }\n\n  public selectNode() {\n    // mirror default implementation\n    this.dom.classList.add('ProseMirror-selectednode');\n    if (this.contentDOM || !this.node.type.spec.draggable) {\n      this.dom.draggable = true;\n    }\n\n    // manage figcaption\n    this.manageFigcaption();\n\n    // attach resize UI\n    this.attachResizeUI();\n  }\n\n  public deselectNode() {\n    // mirror default implementation\n    this.dom.classList.remove('ProseMirror-selectednode');\n    if (this.contentDOM || !this.node.type.spec.draggable) {\n      this.dom.draggable = false;\n    }\n\n    // remove resize UI\n    this.detachResizeUI();\n  }\n\n  // update image with latest node/attributes\n  public update(node: ProsemirrorNode) {\n    // boilerplate type check\n    if (node.type !== this.node.type) {\n      return false;\n    }\n\n    // set new node and update the image\n    this.node = node;\n    this.updateImg();\n\n    // if we already have resize UI then either update it\n    // or detach it (if e.g. the units are no longer compatible)\n    if (this.resizeUI) {\n      if (isResizeUICompatible(this.img!)) {\n        this.resizeUI.update();\n      } else {\n        this.resizeUI.detach();\n        this.resizeUI = null;\n      }\n      // attach if the node is selected\n    } else if (this.isNodeSelected()) {\n      this.attachResizeUI();\n    }\n    return true;\n  }\n\n  // ignore mutations outside of the content dom so sizing actions don't cause PM re-render\n  public ignoreMutation(mutation: MutationRecord | { type: 'selection'; target: Element }) {\n    return !this.contentDOM || !this.contentDOM.contains(mutation.target);\n  }\n\n  // map node to img tag\n  private updateImg() {\n    // unsubscribe from any existing resource watcher\n    if (this.unregisterWatchImg) {\n      this.unregisterWatchImg();\n    }\n\n    // map to path reachable within current editing frame\n    const src = this.node.attrs.src;\n    this.img.src = this.editorUI.context.mapResourceToURL(src);\n\n    // if this is a local resource then watch it and update when it changes\n    if (!src.match(/^\\w+:\\/\\//)) {\n      this.unregisterWatchImg = this.editorUI.context.watchResource(src, () => {\n        this.img.src = this.editorUI.context.mapResourceToURL(src);\n      });\n    }\n\n    // title/tooltip\n    this.img.title = '';\n    if (this.node.attrs.title) {\n      this.img.title = this.node.attrs.title;\n    }\n\n    // ensure alt attribute so that we get default browser broken image treatment\n    this.img.alt = this.node.textContent || this.node.attrs.src;\n\n    // manage caption visibility\n    this.manageFigcaption();\n\n    // update size\n    this.updateImageSize();\n  }\n\n  private updateImageSize() {\n    const containerWidth = this.img.isConnected ? this.containerWidth() : 0;\n    updateImageViewSize(this.node, this.img, this.isFigure() ? this.dom : null, containerWidth);\n  }\n\n  private updateSizeOnVisible() {\n    const updateSizeOnVisible = () => {\n      if (isElementVisible(this.img)) {\n        this.updateImageSize();\n        this.clearSizeOnVisibleTimer();\n      }\n    };\n    this.sizeOnVisibleTimer = window.setInterval(updateSizeOnVisible, 200);\n  }\n\n  private clearSizeOnVisibleTimer() {\n    if (this.sizeOnVisibleTimer) {\n      clearInterval(this.sizeOnVisibleTimer);\n      this.sizeOnVisibleTimer = undefined;\n    }\n  }\n\n  // attach resize UI if appropriate\n  private attachResizeUI() {\n    if (this.imageAttributes && !this.imgBroken && isResizeUICompatible(this.img!)) {\n      const imageNode = () => ({ pos: this.getPos(), node: this.node });\n      const imgContainerWidth = () => this.containerWidth();\n      this.resizeUI = attachResizeUI(imageNode, this.dom, this.img!, imgContainerWidth, this.view, this.editorUI);\n    }\n  }\n\n  private detachResizeUI() {\n    if (this.resizeUI) {\n      this.resizeUI.detach();\n      this.resizeUI = null;\n    }\n  }\n\n  private isNodeSelected() {\n    return this.dom.classList.contains('ProseMirror-selectednode');\n  }\n\n  private isFigure() {\n    return this.type === ImageType.Figure;\n  }\n\n  private containerWidth() {\n    return imageContainerWidth(this.getPos(), this.view);\n  }\n\n  private manageFigcaption() {\n    // hide the figcaption if appropriate\n    const noImplicitFigures = !this.implicitFigures;\n    const emptyFigcaption = this.figcaption && this.node.textContent.length === 0;\n    const selection = this.view.state.selection;\n    const selectionInFigcaption = selection.empty && selection.$head.node() === this.node;\n    const hide = noImplicitFigures || (emptyFigcaption && !selectionInFigcaption);\n\n    // hide or show if we have a figcaption\n    if (this.figcaption) {\n      if (noImplicitFigures) {\n        this.figcaption.style.display = 'none';\n        this.figcaption.contentEditable = 'false';\n      } else {\n        this.figcaption.contentEditable = hide ? 'false' : 'true';\n        this.figcaption.style.height = hide ? '0' : '';\n        this.figcaption.style.minHeight = hide ? '0' : '';\n        this.figcaption.style.margin = hide ? '0' : '';\n      }\n    }\n  }\n}\n","/*\n * image-resize.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { NodeSelection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport {\n  createPopup,\n  createHorizontalPanel,\n  addHorizontalPanelCell,\n  createInputLabel,\n  createImageButton,\n  createCheckboxInput,\n  createSelectInput,\n  createTextInput,\n} from '../../api/widgets/widgets';\nimport { EditorUI } from '../../api/ui';\nimport { editingRootScrollContainerElement } from '../../api/node';\nimport { extractSizeStyles, kPercentUnit, kPixelUnit, removeStyleAttrib } from '../../api/css';\nimport {\n  imageSizePropWithUnit,\n  isNaturalAspectRatio,\n  unitToPixels,\n  pixelsToUnit,\n  roundUnit,\n  kValidUnits,\n  isValidImageSizeUnit,\n} from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib, kStyleAttrib, kAlignAttrib } from '../../api/pandoc_attr';\nimport { EditorUIImages } from '../../api/ui-images';\n\nimport { imageDialog } from './image-dialog';\nimport { hasPercentWidth, imageDimensionsFromImg } from './image-util';\n\nconst kDataWidth = 'data-width';\nconst kDataHeight = 'data-height';\n\nconst kDefaultContainerDisplay = 'inline-block';\n\nexport function initResizeContainer(container: HTMLElement) {\n  // add standard parent class\n  container.classList.add('pm-image-resize-container', 'pm-selected-node-outline-color');\n\n  // so that we are the offsetParent for the resize handles and shelf\n  container.style.position = 'relative';\n\n  // so that the container matches the size of the contained image\n  container.style.display = kDefaultContainerDisplay;\n\n  // so that the handles and shelf can be visible outside the boundaries of the image\n  container.style.overflow = 'visible';\n\n  // return for convenience\n  return container;\n}\n\nexport function isResizeUICompatible(img: HTMLImageElement) {\n  // incompatible if it has a width, but not a data-width\n  const incompatibleWidth = img.style.width && !img.hasAttribute(kDataWidth);\n\n  // incompatible if it has a height, but not a data-height\n  const incompatibleHeight = img.style.height && img.style.height !== 'auto' && !img.hasAttribute(kDataHeight);\n\n  return !incompatibleWidth && !incompatibleHeight;\n}\n\nexport interface ResizeUI {\n  update: () => void;\n  detach: () => void;\n}\n\nexport function attachResizeUI(\n  imageNode: () => NodeWithPos,\n  container: HTMLElement,\n  img: HTMLImageElement,\n  imgContainerWidth: () => number,\n  view: EditorView,\n  ui: EditorUI,\n): ResizeUI {\n  // indicate that resize ui is active\n  container.classList.add('pm-image-resize-active');\n\n  // sync current state of shelf to node\n  const updateImageNodeFromShelf = () => {\n    updateImageNodeSize(\n      view,\n      imageNode(),\n      img,\n      imgContainerWidth,\n      shelf.props.width(),\n      shelf.props.height(),\n      shelf.props.units(),\n    );\n  };\n\n  // shelf init\n  const onInitShelf = () => {\n    // sync props\n    shelf.sync();\n\n    // default for lockRatio based on naturalWidth/naturalHeight\n    const dims = imageDimensionsFromImg(img, imgContainerWidth());\n    shelf.props.setLockRatio(isNaturalAspectRatio(shelf.props.width(), shelf.props.height(), dims, true));\n  };\n\n  // handle width changed from shelf\n  const onWidthChanged = () => {\n    const width = shelf.props.width();\n    const height = shelf.props.lockRatio() ? (img.offsetHeight / img.offsetWidth) * width : shelf.props.height();\n    shelf.props.setHeight(height);\n    updateImageNodeFromShelf();\n  };\n\n  // handle height changed from shelf\n  const onHeightChanged = () => {\n    const height = shelf.props.height();\n    const width = shelf.props.lockRatio() ? (img.offsetWidth / img.offsetHeight) * height : shelf.props.width();\n    shelf.props.setWidth(width);\n    updateImageNodeFromShelf();\n  };\n\n  // do necessary unit conversion when the units change\n  const onUnitsChanged = () => {\n    const prevUnits = shelfSizeFromImage(img).unit;\n    const containerWidth = imgContainerWidth();\n\n    const width = shelf.props.width();\n    const widthPixels = unitToPixels(width, prevUnits, containerWidth);\n    let widthInUnits = pixelsToUnit(widthPixels, shelf.props.units(), containerWidth);\n    if (hasPercentWidth(shelf.props.units()) && widthInUnits > 100) {\n      widthInUnits = 100;\n    }\n    shelf.props.setWidth(widthInUnits);\n\n    const height = shelf.props.height();\n    const heightPixels = unitToPixels(height, prevUnits, containerWidth);\n    shelf.props.setHeight(pixelsToUnit(heightPixels, shelf.props.units(), containerWidth));\n\n    updateImageNodeFromShelf();\n  };\n\n  // handle editImage request from shelf\n  const onEditImage = () => {\n    const nodeWithPos = imageNode();\n    imageDialog(\n      nodeWithPos.node,\n      imageDimensionsFromImg(img, imgContainerWidth()),\n      nodeWithPos.node.type,\n      view,\n      ui,\n      true,\n    );\n  };\n\n  // create resize shelf\n  const shelf = resizeShelf(\n    view,\n    container,\n    img,\n    onInitShelf,\n    onWidthChanged,\n    onHeightChanged,\n    onUnitsChanged,\n    onEditImage,\n    ui.images,\n    ui.context.translateText,\n  );\n\n  // create resize handle and add it to the container\n  const handle = resizeHandle(\n    img,\n    imgContainerWidth,\n    shelf.props.lockRatio,\n    shelf.props.units,\n    shelf.sync,\n    updateImageNodeFromShelf,\n  );\n  container.append(handle);\n\n  // return functions that can be used to update and detach the ui\n  return {\n    update: () => {\n      shelf.sync();\n    },\n    detach: () => {\n      container.classList.remove('pm-image-resize-active');\n      handle.remove();\n      shelf.remove();\n    },\n  };\n}\n\nfunction resizeShelf(\n  view: EditorView,\n  container: HTMLElement,\n  img: HTMLImageElement,\n  onInit: () => void,\n  onWidthChanged: () => void,\n  onHeightChanged: () => void,\n  onUnitsChanged: () => void,\n  onEditImage: () => void,\n  uiImages: EditorUIImages,\n  translateText: (text: string) => string,\n) {\n  // create resize shelf\n  const shelf = createPopup(view, []);\n\n  // add the shelf to the editor container (so we don't mutate the editor dom)\n  const editorContainer = view.dom.parentNode as HTMLElement;\n  editorContainer.appendChild(shelf);\n\n  // update shelf absolute position to make sure it's visible\n  const updatePosition = () => {\n    const kShelfRequiredSize = 333;\n    const editorBox = editorContainer.getBoundingClientRect();\n    const imageBox = container.getBoundingClientRect();\n    shelf.style.top = imageBox.top - editorBox.top + imageBox.height + 6 + 'px';\n    const positionLeft = imageBox.left + kShelfRequiredSize < editorBox.right;\n    if (positionLeft) {\n      shelf.style.right = '';\n      shelf.style.left = imageBox.left - editorBox.left + 'px';\n    } else {\n      shelf.style.left = '';\n      shelf.style.right = editorBox.right - imageBox.right + 'px';\n    }\n  };\n\n  // detect when the editing root note scrolls and update the position\n  const editingScrollContainerEl = editingRootScrollContainerElement(view);\n  if (editingScrollContainerEl) {\n    editingScrollContainerEl.addEventListener('scroll', updatePosition);\n  }\n\n  // update position every 50ms (cleanup drag/drop copy/paste mispositioning)\n  const positionTimer = setInterval(updatePosition, 50);\n\n  // main panel that holds the controls\n  const panel = createHorizontalPanel();\n  shelf.append(panel);\n  const addToPanel = (widget: HTMLElement, paddingRight: number) => {\n    addHorizontalPanelCell(panel, widget);\n    if (paddingRight) {\n      const paddingSpan = window.document.createElement('span');\n      paddingSpan.style.width = paddingRight + kPixelUnit;\n      addHorizontalPanelCell(panel, paddingSpan);\n    }\n  };\n\n  // width\n  const inputClasses = ['pm-text-color', 'pm-background-color'];\n  const wLabel = createInputLabel('w:');\n  addToPanel(wLabel, 4);\n  const wInput = createTextInput(4, inputClasses);\n  wInput.onchange = onWidthChanged;\n  addToPanel(wInput, 8);\n\n  // height\n  const kHeightWidth = '38px';\n  const hLabel = createInputLabel('h:');\n  addToPanel(hLabel, 4);\n  const hInput = createTextInput(4, inputClasses, { width: kHeightWidth });\n  hInput.onchange = onHeightChanged;\n  addToPanel(hInput, 0);\n  const hAutoLabel = createInputLabel('(auto)', ['pm-light-text-color'], { width: kHeightWidth });\n  addToPanel(hAutoLabel, 10);\n\n  // units\n  const unitsSelect = createSelectInput(kValidUnits, inputClasses);\n  unitsSelect.onchange = () => {\n    // drive focus to width and back to prevent wierd selection change\n    // detection condition that causes PM to re-render the node the\n    // next time we resize it\n    wInput.focus();\n    unitsSelect.focus();\n\n    // manage UI\n    manageUnitsUI();\n\n    // notify client\n    onUnitsChanged();\n  };\n  addToPanel(unitsSelect, 12);\n\n  // lock ratio\n  const checkboxWrapper = window.document.createElement('div');\n  const lockCheckbox = createCheckboxInput();\n  lockCheckbox.checked = true;\n  checkboxWrapper.append(lockCheckbox);\n  addToPanel(checkboxWrapper, 4);\n  const lockLabel = createInputLabel(translateText('Lock ratio'));\n  addToPanel(lockLabel, 20);\n\n  // edit button\n  const editImage = createImageButton(\n    uiImages.properties!,\n    ['pm-image-button-edit-properties'],\n    translateText('Edit Attributes'),\n  );\n  editImage.onclick = onEditImage;\n  addHorizontalPanelCell(panel, editImage);\n\n  // run onInit (wait for image to load if necessary)\n  if (img.complete) {\n    setTimeout(onInit, 0);\n  } else {\n    img.onload = onInit;\n  }\n\n  // function used to manage units ui (percent vs. non-percent)\n  const manageUnitsUI = () => {\n    const percentSizing = unitsSelect.value === kPercentUnit;\n\n    if (percentSizing) {\n      lockCheckbox.checked = true;\n      lockCheckbox.disabled = true;\n    } else {\n      lockCheckbox.disabled = false;\n    }\n\n    hInput.style.display = percentSizing ? 'none' : '';\n    hAutoLabel.style.display = percentSizing ? '' : 'none';\n  };\n  manageUnitsUI();\n\n  // helper function to get a dimension (returns null if input not currently valid)\n  const getDim = (input: HTMLInputElement) => {\n    const value = parseFloat(input.value);\n    if (isNaN(value)) {\n      return null;\n    }\n    if (value > 0) {\n      return value;\n    } else {\n      return null;\n    }\n  };\n\n  const setWidth = (width: number) => {\n    wInput.value = roundUnit(width, unitsSelect.value);\n  };\n  const setHeight = (height: number) => {\n    hInput.value = roundUnit(height, unitsSelect.value);\n  };\n\n  return {\n    // shelf element\n    el: shelf,\n\n    // sync the shelf props to the current size/units of the image\n    // we don't sync to the node b/c we want to benefit from automatic\n    // unit handling in the conversion to the DOM\n    sync: () => {\n      const size = shelfSizeFromImage(img);\n      unitsSelect.value = size.unit;\n      setWidth(size.width);\n      setHeight(size.height);\n\n      // manage units ui\n      manageUnitsUI();\n\n      // ensure we are positioned correctly (not offscreen, wide enough, etc.)\n      updatePosition();\n    },\n\n    position: () => {\n      updatePosition();\n    },\n\n    remove: () => {\n      if (editingScrollContainerEl) {\n        editingScrollContainerEl.removeEventListener('scroll', updatePosition);\n      }\n      clearInterval(positionTimer);\n      shelf.remove();\n    },\n\n    props: {\n      width: () => getDim(wInput) || shelfSizeFromImage(img).width,\n      setWidth,\n      height: () => getDim(hInput) || shelfSizeFromImage(img).height,\n      setHeight,\n      units: () => unitsSelect.value,\n      setUnits: (units: string) => (unitsSelect.value = units),\n      lockRatio: () => lockCheckbox.checked,\n      setLockRatio: (lock: boolean) => {\n        if (!lockCheckbox.disabled) {\n          lockCheckbox.checked = lock;\n        }\n      },\n    },\n  };\n}\n\nfunction resizeHandle(\n  img: HTMLImageElement,\n  imgContainerWidth: () => number,\n  lockRatio: () => boolean,\n  units: () => string,\n  onSizing: () => void,\n  onSizingComplete: () => void,\n) {\n  const handle = document.createElement('span');\n  handle.contentEditable = 'false';\n  handle.classList.add('pm-image-resize-handle', 'pm-background-color', 'pm-selected-node-border-color');\n  handle.style.position = 'absolute';\n  handle.style.bottom = '-6px';\n  handle.style.right = '-6px';\n  handle.style.cursor = 'nwse-resize';\n\n  const havePointerEvents = !!document.body.setPointerCapture;\n\n  const onPointerDown = (ev: MouseEvent) => {\n    ev.preventDefault();\n\n    const startWidth = img.offsetWidth;\n    const startHeight = img.offsetHeight;\n\n    const startX = ev.pageX;\n    const startY = ev.pageY;\n\n    const containerWidth = imgContainerWidth();\n\n    const onPointerMove = (e: MouseEvent) => {\n      // detect pointer movement\n      const movedX = e.pageX - startX;\n      const movedY = e.pageY - startY;\n\n      let width;\n      let height;\n      if (lockRatio()) {\n        if (movedX >= movedY) {\n          width = startWidth + movedX;\n          height = startHeight + movedX * (startHeight / startWidth);\n        } else {\n          height = startHeight + movedY;\n          width = startWidth + movedY * (startWidth / startHeight);\n        }\n      } else {\n        width = startWidth + movedX;\n        height = startHeight + movedY;\n      }\n\n      // determine the new width in units. If it's percent and > 100 then clip\n      const widthInUnits = pixelsToUnit(width, units(), containerWidth);\n      if (hasPercentWidth(units()) && widthInUnits > 100) {\n        width = containerWidth;\n        height = width * (startHeight / startWidth);\n      }\n\n      img.style.width = width + kPixelUnit;\n      img.setAttribute(kDataWidth, pixelsToUnit(width, units(), containerWidth) + units());\n      img.style.height = height + kPixelUnit;\n      img.setAttribute(kDataHeight, pixelsToUnit(height, units(), containerWidth) + units());\n\n      onSizing();\n    };\n\n    const onPointerUp = (e: MouseEvent) => {\n      e.preventDefault();\n\n      // stop listening to events\n      if (havePointerEvents) {\n        handle.releasePointerCapture((e as PointerEvent).pointerId);\n        handle.removeEventListener('pointermove', onPointerMove);\n        handle.removeEventListener('pointerup', onPointerUp);\n      } else {\n        document.removeEventListener('mousemove', onPointerMove);\n        document.removeEventListener('mouseup', onPointerUp);\n      }\n\n      // update image size\n      onSizingComplete();\n    };\n\n    if (havePointerEvents) {\n      handle.setPointerCapture((ev as PointerEvent).pointerId);\n      handle.addEventListener('pointermove', onPointerMove);\n      handle.addEventListener('pointerup', onPointerUp);\n    } else {\n      document.addEventListener('mousemove', onPointerMove);\n      document.addEventListener('mouseup', onPointerUp);\n    }\n  };\n\n  if (havePointerEvents) {\n    handle.addEventListener('pointerdown', onPointerDown);\n  } else {\n    handle.addEventListener('mousedown', onPointerDown);\n  }\n\n  return handle;\n}\n\n// derive the shelf size attributes from the image. takes advantage of any data-width\n// or data-height attributes, then falls back to actual offsetWidth/offsetHeight\n// as necessary\nfunction shelfSizeFromImage(img: HTMLImageElement) {\n  // get attributes\n  const width = img.getAttribute(kDataWidth);\n  const height = img.getAttribute(kDataHeight);\n\n  // if there is no width and no height, then use naturalWidth/naturalHeight\n  if (!width && !height) {\n    return {\n      width: img.naturalWidth || img.offsetWidth,\n      height: img.naturalHeight || img.offsetHeight,\n      unit: kPixelUnit,\n    };\n\n    // read units\n  } else {\n    let widthWithUnit = imageSizePropWithUnit(width);\n    let heightWithUnit = imageSizePropWithUnit(height);\n\n    if (!widthWithUnit) {\n      widthWithUnit = {\n        size: heightWithUnit!.size * (img.offsetWidth / img.offsetHeight),\n        unit: heightWithUnit!.unit,\n      };\n    }\n\n    if (!heightWithUnit) {\n      heightWithUnit = {\n        size: widthWithUnit.size * (img.offsetHeight / img.offsetWidth),\n        unit: widthWithUnit.unit,\n      };\n    }\n\n    return {\n      width: widthWithUnit.size,\n      height: heightWithUnit.size,\n      unit: widthWithUnit.unit,\n    };\n  }\n}\n\nfunction updateImageNodeSize(\n  view: EditorView,\n  image: NodeWithPos,\n  img: HTMLImageElement,\n  imgContainerWidth: () => number,\n  width: number,\n  height: number,\n  unit: string,\n) {\n  // don't write pixels explicitly\n  unit = unit === kPixelUnit ? '' : unit;\n\n  // edit width & height in keyvalue\n  let keyvalue = extractSizeStyles(image.node.attrs.keyvalue as Array<[string, string]>)!;\n  keyvalue = keyvalue.filter(value => ![kWidthAttrib, kHeightAttrib].includes(value[0]));\n  keyvalue.push([kWidthAttrib, width + unit]);\n  const dims = imageDimensionsFromImg(img, imgContainerWidth());\n  if (!hasPercentWidth(width + unit) && !isNaturalAspectRatio(width, height, dims, false)) {\n    keyvalue.push([kHeightAttrib, height + unit]);\n  }\n\n  // create transaction\n  const tr = view.state.tr;\n\n  // set new attributes\n  tr.setNodeMarkup(image.pos, image.node.type, { ...image.node.attrs, keyvalue });\n\n  // restore node selection if our tr.setNodeMarkup blew away the selection\n  const prevState = view.state;\n  if (prevState.selection instanceof NodeSelection && prevState.selection.from === image.pos) {\n    tr.setSelection(NodeSelection.create(tr.doc, image.pos));\n  }\n\n  // dispatch transaction\n  view.dispatch(tr);\n}\n\n// update the DOM representation of the image. extracts size-oriented attributes from the node and\n// applies them to the img element (alignment oriented attributes are applied to the figure elmenet)\nexport function updateImageViewSize(\n  node: ProsemirrorNode,\n  img: HTMLImageElement,\n  figure: HTMLElement | null,\n  containerWidth: number,\n) {\n  // reset attributes (they'll be set to new values below)\n  img.removeAttribute(kStyleAttrib);\n  img.removeAttribute(kDataWidth);\n  img.removeAttribute(kDataHeight);\n\n  // reset figure styles (only reset styles that we explicitly set below, b/c some\n  // styles may have been set by e.g. the attachResizeUI function)\n  if (figure) {\n    figure.style.cssFloat = '';\n    figure.style.verticalAlign = '';\n    figure.style.margin = '';\n    figure.style.marginTop = '';\n    figure.style.marginBottom = '';\n    figure.style.marginRight = '';\n    figure.style.marginLeft = '';\n    figure.style.padding = '';\n    figure.style.paddingTop = '';\n    figure.style.paddingBottom = '';\n    figure.style.paddingRight = '';\n    figure.style.paddingLeft = '';\n    figure.style.display = kDefaultContainerDisplay;\n  }\n\n  // apply keyvalue attribute to image\n  if (node.attrs.keyvalue) {\n    // factor width & height out of style\n    const keyvalue = extractSizeStyles(node.attrs.keyvalue);\n\n    // inspect all keys and process width, height, and style\n    (keyvalue as Array<[string, string]>).forEach(attr => {\n      // alias key and value\n      const key = attr[0];\n      let value = attr[1];\n\n      // set align oriented styles on figure parent\n      if (key === kStyleAttrib) {\n        if (figure) {\n          const liftStyle = (attrib: string, val: string) => figure.style.setProperty(attrib, val);\n          value = removeStyleAttrib(value, 'float', liftStyle);\n          value = removeStyleAttrib(value, 'vertical-align', liftStyle);\n          value = removeStyleAttrib(value, 'padding(?:[\\\\w\\\\-])*', liftStyle);\n          removeStyleAttrib(value, 'display', liftStyle); // leave display for lifting by image\n        }\n\n        // apply selected other styles to the image view (we don't just forward the entire\n        // style attribute b/c that would interfere with setting of style props in the\n        // width and height cases below). here we should whitelist in all styles we think\n        // users might want to see in the editor\n        const liftImgStyle = (attrib: string, val: string) => img.style.setProperty(attrib, val);\n        value = removeStyleAttrib(value, 'border(?:[\\\\w\\\\-])*', liftImgStyle);\n        value = removeStyleAttrib(value, 'margin(?:[\\\\w\\\\-])*', liftImgStyle);\n        value = removeStyleAttrib(value, 'display', liftImgStyle);\n      } else if (key === kWidthAttrib) {\n        // see if this is a unit we can edit\n        const widthProp = imageSizePropWithUnit(value);\n        if (widthProp) {\n          widthProp.unit = widthProp.unit || kPixelUnit;\n          if (isValidImageSizeUnit(widthProp.unit)) {\n            img.setAttribute(kDataWidth, widthProp.size + widthProp.unit);\n            img.style.width = unitToPixels(widthProp.size, widthProp.unit, containerWidth) + kPixelUnit;\n          }\n        }\n\n        // if not, just pass it straight through (editing UI will be disabled)\n        if (!img.hasAttribute(kDataWidth)) {\n          img.style.width = value;\n        }\n      } else if (key === kHeightAttrib) {\n        // see if this is a unit we can edit\n        const heightProp = imageSizePropWithUnit(value);\n        if (heightProp) {\n          heightProp.unit = heightProp.unit || kPixelUnit;\n          if (isValidImageSizeUnit(heightProp.unit)) {\n            img.setAttribute(kDataHeight, heightProp.size + heightProp.unit);\n            img.style.height = unitToPixels(heightProp.size, heightProp.unit, containerWidth) + kPixelUnit;\n          }\n        }\n\n        // if not, just pass it straight through (editing UI will be disabled)\n        if (!img.hasAttribute(kDataHeight)) {\n          img.style.height = value;\n        }\n\n        // use of legacy 'align' attribute is common for some pandoc users\n        // so we convert it to the requisite CSS and apply it to the figure container\n      } else if (figure && key === kAlignAttrib) {\n        switch (value) {\n          case 'left':\n          case 'right':\n            figure.style.cssFloat = value;\n            break;\n          case 'top':\n          case 'bottom':\n          case 'middle':\n            figure.style.verticalAlign = value;\n            break;\n        }\n      }\n    });\n\n    // if width is a percentage, then displayed height needs to be 'auto'\n    if (hasPercentWidth(img.getAttribute(kDataWidth))) {\n      img.style.height = 'auto';\n    }\n  }\n}\n","/*\n * widgets.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { applyStyles } from '../css';\n\nimport './widgets.css';\n\nexport function createHorizontalPanel() {\n  const div = window.document.createElement('div');\n  div.classList.add('pm-horizontal-panel');\n  return div;\n}\n\nexport function addHorizontalPanelCell(panel: HTMLDivElement, el: HTMLElement) {\n  el.classList.add('pm-horizontal-panel-cell');\n  panel.append(el);\n}\n\nexport function createPopup(\n  view: EditorView,\n  classes: string[],\n  onDestroyed?: () => void,\n  style?: { [key: string]: string },\n) {\n  // create popup\n  const popup = window.document.createElement('span');\n  popup.contentEditable = 'false';\n  popup.classList.add(\n    'pm-popup',\n    'pm-text-color',\n    'pm-proportional-font',\n    'pm-pane-border-color',\n    'pm-background-color',\n  );\n  popup.style.position = 'absolute';\n  popup.style.zIndex = '10';\n  applyStyles(popup, classes, style);\n\n  // create mutation observer that watches for destruction\n  if (onDestroyed) {\n    const observer = new MutationObserver(mutationsList => {\n      mutationsList.forEach(mutation => {\n        mutation.removedNodes.forEach(node => {\n          if (node === popup) {\n            observer.disconnect();\n            onDestroyed();\n          }\n        });\n      });\n    });\n    observer.observe(view.dom, { attributes: false, childList: true, subtree: true });\n  }\n\n  return popup;\n}\n\nexport function createImageButton(image: string, classes: string[], title: string, style?: { [key: string]: string }) {\n  const button = window.document.createElement('button');\n  button.classList.add('pm-image-button');\n  button.title = title;\n  applyStyles(button, classes, style);\n  const imageEl = window.document.createElement('img') as HTMLImageElement;\n  imageEl.src = image;\n  button.append(imageEl);\n  return button;\n}\n\nexport function createInputLabel(text: string, classes?: string[], style?: { [key: string]: string }) {\n  const label = window.document.createElement('label');\n  label.innerText = text;\n  label.classList.add('pm-input-label');\n  applyStyles(label, classes, style);\n  return label;\n}\n\nexport function createSelectInput(options: string[], classes?: string[], style?: { [key: string]: string }) {\n  const select = window.document.createElement('select');\n  appendOptions(select, options);\n  select.classList.add('pm-input-select');\n  select.classList.add('pm-pane-border-color');\n  applyStyles(select, classes, style);\n  return select;\n}\n\nfunction appendOptions(container: HTMLElement, options: string[]) {\n  options.forEach(option => {\n    const optionEl = window.document.createElement('option');\n    optionEl.value = option;\n    optionEl.textContent = option;\n    container.append(optionEl);\n  });\n}\n\nexport function createCheckboxInput(classes?: string[], style?: { [key: string]: string }) {\n  const input = window.document.createElement('input');\n  input.classList.add('pm-input-checkbox');\n  input.type = 'checkbox';\n  applyStyles(input, classes, style);\n  return input;\n}\n\nexport function createTextInput(widthChars: number, classes?: string[], style?: { [key: string]: string }) {\n  const input = document.createElement('input');\n  input.type = 'text';\n  input.classList.add('pm-input-text');\n  input.classList.add('pm-pane-border-color');\n  applyStyles(input, classes, style);\n  input.style.width = widthChars + 'ch';\n  return input;\n}\n","/*\n * figure-keys.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorState, Transaction, NodeSelection, Selection, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n  findParentNodeOfTypeClosestToPos,\n  findSelectedNodeOfType,\n  setTextSelection,\n  ContentNodeWithPos,\n  findParentNodeOfType,\n  findParentNodeClosestToPos,\n} from 'prosemirror-utils';\n\nimport { BaseKey, verticalArrowCanAdvanceWithinTextBlock } from '../../api/basekeys';\nimport { exitNode } from '../../api/command';\n\nexport function figureKeys(schema: Schema) {\n  return [\n    { key: BaseKey.Enter, command: exitNode(schema.nodes.figure, -1, false) },\n    { key: BaseKey.Backspace, command: backspaceHandler() },\n    { key: BaseKey.ArrowLeft, command: arrowHandler('left') },\n    { key: BaseKey.ArrowRight, command: arrowHandler('right') },\n    { key: BaseKey.ArrowUp, command: arrowHandler('up') },\n    { key: BaseKey.ArrowDown, command: arrowHandler('down') },\n  ];\n}\n\nfunction backspaceHandler() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // must be an empty selection\n    const selection = state.selection;\n    if (!selection.empty) {\n      return false;\n    }\n\n    // must be a selection at the beginning of it's parent\n    const schema = state.schema;\n    const { $head } = state.selection;\n    const { parentOffset } = $head;\n    if (parentOffset !== 0) {\n      return false;\n    }\n\n    // two scenarios: backspace within empty caption or backspace right after figure\n    const isWithinEmptyCaption = $head.parent.type === schema.nodes.figure && $head.parent.childCount === 0;\n    if (isWithinEmptyCaption) {\n      if (dispatch) {\n        // set a node selection for the figure\n        const tr = state.tr;\n        tr.setSelection(NodeSelection.create(tr.doc, $head.pos - 1));\n        dispatch(tr);\n      }\n      return true;\n    } else {\n      // check if the previous node is a figure\n      const parent = $head.node($head.depth - 1);\n      const parentIndex = $head.index($head.depth - 1);\n      if (parentIndex > 0) {\n        const previousNode = parent.child(parentIndex - 1);\n        if (previousNode.type === schema.nodes.figure) {\n          if (dispatch) {\n            const tr = state.tr;\n\n            // if the current node is and empty textblock then remove it\n            if ($head.node().childCount === 0) {\n              const parentTextBlock = findParentNodeClosestToPos($head, node => node.isTextblock);\n              if (parentTextBlock) {\n                tr.deleteRange(parentTextBlock.pos, parentTextBlock.pos + parentTextBlock.node.nodeSize);\n              }\n            }\n\n            const nodePos = $head.pos - previousNode.nodeSize - 1;\n            const figureSelection = NodeSelection.create(tr.doc, nodePos);\n            tr.setSelection(figureSelection);\n            dispatch(tr);\n          }\n          return true;\n        }\n      }\n    }\n\n    return false;\n  };\n}\n\nfunction arrowHandler(dir: 'up' | 'down' | 'left' | 'right') {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    // select figure\n    const selectFigure = (figure: ContentNodeWithPos) => {\n      if (dispatch) {\n        const tr = state.tr;\n        const figureSelection = NodeSelection.create(state.doc, figure.pos);\n        tr.setSelection(figureSelection).scrollIntoView();\n        dispatch(tr);\n      }\n    };\n\n    // select figure caption\n    const selectFigureCaption = (figure: ContentNodeWithPos, atEnd = false) => {\n      if (dispatch) {\n        const tr = state.tr;\n        setTextSelection(figure.pos + (atEnd ? figure.node.textContent.length + 1 : 0), 1)(tr);\n        dispatch(tr);\n      }\n    };\n\n    // alias schema and selection\n    const { schema, selection } = state;\n\n    // down/right arrow for node selection w/ caption drives cursor into caption\n    if (\n      (dir === 'down' || dir === 'right') &&\n      selection instanceof NodeSelection &&\n      selection.node.type === schema.nodes.figure\n    ) {\n      const figure = findSelectedNodeOfType(schema.nodes.figure)(selection);\n      if (figure && figure.node.childCount > 0) {\n        selectFigureCaption(figure);\n        return true;\n      }\n    }\n\n    // up/left arrow for selection in caption takes us back to the node selection\n    if (\n      (dir === 'up' || dir === 'left') &&\n      selection instanceof TextSelection &&\n      !!findParentNodeOfType(schema.nodes.figure)(selection)\n    ) {\n      if (dir === 'up' || (dir === 'left' && selection.$head.parentOffset === 0)) {\n        const figure = findParentNodeOfType(schema.nodes.figure)(selection);\n        if (figure) {\n          selectFigure(figure);\n          return true;\n        }\n      }\n\n      // normal node traversal\n    } else if (selection.empty && view && view.endOfTextblock(dir)) {\n      // compute side offset\n      const side = dir === 'left' || dir === 'up' ? -1 : 1;\n\n      // get selection head\n      const { $head } = selection;\n\n      // see if this would traverse our type\n      const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n      if (nextPos.$head) {\n        const figure = findParentNodeOfTypeClosestToPos(nextPos.$head, schema.nodes.figure);\n        if (figure) {\n          // check for e.g. math where you can advance across embedded newlines\n          if ((dir === 'up' || dir === 'down') && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n            return false;\n          }\n          // arrowing back into a figure with a caption selects the caption\n          if (side === -1 && figure.node.childCount > 0) {\n            selectFigureCaption(figure, dir === 'left');\n            // otherwise select the figure\n          } else {\n            selectFigure(figure);\n          }\n          return true;\n        }\n      }\n    }\n\n    // not handled\n    return false;\n  };\n}\n","/*\n * image-events.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorUI } from '../../api/ui';\n\nconst kTextUriList = 'text/uri-list';\nconst kApplicationQtImage = 'application/x-qt-image';\n\nconst pluginKey = new PluginKey('image-events');\n\nexport function imageEventsPlugin(ui: EditorUI) {\n  return new Plugin({\n    key: pluginKey,\n    props: {\n      handleDOMEvents: {\n        drop: imageDrop(ui),\n      },\n      handlePaste: imagePaste(ui),\n    },\n  });\n}\n\nfunction imagePaste(ui: EditorUI) {\n  return (view: EditorView, event: Event) => {\n    const clipboardEvent = event as ClipboardEvent;\n\n    if (clipboardEvent.clipboardData) {\n      // detect file pastes where there is no payload, in that case check to see\n      // if there is clipboard data we can get from our context (e.g. from Qt)\n      if (clipboardEvent.clipboardData.types.includes(kTextUriList)) {\n        const uriList = clipboardEvent.clipboardData.getData(kTextUriList);\n        if (uriList.length === 0) {\n          ui.context.clipboardUris().then(uris => {\n            if (uris) {\n              handleImageUris(view, view.state.selection.from, event, uris, ui);\n            }\n          });\n          event.preventDefault();\n          return true;\n        }\n        // raw image paste (e.g. from an office doc)\n      } else if (clipboardEvent.clipboardData.types.includes('application/x-qt-image')) {\n        ui.context.clipboardImage().then(image => {\n          if (image) {\n            handleImageUris(view, view.state.selection.from, event, [image], ui);\n          }\n          event.preventDefault();\n          return true;\n        });\n      }\n    }\n\n    return false;\n  };\n}\n\nfunction imageDrop(ui: EditorUI) {\n  return (view: EditorView, event: Event) => {\n    // alias to drag event so typescript knows about event.dataTransfer\n    const dragEvent = event as DragEvent;\n\n    // ensure we have data transfer\n    if (!dragEvent.dataTransfer) {\n      return false;\n    }\n\n    // ensure the drop coordinates map to an editor position\n    const coordinates = view.posAtCoords({\n      left: dragEvent.clientX,\n      top: dragEvent.clientY,\n    });\n    if (!coordinates) {\n      return false;\n    }\n\n    // array of uris\n    let uris: string[] | null = null;\n\n    // see if this is a drag of uris\n    const uriList = dragEvent.dataTransfer.getData(kTextUriList);\n    if (uriList) {\n      uris = uriList.split('\\r?\\n');\n    } else {\n      // see if the ui context has some dropped uris\n      uris = ui.context.droppedUris();\n    }\n\n    // process uris if we have them\n    if (uris && handleImageUris(view, coordinates.pos, event, uris, ui)) {\n      event.preventDefault();\n      return true;\n    } else {\n      return false;\n    }\n  };\n}\n\nfunction handleImageUris(view: EditorView, pos: number, event: Event, uris: string[], ui: EditorUI): boolean {\n  // filter out images\n  const imageUris = uris.filter(uri => {\n    // get extension and check it it's an image\n    // https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types#Common_image_file_types\n    const kImageExtensions = [\n      'apng',\n      'bmp',\n      'gif',\n      'ico',\n      'cur',\n      'jpg',\n      'jpeg',\n      'jfif',\n      'pjpeg',\n      'pjp',\n      'png',\n      'svg',\n      'tif',\n      'tiff',\n      'webp',\n    ];\n    const extension = uri\n      .split(/\\./)\n      .pop()!\n      .toLowerCase();\n    return kImageExtensions.includes(extension);\n  });\n\n  // exit if we have no image uris\n  if (imageUris.length === 0) {\n    return false;\n  }\n\n  // resolve image uris then insert them. note that this is done\n  // async so we return true indicating we've handled the drop and\n  // then we actually do the insertion once it returns\n  ui.context.resolveImageUris(imageUris).then(images => {\n    const tr = view.state.tr;\n    images.forEach(image => {\n      const node = view.state.schema.nodes.image.create({ src: image });\n      tr.insert(pos, node);\n    });\n    view.dispatch(tr);\n  });\n\n  // indicate that we will handle the event\n  return true;\n}\n","/*\n * hr.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { findParentNodeOfType } from 'prosemirror-utils';\nimport { EditorState } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, insertNode, EditorCommandId } from '../api/command';\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nimport './hr-styles.css';\n\nconst extension = (context: ExtensionContext) => {\n  const { ui } = context;\n\n  return {\n    nodes: [\n      {\n        name: 'horizontal_rule',\n        spec: {\n          group: 'block',\n          parseDOM: [{ tag: 'hr' }],\n          toDOM(): DOMOutputSpec {\n            return ['div', ['hr', { class: 'pm-border-background-color' }]];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.HorizontalRule,\n              node: 'horizontal_rule',\n            },\n          ],\n          writer: (output: PandocOutput) => {\n            output.writeToken(PandocTokenType.HorizontalRule);\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [\n        new ProsemirrorCommand(\n          EditorCommandId.HorizontalRule,\n          [],\n          insertNode(schema.nodes.horizontal_rule),\n          hrOmniInsert(ui),\n        ),\n      ];\n    },\n\n    inputRules: (_schema: Schema) => {\n      return [\n        new InputRule(/^\\*{3}$/, (state: EditorState, match: string[], start: number, end: number) => {\n          const schema = state.schema;\n          const paraNode = findParentNodeOfType(schema.nodes.paragraph)(state.selection);\n          if (paraNode && state.selection.$anchor.depth === 2) {\n            // only in top-level paragraphs\n            return state.tr.replaceRangeWith(start, end, schema.nodes.horizontal_rule.create());\n          } else {\n            return null;\n          }\n        }),\n      ];\n    },\n  };\n};\n\nfunction hrOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Horizontal Rule'),\n    description: ui.context.translateText('Line that spans across the page'),\n    group: OmniInsertGroup.Content,\n    priority: 1,\n    image: () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.horizontal_rule_dark! : ui.images.omni_insert?.horizontal_rule!,\n  };\n}\n\nexport default extension;\n","/*\n * hard_break.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { Extension } from '../api/extension';\nimport { BaseKey } from '../api/basekeys';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nconst extension: Extension = {\n  nodes: [\n    {\n      name: 'hard_break',\n      spec: {\n        inline: true,\n        group: 'inline',\n        selectable: false,\n        parseDOM: [{ tag: 'br' }],\n        toDOM() {\n          return ['br'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.LineBreak,\n            node: 'hard_break',\n          },\n        ],\n        writer: (output: PandocOutput) => {\n          output.writeToken(PandocTokenType.LineBreak);\n        },\n      },\n    },\n  ],\n\n  baseKeys: (_schema: Schema) => {\n    return [\n      { key: BaseKey.ModEnter, command: hardBreakCommandFn() },\n      { key: BaseKey.ShiftEnter, command: hardBreakCommandFn() },\n    ];\n  },\n};\n\nfunction hardBreakCommandFn() {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const br = state.schema.nodes.hard_break;\n    if (dispatch) {\n      dispatch(state.tr.replaceSelectionWith(br.create()).scrollIntoView());\n    }\n    return true;\n  };\n}\n\nexport default extension;\n","/*\n * null.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './null-styles.css';\n\nconst extension: Extension = {\n  nodes: [\n    {\n      name: 'null',\n      spec: {\n        group: 'block',\n        atom: true,\n        selectable: false,\n        parseDOM: [{ tag: \"div[class*='null-block']\" }],\n        toDOM() {\n          return ['div', { class: 'null-block' }];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Null,\n            node: 'null',\n          },\n        ],\n        writer: (output: PandocOutput) => {\n          output.writeToken(PandocTokenType.Null);\n        },\n      },\n    },\n  ],\n};\n\nexport default extension;\n","/*\n * em.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'em',\n      spec: {\n        group: 'formatting',\n        parseDOM: [\n          { tag: 'i' },\n          { tag: 'em' },\n          { style: 'font-weight', getAttrs: (value: string | Node) => (value as string) === 'italic' && null },\n        ],\n        toDOM() {\n          return ['em'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Emph,\n            mark: 'em',\n          },\n        ],\n        writer: {\n          priority: 4,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Emph, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Em, ['Mod-i'], schema.marks.em)];\n  },\n\n  inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n    return [\n      delimiterMarkInputRule('\\\\*', schema.marks.em, filter, '\\\\*-`', true),\n      delimiterMarkInputRule('_', schema.marks.em, filter, '\\\\w_`', true),\n    ];\n  },\n};\n\nexport default extension;\n","/*\n * strong.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'strong',\n      spec: {\n        group: 'formatting',\n        parseDOM: [\n          // This works around a Google Docs misbehavior where pasted content will be inexplicably wrapped in `<b>`\n          // tags with a font-weight normal.\n          {\n            tag: 'b',\n            getAttrs: (value: string | Node) => (value as HTMLElement).style.fontWeight !== 'normal' && null,\n          },\n          { tag: 'strong' },\n          {\n            style: 'font-weight',\n            getAttrs: (value: string | Node) => /^(bold(er)?|[5-9]\\d{2,})$/.test(value as string) && null,\n          },\n        ],\n        toDOM() {\n          return ['strong'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Strong,\n            mark: 'strong',\n          },\n        ],\n        writer: {\n          priority: 3,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Strong, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Strong, ['Mod-b'], schema.marks.strong)];\n  },\n\n  inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n    return [\n      delimiterMarkInputRule('\\\\*\\\\*', schema.marks.strong, filter, '`', true),\n      delimiterMarkInputRule('__', schema.marks.strong, filter, '\\\\w`', true),\n    ];\n  },\n};\n\nexport default extension;\n","/*\n * code.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { pandocAttrSpec, pandocAttrParseDom, pandocAttrToDomAttr, pandocAttrReadAST } from '../api/pandoc_attr';\nimport { PandocToken, PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport { kCodeText, kCodeAttr } from '../api/code';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions } = context;\n\n  const codeAttrs = pandocExtensions.inline_code_attributes;\n\n  return {\n    marks: [\n      {\n        name: 'code',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          group: 'formatting',\n          attrs: codeAttrs ? pandocAttrSpec : {},\n          parseDOM: [\n            {\n              tag: 'code',\n              getAttrs(dom: Node | string) {\n                if (codeAttrs) {\n                  return pandocAttrParseDom(dom as Element, {});\n                } else {\n                  return {};\n                }\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            const fontClass = 'pm-code pm-fixedwidth-font pm-chunk-background-color pm-block-border-color';\n            const attrs = codeAttrs\n              ? pandocAttrToDomAttr({\n                  ...mark.attrs,\n                  classes: [...mark.attrs.classes, fontClass],\n                })\n              : {\n                  class: fontClass,\n                };\n            return ['code', attrs];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Code,\n              mark: 'code',\n              getText: (tok: PandocToken) => tok.c[kCodeText],\n              getAttrs: (tok: PandocToken) => {\n                if (codeAttrs) {\n                  return pandocAttrReadAST(tok, kCodeAttr);\n                } else {\n                  return {};\n                }\n              },\n            },\n          ],\n          writer: {\n            // lowest possible mark priority since it doesn't call writeInlines\n            // (so will 'eat' any other marks on the stack)\n            priority: 0,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              // collect code and trim it (pandoc will do this on parse anyway)\n              let code = '';\n              parent.forEach((node: ProsemirrorNode) => (code = code + node.textContent));\n              code = code.trim();\n              if (code.length > 0) {\n                output.writeToken(PandocTokenType.Code, () => {\n                  if (codeAttrs) {\n                    output.writeAttr(mark.attrs.id, mark.attrs.classes, mark.attrs.keyvalue);\n                  } else {\n                    output.writeAttr();\n                  }\n                  output.write(code);\n                });\n              }\n            },\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [new MarkCommand(EditorCommandId.Code, ['Mod-d'], schema.marks.code)];\n    },\n\n    inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n      return [delimiterMarkInputRule('`', schema.marks.code, filter)];\n    },\n  };\n};\n\nexport default extension;\n","/*\n * link.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Schema } from 'prosemirror-model';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocToken, PandocOutput, PandocTokenType } from '../../api/pandoc';\nimport {\n  pandocAttrSpec,\n  pandocAttrParseDom,\n  pandocAttrToDomAttr,\n  pandocAttrReadAST,\n  PandocAttr,\n} from '../../api/pandoc_attr';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { kLinkTarget, kLinkTargetUrl, kLinkTargetTitle, kLinkAttr, kLinkChildren } from '../../api/link';\nimport { hasShortcutHeadingLinks } from '../../api/pandoc_format';\n\nimport { linkCommand, removeLinkCommand, linkOmniInsert } from './link-command';\nimport { linkInputRules, linkPasteHandler } from './link-auto';\nimport { linkHeadingsPostprocessor, syncHeadingLinksAppendTransaction } from './link-headings';\nimport { linkPopupPlugin } from './link-popup';\n\nimport './link-styles.css';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, ui, navigation } = context;\n\n  const capabilities = {\n    headings: hasShortcutHeadingLinks(pandocExtensions),\n    attributes: pandocExtensions.link_attributes,\n    text: true,\n  };\n  const linkAttr = pandocExtensions.link_attributes;\n  const autoLink = pandocExtensions.autolink_bare_uris;\n  const headingLink = hasShortcutHeadingLinks(pandocExtensions);\n  const citations = pandocExtensions.citations;\n\n  const excludes = citations ? { excludes: 'cite_id' } : {};\n\n  return {\n    marks: [\n      {\n        name: 'link',\n        spec: {\n          attrs: {\n            href: {},\n            heading: { default: null },\n            title: { default: null },\n            ...(linkAttr ? pandocAttrSpec : {}),\n          },\n          inclusive: false,\n          ...excludes,\n          parseDOM: [\n            {\n              tag: 'a[href]',\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                const attrs: { [key: string]: string | null } = {\n                  href: el.getAttribute('href'),\n                  title: el.getAttribute('title'),\n                  heading: el.getAttribute('data-heading'),\n                };\n                return {\n                  ...attrs,\n                  ...(linkAttr ? pandocAttrParseDom(el, attrs) : {}),\n                };\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            const linkClasses = 'pm-link pm-link-text-color';\n\n            let extraAttr: any = {};\n            if (linkAttr) {\n              extraAttr = pandocAttrToDomAttr({\n                ...mark.attrs,\n                classes: [...mark.attrs.classes, linkClasses],\n              });\n            } else {\n              extraAttr = { class: linkClasses };\n            }\n\n            return [\n              'a',\n              {\n                href: mark.attrs.href,\n                title: mark.attrs.title,\n                'data-heading': mark.attrs.heading,\n                ...extraAttr,\n              },\n            ];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Link,\n              mark: 'link',\n              getAttrs: (tok: PandocToken) => {\n                const target = tok.c[kLinkTarget];\n                return {\n                  href: target[kLinkTargetUrl],\n                  title: target[kLinkTargetTitle] || null,\n                  ...(linkAttr ? pandocAttrReadAST(tok, kLinkAttr) : {}),\n                };\n              },\n              getChildren: (tok: PandocToken) => tok.c[kLinkChildren],\n\n              postprocessor: hasShortcutHeadingLinks(pandocExtensions) ? linkHeadingsPostprocessor : undefined,\n            },\n          ],\n\n          writer: {\n            priority: 12,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              if (mark.attrs.heading) {\n                output.writeRawMarkdown('[');\n                output.writeInlines(parent);\n                output.writeRawMarkdown(']');\n              } else {\n                output.writeLink(\n                  mark.attrs.href,\n                  mark.attrs.title,\n                  linkAttr ? (mark.attrs as PandocAttr) : null,\n                  () => {\n                    output.writeInlines(parent);\n                  },\n                );\n              }\n            },\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [\n        new ProsemirrorCommand(\n          EditorCommandId.Link,\n          ['Mod-k'],\n          linkCommand(schema.marks.link, ui.dialogs.editLink, capabilities),\n          linkOmniInsert(ui),\n        ),\n        new ProsemirrorCommand(EditorCommandId.RemoveLink, [], removeLinkCommand(schema.marks.link)),\n      ];\n    },\n\n    inputRules: linkInputRules(autoLink, headingLink),\n\n    appendTransaction: (schema: Schema) =>\n      pandocExtensions.implicit_header_references ? [syncHeadingLinksAppendTransaction()] : [],\n\n    plugins: (schema: Schema) => {\n      const plugins = [\n        linkPopupPlugin(\n          schema,\n          ui,\n          navigation,\n          linkCommand(schema.marks.link, ui.dialogs.editLink, capabilities),\n          removeLinkCommand(schema.marks.link),\n        ),\n      ];\n      if (autoLink) {\n        plugins.push(\n          new Plugin({\n            key: new PluginKey('link-auto'),\n            props: {\n              transformPasted: linkPasteHandler(schema),\n            },\n          }),\n        );\n      }\n      return plugins;\n    },\n  };\n};\n\nexport default extension;\n","/*\n * link-command.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { MarkType } from 'prosemirror-model';\nimport { EditorUI } from '../../api/ui';\nimport { LinkEditorFn, LinkProps } from '../../api/ui-dialogs';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findChildren } from 'prosemirror-utils';\n\nimport { markIsActive, getMarkAttrs, getSelectionMarkRange, getMarkRange } from '../../api/mark';\n\nimport { linkTargets, LinkCapabilities, LinkType } from '../../api/link';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { equalsIgnoreCase } from '../../api/text';\n\nexport function linkCommand(markType: MarkType, onEditLink: LinkEditorFn, capabilities: LinkCapabilities) {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    // if the current node doesn't allow this mark return false\n    if (!state.selection.$from.node().type.allowsMarkType(markType)) {\n      return false;\n    }\n\n    async function asyncEditLink() {\n      if (dispatch) {\n        // collect link targets\n        const targets = await linkTargets(state.doc);\n\n        // get the range of the mark\n        const range = getSelectionMarkRange(state.selection, markType);\n\n        // get link attributes if we have them\n        let link: { [key: string]: any } = {};\n\n        // only get text if this is a text selection\n        if (state.selection instanceof TextSelection) {\n          link.text = state.doc.textBetween(range.from, range.to);\n          capabilities.text = true;\n        } else {\n          capabilities.text = false;\n        }\n\n        // get other attributes\n        if (markIsActive(state, markType)) {\n          link = {\n            ...link,\n            ...getMarkAttrs(state.doc, range, markType),\n          };\n        } else {\n          // if the link text is a URL then make it the default\n          if (link.text && link.text.match(/^https?:\\/\\/.*$/)) {\n            link.href = link.text;\n          }\n        }\n\n        // determine type\n        if (link.heading) {\n          link.type = LinkType.Heading;\n        } else if (link.href && link.href.startsWith('#')) {\n          link.type = LinkType.ID;\n        } else {\n          link.type = LinkType.URL;\n        }\n\n        // show edit ui\n        const result = await onEditLink({ ...link } as LinkProps, targets, capabilities);\n        if (result) {\n          const tr = state.tr;\n          tr.removeMark(range.from, range.to, markType);\n          if (result.action === 'edit') {\n            // create the mark\n            const mark = markType.create(result.link);\n\n            // if the content changed then replace the range, otherwise\n            if (capabilities.text && link.text !== result.link.text) {\n              const node = markType.schema.text(result.link.text, [mark]);\n              // if we are editing an existing link then replace it, otherwise replace the selection\n              if (link.href) {\n                tr.replaceRangeWith(range.from, range.to, node);\n              } else {\n                tr.replaceSelectionWith(node, false);\n              }\n            } else {\n              tr.addMark(range.from, range.to, mark);\n            }\n\n            // if it's a heading link then update heading to indicate it has an associated link\n            if (result.link.type === LinkType.Heading) {\n              const heading = findChildren(\n                tr.doc,\n                node =>\n                  node.type === state.schema.nodes.heading &&\n                  equalsIgnoreCase(node.textContent, result.link.heading || ''),\n              );\n              if (heading.length > 0) {\n                tr.setNodeMarkup(heading[0].pos, state.schema.nodes.heading, {\n                  ...heading[0].node.attrs,\n                  link: result.link.heading,\n                });\n              }\n            }\n          }\n          dispatch(tr);\n        }\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncEditLink();\n\n    return true;\n  };\n}\n\nexport function linkOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Link...'),\n    description: ui.context.translateText('Link to another location'),\n    group: OmniInsertGroup.Content,\n    priority: 8,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.link_dark! : ui.images.omni_insert?.link!),\n  };\n}\n\nexport function removeLinkCommand(markType: MarkType) {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    const range = getMarkRange(state.selection.$from, markType);\n    if (!range) {\n      return false;\n    }\n\n    if (dispatch) {\n      const tr = state.tr;\n      tr.removeMark(range.from, range.to, markType);\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n","/*\n * link-auto.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { markInputRule, MarkInputRuleFilter } from '../../api/input_rule';\nimport { markPasteHandler } from '../../api/clipboard';\n\nexport function linkInputRules(autoLink: boolean, headingLink: boolean) {\n  return (schema: Schema, filter: MarkInputRuleFilter) => {\n    const rules = [\n      // <link> style link\n      markInputRule(/(?:(?:^|[^`])<)(https?:\\/\\/[^>]+)(?:>)$/, schema.marks.link, filter, (match: string[]) => ({\n        href: match[1],\n      })),\n      // full markdown link\n      markInputRule(/(?:\\[)([^\\]]+)(?:\\]\\()([^)]+)(?:\\))$/, schema.marks.link, filter, (match: string[]) => ({\n        href: match[2],\n      })),\n    ];\n\n    if (autoLink) {\n      // plain link\n      rules.push(\n        new InputRule(\n          /(^|[^`])(https?:\\/\\/[^\\s]+\\w)[\\.\\?!\\,)]* $/,\n          (state: EditorState, match: string[], start: number, end: number) => {\n            const tr = state.tr;\n            start = start + match[1].length;\n            const linkEnd = start + match[2].length;\n            tr.addMark(start, linkEnd, schema.marks.link.create({ href: match[2] }));\n            tr.removeStoredMark(schema.marks.link);\n            tr.insertText(' ');\n            setTextSelection(end + 1)(tr);\n            return tr;\n          },\n        ),\n      );\n    }\n\n    return rules;\n  };\n}\n\nexport function linkPasteHandler(schema: Schema) {\n  return markPasteHandler(/(?:<)?([a-z]+:\\/\\/[^\\s>]+)(?:>)?/g, schema.marks.link, url => ({ href: url }));\n}\n","/*\n * clipboard.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Slice, Fragment, MarkType, Node as ProsemirrorNode } from 'prosemirror-model';\n\n// add marks to plain text pasted into the editor (e.g. urls become links)\n// https://github.com/ProseMirror/prosemirror/issues/90\nexport function markPasteHandler(regexp: RegExp, type: MarkType, getAttrs: (s: string) => {}) {\n  const handler = (fragment: Fragment) => {\n    regexp.lastIndex = 0;\n\n    const nodes: ProsemirrorNode[] = [];\n\n    fragment.forEach((child: ProsemirrorNode) => {\n      if (child.isText) {\n        const { text } = child;\n        let pos = 0;\n        let match;\n\n        do {\n          match = regexp.exec(text!);\n          if (match) {\n            const start = match.index;\n            const end = start + match[0].length;\n            const matchText = match.length > 1 ? match[1] : match[0];\n            const attrs = getAttrs instanceof Function ? getAttrs(matchText) : getAttrs;\n            if (start > 0) {\n              nodes.push(child.cut(pos, start));\n            }\n            nodes.push(type.schema.text(matchText).mark(type.create(attrs).addToSet(child.marks)));\n            pos = end;\n          }\n        } while (match);\n\n        if (pos < text!.length) {\n          nodes.push(child.cut(pos));\n        }\n      } else {\n        nodes.push(child.copy(handler(child.content)));\n      }\n    });\n\n    regexp.lastIndex = 0;\n\n    return Fragment.fromArray(nodes);\n  };\n\n  return (slice: Slice) => new Slice(handler(slice.content), slice.openStart, slice.openEnd);\n}\n","/*\n * link-headings.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildrenByType, findChildrenByMark } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { Transaction } from 'prosemirror-state';\nimport { equalsIgnoreCase } from '../../api/text';\n\n// detect links to headings within the doc read from pandoc and update the doc\n// to note those headings in the link attributes\nexport function linkHeadingsPostprocessor(doc: ProsemirrorNode) {\n  // alias schema\n  const schema = doc.type.schema;\n\n  // start with a list of all headings\n  const headings = findChildrenByType(doc, schema.nodes.heading);\n\n  // find link marks\n  findChildrenByMark(doc, schema.marks.link).forEach(link => {\n    const markRange = getMarkRange(doc.resolve(link.pos), schema.marks.link);\n    if (markRange) {\n      const attrs = getMarkAttrs(doc, markRange, schema.marks.link);\n      const linkText = doc.textBetween(markRange.from, markRange.to);\n      const matchedHeading = headings.find(heading => {\n        return equalsIgnoreCase(heading.node.textContent, linkText) && !attrs.title && attrs.href === '#';\n      });\n      if (matchedHeading) {\n        // point the link mark at this heading by name\n        doc.nodesBetween(markRange.from, markRange.to, node => {\n          const linkMark = node.marks.find(m => m.type === schema.marks.link);\n          if (linkMark) {\n            linkMark.attrs.heading = matchedHeading.node.textContent;\n          }\n        });\n\n        // update the heading to indicate it has a named link to it\n        matchedHeading.node.attrs.link = linkText;\n      }\n    }\n  });\n\n  // return doc\n  return doc;\n}\n\nexport function syncHeadingLinksAppendTransaction() {\n  return {\n    name: 'sync-heading-links',\n    nodeFilter: (node: ProsemirrorNode) =>\n      node.type === node.type.schema.nodes.heading || node.type.schema.marks.link.isInSet(node.marks),\n    append: (tr: Transaction) => {\n      // alias schema\n      const schema = tr.doc.type.schema;\n\n      // fix links to be in sync with their text\n      const links = findChildrenByMark(tr.doc, schema.marks.link);\n      links.forEach(link => {\n        const linkPos = tr.mapping.map(link.pos);\n        const range = getMarkRange(tr.doc.resolve(linkPos), schema.marks.link);\n        if (range) {\n          const attrs = getMarkAttrs(tr.doc, range, schema.marks.link);\n          const linkText = tr.doc.textBetween(range.from, range.to);\n          if (attrs.heading && !equalsIgnoreCase(attrs.heading, linkText)) {\n            tr.removeMark(range.from, range.to, schema.marks.link);\n            tr.addMark(range.from, range.to, schema.marks.link.create({ ...attrs, heading: linkText }));\n          }\n        }\n      });\n\n      // if a heading has deviated from it's link, then update the link\n      findChildrenByType(tr.doc, schema.nodes.heading).forEach(heading => {\n        const headingPos = tr.mapping.map(heading.pos);\n        const headingText = heading.node.textContent;\n        const headingLink = heading.node.attrs.link;\n\n        if (headingLink && !equalsIgnoreCase(headingLink, headingText) && headingText.length > 0) {\n          // set the heading link text\n          tr.setNodeMarkup(headingPos, schema.nodes.heading, {\n            ...heading.node.attrs,\n            link: headingText,\n          });\n\n          // find links that don't match and update them\n          findChildrenByMark(tr.doc, schema.marks.link).forEach(link => {\n            const linkPos = tr.mapping.map(link.pos);\n            const range = getMarkRange(tr.doc.resolve(linkPos), schema.marks.link);\n            if (range) {\n              const attrs = getMarkAttrs(tr.doc, range, schema.marks.link);\n              if (equalsIgnoreCase(attrs.heading, headingLink)) {\n                tr.insertText(headingText, range.from, range.to);\n                tr.addMark(\n                  range.from,\n                  range.from + headingText.length,\n                  schema.marks.link.create({ ...attrs, heading: headingText }),\n                );\n              }\n            }\n          });\n        }\n      });\n    },\n  };\n}\n","/*\n * LinkPopup.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, EditorView } from 'prosemirror-view';\nimport { Selection, PluginKey } from 'prosemirror-state';\n\nimport * as React from 'react';\n\nimport ClipboardJS from 'clipboard';\n\nimport { EditorUI } from '../../api/ui';\nimport { LinkProps } from '../../api/ui-dialogs';\nimport { CommandFn } from '../../api/command';\n\nimport { selectionIsImageNode } from '../../api/selection';\n\nimport { showTooltip } from '../../api/widgets/tooltip';\n\nimport { WidgetProps } from '../../api/widgets/react';\nimport { LinkButton, ImageButton } from '../../api/widgets/button';\nimport { Popup } from '../../api/widgets/popup';\nimport { EditorNavigation, NavigationType } from '../../api/navigation';\nimport { Schema } from 'prosemirror-model';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\n\nexport function linkPopupPlugin(\n  schema: Schema,\n  ui: EditorUI,\n  nav: EditorNavigation,\n  linkCmd: CommandFn,\n  removeLinkCmd: CommandFn,\n) {\n  const kPopupChromeWidth = 70;\n  const kMaxLinkWidth = 300;\n  const maxWidth = kMaxLinkWidth + kPopupChromeWidth;\n\n  return textPopupDecorationPlugin({\n    key: new PluginKey<DecorationSet>('link-popup'),\n    markType: schema.marks.link,\n    maxWidth,\n    createPopup: (view: EditorView, target: TextPopupTarget<LinkProps>, style: React.CSSProperties) => {\n      return Promise.resolve(\n        <LinkPopup\n          link={target.attrs}\n          maxLinkWidth={kMaxLinkWidth - 10} // prevent off by pixel(s) overflow\n          linkCmd={linkCmd}\n          removeLinkCmd={removeLinkCmd}\n          view={view}\n          ui={ui}\n          nav={nav}\n          style={style}\n        />,\n      );\n    },\n    specKey: (target: TextPopupTarget<LinkProps>) => {\n      const linkText = target.attrs.heading ? target.attrs.heading : target.attrs.href;\n      return `link:${linkText}`;\n    },\n    filter: (selection: Selection) => {\n      return !selectionIsImageNode(schema, selection);\n    },\n    onCmdClick: (target: TextPopupTarget<LinkProps>) => {\n      ui.display.openURL(target.attrs.href);\n    },\n  });\n}\n\ninterface LinkPopupProps extends WidgetProps {\n  link: LinkProps;\n  maxLinkWidth: number;\n  view: EditorView;\n  ui: EditorUI;\n  nav: EditorNavigation;\n  linkCmd: CommandFn;\n  removeLinkCmd: CommandFn;\n}\n\nconst LinkPopup: React.FC<LinkPopupProps> = props => {\n  // link\n  const linkText = props.link.heading ? props.link.heading : props.link.href;\n  const onLinkClicked = () => {\n    props.view.focus();\n    if (props.link.heading) {\n      props.nav.navigate(NavigationType.Heading, props.link.heading);\n    } else if (props.link.href.startsWith('#')) {\n      props.nav.navigate(NavigationType.Href, props.link.href.substr(1));\n    } else {\n      props.ui.display.openURL(props.link.href);\n    }\n  };\n\n  // copy\n  const showCopyButton = !props.link.heading && ClipboardJS.isSupported();\n  let clipboard: ClipboardJS;\n  const setCopyButton = (button: HTMLButtonElement | null) => {\n    if (button) {\n      clipboard = new ClipboardJS(button, {\n        text: () => linkText,\n      });\n      clipboard.on('success', () => {\n        showTooltip(button, props.ui.context.translateText('Copied to Clipboard'), 's');\n      });\n    } else {\n      if (clipboard) {\n        clipboard.destroy();\n      }\n    }\n  };\n\n  // remove\n  const onRemoveClicked = () => {\n    // in rstudio (w/ webkit) removing the link during the click results\n    // in a page-navigation! defer to next event cycle to avoid this\n    setTimeout(() => {\n      props.removeLinkCmd(props.view.state, props.view.dispatch, props.view);\n      props.view.focus();\n    }, 0);\n  };\n\n  // edit\n  const onEditClicked = () => {\n    props.linkCmd(props.view.state, props.view.dispatch, props.view);\n  };\n\n  return (\n    <Popup classes={['pm-popup-link']} style={props.style}>\n      <LinkButton text={linkText} onClick={onLinkClicked} maxWidth={props.maxLinkWidth} />\n      {showCopyButton ? (\n        <ImageButton\n          image={props.ui.images.copy!}\n          classes={['pm-image-button-copy-link']}\n          title={props.ui.context.translateText('Copy Link to Clipboard')}\n          ref={setCopyButton}\n        />\n      ) : null}\n      <ImageButton\n        image={props.ui.images.removelink!}\n        classes={['pm-image-button-remove-link']}\n        title={props.ui.context.translateText('Remove Link')}\n        onClick={onRemoveClicked}\n      />\n      <ImageButton\n        image={props.ui.images.properties!}\n        classes={['pm-image-button-edit-properties']}\n        title={props.ui.context.translateText('Edit Attributes')}\n        onClick={onEditClicked}\n      />\n    </Popup>\n  );\n};\n","/*\n * tooltip.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport tlite from 'tlite';\n\nimport './tooltip.css';\n\nexport function showTooltip(\n  el: Element,\n  text: string,\n  grav: 's' | 'n' | 'e' | 'w' | 'sw' | 'se' | 'nw' | 'ne' = 'n',\n  timeout = 2000,\n) {\n  el.setAttribute('title', '');\n  el.setAttribute('data-tlite', text);\n  tlite.show(el, { grav });\n  setTimeout(() => tlite.hide(el), timeout);\n}\n","/*\n * button.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nexport interface LinkButtonProps extends WidgetProps {\n  text: string;\n  onClick: () => void;\n  title?: string;\n  maxWidth?: number;\n}\n\nexport const LinkButton: React.FC<LinkButtonProps> = props => {\n  const className = ['pm-link', 'pm-link-text-color'].concat(props.classes || []).join(' ');\n\n  const style: React.CSSProperties = {\n    ...props.style,\n    maxWidth: props.maxWidth,\n  };\n\n  const onClick = (e: React.MouseEvent) => {\n    e.preventDefault();\n    props.onClick();\n  };\n\n  const onKeyDown = (e: React.KeyboardEvent) => {\n    if (e.keyCode === 32) {\n      e.preventDefault();\n      props.onClick();\n    }\n  };\n\n  return (\n    <a\n      href={props.text}\n      tabIndex={0}\n      onClick={onClick}\n      onKeyDown={onKeyDown}\n      title={props.title || props.text}\n      className={className}\n      style={style}\n    >\n      {props.text}\n    </a>\n  );\n};\n\nexport interface ImageButtonProps extends WidgetProps {\n  title: string;\n  image: string;\n  tabIndex?: number;\n  onClick?: () => void;\n}\n\nexport const ImageButton = React.forwardRef<HTMLButtonElement, ImageButtonProps>((props: ImageButtonProps, ref) => {\n  const className = ['pm-image-button'].concat(props.classes || []).join(' ');\n  const onClick = (e: React.MouseEvent) => {\n    if (props.onClick) {\n      e.preventDefault();\n      props.onClick();\n    }\n  };\n  return (\n    <button\n      onClick={onClick}\n      title={props.title}\n      className={className}\n      style={props.style}\n      ref={ref}\n      tabIndex={props.tabIndex}\n    >\n      <img src={props.image} alt={props.title} />\n    </button>\n  );\n});\n\nexport interface TextButtonProps extends WidgetProps {\n  title: string;\n  onClick?: () => void;\n  tabIndex?: number;\n  disabled?: boolean;\n}\n\nexport const TextButton = React.forwardRef<HTMLButtonElement, TextButtonProps>((props: TextButtonProps, ref) => {\n  const className = ['pm-text-button', 'pm-input-button'].concat(props.classes || []).join(' ');\n  const onClick = (e: React.MouseEvent) => {\n    if (props.onClick) {\n      e.preventDefault();\n      props.onClick();\n    }\n  };\n  return (\n    <button\n      onClick={onClick}\n      type=\"button\"\n      className={className}\n      style={props.style}\n      ref={ref}\n      tabIndex={props.tabIndex}\n      disabled={props.disabled}\n    >\n      {props.title}\n    </button>\n  );\n});\n\nexport interface OutlineButtonProps extends WidgetProps {\n  title: string;\n  onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n  tabIndex?: number;\n}\n\nexport const OutlineButton = React.forwardRef<HTMLButtonElement, OutlineButtonProps>(\n  (props: OutlineButtonProps, ref) => {\n    const className = ['pm-outline-button', 'pm-input-button', 'pm-input-outline-button']\n      .concat(props.classes || [])\n      .join(' ');\n    return (\n      <button\n        onClick={props.onClick}\n        type=\"button\"\n        className={className}\n        style={props.style}\n        ref={ref}\n        tabIndex={props.tabIndex}\n      >\n        {props.title}\n      </button>\n    );\n  },\n);\n","/*\n * TextPopup.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\nimport { Selection, Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\n\nimport * as React from 'react';\n\nimport { getMarkRange, getMarkAttrs } from './mark';\nimport { kRestoreLocationTransaction, kNavigationTransaction } from './transaction';\n\nimport { reactRenderForEditorView } from './widgets/react';\nimport { textRangePopupDecorationPosition } from './widgets/decoration';\nimport { kPlatformMac } from './platform';\nimport { MarkType } from 'prosemirror-model';\n\nexport interface TextPopupTarget<AttrsType = any> {\n  attrs: AttrsType;\n  text: string;\n}\n\nexport interface TextPopupDecoration<AttrsType = any> {\n  key: PluginKey<DecorationSet>;\n  markType: MarkType;\n  maxWidth: number;\n  createPopup: (\n    view: EditorView,\n    target: TextPopupTarget<AttrsType>,\n    style: React.CSSProperties,\n  ) => Promise<JSX.Element | null>;\n  dismissOnEdit?: boolean;\n  makeLinksAccessible?: boolean;\n  specKey?: (target: TextPopupTarget<AttrsType>) => string;\n  filter?: (selection: Selection) => boolean;\n  onCmdClick?: (target: TextPopupTarget<AttrsType>) => void;\n}\n\nexport function textPopupDecorationPlugin(deco: TextPopupDecoration): Plugin<DecorationSet> {\n  const {\n    key,\n    markType,\n    maxWidth,\n    createPopup,\n    specKey,\n    dismissOnEdit,\n    makeLinksAccessible,\n    filter,\n    onCmdClick,\n  } = deco;\n\n  let editorView: EditorView;\n\n  return new Plugin<DecorationSet>({\n    key,\n    view(view: EditorView) {\n      editorView = view;\n      return {};\n    },\n    state: {\n      init: (_config: { [key: string]: any }) => {\n        return DecorationSet.empty;\n      },\n      apply: (tr: Transaction, old: DecorationSet, _oldState: EditorState, newState: EditorState) => {\n        // if this a restore location or navigation then return empty\n        if (tr.getMeta(kRestoreLocationTransaction) || tr.getMeta(kNavigationTransaction)) {\n          return DecorationSet.empty;\n        }\n\n        // if this is doc update and we have dismiss on edit then return empty\n        if (dismissOnEdit && tr.docChanged) {\n          return DecorationSet.empty;\n        }\n\n        // if the selection is contained within the mark then show the popup\n        const selection = newState.selection;\n\n        // TODO JJA: The mark range is undefined when the the selection is 'after' the mark\n        // e.g.  [@allaire2012|]\n        // which means that the preview doesn't show\n        const range = getMarkRange(selection.$from, markType);\n\n        if (range) {\n          // selection has to be bounded by the range\n          if (selection.from < range.from || selection.to > range.to) {\n            return DecorationSet.empty;\n          }\n\n          // apply the filter\n          if (filter && !filter(selection)) {\n            return DecorationSet.empty;\n          }\n\n          // don't show the link popup if it's positioned at the far left of the mark\n          // (awkward when cursor is just left of an image)\n          if (selection.empty && range.from === selection.from) {\n            return DecorationSet.empty;\n          }\n\n          // mark target\n          const attrs = getMarkAttrs(newState.doc, range, markType);\n          const text = newState.doc.textBetween(range.from, range.to);\n          const target = { attrs, text };\n\n          // compute position (we need this both for setting the styles on the LinkPopup\n          // as well as for setting the Decorator pos)\n          const decorationPosition = textRangePopupDecorationPosition(editorView, range, maxWidth);\n\n          // key if one was provided\n          let decoratorSpec: { [key: string]: any } | undefined;\n          if (specKey) {\n            decoratorSpec = {\n              key: decorationPosition.key + specKey(target),\n              ignoreSelection: true,\n              stopEvent: () => {\n                return true;\n              },\n            };\n          }\n\n          // create decorator\n          const textPopupDecorator = Decoration.widget(\n            decorationPosition.pos,\n\n            (view: EditorView, getPos: () => number) => {\n              // create decorator and render popup into it\n              const decorationEl = window.document.createElement('div');\n              decorationEl.style.visibility = 'hidden';\n\n              // create popup component\n              createPopup(view, target, decorationPosition.style).then(popup => {\n                if (popup) {\n                  reactRenderForEditorView(popup, decorationEl, view);\n\n                  // make sure links responsd to spacebar\n                  if (makeLinksAccessible) {\n                    const links = decorationEl.getElementsByTagName('a');\n                    // tslint:disable-next-line: prefer-for-of\n                    for (let i = 0; i < links.length; i++) {\n                      const link = links[0];\n                      link.onkeydown = (e: KeyboardEvent) => {\n                        if (e.keyCode === 32) {\n                          e.preventDefault();\n                          link.click();\n                        }\n                      };\n                    }\n                  }\n\n                  decorationEl.style.visibility = 'visible';\n                }\n              });\n\n              return decorationEl;\n            },\n\n            decoratorSpec,\n          );\n\n          // return decorations\n          return DecorationSet.create(tr.doc, [textPopupDecorator]);\n        } else {\n          return DecorationSet.empty;\n        }\n      },\n    },\n    props: {\n      decorations: (state: EditorState) => {\n        return key.getState(state);\n      },\n      handleClick: onCmdClick\n        ? (view: EditorView, pos: number, event: MouseEvent) => {\n            const keyPressed = kPlatformMac && event.metaKey;\n            if (keyPressed) {\n              const attrs = getMarkAttrs(view.state.doc, { from: pos, to: pos }, markType);\n              const range = getMarkRange(view.state.doc.resolve(pos));\n              if (attrs && range) {\n                event.stopPropagation();\n                event.preventDefault();\n                const text = view.state.doc.textBetween(range.from, range.to);\n                onCmdClick({ attrs, text });\n                return true;\n              }\n            }\n            return false;\n          }\n        : undefined,\n    },\n  });\n}\n","/*\n * react.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport { EditorView } from 'prosemirror-view';\n\nexport interface WidgetProps {\n  classes?: string[];\n  style?: React.CSSProperties;\n}\n\n// Render a react element into a DOM container that will eventually be added to the EditorView.dom\n// this function is necessary for situations where an element is created and then handed to ProseMirror\n// (unattached to the DOM), and then subsequently destoyed/unmounted by ProseMirror. We use a\n// MutationObserver to watch EditorView.dom for the element's removal then in response call\n// ReactDOM.unmountComponentAtNode\nexport function reactRenderForEditorView(element: React.ReactElement, container: HTMLElement, view: EditorView) {\n  // render the react element into the container\n  const ref = ReactDOM.render(element, container);\n\n  // track view dom mutations to determine when ProseMirror has destroyed the element\n  // (our cue to unmount/cleanup the react component)\n  const observer = new MutationObserver(mutationsList => {\n    mutationsList.forEach(mutation => {\n      mutation.removedNodes.forEach(node => {\n        if (node === container) {\n          observer.disconnect();\n          ReactDOM.unmountComponentAtNode(container);\n        }\n      });\n    });\n  });\n  observer.observe(view.dom, { attributes: false, childList: true, subtree: true });\n\n  // return the ref\n  return ref;\n}\n","/*\n * decoration.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { editingRootNodeClosestToPos } from '../node';\n\nimport { kPixelUnit } from '../css';\n\nexport interface DecorationPosition {\n  pos: number;\n  style: { [key: string]: string };\n  key: string;\n}\n\nexport function textRangePopupDecorationPosition(\n  view: EditorView,\n  range: { from: number; to: number },\n  maxWidth: number,\n): DecorationPosition {\n  // get the (window) DOM coordinates for the start of the range. we use range.from + 1 so\n  // that ranges that are at the beginning of a line don't have their position set\n  // to the previous line\n  const rangeCoords = view.coordsAtPos(range.from + 1);\n\n  // get the node, element, coordinates, and style for the current editing root\n  const rangePos = view.state.doc.resolve(range.from);\n  const editingNode = editingRootNodeClosestToPos(rangePos)!;\n  const editingEl = view.domAtPos(editingNode!.pos + 1).node as HTMLElement;\n  const editingBox = editingEl.getBoundingClientRect();\n  const editingBoxStyle = window.getComputedStyle(editingEl);\n\n  // base popup style\n  const topPadding = parseInt(editingBoxStyle.paddingTop!, 10) || 0;\n  const popupStyle = {\n    top: rangeCoords.bottom - editingBox.top - topPadding + 5 + kPixelUnit,\n  };\n\n  // we need to compute whether the popup will be visible (horizontally), do\n  // this by testing whether we have room for the max link width + controls/padding\n  let style: { [key: string]: string };\n  const positionRight = rangeCoords.left + maxWidth > editingBox.right;\n  if (positionRight) {\n    const rightCoords = view.coordsAtPos(range.to);\n    const rightPos = rangeCoords.top === rightCoords.top ? editingBox.right - rightCoords.right : 0;\n    style = {\n      ...popupStyle,\n      right: rightPos + kPixelUnit,\n    };\n  } else {\n    const marginLeft =\n      'calc(' +\n      (rangeCoords.left - editingBox.left) +\n      'px ' +\n      ' - ' +\n      editingBoxStyle.borderLeftWidth +\n      ' - ' +\n      editingBoxStyle.paddingLeft +\n      ' - ' +\n      editingBoxStyle.marginLeft +\n      ' - 1ch' +\n      ')';\n    style = {\n      ...popupStyle,\n      marginLeft,\n    };\n  }\n\n  // calculate key\n  const key = Object.keys(style)\n    .map(attrib => `${attrib}=${style[attrib]}`)\n    .join(';');\n\n  return {\n    pos: editingNode.pos + editingNode.node.nodeSize - 1,\n    style,\n    key,\n  };\n}\n\nfunction getEditingBox(view: EditorView, pos$: ResolvedPos) {\n  const editingNode = editingRootNodeClosestToPos(pos$);\n  const editingEl = view.domAtPos(editingNode!.pos + 1).node as HTMLElement;\n  return editingEl.getBoundingClientRect();\n}\n","/*\n * select_all.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findBlockNodes, ContentNodeWithPos } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { editingRootNode } from '../api/node';\n\nconst extension: Extension = {\n  commands: () => {\n    return [new ProsemirrorCommand(EditorCommandId.SelectAll, ['Mod-a'], selectAll)];\n  },\n};\n\nexport function selectAll(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n  if (dispatch) {\n    const editingRoot = editingRootNode(state.selection);\n    if (editingRoot) {\n      const schema = state.schema;\n      const tr = state.tr;\n      if (editingRoot.node.type === schema.nodes.note) {\n        tr.setSelection(childBlocksSelection(tr.doc, editingRoot));\n      } else {\n        const start = tr.doc.resolve(editingRoot.pos);\n        const end = tr.doc.resolve(editingRoot.pos + editingRoot.node.nodeSize);\n        tr.setSelection(new TextSelection(start, end));\n      }\n      dispatch(tr);\n      if (view) {\n        // we do this to escape from embedded editors e.g. codemirror\n        view.focus();\n      }\n    }\n  }\n  return true;\n}\n\nfunction childBlocksSelection(doc: ProsemirrorNode, parent: ContentNodeWithPos) {\n  const blocks = findBlockNodes(parent.node);\n  const begin = parent.start + blocks[0].pos + 1;\n  const lastBlock = blocks[blocks.length - 1];\n  const end = parent.start + lastBlock.pos + lastBlock.node.nodeSize;\n  return TextSelection.create(doc, begin, end);\n}\n\nexport default extension;\n","/*\n * history.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { history, redo, undo } from 'prosemirror-history';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n  commands: () => {\n    return [\n      new ProsemirrorCommand(EditorCommandId.Undo, ['Mod-z'], undo),\n      new ProsemirrorCommand(EditorCommandId.Redo, ['Shift-Mod-z'], redo),\n    ];\n  },\n\n  plugins: () => {\n    return [history()];\n  },\n};\n\nexport default extension;\n","/*\n * cursor.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey, Plugin, EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { dropCursor } from 'prosemirror-dropcursor';\nimport { gapCursor, GapCursor } from 'prosemirror-gapcursor';\nimport 'prosemirror-gapcursor/style/gapcursor.css';\n\nimport { findParentNodeOfTypeClosestToPos, findParentNodeOfType, findParentNode } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { BaseKey, verticalArrowCanAdvanceWithinTextBlock } from '../api/basekeys';\n\nimport './cursor.css';\nimport { ResolvedPos } from 'prosemirror-model';\nimport { isList } from '../api/list';\n\n\nconst extension: Extension = {\n\n  baseKeys: () => {\n    return [\n      { key: BaseKey.ArrowLeft, command: gapArrowHandler('left') },\n      { key: BaseKey.ArrowUp, command: gapArrowHandler('up') }\n    ];\n  },\n\n  plugins: () => {\n    return [\n      gapCursor(), \n      dropCursor(),\n      new Plugin({\n        key: new PluginKey('div-gap-cursor'),\n        props: {\n          handleDOMEvents: {\n            click: gapClickHandler,\n          },\n        },\n      })];\n  },\n};\n\nfunction gapArrowHandler(dir: 'up' | 'left') {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    \n\n    // function to create a gap cursor\n    const createGapCursor = ($pos: ResolvedPos) => {\n      if (dispatch) {\n        const cursor = new GapCursor($pos, $pos);\n        const tr = state.tr;\n        tr.setSelection(cursor);\n        dispatch(tr);\n      }\n      return true;\n    };\n\n    if (state.selection.empty && view && view.endOfTextblock(dir)) {\n      \n      // get the selection\n      const $head = state.selection.$head;\n\n      // if we are in a block that handles up/down (e.g. display math)\n      // then we don't want to make a gap cursor\n      if (dir === 'up' && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n        return false;\n      }\n\n      // check if we are in a div\n      const div = findParentNodeOfType(state.schema.nodes.div)(state.selection);\n      \n      // if we are at the very top of a div then create a gap cursor\n      if (div) {\n        \n        const $divPos = state.doc.resolve(div.pos);\n        if ($head.index($head.depth - 1) === 0 && !(state.selection instanceof GapCursor)) {\n\n          // if we are in a list item the calculations about view.endOfTextblock will be off\n          if (findParentNode(isList)(state.selection)) {\n            return false;\n          }\n\n          return createGapCursor(state.doc.resolve($divPos.pos + 1));\n        } \n      }\n\n      // if we are at the top of the document then create a gap cursor\n      if (!$head.nodeBefore && ($head.pos <= 2)) {\n        return createGapCursor(state.doc.resolve($head.pos - 1));\n      }\n      \n      return false;\n\n    } else {\n      return false;\n    }\n\n   \n  };\n}\n\n\nfunction gapClickHandler(view: EditorView, event: Event): boolean {\n\n  const schema = view.state.schema;\n  const mouseEvent = event as MouseEvent;\n  const clickPos = view.posAtCoords({ left: mouseEvent.clientX, top: mouseEvent.clientY } );\n\n  if (clickPos) {\n\n    // resolve click pos\n    const $clickPos = view.state.doc.resolve(clickPos.pos);    \n\n    // create a gap cursor at the click position\n    const createGapCursor = () => {\n      // focus the view\n      view.focus();\n        \n      // create the gap cursor\n      const tr = view.state.tr;\n      const cursor = new GapCursor($clickPos, $clickPos); \n      tr.setSelection(cursor);\n      view.dispatch(tr);\n      \n      // prevent default event handling\n      event.preventDefault();\n      event.stopImmediatePropagation();\n      return false;\n    };\n     \n    // handle clicks at the top of divs\n     if (schema.nodes.div) {\n      const div = findParentNodeOfTypeClosestToPos(\n        view.state.doc.resolve(clickPos.pos), schema.nodes.div\n      );\n      if (div && div.pos === clickPos.inside) {\n        const divNode = view.nodeDOM(div.start);\n        if (divNode instanceof HTMLElement) {\n          if (Math.abs(mouseEvent.clientX - divNode.getBoundingClientRect().left) < 150) {\n            return createGapCursor();\n          }\n        }\n      }\n    }\n\n    // handle clicks above body\n    // Take this out for now b/c it was interfering with other mouse \n    // gestures (e.g. clicking on attr editor). keyboard gestures still\n    // work to get to the top of the body\n    /*\n    if ($clickPos.parent.type === schema.nodes.body &&\n        $clickPos.start() === $clickPos.pos) {\n      \n      return createGapCursor();\n\n    }\n    */\n  }\n\n  return false;\n}\n\nexport default extension;\n","/*\n * clear_formatting.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { Extension } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { liftTarget } from 'prosemirror-transform';\n\n// marks included in clear formatting\nconst kFormattingMarks = ['code', 'em', 'underline', 'smallcaps', 'span', 'strikeout', 'strong', 'superscript', 'subscript'];\n\n// for nodes, all nodes with isTextblock === true will be converted to paragraph, and all\n// nodes in this list will be lifted\nconst kLiftFormattingNodes = ['blockquote', 'line_block', 'div', 'raw_block'];\n\nconst extension: Extension = {\n  commands: () => {\n    return [new ProsemirrorCommand(EditorCommandId.ClearFormatting, ['Mod-\\\\'], clearFormatting)];\n  },\n};\n\nexport function clearFormatting(state: EditorState, dispatch?: (tr: Transaction) => void) {\n  if (dispatch) {\n    // create transaction\n    const tr = state.tr;\n\n    // alias schema and selection\n    const schema = state.schema;\n    const { from, to } = tr.selection;\n\n    // clear formatting marks\n    kFormattingMarks.forEach(markName => {\n      const mark = state.schema.marks[markName];\n      if (mark) {\n        tr.removeMark(from, to, mark);\n      }\n    });\n    tr.setStoredMarks([]);\n\n    // lift / set nodes as required\n    tr.doc.nodesBetween(from, to, (node: ProsemirrorNode, pos: number) => {\n      // ignore paragraph and text nodes (already have 'cleared' formatting)\n      if (node.type === schema.nodes.paragraph || node.type === schema.nodes.text) {\n        return;\n      }\n\n      // pass recursively through list container nodes\n      if (\n        node.type === schema.nodes.bullet_list ||\n        node.type === schema.nodes.ordered_list ||\n        node.type === schema.nodes.definition_list ||\n        node.type === schema.nodes.definition_list_term ||\n        node.type === schema.nodes.definition_list_description\n      ) {\n        return;\n      }\n\n      // get node range (map positions)\n      const fromPos = tr.doc.resolve(tr.mapping.map(pos + 1));\n      const toPos = tr.doc.resolve(tr.mapping.map(pos + node.nodeSize - 1));\n      const nodeRange = fromPos.blockRange(toPos);\n\n      // process text blocks and blocks that can be lifted (e.g. blockquote)\n      if (nodeRange) {\n        if (node.type.isTextblock) {\n          tr.setNodeMarkup(nodeRange.start, schema.nodes.paragraph);\n        } else if (kLiftFormattingNodes.includes(node.type.name)) {\n          const targetLiftDepth = liftTarget(nodeRange);\n          if (targetLiftDepth || targetLiftDepth === 0) {\n            tr.lift(nodeRange, targetLiftDepth);\n          }\n        }\n      }\n    });\n\n    dispatch(tr);\n  }\n\n  return true;\n}\n\nexport default extension;\n","/*\n * smarty.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ellipsis, InputRule } from 'prosemirror-inputrules';\nimport { Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { fancyQuotesToSimple } from '../api/quote';\n\nconst plugin = new PluginKey('smartypaste');\n\n// match enDash but only for lines that aren't an html comment\nconst enDash = new InputRule(/[^!-`]--$/, (state: EditorState, match: string[], start: number, end: number) => {\n  const { parent, parentOffset } = state.selection.$head;\n  const precedingText = parent.textBetween(0, parentOffset);\n  if (precedingText.indexOf('<!--') === -1) {\n    const tr = state.tr;\n    tr.insertText('–', end - 1, end);\n    return tr;\n  } else {\n    return null;\n  }\n});\n\nconst emDash = new InputRule(/(^|[^`])–-$/, (state: EditorState, match: string[], start: number, end: number) => {\n  const tr = state.tr;\n  tr.insertText('—', end - 1, end);\n  return tr;\n});\n\nconst extension: Extension = {\n  inputRules: () => {\n    return [ellipsis, enDash, emDash];\n  },\n\n  plugins: (schema: Schema) => {\n    return [\n      // apply smarty rules to plain text pastes\n      new Plugin({\n        key: plugin,\n        props: {\n          transformPastedText(text: string) {\n            // emdash\n            text = text.replace(/(\\w)---(\\w)/g, '$1—$2');\n\n            // endash\n            text = text.replace(/(\\w)--(\\w)/g, '$1–$2');\n\n            // ellipses\n            text = text.replace(/\\.\\.\\./g, '…');\n\n            // we explicitly don't want fancy quotes in the editor\n            text = fancyQuotesToSimple(text);\n\n            return text;\n          },\n        },\n      }),\n    ];\n  },\n};\n\nexport default extensionIfEnabled(extension, 'smart');\n","/*\n * attr_duplicate_id.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Step, AddMarkStep } from 'prosemirror-transform';\nimport { findChildren } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { getMarkAttrs, getMarkRange } from '../api/mark';\nimport { extensionIfPandocAttrEnabled } from '../api/pandoc_attr';\n\nconst extension: Extension = {\n  appendTransaction: (_schema: Schema) => {\n    // detect changes in content with ids\n    const hasAttrId = (node: ProsemirrorNode) => {\n      return !!node.attrs.id || node.marks.some(mark => !!mark.attrs.id);\n    };\n\n    // detect mark steps with new ids\n    const attrMarkStep = (step: Step) => {\n      return step instanceof AddMarkStep && !!(step as any).mark.attrs.id;\n    };\n\n    return [\n      {\n        name: 'attr_duplicate_id',\n        filter: (transactions: Transaction[]) => transactions.some(transaction => transaction.steps.some(attrMarkStep)),\n        nodeFilter: hasAttrId,\n        append: (tr: Transaction) => {\n          const usedIds = new Set<string>();\n          const scannedRanges: Array<{ from: number; to: number }> = [];\n          findChildren(tr.doc, hasAttrId, true).forEach(attrNode => {\n            if (attrNode.node.attrs.id) {\n              const id = attrNode.node.attrs.id;\n              if (usedIds.has(id)) {\n                const node = attrNode.node;\n                tr.setNodeMarkup(attrNode.pos, undefined, { ...node.attrs, id: null }, node.marks);\n              } else {\n                usedIds.add(id);\n              }\n            } else {\n              const mark = attrNode.node.marks.find(mk => !!mk.attrs.id)!;\n              const markRange = getMarkRange(tr.doc.resolve(attrNode.pos), mark.type) as { from: number; to: number };\n              const markAttrs = getMarkAttrs(tr.doc, markRange, mark.type);\n              const id = markAttrs.id;\n              if (id && !scannedRanges.find(range => range.from === markRange.from && range.to === markRange.to)) {\n                scannedRanges.push(markRange);\n                if (usedIds.has(id)) {\n                  tr.removeMark(markRange.from, markRange.to, mark.type);\n                  tr.addMark(markRange.from, markRange.to, mark.type.create({ ...mark.attrs, id: null }));\n                } else {\n                  usedIds.add(id);\n                }\n              }\n            }\n          });\n        },\n      },\n    ];\n  },\n};\n\nexport default extensionIfPandocAttrEnabled(extension);\n","/*\n * trailing_p.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction, Selection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { Transform } from 'prosemirror-transform';\nimport { ContentNodeWithPos } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { editingRootNode } from '../api/node';\nimport { FixupContext } from '../api/fixup';\nimport { trTransform } from '../api/transaction';\n\nconst extension: Extension = {\n  fixups: (schema: Schema) => {\n    return [\n      (tr: Transaction, context: FixupContext) => {\n        if (context === FixupContext.Load) {\n          if (requiresTrailingP(tr.selection)) {\n            insertTrailingP(tr);\n          }\n        }\n        return tr;\n      },\n    ];\n  },\n\n  appendTransaction: (schema: Schema) => {\n    return [\n      {\n        name: 'trailing_p',\n        append: (tr: Transaction) => {\n          if (requiresTrailingP(tr.selection)) {\n            insertTrailingP(tr);\n          }\n          return tr;\n        },\n      },\n    ];\n  },\n};\n\nfunction insertTrailingP(tr: Transaction) {\n  const editingNode = editingRootNode(tr.selection);\n  if (editingNode) {\n    trTransform(tr, insertTrailingPTransform(editingNode));\n  }\n}\n\nfunction insertTrailingPTransform(editingNode: ContentNodeWithPos) {\n  return (tr: Transform) => {\n    const schema = editingNode.node.type.schema;\n    tr.insert(editingNode.pos + editingNode.node.nodeSize - 1, schema.nodes.paragraph.create());\n  };\n}\n\nfunction requiresTrailingP(selection: Selection) {\n  const editingRoot = editingRootNode(selection);\n  if (editingRoot) {\n    return !isParagraphNode(editingRoot.node.lastChild) || isDisplayMathNode(editingRoot.node.lastChild);\n  } else {\n    return false;\n  }\n}\n\nfunction isParagraphNode(node: ProsemirrorNode | null | undefined) {\n  if (node) {\n    const schema = node.type.schema;\n    return node.type === schema.nodes.paragraph;\n  } else {\n    return false;\n  }\n}\n\nfunction isDisplayMathNode(node: ProsemirrorNode | null | undefined) {\n  if (node && node.firstChild) {\n    return node.childCount === 1 && node.type.schema.marks.math?.isInSet(node.firstChild.marks);\n  } else {\n    return false;\n  }\n}\n\nexport default extension;\n","/*\n * empty_mark.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { Transaction, EditorState } from 'prosemirror-state';\nimport { ReplaceStep } from 'prosemirror-transform';\n\nimport { Extension } from '../api/extension';\nimport { getMarkRange } from '../api/mark';\n\nconst extension: Extension = {\n  appendTransaction: (schema: Schema) => {\n    return [\n      {\n        name: 'clear_empty_mark',\n        append: (tr: Transaction, transactions: Transaction[], _oldState: EditorState, newState: EditorState) => {\n          // if we have an empty selection\n          if (newState.selection.empty) {\n            // if the last change removed text\n            const removedText = transactions.some(transaction =>\n              transaction.steps.some(step => {\n                return step instanceof ReplaceStep && (step as any).slice.content.size === 0;\n              }),\n            );\n            if (removedText) {\n              // if there is a stored mark w/ 0 range then remove it\n              newState.storedMarks?.forEach(mark => {\n                const markRange = getMarkRange(tr.doc.resolve(tr.selection.from), mark.type);\n                if (!markRange || markRange.from === markRange.to) {\n                  tr.removeStoredMark(mark);\n                }\n              });\n            }\n          }\n        },\n      },\n    ];\n  },\n};\n\nexport default extension;\n","/*\n * escape_mark.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport { BaseKey } from '../api/basekeys';\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n  baseKeys: (_schema: Schema) => {\n    return [\n      {\n        key: BaseKey.ArrowRight,\n        command: (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n          if (state.selection.empty) {\n            // if we are at the end of a parent text block and there are\n            // marks stored in the state or active on the selection then\n            // clear the stored marks and insert a space.\n            const $head = state.selection.$head;\n            const parent = $head.node($head.depth);\n            if (\n              parent.type.isTextblock &&\n              $head.parentOffset === parent.textContent.length &&\n              ($head.marks().length > 0 || !!state.storedMarks)\n            ) {\n              if (dispatch) {\n                const tr = state.tr;\n                tr.setStoredMarks([]);\n                tr.insertText(' ');\n                dispatch(tr);\n              }\n              return true;\n            }\n          }\n          return false;\n        },\n      },\n    ];\n  },\n};\n\nexport default extension;\n","/*\n * code_block_input.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, ResolvedPos, Fragment } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocExtensions } from '../api/pandoc';\nimport { EditorFormat } from '../api/format';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { precedingListItemInsertPos, precedingListItemInsert } from '../api/list';\nimport { pandocAttrFrom } from '../api/pandoc_attr';\nimport { BaseKey } from '../api/basekeys';\n\nimport { markIsActive } from '../api/mark';\nimport { canInsertRmdChunk } from '../api/rmd';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { pandocExtensions, format } = context;\n\n  const fencedAttributes = pandocExtensions.fenced_code_attributes || !!format.rmdExtensions.codeChunks;\n\n  return {\n    baseKeys: () => {\n      return [{ key: BaseKey.Enter, command: codeBlockInputRuleEnter(pandocExtensions, fencedAttributes, format) }];\n    },\n\n    inputRules: () => {\n      if (fencedAttributes) {\n        return [\n          new InputRule(/^```{$/, (state: EditorState, match: string[], start: number, end: number) => {\n            if (!canApplyCodeBlockInputRule(state)) {\n              return null;\n            }\n            const tr = state.tr;\n            tr.insertText('{}');\n            setTextSelection(start + match[0].length)(tr);\n            return tr;\n          }),\n        ];\n      } else {\n        return [];\n      }\n    },\n  };\n};\n\nfunction codeBlockInputRuleEnter(pandocExtensions: PandocExtensions, fencedAttributes: boolean, format: EditorFormat) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // see if the parent consist of a pending code block input rule\n    const schema = state.schema;\n    const { $head } = state.selection;\n\n    // selection must be empty\n    if (!state.selection.empty) {\n      return false;\n    }\n\n    // full text of parent must meet the pattern\n    // eslint-disable-next-line no-useless-escape\n    const match = $head.parent.textContent.match(/^```(?:(\\w+)|\\{([\\.=]?[^\\}]+)\\})?$/);\n    if (!match) {\n      return false;\n    }\n\n    // no inline code marks\n    if (markIsActive(state, schema.marks.code)) {\n      return false;\n    }\n\n    // must be able to perform the replacement\n    if (!canApplyCodeBlockInputRule(state)) {\n      return false;\n    }\n\n    // determine nature of insert\n    const fenced = fencedAttributes && !!match[2];\n    const langAttrib = fenced ? match[2] : match[1] || '';\n    const rawBlock = fenced && pandocExtensions.raw_attribute && langAttrib.match(/^=\\w.*$/);\n    const rmdChunk = fenced && !!format.rmdExtensions.codeChunks && langAttrib.match(/^\\w.*$/);\n\n    // if it's an rmd chunk then apply further validation\n    if (rmdChunk && !canInsertRmdChunk(state)) {\n      return false;\n    }\n\n    // execute\n    if (dispatch) {\n      // eslint-disable-next-line no-useless-escape\n      const lang = langAttrib.replace(/^[\\.=]/, '');\n\n      // create transaction and clear input\n      const tr = state.tr;\n      const start = $head.start();\n      const end = start + $head.parent.textContent.length;\n      tr.deleteRange(start, end);\n\n      // determine type and attrs\n      const type = rawBlock ? schema.nodes.raw_block : rmdChunk ? schema.nodes.rmd_chunk : schema.nodes.code_block;\n      const content = rmdChunk ? schema.text(`{${match[2]}}\\n`) : Fragment.empty;\n      const attrs = rawBlock ? { format: lang } : !rmdChunk && lang.length ? pandocAttrFrom({ classes: [lang] }) : {};\n\n      // see if this should go into a preceding list item\n      const prevListItemPos = precedingListItemInsertPos(state.doc, state.selection);\n      if (prevListItemPos) {\n        const block = type.createAndFill(attrs, content);\n        precedingListItemInsert(tr, prevListItemPos, block);\n      } else {\n        tr.insert(start, content);\n        tr.setBlockType(start, start, type, attrs);\n      }\n\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nfunction canReplaceNodeWithCodeBlock(schema: Schema, $pos: ResolvedPos) {\n  return $pos.node(-1).canReplaceWith($pos.index(-1), $pos.indexAfter(-1), schema.nodes.code_block);\n}\n\nfunction canApplyCodeBlockInputRule(state: EditorState) {\n  const schema = state.schema;\n  const { $head } = state.selection;\n  return canReplaceNodeWithCodeBlock(schema, $head) || precedingListItemInsertPos(state.doc, state.selection);\n}\n\nexport default extension;\n","/*\n * plain_text_paste.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos, Schema, Fragment, Slice } from 'prosemirror-model';\nimport { Plugin, PluginKey } from 'prosemirror-state';\n\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n  plugins: (schema: Schema) => [pasteTextPlugin(schema)],\n};\n\nfunction pasteTextPlugin(schema: Schema) {\n  return new Plugin({\n    key: new PluginKey('paste-text'),\n\n    props: {\n      clipboardTextParser: (text: string, $context: ResolvedPos): any => {\n        // if it's a single line then create a slice w/ marks from the context active\n        if (text.indexOf('\\n') === -1) {\n          const marks = $context.marks();\n          const textNode = schema.text(text, marks);\n          return new Slice(Fragment.from(textNode), 0, 0);\n        } else {\n          return null;\n        }\n      },\n    },\n  });\n}\n\nexport default extension;\n","/*\n * bottom_padding.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport zenscroll from 'zenscroll';\n\nimport { Extension } from '../api/extension';\nimport { editingRootNode } from '../api/node';\nimport { selectionIsBodyTopLevel } from '../api/selection';\nimport { EditorView } from 'prosemirror-view';\nimport { bodyElement } from '../api/dom';\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\n// when we get close to the bottom, we autoscroll to provide more padding\nconst kAutoscrollGapPx = 25;\n\nconst extension: Extension = {\n  plugins: (schema: Schema) => {\n    return [\n      new Plugin({\n        key: new PluginKey('bottom_padding'),\n        view: () => ({\n          update: (view: EditorView, prevState: EditorState) => {\n            const selection = view.state.selection;\n            if (selectionWithinLastBodyParagraph(selection)) {\n              const paragraphNode = findParentNodeOfType(schema.nodes.paragraph)(selection);\n              if (paragraphNode) {\n                const paragraphEl = view.nodeDOM(paragraphNode.pos) as HTMLElement;\n                const paragraphRect = paragraphEl.getBoundingClientRect();\n                const editorEl = view.dom;\n                const editorRect = editorEl.getBoundingClientRect();\n                if (Math.abs(paragraphRect.bottom - editorRect.bottom) < kAutoscrollGapPx) {\n                  const bodyEl = bodyElement(view);\n                  const scroller = zenscroll.createScroller(bodyEl);\n                  scroller.toY(bodyEl.scrollHeight, 0);\n                }\n              }\n            }\n          },\n        }),\n      }),\n    ];\n  },\n};\n\nfunction selectionWithinLastBodyParagraph(selection: Selection) {\n  if (selectionIsBodyTopLevel(selection)) {\n    const editingRoot = editingRootNode(selection);\n    if (editingRoot) {\n      const node = selection.$head.node();\n      return node === editingRoot.node.lastChild && node.type === node.type.schema.nodes.paragraph;\n    }\n  }\n  return false;\n}\n\nexport default extension;\n","/*\n * insert_symbol.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey, Transaction, EditorState } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { EditorUI } from '../../api/ui';\nimport { parseCodepoint } from '../../api/unicode';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { performInsertSymbol, InsertSymbolPlugin } from './insert_symbol-plugin';\nimport { SymbolDataProvider, SymbolCharacterGroup, SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport symbolData from './symbols';\n\nconst key = new PluginKey<boolean>('insert-symbol');\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { ui, events } = context;\n  return {\n    commands: () => {\n      return [new ProsemirrorCommand(EditorCommandId.Symbol, [], performInsertSymbol(key), symbolOmniInsert(ui))];\n    },\n    plugins: (_schema: Schema) => {\n      return [new InsertSymbolPlugin(key, new UnicodeSymbolDataProvider(), ui, events)];\n    },\n  };\n};\n\nfunction symbolOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Symbol...'),\n    keywords: ['unicode', 'special', 'character'],\n    description: ui.context.translateText('Unicode symbol / special character'),\n    group: OmniInsertGroup.Content,\n    priority: 6,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.symbol_dark! : ui.images.omni_insert?.symbol!),\n  };\n}\n\nclass UnicodeSymbolDataProvider implements SymbolDataProvider {\n  constructor() {\n    this.symbolGroups = symbolData.sort((a, b) => a.name.localeCompare(b.name));\n  }\n  private readonly symbolGroups: SymbolCharacterGroup[];\n\n  public insertSymbolTransaction(\n    symbolCharacter: SymbolCharacter,\n    searchTerm: string,\n    state: EditorState,\n  ): Transaction {\n    const tr = state.tr;\n    tr.insertText(symbolCharacter.value);\n    return tr;\n  }\n\n  public readonly filterPlaceholderHint = 'keyword or codepoint';\n\n  public readonly symbolPreviewStyle: React.CSSProperties = { fontSize: '28px' } as React.CSSProperties;\n\n  public symbolGroupNames(): string[] {\n    return [kCategoryAll, ...this.symbolGroups.map(symbolGroup => symbolGroup.name)];\n  }\n\n  public getSymbols(groupName: string | undefined) {\n    if (groupName === undefined || groupName === kCategoryAll) {\n      return this.symbolGroups\n        .map(symbolGroup => symbolGroup.symbols)\n        .flat()\n        .sort((a, b) => a.codepoint! - b.codepoint!);\n    }\n    return this.symbolGroups\n      .filter(symbolGroup => groupName === symbolGroup.name)\n      .map(symbolGroup => symbolGroup.symbols)\n      .flat();\n  }\n\n  public filterSymbols(filterText: string, symbols: SymbolCharacter[]): SymbolCharacter[] {\n    const codepoint = parseCodepoint(filterText);\n    const filteredSymbols = symbols.filter(symbol => {\n      // Search by name\n      if (symbol.name.includes(filterText.toUpperCase())) {\n        return true;\n      }\n\n      // Search by codepoint\n      if (codepoint && symbol.codepoint === codepoint) {\n        return true;\n      }\n\n      return false;\n    });\n\n    if (filteredSymbols.length === 0 && codepoint !== undefined) {\n      return [\n        {\n          name: codepoint.toString(16),\n          value: String.fromCodePoint(codepoint),\n          codepoint,\n        },\n      ];\n    }\n    return filteredSymbols;\n  }\n}\nconst kCategoryAll = 'All';\n\nexport default extension;\n","/*\n * unicode.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Tries to parse a unicode codepoint string that a user might enter\n// For example:\n// U+2A1F\n// 2A1F\n// 10783\nconst kMinValidCodepoint = 0;\nconst kMaxValidCodepoint = 1114112;\n\nconst kHexCodepointPrefix = 'U+';\nconst kHexNumberPrefex = '0x';\n\nexport function parseCodepoint(codepointText: string): number | undefined {\n  // Try parsing it as a base 10 int\n  // Use non primitive Number so we get strict parsing\n  const base10Value = Number(codepointText).valueOf();\n  if (!Number.isNaN(base10Value)) {\n    if (isValidCodepoint(base10Value)) {\n      return base10Value;\n    }\n  }\n\n  // It might have a user prefix for unicode character, remove\n  let hexOnlyText = codepointText.toUpperCase();\n  if (hexOnlyText.startsWith(kHexCodepointPrefix.toUpperCase())) {\n    hexOnlyText = codepointText.substr(kHexCodepointPrefix.length, codepointText.length - kHexCodepointPrefix.length);\n  }\n\n  // try parsing it as a hex string\n  // Use non primitive Number so we get strict parsing, prefix with 0x to ensure treatment as hex\n  if (!hexOnlyText.startsWith(kHexNumberPrefex)) {\n    hexOnlyText = kHexNumberPrefex + hexOnlyText;\n  }\n  const hexValue = Number(hexOnlyText).valueOf();\n  if (!Number.isNaN(hexValue) && isValidCodepoint(hexValue)) {\n    return hexValue;\n  }\n\n  return undefined;\n}\n\nfunction isValidCodepoint(codepoint: number) {\n  return codepoint > kMinValidCodepoint && codepoint < kMaxValidCodepoint;\n}\n","/*\n * insert_symbol-plugin.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { applyStyles } from '../../api/css';\nimport { EditorEvents } from '../../api/events';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\n\nimport { InsertSymbolPopup } from './insert_symbol-popup';\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport { ScrollEvent } from '../../api/event-types';\n\nconst kMinimumPanelPaddingToEdgeOfView = 5;\n\nexport const performInsertSymbol = (pluginKey: PluginKey<boolean>) => {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    if (!isEnabled(state)) {\n      return false;\n    }\n\n    if (dispatch && view) {\n      const plugin = pluginKey.get(state) as InsertSymbolPlugin;\n      plugin.showPopup(view);\n    }\n    return true;\n  };\n};\n\nfunction isEnabled(state: EditorState) {\n  return canInsertNode(state, state.schema.nodes.text);\n}\n\nexport class InsertSymbolPlugin extends Plugin<boolean> {\n  private readonly scrollUnsubscribe: VoidFunction;\n  private readonly ui: EditorUI;\n  private popup: HTMLElement | null = null;\n  private dataProvider: SymbolDataProvider;\n\n  constructor(pluginKey: PluginKey<boolean>, dataProvider: SymbolDataProvider, ui: EditorUI, events: EditorEvents) {\n    super({\n      key: pluginKey,\n      view: () => ({\n        update: () => {\n          this.closePopup();\n        },\n        destroy: () => {\n          this.closePopup();\n          this.scrollUnsubscribe();\n          window.document.removeEventListener('focusin', this.focusChanged);\n        },\n      }),\n    });\n\n    this.dataProvider = dataProvider;\n    this.ui = ui;\n    this.closePopup = this.closePopup.bind(this);\n    this.scrollUnsubscribe = events.subscribe(ScrollEvent, this.closePopup);\n\n    this.focusChanged = this.focusChanged.bind(this);\n    window.document.addEventListener('focusin', this.focusChanged);\n  }\n\n  public showPopup(view: EditorView) {\n    if (!this.popup) {\n      const kHeight = 336;\n      const kWidth = 450;\n\n      this.popup = window.document.createElement('div');\n      this.popup.tabIndex = 0;\n      this.popup.style.position = 'absolute';\n      this.popup.style.zIndex = '900';\n\n      applyStyles(this.popup, [], this.panelPositionStylesForCurrentSelection(view, kHeight, kWidth));\n      ReactDOM.render(this.insertSymbolPopup(view, [kHeight, kWidth]), this.popup);\n      window.document.body.appendChild(this.popup);\n    }\n  }\n\n  private panelPositionStylesForCurrentSelection(view: EditorView, height: number, width: number) {\n    const selection = view.state.selection;\n    const editorRect = view.dom.getBoundingClientRect();\n\n    const selectionCoords = view.coordsAtPos(selection.from);\n\n    const maximumTopPosition = Math.min(\n      selectionCoords.bottom,\n      window.innerHeight - height - kMinimumPanelPaddingToEdgeOfView,\n    );\n    const minimumTopPosition = editorRect.y;\n    const popupTopPosition = Math.max(minimumTopPosition, maximumTopPosition);\n\n    const maximumLeftPosition = Math.min(\n      selectionCoords.right,\n      window.innerWidth - width - kMinimumPanelPaddingToEdgeOfView,\n    );\n    const minimumLeftPosition = editorRect.x;\n    const popupLeftPosition = Math.max(minimumLeftPosition, maximumLeftPosition);\n\n    // styles we'll return\n    const styles = {\n      top: popupTopPosition + 'px',\n      left: popupLeftPosition + 'px',\n    };\n\n    return styles;\n  }\n\n  private focusChanged() {\n    if (window.document.activeElement !== this.popup && !this.popup?.contains(window.document.activeElement)) {\n      this.closePopup();\n    }\n  }\n\n  private closePopup() {\n    if (this.popup) {\n      ReactDOM.unmountComponentAtNode(this.popup);\n      this.popup.remove();\n      this.popup = null;\n    }\n  }\n\n  private insertSymbolPopup(view: EditorView, size: [number, number]) {\n    const insertSymbol = (symbolCharacter: SymbolCharacter, searchTerm: string) => {\n      const tr = this.dataProvider.insertSymbolTransaction(symbolCharacter, searchTerm, view.state);\n      view.dispatch(tr);\n      view.focus();\n    };\n\n    const closePopup = () => {\n      this.closePopup();\n      view.focus();\n    };\n\n    return (\n      <InsertSymbolPopup\n        symbolDataProvider={this.dataProvider}\n        onClose={closePopup}\n        onInsertSymbol={insertSymbol}\n        enabled={isEnabled(view.state)}\n        size={size}\n        searchImage={this.ui.images.search}\n        searchPlaceholder={this.ui.context.translateText(this.dataProvider.filterPlaceholderHint)}\n        ui={this.ui}\n      />\n    );\n  }\n}\n","/*\n * insert_symbol-popup.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEvent } from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { isElementFocused, focusElement } from '../../api/focus';\nimport { Popup } from '../../api/widgets/popup';\nimport { SelectInput } from '../../api/widgets/select';\nimport { TextInput } from '../../api/widgets/text';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\nimport SymbolCharacterGrid, { newIndexForKeyboardEvent } from './insert_symbol-grid';\n\nimport './insert_symbol-styles.css';\nimport { SymbolPreview } from './insert_symbol-grid-preview';\n\ninterface InsertSymbolPopupProps extends WidgetProps {\n  symbolDataProvider: SymbolDataProvider;\n  enabled: boolean;\n  size: [number, number];\n  onInsertSymbol: (symbolCharacter: SymbolCharacter, searchTerm: string) => void;\n  onClose: VoidFunction;\n  ui: EditorUI;\n  searchImage?: string;\n  searchPlaceholder?: string;\n}\n\nexport const InsertSymbolPopup: React.FC<InsertSymbolPopupProps> = props => {\n  const kPopupChromeHeight = 25;\n  const popupHeight = props.size[0] - kPopupChromeHeight;\n  const popupWidth = props.size[1];\n  const style: React.CSSProperties = {\n    ...props.style,\n    height: popupHeight + 'px',\n    width: popupWidth + 'px',\n  };\n  const classNames = ['pm-popup-insert-symbol'].concat(props.classes || []);\n\n  const gridHeight = popupHeight - 108;\n  const gridWidth = popupWidth;\n  const kNumberOfcolumns = 11;\n\n  const [filterText, setFilterText] = React.useState<string>('');\n  const [selectedSymbolGroup, setSelectedSymbolGroup] = React.useState<string>();\n  const [selectedSymbolIndex, setSelectedSymbolIndex] = React.useState<number>(0);\n  const [preferenceChanged, setPreferenceChanged] = React.useState<number>(0);\n\n  const symbols = React.useMemo(() => props.symbolDataProvider.getSymbols(selectedSymbolGroup), [\n    selectedSymbolGroup,\n    preferenceChanged,\n    props.symbolDataProvider,\n  ]);\n  const filteredSymbols = React.useMemo(() => props.symbolDataProvider.filterSymbols(filterText, symbols), [\n    filterText,\n    symbols,\n    props.symbolDataProvider,\n  ]);\n\n  // If the symbol list gets shorter than the selected index, move\n  // selected cell into range\n  React.useEffect(() => {\n    if (selectedSymbolIndex > filteredSymbols.length) {\n      setSelectedSymbolIndex(Math.max(filteredSymbols.length - 1, 0));\n    }\n  }, [selectedSymbolIndex, filteredSymbols]);\n\n  const textRef = React.useRef<HTMLInputElement>(null);\n  const selectRef = React.useRef<HTMLSelectElement>(null);\n  const gridRef = React.useRef<HTMLDivElement>(null);\n  const preferenceRef = React.useRef<HTMLElement>(null);\n\n  // Focus the first text box\n  React.useEffect(() => {\n    focusElement(textRef.current);\n  }, []);\n\n  const options = props.symbolDataProvider.symbolGroupNames().map(name => (\n    <option key={name} value={name}>\n      {props.ui.context.translateText(name)}\n    </option>\n  ));\n\n  const handleSelectChanged = (event: ChangeEvent<Element>) => {\n    const value: string = (event.target as HTMLSelectElement).selectedOptions[0].value;\n    const selectedGroupName: string | undefined = props.symbolDataProvider\n      .symbolGroupNames()\n      .find(name => name === value);\n    if (selectedGroupName) {\n      setSelectedSymbolGroup(selectedGroupName);\n    }\n  };\n\n  const handleKeyboardEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n    // The last element might be the preference panel, if a provider\n    // provides one\n    function lastElement(): React.RefObject<HTMLElement> {\n      if (preferenceRef.current !== null) {\n        return preferenceRef;\n      }\n      return gridRef;\n    }\n\n    // Global Key Handling\n    switch (event.key) {\n      case 'Escape':\n        // Esc key - close popup\n        props.onClose();\n        event.preventDefault();\n        break;\n\n      case 'Tab':\n        if (event.shiftKey && isElementFocused(textRef.current)) {\n          focusElement(lastElement().current);\n          event.preventDefault();\n        } else if (!event.shiftKey && isElementFocused(lastElement().current)) {\n          focusElement(textRef.current);\n          event.preventDefault();\n        }\n        break;\n\n      case 'Enter':\n        if (isElementFocused(textRef.current) || isElementFocused(gridRef.current)) {\n          handleSelectedSymbolCommitted();\n          event.preventDefault();\n        }\n        break;\n\n      case 'ArrowLeft':\n      case 'ArrowRight':\n      case 'ArrowUp':\n      case 'ArrowDown':\n      case 'PageUp':\n      case 'PageDown':\n        // If the text filter is focused, forward arrow keys to the grid. If other elements are focused\n        // they may need to handle arrow keys, so don't handle them in this case\n        if (isElementFocused(textRef.current) && !event.shiftKey && !event.altKey && !event.ctrlKey) {\n          const newIndex = newIndexForKeyboardEvent(\n            event,\n            selectedSymbolIndex,\n            kNumberOfcolumns,\n            filteredSymbols.length,\n          );\n          if (newIndex !== undefined && newIndex >= 0 && newIndex !== selectedSymbolIndex) {\n            event.preventDefault();\n            setSelectedSymbolIndex(newIndex);\n          }\n        }\n        break;\n      default:\n        break;\n    }\n  };\n\n  const handleSelectedSymbolChanged = (symbolIndex: number) => {\n    setSelectedSymbolIndex(symbolIndex);\n  };\n\n  const handleSelectedSymbolCommitted = () => {\n    if (filteredSymbols.length > selectedSymbolIndex) {\n      props.onInsertSymbol(filteredSymbols[selectedSymbolIndex], textRef.current?.value || '');\n    }\n  };\n\n  const handleTextChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    setFilterText(event?.target.value);\n  };\n\n  const handlePreferencesChanged = () => {\n    setPreferenceChanged(preferenceChanged + 1);\n  };\n\n  const preferencesProps = {\n    selectedSymbolIndex,\n    context: props.ui.context,\n    prefs: props.ui.prefs,\n    onPreferencesChanged: handlePreferencesChanged,\n    ref: preferenceRef,\n  };\n\n  const preferencesPanel = props.symbolDataProvider.symbolPreferencesPanel\n    ? React.createElement(props.symbolDataProvider.symbolPreferencesPanel, preferencesProps)\n    : undefined;\n\n  return (\n    <Popup classes={classNames} style={style}>\n      <div onKeyDown={handleKeyboardEvent}>\n        <div className=\"pm-popup-insert-symbol-search-container\" style={{ width: gridWidth }}>\n          <TextInput\n            width={20 + 'ch'}\n            iconAdornment={props.searchImage}\n            tabIndex={0}\n            className=\"pm-popup-insert-symbol-search-textbox\"\n            placeholder={props.searchPlaceholder}\n            onChange={handleTextChange}\n            ref={textRef}\n          />\n          <SelectInput\n            tabIndex={0}\n            ref={selectRef}\n            className=\"pm-popup-insert-symbol-select-category\"\n            onChange={handleSelectChanged}\n          >\n            {options}\n          </SelectInput>\n        </div>\n\n        <hr className=\"pm-popup-insert-symbol-separator pm-border-background-color\" />\n        <div className=\"pm-popup-insert-symbol-grid-container\">\n          <SymbolCharacterGrid\n            symbolCharacters={filteredSymbols}\n            selectedIndex={selectedSymbolIndex}\n            onSelectionChanged={handleSelectedSymbolChanged}\n            onSelectionCommitted={handleSelectedSymbolCommitted}\n            height={gridHeight}\n            width={gridWidth}\n            numberOfColumns={kNumberOfcolumns}\n            ref={gridRef}\n            ui={props.ui}\n          />\n          <div\n            className=\"pm-popup-insert-symbol-no-matching pm-light-text-color\"\n            style={{ display: filteredSymbols.length > 0 ? 'none' : 'block' }}\n          >\n            No matching symbols\n          </div>\n        </div>\n        <hr className=\"pm-popup-insert-symbol-separator pm-border-background-color\" />\n        {filteredSymbols[selectedSymbolIndex] && (\n          <SymbolPreview\n            symbolCharacter={filteredSymbols[selectedSymbolIndex]}\n            symbolPreviewStyle={props.symbolDataProvider.symbolPreviewStyle}\n            ui={props.ui}\n          >\n            {preferencesPanel}\n          </SymbolPreview>\n        )}\n      </div>\n    </Popup>\n  );\n};\n","/*\n * focus.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function isElementFocused(element: HTMLElement | null): boolean {\n  if (element) {\n    return window.document.activeElement === element;\n  }\n  return false;\n}\n\nexport function focusElement(element: HTMLElement | null) {\n  if (element) {\n    element.focus();\n  }\n}\n","/*\n * select.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, ReactNode } from 'react';\n\nimport { WidgetProps } from './react';\n\nexport interface SelectInputProps extends WidgetProps {\n  tabIndex?: number;\n  className?: string;\n  onChange?: ChangeEventHandler;\n  children: ReactNode;\n  defaultValue?: string;\n}\n\nexport const SelectInput = React.forwardRef<HTMLSelectElement, SelectInputProps>((props, ref) => {\n  const style: React.CSSProperties = {\n    ...props.style,\n  };\n\n  return (\n    <select\n      className={`pm-input-select pm-background-color pm-pane-border-color pm-text-color ${props.className}`}\n      style={style}\n      tabIndex={props.tabIndex}\n      ref={ref}\n      onChange={props.onChange}\n      defaultValue={props.defaultValue}\n    >\n      {props.children}\n    </select>\n  );\n});\n","/*\n * text.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, KeyboardEventHandler, FocusEventHandler, ClipboardEventHandler } from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './text.css';\n\nexport interface TextInputProps extends WidgetProps {\n  width: string;\n  tabIndex?: number;\n  className?: string;\n  placeholder?: string;\n  iconAdornment?: string;\n  value?: string;\n  onChange?: ChangeEventHandler;\n  onKeyDown?: KeyboardEventHandler<HTMLInputElement>;\n  onKeyUp?: KeyboardEventHandler<HTMLInputElement>;\n  onKeyPress?: KeyboardEventHandler<HTMLInputElement>;\n  onBlur?: FocusEventHandler<HTMLInputElement>;\n  onPaste?: ClipboardEventHandler<HTMLInputElement>;\n  onFocus?: FocusEventHandler<HTMLInputElement>;\n}\n\nexport const TextInput = React.forwardRef<HTMLInputElement, TextInputProps>((props, ref) => {\n  // Allow specifying an actual width (e.g. a percentage) or a character width\n  // If a character width is specified, we should prefer to use the size attribute of the input\n  // as the focus widget that is added to focus elements is confused by the 'ch' size in styles\n  const characterWidth = props.width.endsWith('ch')\n    ? parseInt(props.width.substr(0, props.width.length - 2), 10)\n    : undefined;\n  const style: React.CSSProperties = {\n    ...props.style,\n    width: characterWidth ? undefined : props.width,\n  };\n\n  return (\n    <div className=\"pm-textinput-container\" style={style}>\n      {props.iconAdornment ? <img src={props.iconAdornment} className=\"pm-textinput-icon\" alt=\"\" /> : undefined}\n      <input\n        type=\"text\"\n        placeholder={props.placeholder}\n        size={characterWidth}\n        className={`\n          pm-input-text \n          pm-textinput-input \n          pm-text-color \n          pm-background-color \n          ${props.className}\n          ${props.iconAdornment ? 'pm-textinput-input-with-icon' : ''}`}\n        value={props.value !== undefined ? props.value : undefined}\n        onChange={props.onChange}\n        onKeyDown={props.onKeyDown}\n        onKeyUp={props.onKeyUp}\n        onKeyPress={props.onKeyPress}\n        onBlur={props.onBlur}\n        onFocus={props.onFocus}\n        tabIndex={props.tabIndex}\n        onPaste={props.onPaste}\n        ref={ref}\n        spellCheck={false}\n      />\n    </div>\n  );\n});\n","/*\n * insert_symbol-grid.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { FixedSizeGrid } from 'react-window';\n\nimport debounce from 'lodash.debounce';\n\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { CharacterGridCellItemData, SymbolCharacterCell } from './insert_symbol-grid-cell';\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-grid-styles.css';\n\ninterface CharacterGridProps extends WidgetProps {\n  height: number;\n  width: number;\n  numberOfColumns: number;\n  symbolCharacters: SymbolCharacter[];\n  selectedIndex: number;\n  onSelectionChanged: (selectedIndex: number) => void;\n  onSelectionCommitted: VoidFunction;\n  ui: EditorUI;\n}\n\nconst selectedItemClassName = 'pm-grid-item-selected';\n\nconst SymbolCharacterGrid = React.forwardRef<any, CharacterGridProps>((props, ref) => {\n  const columnWidth = Math.floor(props.width / props.numberOfColumns);\n  const characterCellData: CharacterGridCellItemData = {\n    symbolCharacters: props.symbolCharacters,\n    numberOfColumns: props.numberOfColumns,\n    selectedIndex: props.selectedIndex,\n    onSelectionChanged: props.onSelectionChanged,\n    onSelectionCommitted: props.onSelectionCommitted,\n    selectedItemClassName,\n  };\n\n  const gridRef = React.useRef<FixedSizeGrid>(null);\n  const handleScroll = debounce(() => {\n    gridRef.current?.scrollToItem({ rowIndex: Math.floor(props.selectedIndex / props.numberOfColumns) });\n  }, 5);\n\n  React.useEffect(handleScroll, [props.selectedIndex]);\n\n  const handleKeyDown = (event: React.KeyboardEvent) => {\n    const newIndex = newIndexForKeyboardEvent(\n      event,\n      props.selectedIndex,\n      props.numberOfColumns,\n      props.symbolCharacters.length,\n    );\n    if (newIndex !== undefined) {\n      props.onSelectionChanged(newIndex);\n      event.preventDefault();\n    }\n  };\n\n  return (\n    <div onKeyDown={handleKeyDown} tabIndex={0} ref={ref}>\n      <FixedSizeGrid\n        columnCount={props.numberOfColumns}\n        rowCount={Math.ceil(props.symbolCharacters.length / props.numberOfColumns)}\n        height={props.height}\n        width={props.width + 1}\n        rowHeight={columnWidth}\n        columnWidth={columnWidth}\n        itemData={characterCellData}\n        className=\"pm-symbol-grid\"\n        ref={gridRef}\n      >\n        {SymbolCharacterCell}\n      </FixedSizeGrid>\n    </div>\n  );\n});\n\nfunction previous(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex - 1;\n  return Math.max(0, newIndex);\n}\nfunction next(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex + 1;\n  return Math.min(numberOfCells - 1, newIndex);\n}\nfunction prevRow(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex - numberOfColumns;\n  return newIndex >= 0 ? newIndex : currentIndex;\n}\nfunction nextRow(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex + numberOfColumns;\n  return newIndex < numberOfCells ? newIndex : currentIndex;\n}\nfunction nextPage(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex + 6 * numberOfColumns;\n  return Math.min(numberOfCells - 1, newIndex);\n}\nfunction prevPage(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n  const newIndex = currentIndex - 6 * numberOfColumns;\n  return Math.max(0, newIndex);\n}\n\nexport const newIndexForKeyboardEvent = (\n  event: React.KeyboardEvent,\n  selectedIndex: number,\n  numberOfColumns: number,\n  numberOfCells: number,\n): number | undefined => {\n  switch (event.key) {\n    case 'ArrowLeft': // left\n      return previous(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'ArrowUp': // up\n      return prevRow(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'ArrowRight': // right\n      return next(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'ArrowDown': // down\n      return nextRow(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'PageDown':\n      return nextPage(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'PageUp':\n      return prevPage(selectedIndex, numberOfColumns, numberOfCells);\n\n    case 'Home':\n      return 0;\n\n    case 'End':\n      return numberOfCells - 1;\n\n    default:\n      return undefined;\n  }\n};\n\nexport default SymbolCharacterGrid;\n","/*\n * insert_symbol-grid-cell.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { GridChildComponentProps } from 'react-window';\n\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nexport interface CharacterGridCellItemData {\n  symbolCharacters: SymbolCharacter[];\n  numberOfColumns: number;\n  selectedIndex: number;\n  selectedItemClassName: string;\n  onSelectionChanged: (selectedIndex: number) => void;\n  onSelectionCommitted: VoidFunction;\n}\n\nexport const SymbolCharacterCell = (props: GridChildComponentProps) => {\n  const characterGridCellItemData = props.data as CharacterGridCellItemData;\n  const symbolCharacters = characterGridCellItemData.symbolCharacters;\n  const itemIndex = props.rowIndex * characterGridCellItemData.numberOfColumns + props.columnIndex;\n\n  const handleMouseEnter = (event: React.MouseEvent) => {\n    characterGridCellItemData.onSelectionChanged(itemIndex);\n  };\n\n  // If we don't handle and eat the mouse down event, the mouse down will propagate to the parent\n  // editor and result in loss of focus to this element\n  const handleMouseDown = (event: React.MouseEvent) => {\n    event.preventDefault();\n    event.stopPropagation();\n  };\n\n  const handleMouseClick = (event: React.MouseEvent) => {\n    event.preventDefault();\n    event.stopPropagation();\n    characterGridCellItemData.onSelectionCommitted();\n  };\n\n  if (itemIndex < symbolCharacters.length) {\n    const ch = symbolCharacters[itemIndex];\n    return (\n      <div\n        tabIndex={-1}\n        style={props.style}\n        className=\"pm-symbol-grid-container\"\n        onClick={handleMouseClick}\n        onMouseDown={handleMouseDown}\n        onMouseEnter={handleMouseEnter}\n      >\n        <div\n          className={`pm-symbol-grid-cell pm-grid-item pm-emoji-font ${\n            characterGridCellItemData.selectedIndex === itemIndex ? characterGridCellItemData.selectedItemClassName : ''\n            }`}\n        >\n          {ch.value || ''}\n        </div>\n      </div>\n    );\n  } else {\n    return null;\n  }\n};\n","/*\n * insert_symbol-grid-preview.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { CSSProperties, ReactNode } from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-grid-preview.css';\n\ninterface SymbolPreviewProps extends WidgetProps {\n  symbolCharacter: SymbolCharacter;\n  symbolPreviewStyle: CSSProperties;\n  ui: EditorUI;\n  children: ReactNode;\n}\n\nexport const SymbolPreview = React.forwardRef<any, SymbolPreviewProps>((props, ref) => {\n  return (\n    <div style={{ height: '54px' }} className=\"pm-popup-insert-symbol-preview-container\" ref={ref}>\n      <div className=\"pm-popup-insert-symbol-preview-thumbnail\">\n        <div style={props.symbolPreviewStyle}>{props.symbolCharacter.value}</div>\n        <div className=\"pm-popup-insert-symbol-preview-summary\">\n          <div className=\"pm-popup-insert-symbol-preview-name pm-text-color\">\n            {props.ui.context.translateText(props.symbolCharacter.name)}\n          </div>\n          <div className=\"pm-popup-insert-symbol-preview-markdown pm-light-text-color\">\n            {props.symbolCharacter.markdown || `U+${props.symbolCharacter.codepoint?.toString(16)}`}\n          </div>\n        </div>\n      </div>\n      <div className=\"pm-popup-insert-symbol-preview-action\">{props.children}</div>\n    </div>\n  );\n});\n","import { SymbolCharacterGroup } from './insert_symbol-dataprovider';\n\nconst symbols: SymbolCharacterGroup[] = [\n  {\n    name: 'Miscellaneous',\n    symbols: [\n      {\n        name: 'NO-BREAK SPACE',\n        value: ' ',\n        codepoint: 160,\n      },\n      {\n        name: 'INVERTED EXCLAMATION MARK',\n        value: '¡',\n        codepoint: 161,\n      },\n      {\n        name: 'CENT SIGN',\n        value: '¢',\n        codepoint: 162,\n      },\n      {\n        name: 'POUND SIGN',\n        value: '£',\n        codepoint: 163,\n      },\n      {\n        name: 'CURRENCY SIGN',\n        value: '¤',\n        codepoint: 164,\n      },\n      {\n        name: 'YEN SIGN',\n        value: '¥',\n        codepoint: 165,\n      },\n      {\n        name: 'BROKEN BAR',\n        value: '¦',\n        codepoint: 166,\n      },\n      {\n        name: 'SECTION SIGN',\n        value: '§',\n        codepoint: 167,\n      },\n      {\n        name: 'DIAERESIS',\n        value: '¨',\n        codepoint: 168,\n      },\n      {\n        name: 'FEMININE ORDINAL INDICATOR',\n        value: 'ª',\n        codepoint: 170,\n      },\n      {\n        name: 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK',\n        value: '«',\n        codepoint: 171,\n      },\n      {\n        name: 'NOT SIGN',\n        value: '¬',\n        codepoint: 172,\n      },\n      {\n        name: 'MACRON',\n        value: '¯',\n        codepoint: 175,\n      },\n      {\n        name: 'DEGREE SIGN',\n        value: '°',\n        codepoint: 176,\n      },\n      {\n        name: 'PLUS-MINUS SIGN',\n        value: '±',\n        codepoint: 177,\n      },\n      {\n        name: 'SUPERSCRIPT TWO',\n        value: '²',\n        codepoint: 178,\n      },\n      {\n        name: 'SUPERSCRIPT THREE',\n        value: '³',\n        codepoint: 179,\n      },\n      {\n        name: 'ACUTE ACCENT',\n        value: '´',\n        codepoint: 180,\n      },\n      {\n        name: 'MICRO SIGN',\n        value: 'µ',\n        codepoint: 181,\n      },\n      {\n        name: 'PILCROW SIGN',\n        value: '¶',\n        codepoint: 182,\n      },\n      {\n        name: 'MIDDLE DOT',\n        value: '·',\n        codepoint: 183,\n      },\n      {\n        name: 'CEDILLA',\n        value: '¸',\n        codepoint: 184,\n      },\n      {\n        name: 'SUPERSCRIPT ONE',\n        value: '¹',\n        codepoint: 185,\n      },\n      {\n        name: 'MASCULINE ORDINAL INDICATOR',\n        value: 'º',\n        codepoint: 186,\n      },\n      {\n        name: 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK',\n        value: '»',\n        codepoint: 187,\n      },\n      {\n        name: 'VULGAR FRACTION ONE QUARTER',\n        value: '¼',\n        codepoint: 188,\n      },\n      {\n        name: 'VULGAR FRACTION ONE HALF',\n        value: '½',\n        codepoint: 189,\n      },\n      {\n        name: 'VULGAR FRACTION THREE QUARTERS',\n        value: '¾',\n        codepoint: 190,\n      },\n      {\n        name: 'INVERTED QUESTION MARK',\n        value: '¿',\n        codepoint: 191,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH GRAVE',\n        value: 'À',\n        codepoint: 192,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH ACUTE',\n        value: 'Á',\n        codepoint: 193,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX',\n        value: 'Â',\n        codepoint: 194,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH TILDE',\n        value: 'Ã',\n        codepoint: 195,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH DIAERESIS',\n        value: 'Ä',\n        codepoint: 196,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER A WITH RING ABOVE',\n        value: 'Å',\n        codepoint: 197,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER AE',\n        value: 'Æ',\n        codepoint: 198,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER C WITH CEDILLA',\n        value: 'Ç',\n        codepoint: 199,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER E WITH GRAVE',\n        value: 'È',\n        codepoint: 200,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER E WITH ACUTE',\n        value: 'É',\n        codepoint: 201,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX',\n        value: 'Ê',\n        codepoint: 202,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER E WITH DIAERESIS',\n        value: 'Ë',\n        codepoint: 203,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER I WITH GRAVE',\n        value: 'Ì',\n        codepoint: 204,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER I WITH ACUTE',\n        value: 'Í',\n        codepoint: 205,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX',\n        value: 'Î',\n        codepoint: 206,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER I WITH DIAERESIS',\n        value: 'Ï',\n        codepoint: 207,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER ETH',\n        value: 'Ð',\n        codepoint: 208,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER N WITH TILDE',\n        value: 'Ñ',\n        codepoint: 209,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH GRAVE',\n        value: 'Ò',\n        codepoint: 210,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH ACUTE',\n        value: 'Ó',\n        codepoint: 211,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX',\n        value: 'Ô',\n        codepoint: 212,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH TILDE',\n        value: 'Õ',\n        codepoint: 213,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH DIAERESIS',\n        value: 'Ö',\n        codepoint: 214,\n      },\n      {\n        name: 'MULTIPLICATION SIGN',\n        value: '×',\n        codepoint: 215,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER O WITH STROKE',\n        value: 'Ø',\n        codepoint: 216,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER U WITH GRAVE',\n        value: 'Ù',\n        codepoint: 217,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER U WITH ACUTE',\n        value: 'Ú',\n        codepoint: 218,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX',\n        value: 'Û',\n        codepoint: 219,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER U WITH DIAERESIS',\n        value: 'Ü',\n        codepoint: 220,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER Y WITH ACUTE',\n        value: 'Ý',\n        codepoint: 221,\n      },\n      {\n        name: 'LATIN CAPITAL LETTER THORN',\n        value: 'Þ',\n        codepoint: 222,\n      },\n      {\n        name: 'LATIN SMALL LETTER SHARP S',\n        value: 'ß',\n        codepoint: 223,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH GRAVE',\n        value: 'à',\n        codepoint: 224,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH ACUTE',\n        value: 'á',\n        codepoint: 225,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH CIRCUMFLEX',\n        value: 'â',\n        codepoint: 226,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH TILDE',\n        value: 'ã',\n        codepoint: 227,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH DIAERESIS',\n        value: 'ä',\n        codepoint: 228,\n      },\n      {\n        name: 'LATIN SMALL LETTER A WITH RING ABOVE',\n        value: 'å',\n        codepoint: 229,\n      },\n      {\n        name: 'LATIN SMALL LETTER AE',\n        value: 'æ',\n        codepoint: 230,\n      },\n      {\n        name: 'LATIN SMALL LETTER C WITH CEDILLA',\n        value: 'ç',\n        codepoint: 231,\n      },\n      {\n        name: 'LATIN SMALL LETTER E WITH GRAVE',\n        value: 'è',\n        codepoint: 232,\n      },\n      {\n        name: 'LATIN SMALL LETTER E WITH ACUTE',\n        value: 'é',\n        codepoint: 233,\n      },\n      {\n        name: 'LATIN SMALL LETTER E WITH CIRCUMFLEX',\n        value: 'ê',\n        codepoint: 234,\n      },\n      {\n        name: 'LATIN SMALL LETTER E WITH DIAERESIS',\n        value: 'ë',\n        codepoint: 235,\n      },\n      {\n        name: 'LATIN SMALL LETTER I WITH GRAVE',\n        value: 'ì',\n        codepoint: 236,\n      },\n      {\n        name: 'LATIN SMALL LETTER I WITH ACUTE',\n        value: 'í',\n        codepoint: 237,\n      },\n      {\n        name: 'LATIN SMALL LETTER I WITH CIRCUMFLEX',\n        value: 'î',\n        codepoint: 238,\n      },\n      {\n        name: 'LATIN SMALL LETTER I WITH DIAERESIS',\n        value: 'ï',\n        codepoint: 239,\n      },\n      {\n        name: 'LATIN SMALL LETTER ETH',\n        value: 'ð',\n        codepoint: 240,\n      },\n      {\n        name: 'LATIN SMALL LETTER N WITH TILDE',\n        value: 'ñ',\n        codepoint: 241,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH GRAVE',\n        value: 'ò',\n        codepoint: 242,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH ACUTE',\n        value: 'ó',\n        codepoint: 243,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH CIRCUMFLEX',\n        value: 'ô',\n        codepoint: 244,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH TILDE',\n        value: 'õ',\n        codepoint: 245,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH DIAERESIS',\n        value: 'ö',\n        codepoint: 246,\n      },\n      {\n        name: 'DIVISION SIGN',\n        value: '÷',\n        codepoint: 247,\n      },\n      {\n        name: 'LATIN SMALL LETTER O WITH STROKE',\n        value: 'ø',\n        codepoint: 248,\n      },\n      {\n        name: 'LATIN SMALL LETTER U WITH GRAVE',\n        value: 'ù',\n        codepoint: 249,\n      },\n      {\n        name: 'LATIN SMALL LETTER U WITH ACUTE',\n        value: 'ú',\n        codepoint: 250,\n      },\n      {\n        name: 'LATIN SMALL LETTER U WITH CIRCUMFLEX',\n        value: 'û',\n        codepoint: 251,\n      },\n      {\n        name: 'LATIN SMALL LETTER U WITH DIAERESIS',\n        value: 'ü',\n        codepoint: 252,\n      },\n      {\n        name: 'LATIN SMALL LETTER Y WITH ACUTE',\n        value: 'ý',\n        codepoint: 253,\n      },\n      {\n        name: 'LATIN SMALL LETTER THORN',\n        value: 'þ',\n        codepoint: 254,\n      },\n      {\n        name: 'LATIN SMALL LETTER Y WITH DIAERESIS',\n        value: 'ÿ',\n        codepoint: 255,\n      },\n      {\n        name: 'ACCOUNT OF',\n        value: '℀',\n        codepoint: 8448,\n      },\n      {\n        name: 'ADDRESSED TO THE SUBJECT',\n        value: '℁',\n        codepoint: 8449,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL C',\n        value: 'ℂ',\n        codepoint: 8450,\n      },\n      {\n        name: 'DEGREE CELSIUS',\n        value: '℃',\n        codepoint: 8451,\n      },\n      {\n        name: 'CENTRE LINE SYMBOL',\n        value: '℄',\n        codepoint: 8452,\n      },\n      {\n        name: 'CARE OF',\n        value: '℅',\n        codepoint: 8453,\n      },\n      {\n        name: 'CADA UNA',\n        value: '℆',\n        codepoint: 8454,\n      },\n      {\n        name: 'EULER CONSTANT',\n        value: 'ℇ',\n        codepoint: 8455,\n      },\n      {\n        name: 'SCRUPLE',\n        value: '℈',\n        codepoint: 8456,\n      },\n      {\n        name: 'DEGREE FAHRENHEIT',\n        value: '℉',\n        codepoint: 8457,\n      },\n      {\n        name: 'SCRIPT SMALL G',\n        value: 'ℊ',\n        codepoint: 8458,\n      },\n      {\n        name: 'SCRIPT CAPITAL H',\n        value: 'ℋ',\n        codepoint: 8459,\n      },\n      {\n        name: 'BLACK-LETTER CAPITAL H',\n        value: 'ℌ',\n        codepoint: 8460,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL H',\n        value: 'ℍ',\n        codepoint: 8461,\n      },\n      {\n        name: 'PLANCK CONSTANT',\n        value: 'ℎ',\n        codepoint: 8462,\n      },\n      {\n        name: 'PLANCK CONSTANT OVER TWO PI',\n        value: 'ℏ',\n        codepoint: 8463,\n      },\n      {\n        name: 'SCRIPT CAPITAL I',\n        value: 'ℐ',\n        codepoint: 8464,\n      },\n      {\n        name: 'BLACK-LETTER CAPITAL I',\n        value: 'ℑ',\n        codepoint: 8465,\n      },\n      {\n        name: 'SCRIPT CAPITAL L',\n        value: 'ℒ',\n        codepoint: 8466,\n      },\n      {\n        name: 'SCRIPT SMALL L',\n        value: 'ℓ',\n        codepoint: 8467,\n      },\n      {\n        name: 'L B BAR SYMBOL',\n        value: '℔',\n        codepoint: 8468,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL N',\n        value: 'ℕ',\n        codepoint: 8469,\n      },\n      {\n        name: 'NUMERO SIGN',\n        value: '№',\n        codepoint: 8470,\n      },\n      {\n        name: 'SOUND RECORDING COPYRIGHT',\n        value: '℗',\n        codepoint: 8471,\n      },\n      {\n        name: 'SCRIPT CAPITAL P',\n        value: '℘',\n        codepoint: 8472,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL P',\n        value: 'ℙ',\n        codepoint: 8473,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL Q',\n        value: 'ℚ',\n        codepoint: 8474,\n      },\n      {\n        name: 'SCRIPT CAPITAL R',\n        value: 'ℛ',\n        codepoint: 8475,\n      },\n      {\n        name: 'BLACK-LETTER CAPITAL R',\n        value: 'ℜ',\n        codepoint: 8476,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL R',\n        value: 'ℝ',\n        codepoint: 8477,\n      },\n      {\n        name: 'PRESCRIPTION TAKE',\n        value: '℞',\n        codepoint: 8478,\n      },\n      {\n        name: 'RESPONSE',\n        value: '℟',\n        codepoint: 8479,\n      },\n      {\n        name: 'SERVICE MARK',\n        value: '℠',\n        codepoint: 8480,\n      },\n      {\n        name: 'TELEPHONE SIGN',\n        value: '℡',\n        codepoint: 8481,\n      },\n      {\n        name: 'VERSICLE',\n        value: '℣',\n        codepoint: 8483,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL Z',\n        value: 'ℤ',\n        codepoint: 8484,\n      },\n      {\n        name: 'OUNCE SIGN',\n        value: '℥',\n        codepoint: 8485,\n      },\n      {\n        name: 'OHM SIGN',\n        value: 'Ω',\n        codepoint: 8486,\n      },\n      {\n        name: 'INVERTED OHM SIGN',\n        value: '℧',\n        codepoint: 8487,\n      },\n      {\n        name: 'BLACK-LETTER CAPITAL Z',\n        value: 'ℨ',\n        codepoint: 8488,\n      },\n      {\n        name: 'TURNED GREEK SMALL LETTER IOTA',\n        value: '℩',\n        codepoint: 8489,\n      },\n      {\n        name: 'KELVIN SIGN',\n        value: 'K',\n        codepoint: 8490,\n      },\n      {\n        name: 'ANGSTROM SIGN',\n        value: 'Å',\n        codepoint: 8491,\n      },\n      {\n        name: 'SCRIPT CAPITAL B',\n        value: 'ℬ',\n        codepoint: 8492,\n      },\n      {\n        name: 'BLACK-LETTER CAPITAL C',\n        value: 'ℭ',\n        codepoint: 8493,\n      },\n      {\n        name: 'ESTIMATED SYMBOL',\n        value: '℮',\n        codepoint: 8494,\n      },\n      {\n        name: 'SCRIPT SMALL E',\n        value: 'ℯ',\n        codepoint: 8495,\n      },\n      {\n        name: 'SCRIPT CAPITAL E',\n        value: 'ℰ',\n        codepoint: 8496,\n      },\n      {\n        name: 'SCRIPT CAPITAL F',\n        value: 'ℱ',\n        codepoint: 8497,\n      },\n      {\n        name: 'TURNED CAPITAL F',\n        value: 'Ⅎ',\n        codepoint: 8498,\n      },\n      {\n        name: 'SCRIPT CAPITAL M',\n        value: 'ℳ',\n        codepoint: 8499,\n      },\n      {\n        name: 'SCRIPT SMALL O',\n        value: 'ℴ',\n        codepoint: 8500,\n      },\n      {\n        name: 'ALEF SYMBOL',\n        value: 'ℵ',\n        codepoint: 8501,\n      },\n      {\n        name: 'BET SYMBOL',\n        value: 'ℶ',\n        codepoint: 8502,\n      },\n      {\n        name: 'GIMEL SYMBOL',\n        value: 'ℷ',\n        codepoint: 8503,\n      },\n      {\n        name: 'DALET SYMBOL',\n        value: 'ℸ',\n        codepoint: 8504,\n      },\n      {\n        name: 'ROTATED CAPITAL Q',\n        value: '℺',\n        codepoint: 8506,\n      },\n      {\n        name: 'FACSIMILE SIGN',\n        value: '℻',\n        codepoint: 8507,\n      },\n      {\n        name: 'DOUBLE-STRUCK SMALL PI',\n        value: 'ℼ',\n        codepoint: 8508,\n      },\n      {\n        name: 'DOUBLE-STRUCK SMALL GAMMA',\n        value: 'ℽ',\n        codepoint: 8509,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL GAMMA',\n        value: 'ℾ',\n        codepoint: 8510,\n      },\n      {\n        name: 'DOUBLE-STRUCK CAPITAL PI',\n        value: 'ℿ',\n        codepoint: 8511,\n      },\n      {\n        name: 'DOUBLE-STRUCK N-ARY SUMMATION',\n        value: '⅀',\n        codepoint: 8512,\n      },\n      {\n        name: 'TURNED SANS-SERIF CAPITAL G',\n        value: '⅁',\n        codepoint: 8513,\n      },\n      {\n        name: 'TURNED SANS-SERIF CAPITAL L',\n        value: '⅂',\n        codepoint: 8514,\n      },\n      {\n        name: 'REVERSED SANS-SERIF CAPITAL L',\n        value: '⅃',\n        codepoint: 8515,\n      },\n      {\n        name: 'TURNED SANS-SERIF CAPITAL Y',\n        value: '⅄',\n        codepoint: 8516,\n      },\n      {\n        name: 'DOUBLE-STRUCK ITALIC CAPITAL D',\n        value: 'ⅅ',\n        codepoint: 8517,\n      },\n      {\n        name: 'DOUBLE-STRUCK ITALIC SMALL D',\n        value: 'ⅆ',\n        codepoint: 8518,\n      },\n      {\n        name: 'DOUBLE-STRUCK ITALIC SMALL E',\n        value: 'ⅇ',\n        codepoint: 8519,\n      },\n      {\n        name: 'DOUBLE-STRUCK ITALIC SMALL I',\n        value: 'ⅈ',\n        codepoint: 8520,\n      },\n      {\n        name: 'DOUBLE-STRUCK ITALIC SMALL J',\n        value: 'ⅉ',\n        codepoint: 8521,\n      },\n      {\n        name: 'PROPERTY LINE',\n        value: '⅊',\n        codepoint: 8522,\n      },\n      {\n        name: 'TURNED AMPERSAND',\n        value: '⅋',\n        codepoint: 8523,\n      },\n      {\n        name: 'PER SIGN',\n        value: '⅌',\n        codepoint: 8524,\n      },\n      {\n        name: 'AKTIESELSKAB',\n        value: '⅍',\n        codepoint: 8525,\n      },\n      {\n        name: 'TURNED SMALL F',\n        value: 'ⅎ',\n        codepoint: 8526,\n      },\n      {\n        name: 'SYMBOL FOR SAMARITAN SOURCE',\n        value: '⅏',\n        codepoint: 8527,\n      },\n      {\n        name: 'CIRCLED DIGIT ONE',\n        value: '①',\n        codepoint: 9312,\n      },\n      {\n        name: 'CIRCLED DIGIT TWO',\n        value: '②',\n        codepoint: 9313,\n      },\n      {\n        name: 'CIRCLED DIGIT THREE',\n        value: '③',\n        codepoint: 9314,\n      },\n      {\n        name: 'CIRCLED DIGIT FOUR',\n        value: '④',\n        codepoint: 9315,\n      },\n      {\n        name: 'CIRCLED DIGIT FIVE',\n        value: '⑤',\n        codepoint: 9316,\n      },\n      {\n        name: 'CIRCLED DIGIT SIX',\n        value: '⑥',\n        codepoint: 9317,\n      },\n      {\n        name: 'CIRCLED DIGIT SEVEN',\n        value: '⑦',\n        codepoint: 9318,\n      },\n      {\n        name: 'CIRCLED DIGIT EIGHT',\n        value: '⑧',\n        codepoint: 9319,\n      },\n      {\n        name: 'CIRCLED DIGIT NINE',\n        value: '⑨',\n        codepoint: 9320,\n      },\n      {\n        name: 'CIRCLED NUMBER TEN',\n        value: '⑩',\n        codepoint: 9321,\n      },\n      {\n        name: 'CIRCLED NUMBER ELEVEN',\n        value: '⑪',\n        codepoint: 9322,\n      },\n      {\n        name: 'CIRCLED NUMBER TWELVE',\n        value: '⑫',\n        codepoint: 9323,\n      },\n      {\n        name: 'CIRCLED NUMBER THIRTEEN',\n        value: '⑬',\n        codepoint: 9324,\n      },\n      {\n        name: 'CIRCLED NUMBER FOURTEEN',\n        value: '⑭',\n        codepoint: 9325,\n      },\n      {\n        name: 'CIRCLED NUMBER FIFTEEN',\n        value: '⑮',\n        codepoint: 9326,\n      },\n      {\n        name: 'CIRCLED NUMBER SIXTEEN',\n        value: '⑯',\n        codepoint: 9327,\n      },\n      {\n        name: 'CIRCLED NUMBER SEVENTEEN',\n        value: '⑰',\n        codepoint: 9328,\n      },\n      {\n        name: 'CIRCLED NUMBER EIGHTEEN',\n        value: '⑱',\n        codepoint: 9329,\n      },\n      {\n        name: 'CIRCLED NUMBER NINETEEN',\n        value: '⑲',\n        codepoint: 9330,\n      },\n      {\n        name: 'CIRCLED NUMBER TWENTY',\n        value: '⑳',\n        codepoint: 9331,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT ONE',\n        value: '⑴',\n        codepoint: 9332,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT TWO',\n        value: '⑵',\n        codepoint: 9333,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT THREE',\n        value: '⑶',\n        codepoint: 9334,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT FOUR',\n        value: '⑷',\n        codepoint: 9335,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT FIVE',\n        value: '⑸',\n        codepoint: 9336,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT SIX',\n        value: '⑹',\n        codepoint: 9337,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT SEVEN',\n        value: '⑺',\n        codepoint: 9338,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT EIGHT',\n        value: '⑻',\n        codepoint: 9339,\n      },\n      {\n        name: 'PARENTHESIZED DIGIT NINE',\n        value: '⑼',\n        codepoint: 9340,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER TEN',\n        value: '⑽',\n        codepoint: 9341,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER ELEVEN',\n        value: '⑾',\n        codepoint: 9342,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER TWELVE',\n        value: '⑿',\n        codepoint: 9343,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER THIRTEEN',\n        value: '⒀',\n        codepoint: 9344,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER FOURTEEN',\n        value: '⒁',\n        codepoint: 9345,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER FIFTEEN',\n        value: '⒂',\n        codepoint: 9346,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER SIXTEEN',\n        value: '⒃',\n        codepoint: 9347,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER SEVENTEEN',\n        value: '⒄',\n        codepoint: 9348,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER EIGHTEEN',\n        value: '⒅',\n        codepoint: 9349,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER NINETEEN',\n        value: '⒆',\n        codepoint: 9350,\n      },\n      {\n        name: 'PARENTHESIZED NUMBER TWENTY',\n        value: '⒇',\n        codepoint: 9351,\n      },\n      {\n        name: 'DIGIT ONE FULL STOP',\n        value: '⒈',\n        codepoint: 9352,\n      },\n      {\n        name: 'DIGIT TWO FULL STOP',\n        value: '⒉',\n        codepoint: 9353,\n      },\n      {\n        name: 'DIGIT THREE FULL STOP',\n        value: '⒊',\n        codepoint: 9354,\n      },\n      {\n        name: 'DIGIT FOUR FULL STOP',\n        value: '⒋',\n        codepoint: 9355,\n      },\n      {\n        name: 'DIGIT FIVE FULL STOP',\n        value: '⒌',\n        codepoint: 9356,\n      },\n      {\n        name: 'DIGIT SIX FULL STOP',\n        value: '⒍',\n        codepoint: 9357,\n      },\n      {\n        name: 'DIGIT SEVEN FULL STOP',\n        value: '⒎',\n        codepoint: 9358,\n      },\n      {\n        name: 'DIGIT EIGHT FULL STOP',\n        value: '⒏',\n        codepoint: 9359,\n      },\n      {\n        name: 'DIGIT NINE FULL STOP',\n        value: '⒐',\n        codepoint: 9360,\n      },\n      {\n        name: 'NUMBER TEN FULL STOP',\n        value: '⒑',\n        codepoint: 9361,\n      },\n      {\n        name: 'NUMBER ELEVEN FULL STOP',\n        value: '⒒',\n        codepoint: 9362,\n      },\n      {\n        name: 'NUMBER TWELVE FULL STOP',\n        value: '⒓',\n        codepoint: 9363,\n      },\n      {\n        name: 'NUMBER THIRTEEN FULL STOP',\n        value: '⒔',\n        codepoint: 9364,\n      },\n      {\n        name: 'NUMBER FOURTEEN FULL STOP',\n        value: '⒕',\n        codepoint: 9365,\n      },\n      {\n        name: 'NUMBER FIFTEEN FULL STOP',\n        value: '⒖',\n        codepoint: 9366,\n      },\n      {\n        name: 'NUMBER SIXTEEN FULL STOP',\n        value: '⒗',\n        codepoint: 9367,\n      },\n      {\n        name: 'NUMBER SEVENTEEN FULL STOP',\n        value: '⒘',\n        codepoint: 9368,\n      },\n      {\n        name: 'NUMBER EIGHTEEN FULL STOP',\n        value: '⒙',\n        codepoint: 9369,\n      },\n      {\n        name: 'NUMBER NINETEEN FULL STOP',\n        value: '⒚',\n        codepoint: 9370,\n      },\n      {\n        name: 'NUMBER TWENTY FULL STOP',\n        value: '⒛',\n        codepoint: 9371,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER A',\n        value: '⒜',\n        codepoint: 9372,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER B',\n        value: '⒝',\n        codepoint: 9373,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER C',\n        value: '⒞',\n        codepoint: 9374,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER D',\n        value: '⒟',\n        codepoint: 9375,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER E',\n        value: '⒠',\n        codepoint: 9376,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER F',\n        value: '⒡',\n        codepoint: 9377,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER G',\n        value: '⒢',\n        codepoint: 9378,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER H',\n        value: '⒣',\n        codepoint: 9379,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER I',\n        value: '⒤',\n        codepoint: 9380,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER J',\n        value: '⒥',\n        codepoint: 9381,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER K',\n        value: '⒦',\n        codepoint: 9382,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER L',\n        value: '⒧',\n        codepoint: 9383,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER M',\n        value: '⒨',\n        codepoint: 9384,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER N',\n        value: '⒩',\n        codepoint: 9385,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER O',\n        value: '⒪',\n        codepoint: 9386,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER P',\n        value: '⒫',\n        codepoint: 9387,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER Q',\n        value: '⒬',\n        codepoint: 9388,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER R',\n        value: '⒭',\n        codepoint: 9389,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER S',\n        value: '⒮',\n        codepoint: 9390,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER T',\n        value: '⒯',\n        codepoint: 9391,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER U',\n        value: '⒰',\n        codepoint: 9392,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER V',\n        value: '⒱',\n        codepoint: 9393,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER W',\n        value: '⒲',\n        codepoint: 9394,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER X',\n        value: '⒳',\n        codepoint: 9395,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER Y',\n        value: '⒴',\n        codepoint: 9396,\n      },\n      {\n        name: 'PARENTHESIZED LATIN SMALL LETTER Z',\n        value: '⒵',\n        codepoint: 9397,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER A',\n        value: 'Ⓐ',\n        codepoint: 9398,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER B',\n        value: 'Ⓑ',\n        codepoint: 9399,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER C',\n        value: 'Ⓒ',\n        codepoint: 9400,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER D',\n        value: 'Ⓓ',\n        codepoint: 9401,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER E',\n        value: 'Ⓔ',\n        codepoint: 9402,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER F',\n        value: 'Ⓕ',\n        codepoint: 9403,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER G',\n        value: 'Ⓖ',\n        codepoint: 9404,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER H',\n        value: 'Ⓗ',\n        codepoint: 9405,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER I',\n        value: 'Ⓘ',\n        codepoint: 9406,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER J',\n        value: 'Ⓙ',\n        codepoint: 9407,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER K',\n        value: 'Ⓚ',\n        codepoint: 9408,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER L',\n        value: 'Ⓛ',\n        codepoint: 9409,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER N',\n        value: 'Ⓝ',\n        codepoint: 9411,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER O',\n        value: 'Ⓞ',\n        codepoint: 9412,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER P',\n        value: 'Ⓟ',\n        codepoint: 9413,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER Q',\n        value: 'Ⓠ',\n        codepoint: 9414,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER R',\n        value: 'Ⓡ',\n        codepoint: 9415,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER S',\n        value: 'Ⓢ',\n        codepoint: 9416,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER T',\n        value: 'Ⓣ',\n        codepoint: 9417,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER U',\n        value: 'Ⓤ',\n        codepoint: 9418,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER V',\n        value: 'Ⓥ',\n        codepoint: 9419,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER W',\n        value: 'Ⓦ',\n        codepoint: 9420,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER X',\n        value: 'Ⓧ',\n        codepoint: 9421,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER Y',\n        value: 'Ⓨ',\n        codepoint: 9422,\n      },\n      {\n        name: 'CIRCLED LATIN CAPITAL LETTER Z',\n        value: 'Ⓩ',\n        codepoint: 9423,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER A',\n        value: 'ⓐ',\n        codepoint: 9424,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER B',\n        value: 'ⓑ',\n        codepoint: 9425,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER C',\n        value: 'ⓒ',\n        codepoint: 9426,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER D',\n        value: 'ⓓ',\n        codepoint: 9427,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER E',\n        value: 'ⓔ',\n        codepoint: 9428,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER F',\n        value: 'ⓕ',\n        codepoint: 9429,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER G',\n        value: 'ⓖ',\n        codepoint: 9430,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER H',\n        value: 'ⓗ',\n        codepoint: 9431,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER I',\n        value: 'ⓘ',\n        codepoint: 9432,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER J',\n        value: 'ⓙ',\n        codepoint: 9433,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER K',\n        value: 'ⓚ',\n        codepoint: 9434,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER L',\n        value: 'ⓛ',\n        codepoint: 9435,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER M',\n        value: 'ⓜ',\n        codepoint: 9436,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER N',\n        value: 'ⓝ',\n        codepoint: 9437,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER O',\n        value: 'ⓞ',\n        codepoint: 9438,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER P',\n        value: 'ⓟ',\n        codepoint: 9439,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER Q',\n        value: 'ⓠ',\n        codepoint: 9440,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER R',\n        value: 'ⓡ',\n        codepoint: 9441,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER S',\n        value: 'ⓢ',\n        codepoint: 9442,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER T',\n        value: 'ⓣ',\n        codepoint: 9443,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER U',\n        value: 'ⓤ',\n        codepoint: 9444,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER V',\n        value: 'ⓥ',\n        codepoint: 9445,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER W',\n        value: 'ⓦ',\n        codepoint: 9446,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER X',\n        value: 'ⓧ',\n        codepoint: 9447,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER Y',\n        value: 'ⓨ',\n        codepoint: 9448,\n      },\n      {\n        name: 'CIRCLED LATIN SMALL LETTER Z',\n        value: 'ⓩ',\n        codepoint: 9449,\n      },\n      {\n        name: 'CIRCLED DIGIT ZERO',\n        value: '⓪',\n        codepoint: 9450,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER ELEVEN',\n        value: '⓫',\n        codepoint: 9451,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER TWELVE',\n        value: '⓬',\n        codepoint: 9452,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER THIRTEEN',\n        value: '⓭',\n        codepoint: 9453,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER FOURTEEN',\n        value: '⓮',\n        codepoint: 9454,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER FIFTEEN',\n        value: '⓯',\n        codepoint: 9455,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER SIXTEEN',\n        value: '⓰',\n        codepoint: 9456,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER SEVENTEEN',\n        value: '⓱',\n        codepoint: 9457,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER EIGHTEEN',\n        value: '⓲',\n        codepoint: 9458,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER NINETEEN',\n        value: '⓳',\n        codepoint: 9459,\n      },\n      {\n        name: 'NEGATIVE CIRCLED NUMBER TWENTY',\n        value: '⓴',\n        codepoint: 9460,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT ONE',\n        value: '⓵',\n        codepoint: 9461,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT TWO',\n        value: '⓶',\n        codepoint: 9462,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT THREE',\n        value: '⓷',\n        codepoint: 9463,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT FOUR',\n        value: '⓸',\n        codepoint: 9464,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT FIVE',\n        value: '⓹',\n        codepoint: 9465,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT SIX',\n        value: '⓺',\n        codepoint: 9466,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT SEVEN',\n        value: '⓻',\n        codepoint: 9467,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT EIGHT',\n        value: '⓼',\n        codepoint: 9468,\n      },\n      {\n        name: 'DOUBLE CIRCLED DIGIT NINE',\n        value: '⓽',\n        codepoint: 9469,\n      },\n      {\n        name: 'DOUBLE CIRCLED NUMBER TEN',\n        value: '⓾',\n        codepoint: 9470,\n      },\n      {\n        name: 'NEGATIVE CIRCLED DIGIT ZERO',\n        value: '⓿',\n        codepoint: 9471,\n      },\n      {\n        name: 'BLACK STAR',\n        value: '★',\n        codepoint: 9733,\n      },\n      {\n        name: 'WHITE STAR',\n        value: '☆',\n        codepoint: 9734,\n      },\n      {\n        name: 'LIGHTNING',\n        value: '☇',\n        codepoint: 9735,\n      },\n      {\n        name: 'THUNDERSTORM',\n        value: '☈',\n        codepoint: 9736,\n      },\n      {\n        name: 'SUN',\n        value: '☉',\n        codepoint: 9737,\n      },\n      {\n        name: 'ASCENDING NODE',\n        value: '☊',\n        codepoint: 9738,\n      },\n      {\n        name: 'DESCENDING NODE',\n        value: '☋',\n        codepoint: 9739,\n      },\n      {\n        name: 'CONJUNCTION',\n        value: '☌',\n        codepoint: 9740,\n      },\n      {\n        name: 'OPPOSITION',\n        value: '☍',\n        codepoint: 9741,\n      },\n      {\n        name: 'WHITE TELEPHONE',\n        value: '☏',\n        codepoint: 9743,\n      },\n      {\n        name: 'BALLOT BOX',\n        value: '☐',\n        codepoint: 9744,\n      },\n      {\n        name: 'BALLOT BOX WITH X',\n        value: '☒',\n        codepoint: 9746,\n      },\n      {\n        name: 'SALTIRE',\n        value: '☓',\n        codepoint: 9747,\n      },\n      {\n        name: 'WHITE SHOGI PIECE',\n        value: '☖',\n        codepoint: 9750,\n      },\n      {\n        name: 'BLACK SHOGI PIECE',\n        value: '☗',\n        codepoint: 9751,\n      },\n      {\n        name: 'REVERSED ROTATED FLORAL HEART BULLET',\n        value: '☙',\n        codepoint: 9753,\n      },\n      {\n        name: 'BLACK LEFT POINTING INDEX',\n        value: '☚',\n        codepoint: 9754,\n      },\n      {\n        name: 'BLACK RIGHT POINTING INDEX',\n        value: '☛',\n        codepoint: 9755,\n      },\n      {\n        name: 'WHITE LEFT POINTING INDEX',\n        value: '☜',\n        codepoint: 9756,\n      },\n      {\n        name: 'WHITE RIGHT POINTING INDEX',\n        value: '☞',\n        codepoint: 9758,\n      },\n      {\n        name: 'WHITE DOWN POINTING INDEX',\n        value: '☟',\n        codepoint: 9759,\n      },\n      {\n        name: 'CAUTION SIGN',\n        value: '☡',\n        codepoint: 9761,\n      },\n      {\n        name: 'CADUCEUS',\n        value: '☤',\n        codepoint: 9764,\n      },\n      {\n        name: 'ANKH',\n        value: '☥',\n        codepoint: 9765,\n      },\n      {\n        name: 'CHI RHO',\n        value: '☧',\n        codepoint: 9767,\n      },\n      {\n        name: 'CROSS OF LORRAINE',\n        value: '☨',\n        codepoint: 9768,\n      },\n      {\n        name: 'CROSS OF JERUSALEM',\n        value: '☩',\n        codepoint: 9769,\n      },\n      {\n        name: 'FARSI SYMBOL',\n        value: '☫',\n        codepoint: 9771,\n      },\n      {\n        name: 'ADI SHAKTI',\n        value: '☬',\n        codepoint: 9772,\n      },\n      {\n        name: 'HAMMER AND SICKLE',\n        value: '☭',\n        codepoint: 9773,\n      },\n      {\n        name: 'TRIGRAM FOR HEAVEN',\n        value: '☰',\n        codepoint: 9776,\n      },\n      {\n        name: 'TRIGRAM FOR LAKE',\n        value: '☱',\n        codepoint: 9777,\n      },\n      {\n        name: 'TRIGRAM FOR FIRE',\n        value: '☲',\n        codepoint: 9778,\n      },\n      {\n        name: 'TRIGRAM FOR THUNDER',\n        value: '☳',\n        codepoint: 9779,\n      },\n      {\n        name: 'TRIGRAM FOR WIND',\n        value: '☴',\n        codepoint: 9780,\n      },\n      {\n        name: 'TRIGRAM FOR WATER',\n        value: '☵',\n        codepoint: 9781,\n      },\n      {\n        name: 'TRIGRAM FOR MOUNTAIN',\n        value: '☶',\n        codepoint: 9782,\n      },\n      {\n        name: 'TRIGRAM FOR EARTH',\n        value: '☷',\n        codepoint: 9783,\n      },\n      {\n        name: 'BLACK SMILING FACE',\n        value: '☻',\n        codepoint: 9787,\n      },\n      {\n        name: 'WHITE SUN WITH RAYS',\n        value: '☼',\n        codepoint: 9788,\n      },\n      {\n        name: 'FIRST QUARTER MOON',\n        value: '☽',\n        codepoint: 9789,\n      },\n      {\n        name: 'LAST QUARTER MOON',\n        value: '☾',\n        codepoint: 9790,\n      },\n      {\n        name: 'MERCURY',\n        value: '☿',\n        codepoint: 9791,\n      },\n      {\n        name: 'EARTH',\n        value: '♁',\n        codepoint: 9793,\n      },\n      {\n        name: 'JUPITER',\n        value: '♃',\n        codepoint: 9795,\n      },\n      {\n        name: 'SATURN',\n        value: '♄',\n        codepoint: 9796,\n      },\n      {\n        name: 'URANUS',\n        value: '♅',\n        codepoint: 9797,\n      },\n      {\n        name: 'NEPTUNE',\n        value: '♆',\n        codepoint: 9798,\n      },\n      {\n        name: 'PLUTO',\n        value: '♇',\n        codepoint: 9799,\n      },\n      {\n        name: 'WHITE CHESS KING',\n        value: '♔',\n        codepoint: 9812,\n      },\n      {\n        name: 'WHITE CHESS QUEEN',\n        value: '♕',\n        codepoint: 9813,\n      },\n      {\n        name: 'WHITE CHESS ROOK',\n        value: '♖',\n        codepoint: 9814,\n      },\n      {\n        name: 'WHITE CHESS BISHOP',\n        value: '♗',\n        codepoint: 9815,\n      },\n      {\n        name: 'WHITE CHESS KNIGHT',\n        value: '♘',\n        codepoint: 9816,\n      },\n      {\n        name: 'WHITE CHESS PAWN',\n        value: '♙',\n        codepoint: 9817,\n      },\n      {\n        name: 'BLACK CHESS KING',\n        value: '♚',\n        codepoint: 9818,\n      },\n      {\n        name: 'BLACK CHESS QUEEN',\n        value: '♛',\n        codepoint: 9819,\n      },\n      {\n        name: 'BLACK CHESS ROOK',\n        value: '♜',\n        codepoint: 9820,\n      },\n      {\n        name: 'BLACK CHESS BISHOP',\n        value: '♝',\n        codepoint: 9821,\n      },\n      {\n        name: 'BLACK CHESS KNIGHT',\n        value: '♞',\n        codepoint: 9822,\n      },\n      {\n        name: 'WHITE HEART SUIT',\n        value: '♡',\n        codepoint: 9825,\n      },\n      {\n        name: 'WHITE DIAMOND SUIT',\n        value: '♢',\n        codepoint: 9826,\n      },\n      {\n        name: 'WHITE SPADE SUIT',\n        value: '♤',\n        codepoint: 9828,\n      },\n      {\n        name: 'WHITE CLUB SUIT',\n        value: '♧',\n        codepoint: 9831,\n      },\n      {\n        name: 'QUARTER NOTE',\n        value: '♩',\n        codepoint: 9833,\n      },\n      {\n        name: 'EIGHTH NOTE',\n        value: '♪',\n        codepoint: 9834,\n      },\n      {\n        name: 'BEAMED EIGHTH NOTES',\n        value: '♫',\n        codepoint: 9835,\n      },\n      {\n        name: 'BEAMED SIXTEENTH NOTES',\n        value: '♬',\n        codepoint: 9836,\n      },\n      {\n        name: 'MUSIC FLAT SIGN',\n        value: '♭',\n        codepoint: 9837,\n      },\n      {\n        name: 'MUSIC NATURAL SIGN',\n        value: '♮',\n        codepoint: 9838,\n      },\n      {\n        name: 'MUSIC SHARP SIGN',\n        value: '♯',\n        codepoint: 9839,\n      },\n      {\n        name: 'WEST SYRIAC CROSS',\n        value: '♰',\n        codepoint: 9840,\n      },\n      {\n        name: 'EAST SYRIAC CROSS',\n        value: '♱',\n        codepoint: 9841,\n      },\n      {\n        name: 'UNIVERSAL RECYCLING SYMBOL',\n        value: '♲',\n        codepoint: 9842,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-1 PLASTICS',\n        value: '♳',\n        codepoint: 9843,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-2 PLASTICS',\n        value: '♴',\n        codepoint: 9844,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-3 PLASTICS',\n        value: '♵',\n        codepoint: 9845,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-4 PLASTICS',\n        value: '♶',\n        codepoint: 9846,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-5 PLASTICS',\n        value: '♷',\n        codepoint: 9847,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-6 PLASTICS',\n        value: '♸',\n        codepoint: 9848,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR TYPE-7 PLASTICS',\n        value: '♹',\n        codepoint: 9849,\n      },\n      {\n        name: 'RECYCLING SYMBOL FOR GENERIC MATERIALS',\n        value: '♺',\n        codepoint: 9850,\n      },\n      {\n        name: 'RECYCLED PAPER SYMBOL',\n        value: '♼',\n        codepoint: 9852,\n      },\n      {\n        name: 'PARTIALLY-RECYCLED PAPER SYMBOL',\n        value: '♽',\n        codepoint: 9853,\n      },\n      {\n        name: 'DIE FACE-1',\n        value: '⚀',\n        codepoint: 9856,\n      },\n      {\n        name: 'DIE FACE-2',\n        value: '⚁',\n        codepoint: 9857,\n      },\n      {\n        name: 'DIE FACE-3',\n        value: '⚂',\n        codepoint: 9858,\n      },\n      {\n        name: 'DIE FACE-4',\n        value: '⚃',\n        codepoint: 9859,\n      },\n      {\n        name: 'DIE FACE-5',\n        value: '⚄',\n        codepoint: 9860,\n      },\n      {\n        name: 'DIE FACE-6',\n        value: '⚅',\n        codepoint: 9861,\n      },\n      {\n        name: 'WHITE CIRCLE WITH DOT RIGHT',\n        value: '⚆',\n        codepoint: 9862,\n      },\n      {\n        name: 'WHITE CIRCLE WITH TWO DOTS',\n        value: '⚇',\n        codepoint: 9863,\n      },\n      {\n        name: 'BLACK CIRCLE WITH WHITE DOT RIGHT',\n        value: '⚈',\n        codepoint: 9864,\n      },\n      {\n        name: 'BLACK CIRCLE WITH TWO WHITE DOTS',\n        value: '⚉',\n        codepoint: 9865,\n      },\n      {\n        name: 'MONOGRAM FOR YANG',\n        value: '⚊',\n        codepoint: 9866,\n      },\n      {\n        name: 'MONOGRAM FOR YIN',\n        value: '⚋',\n        codepoint: 9867,\n      },\n      {\n        name: 'DIGRAM FOR GREATER YANG',\n        value: '⚌',\n        codepoint: 9868,\n      },\n      {\n        name: 'DIGRAM FOR LESSER YIN',\n        value: '⚍',\n        codepoint: 9869,\n      },\n      {\n        name: 'DIGRAM FOR LESSER YANG',\n        value: '⚎',\n        codepoint: 9870,\n      },\n      {\n        name: 'DIGRAM FOR GREATER YIN',\n        value: '⚏',\n        codepoint: 9871,\n      },\n      {\n        name: 'WHITE FLAG',\n        value: '⚐',\n        codepoint: 9872,\n      },\n      {\n        name: 'BLACK FLAG',\n        value: '⚑',\n        codepoint: 9873,\n      },\n      {\n        name: 'FLOWER',\n        value: '⚘',\n        codepoint: 9880,\n      },\n      {\n        name: 'STAFF OF HERMES',\n        value: '⚚',\n        codepoint: 9882,\n      },\n      {\n        name: 'DOUBLED FEMALE SIGN',\n        value: '⚢',\n        codepoint: 9890,\n      },\n      {\n        name: 'DOUBLED MALE SIGN',\n        value: '⚣',\n        codepoint: 9891,\n      },\n      {\n        name: 'INTERLOCKED FEMALE AND MALE SIGN',\n        value: '⚤',\n        codepoint: 9892,\n      },\n      {\n        name: 'MALE AND FEMALE SIGN',\n        value: '⚥',\n        codepoint: 9893,\n      },\n      {\n        name: 'MALE WITH STROKE SIGN',\n        value: '⚦',\n        codepoint: 9894,\n      },\n      {\n        name: 'VERTICAL MALE WITH STROKE SIGN',\n        value: '⚨',\n        codepoint: 9896,\n      },\n      {\n        name: 'HORIZONTAL MALE WITH STROKE SIGN',\n        value: '⚩',\n        codepoint: 9897,\n      },\n      {\n        name: 'MEDIUM SMALL WHITE CIRCLE',\n        value: '⚬',\n        codepoint: 9900,\n      },\n      {\n        name: 'MARRIAGE SYMBOL',\n        value: '⚭',\n        codepoint: 9901,\n      },\n      {\n        name: 'DIVORCE SYMBOL',\n        value: '⚮',\n        codepoint: 9902,\n      },\n      {\n        name: 'UNMARRIED PARTNERSHIP SYMBOL',\n        value: '⚯',\n        codepoint: 9903,\n      },\n      {\n        name: 'NEUTER',\n        value: '⚲',\n        codepoint: 9906,\n      },\n      {\n        name: 'WHITE DIAMOND IN SQUARE',\n        value: '⛋',\n        codepoint: 9931,\n      },\n      {\n        name: 'ASTRONOMICAL SYMBOL FOR URANUS',\n        value: '⛢',\n        codepoint: 9954,\n      },\n      {\n        name: 'UPPER BLADE SCISSORS',\n        value: '✁',\n        codepoint: 9985,\n      },\n      {\n        name: 'LOWER BLADE SCISSORS',\n        value: '✃',\n        codepoint: 9987,\n      },\n      {\n        name: 'WHITE SCISSORS',\n        value: '✄',\n        codepoint: 9988,\n      },\n      {\n        name: 'TELEPHONE LOCATION SIGN',\n        value: '✆',\n        codepoint: 9990,\n      },\n      {\n        name: 'TAPE DRIVE',\n        value: '✇',\n        codepoint: 9991,\n      },\n      {\n        name: 'LOWER RIGHT PENCIL',\n        value: '✎',\n        codepoint: 9998,\n      },\n      {\n        name: 'UPPER RIGHT PENCIL',\n        value: '✐',\n        codepoint: 10000,\n      },\n      {\n        name: 'WHITE NIB',\n        value: '✑',\n        codepoint: 10001,\n      },\n      {\n        name: 'CHECK MARK',\n        value: '✓',\n        codepoint: 10003,\n      },\n      {\n        name: 'MULTIPLICATION X',\n        value: '✕',\n        codepoint: 10005,\n      },\n      {\n        name: 'BALLOT X',\n        value: '✗',\n        codepoint: 10007,\n      },\n      {\n        name: 'HEAVY BALLOT X',\n        value: '✘',\n        codepoint: 10008,\n      },\n      {\n        name: 'OUTLINED GREEK CROSS',\n        value: '✙',\n        codepoint: 10009,\n      },\n      {\n        name: 'HEAVY GREEK CROSS',\n        value: '✚',\n        codepoint: 10010,\n      },\n      {\n        name: 'OPEN CENTRE CROSS',\n        value: '✛',\n        codepoint: 10011,\n      },\n      {\n        name: 'HEAVY OPEN CENTRE CROSS',\n        value: '✜',\n        codepoint: 10012,\n      },\n      {\n        name: 'SHADOWED WHITE LATIN CROSS',\n        value: '✞',\n        codepoint: 10014,\n      },\n      {\n        name: 'OUTLINED LATIN CROSS',\n        value: '✟',\n        codepoint: 10015,\n      },\n      {\n        name: 'MALTESE CROSS',\n        value: '✠',\n        codepoint: 10016,\n      },\n      {\n        name: 'FOUR TEARDROP-SPOKED ASTERISK',\n        value: '✢',\n        codepoint: 10018,\n      },\n      {\n        name: 'FOUR BALLOON-SPOKED ASTERISK',\n        value: '✣',\n        codepoint: 10019,\n      },\n      {\n        name: 'HEAVY FOUR BALLOON-SPOKED ASTERISK',\n        value: '✤',\n        codepoint: 10020,\n      },\n      {\n        name: 'FOUR CLUB-SPOKED ASTERISK',\n        value: '✥',\n        codepoint: 10021,\n      },\n      {\n        name: 'BLACK FOUR POINTED STAR',\n        value: '✦',\n        codepoint: 10022,\n      },\n      {\n        name: 'WHITE FOUR POINTED STAR',\n        value: '✧',\n        codepoint: 10023,\n      },\n      {\n        name: 'STRESS OUTLINED WHITE STAR',\n        value: '✩',\n        codepoint: 10025,\n      },\n      {\n        name: 'CIRCLED WHITE STAR',\n        value: '✪',\n        codepoint: 10026,\n      },\n      {\n        name: 'OPEN CENTRE BLACK STAR',\n        value: '✫',\n        codepoint: 10027,\n      },\n      {\n        name: 'BLACK CENTRE WHITE STAR',\n        value: '✬',\n        codepoint: 10028,\n      },\n      {\n        name: 'OUTLINED BLACK STAR',\n        value: '✭',\n        codepoint: 10029,\n      },\n      {\n        name: 'HEAVY OUTLINED BLACK STAR',\n        value: '✮',\n        codepoint: 10030,\n      },\n      {\n        name: 'PINWHEEL STAR',\n        value: '✯',\n        codepoint: 10031,\n      },\n      {\n        name: 'SHADOWED WHITE STAR',\n        value: '✰',\n        codepoint: 10032,\n      },\n      {\n        name: 'HEAVY ASTERISK',\n        value: '✱',\n        codepoint: 10033,\n      },\n      {\n        name: 'OPEN CENTRE ASTERISK',\n        value: '✲',\n        codepoint: 10034,\n      },\n      {\n        name: 'EIGHT POINTED PINWHEEL STAR',\n        value: '✵',\n        codepoint: 10037,\n      },\n      {\n        name: 'SIX POINTED BLACK STAR',\n        value: '✶',\n        codepoint: 10038,\n      },\n      {\n        name: 'EIGHT POINTED RECTILINEAR BLACK STAR',\n        value: '✷',\n        codepoint: 10039,\n      },\n      {\n        name: 'HEAVY EIGHT POINTED RECTILINEAR BLACK STAR',\n        value: '✸',\n        codepoint: 10040,\n      },\n      {\n        name: 'TWELVE POINTED BLACK STAR',\n        value: '✹',\n        codepoint: 10041,\n      },\n      {\n        name: 'SIXTEEN POINTED ASTERISK',\n        value: '✺',\n        codepoint: 10042,\n      },\n      {\n        name: 'TEARDROP-SPOKED ASTERISK',\n        value: '✻',\n        codepoint: 10043,\n      },\n      {\n        name: 'OPEN CENTRE TEARDROP-SPOKED ASTERISK',\n        value: '✼',\n        codepoint: 10044,\n      },\n      {\n        name: 'HEAVY TEARDROP-SPOKED ASTERISK',\n        value: '✽',\n        codepoint: 10045,\n      },\n      {\n        name: 'SIX PETALLED BLACK AND WHITE FLORETTE',\n        value: '✾',\n        codepoint: 10046,\n      },\n      {\n        name: 'BLACK FLORETTE',\n        value: '✿',\n        codepoint: 10047,\n      },\n      {\n        name: 'WHITE FLORETTE',\n        value: '❀',\n        codepoint: 10048,\n      },\n      {\n        name: 'EIGHT PETALLED OUTLINED BLACK FLORETTE',\n        value: '❁',\n        codepoint: 10049,\n      },\n      {\n        name: 'CIRCLED OPEN CENTRE EIGHT POINTED STAR',\n        value: '❂',\n        codepoint: 10050,\n      },\n      {\n        name: 'HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK',\n        value: '❃',\n        codepoint: 10051,\n      },\n      {\n        name: 'TIGHT TRIFOLIATE SNOWFLAKE',\n        value: '❅',\n        codepoint: 10053,\n      },\n      {\n        name: 'HEAVY CHEVRON SNOWFLAKE',\n        value: '❆',\n        codepoint: 10054,\n      },\n      {\n        name: 'HEAVY SPARKLE',\n        value: '❈',\n        codepoint: 10056,\n      },\n      {\n        name: 'BALLOON-SPOKED ASTERISK',\n        value: '❉',\n        codepoint: 10057,\n      },\n      {\n        name: 'EIGHT TEARDROP-SPOKED PROPELLER ASTERISK',\n        value: '❊',\n        codepoint: 10058,\n      },\n      {\n        name: 'HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK',\n        value: '❋',\n        codepoint: 10059,\n      },\n      {\n        name: 'SHADOWED WHITE CIRCLE',\n        value: '❍',\n        codepoint: 10061,\n      },\n      {\n        name: 'LOWER RIGHT DROP-SHADOWED WHITE SQUARE',\n        value: '❏',\n        codepoint: 10063,\n      },\n      {\n        name: 'UPPER RIGHT DROP-SHADOWED WHITE SQUARE',\n        value: '❐',\n        codepoint: 10064,\n      },\n      {\n        name: 'LOWER RIGHT SHADOWED WHITE SQUARE',\n        value: '❑',\n        codepoint: 10065,\n      },\n      {\n        name: 'UPPER RIGHT SHADOWED WHITE SQUARE',\n        value: '❒',\n        codepoint: 10066,\n      },\n      {\n        name: 'BLACK DIAMOND MINUS WHITE X',\n        value: '❖',\n        codepoint: 10070,\n      },\n      {\n        name: 'LIGHT VERTICAL BAR',\n        value: '❘',\n        codepoint: 10072,\n      },\n      {\n        name: 'MEDIUM VERTICAL BAR',\n        value: '❙',\n        codepoint: 10073,\n      },\n      {\n        name: 'HEAVY VERTICAL BAR',\n        value: '❚',\n        codepoint: 10074,\n      },\n      {\n        name: 'HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT',\n        value: '❛',\n        codepoint: 10075,\n      },\n      {\n        name: 'HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT',\n        value: '❜',\n        codepoint: 10076,\n      },\n      {\n        name: 'HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT',\n        value: '❝',\n        codepoint: 10077,\n      },\n      {\n        name: 'HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT',\n        value: '❞',\n        codepoint: 10078,\n      },\n      {\n        name: 'CURVED STEM PARAGRAPH SIGN ORNAMENT',\n        value: '❡',\n        codepoint: 10081,\n      },\n      {\n        name: 'HEAVY EXCLAMATION MARK ORNAMENT',\n        value: '❢',\n        codepoint: 10082,\n      },\n      {\n        name: 'ROTATED HEAVY BLACK HEART BULLET',\n        value: '❥',\n        codepoint: 10085,\n      },\n      {\n        name: 'FLORAL HEART',\n        value: '❦',\n        codepoint: 10086,\n      },\n      {\n        name: 'ROTATED FLORAL HEART BULLET',\n        value: '❧',\n        codepoint: 10087,\n      },\n      {\n        name: 'MEDIUM LEFT PARENTHESIS ORNAMENT',\n        value: '❨',\n        codepoint: 10088,\n      },\n      {\n        name: 'MEDIUM RIGHT PARENTHESIS ORNAMENT',\n        value: '❩',\n        codepoint: 10089,\n      },\n      {\n        name: 'MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT',\n        value: '❪',\n        codepoint: 10090,\n      },\n      {\n        name: 'MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT',\n        value: '❫',\n        codepoint: 10091,\n      },\n      {\n        name: 'MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT',\n        value: '❬',\n        codepoint: 10092,\n      },\n      {\n        name: 'MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT',\n        value: '❭',\n        codepoint: 10093,\n      },\n      {\n        name: 'HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT',\n        value: '❮',\n        codepoint: 10094,\n      },\n      {\n        name: 'HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT',\n        value: '❯',\n        codepoint: 10095,\n      },\n      {\n        name: 'HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT',\n        value: '❰',\n        codepoint: 10096,\n      },\n      {\n        name: 'HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT',\n        value: '❱',\n        codepoint: 10097,\n      },\n      {\n        name: 'LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT',\n        value: '❲',\n        codepoint: 10098,\n      },\n      {\n        name: 'LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT',\n        value: '❳',\n        codepoint: 10099,\n      },\n      {\n        name: 'MEDIUM LEFT CURLY BRACKET ORNAMENT',\n        value: '❴',\n        codepoint: 10100,\n      },\n      {\n        name: 'MEDIUM RIGHT CURLY BRACKET ORNAMENT',\n        value: '❵',\n        codepoint: 10101,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT ONE',\n        value: '❶',\n        codepoint: 10102,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT TWO',\n        value: '❷',\n        codepoint: 10103,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT THREE',\n        value: '❸',\n        codepoint: 10104,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT FOUR',\n        value: '❹',\n        codepoint: 10105,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT FIVE',\n        value: '❺',\n        codepoint: 10106,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT SIX',\n        value: '❻',\n        codepoint: 10107,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT SEVEN',\n        value: '❼',\n        codepoint: 10108,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT EIGHT',\n        value: '❽',\n        codepoint: 10109,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED DIGIT NINE',\n        value: '❾',\n        codepoint: 10110,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED NUMBER TEN',\n        value: '❿',\n        codepoint: 10111,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT ONE',\n        value: '➀',\n        codepoint: 10112,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT TWO',\n        value: '➁',\n        codepoint: 10113,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT THREE',\n        value: '➂',\n        codepoint: 10114,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT FOUR',\n        value: '➃',\n        codepoint: 10115,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT FIVE',\n        value: '➄',\n        codepoint: 10116,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT SIX',\n        value: '➅',\n        codepoint: 10117,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN',\n        value: '➆',\n        codepoint: 10118,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT',\n        value: '➇',\n        codepoint: 10119,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF DIGIT NINE',\n        value: '➈',\n        codepoint: 10120,\n      },\n      {\n        name: 'DINGBAT CIRCLED SANS-SERIF NUMBER TEN',\n        value: '➉',\n        codepoint: 10121,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE',\n        value: '➊',\n        codepoint: 10122,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO',\n        value: '➋',\n        codepoint: 10123,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE',\n        value: '➌',\n        codepoint: 10124,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR',\n        value: '➍',\n        codepoint: 10125,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE',\n        value: '➎',\n        codepoint: 10126,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX',\n        value: '➏',\n        codepoint: 10127,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN',\n        value: '➐',\n        codepoint: 10128,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT',\n        value: '➑',\n        codepoint: 10129,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE',\n        value: '➒',\n        codepoint: 10130,\n      },\n      {\n        name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN',\n        value: '➓',\n        codepoint: 10131,\n      },\n      {\n        name: 'HEAVY WIDE-HEADED RIGHTWARDS ARROW',\n        value: '➔',\n        codepoint: 10132,\n      },\n      {\n        name: 'HEAVY SOUTH EAST ARROW',\n        value: '➘',\n        codepoint: 10136,\n      },\n      {\n        name: 'HEAVY RIGHTWARDS ARROW',\n        value: '➙',\n        codepoint: 10137,\n      },\n      {\n        name: 'HEAVY NORTH EAST ARROW',\n        value: '➚',\n        codepoint: 10138,\n      },\n      {\n        name: 'DRAFTING POINT RIGHTWARDS ARROW',\n        value: '➛',\n        codepoint: 10139,\n      },\n      {\n        name: 'HEAVY ROUND-TIPPED RIGHTWARDS ARROW',\n        value: '➜',\n        codepoint: 10140,\n      },\n      {\n        name: 'TRIANGLE-HEADED RIGHTWARDS ARROW',\n        value: '➝',\n        codepoint: 10141,\n      },\n      {\n        name: 'HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW',\n        value: '➞',\n        codepoint: 10142,\n      },\n      {\n        name: 'DASHED TRIANGLE-HEADED RIGHTWARDS ARROW',\n        value: '➟',\n        codepoint: 10143,\n      },\n      {\n        name: 'HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW',\n        value: '➠',\n        codepoint: 10144,\n      },\n      {\n        name: 'THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD',\n        value: '➢',\n        codepoint: 10146,\n      },\n      {\n        name: 'THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD',\n        value: '➣',\n        codepoint: 10147,\n      },\n      {\n        name: 'BLACK RIGHTWARDS ARROWHEAD',\n        value: '➤',\n        codepoint: 10148,\n      },\n      {\n        name: 'HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW',\n        value: '➥',\n        codepoint: 10149,\n      },\n      {\n        name: 'HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW',\n        value: '➦',\n        codepoint: 10150,\n      },\n      {\n        name: 'SQUAT BLACK RIGHTWARDS ARROW',\n        value: '➧',\n        codepoint: 10151,\n      },\n      {\n        name: 'HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW',\n        value: '➨',\n        codepoint: 10152,\n      },\n      {\n        name: 'RIGHT-SHADED WHITE RIGHTWARDS ARROW',\n        value: '➩',\n        codepoint: 10153,\n      },\n      {\n        name: 'LEFT-SHADED WHITE RIGHTWARDS ARROW',\n        value: '➪',\n        codepoint: 10154,\n      },\n      {\n        name: 'BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➫',\n        codepoint: 10155,\n      },\n      {\n        name: 'FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➬',\n        codepoint: 10156,\n      },\n      {\n        name: 'HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➭',\n        codepoint: 10157,\n      },\n      {\n        name: 'HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➮',\n        codepoint: 10158,\n      },\n      {\n        name: 'NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➯',\n        codepoint: 10159,\n      },\n      {\n        name: 'NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n        value: '➱',\n        codepoint: 10161,\n      },\n      {\n        name: 'CIRCLED HEAVY WHITE RIGHTWARDS ARROW',\n        value: '➲',\n        codepoint: 10162,\n      },\n      {\n        name: 'WHITE-FEATHERED RIGHTWARDS ARROW',\n        value: '➳',\n        codepoint: 10163,\n      },\n      {\n        name: 'BLACK-FEATHERED SOUTH EAST ARROW',\n        value: '➴',\n        codepoint: 10164,\n      },\n      {\n        name: 'BLACK-FEATHERED RIGHTWARDS ARROW',\n        value: '➵',\n        codepoint: 10165,\n      },\n      {\n        name: 'BLACK-FEATHERED NORTH EAST ARROW',\n        value: '➶',\n        codepoint: 10166,\n      },\n      {\n        name: 'HEAVY BLACK-FEATHERED SOUTH EAST ARROW',\n        value: '➷',\n        codepoint: 10167,\n      },\n      {\n        name: 'HEAVY BLACK-FEATHERED RIGHTWARDS ARROW',\n        value: '➸',\n        codepoint: 10168,\n      },\n      {\n        name: 'HEAVY BLACK-FEATHERED NORTH EAST ARROW',\n        value: '➹',\n        codepoint: 10169,\n      },\n      {\n        name: 'TEARDROP-BARBED RIGHTWARDS ARROW',\n        value: '➺',\n        codepoint: 10170,\n      },\n      {\n        name: 'HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW',\n        value: '➻',\n        codepoint: 10171,\n      },\n      {\n        name: 'WEDGE-TAILED RIGHTWARDS ARROW',\n        value: '➼',\n        codepoint: 10172,\n      },\n      {\n        name: 'HEAVY WEDGE-TAILED RIGHTWARDS ARROW',\n        value: '➽',\n        codepoint: 10173,\n      },\n      {\n        name: 'OPEN-OUTLINED RIGHTWARDS ARROW',\n        value: '➾',\n        codepoint: 10174,\n      },\n    ],\n  },\n  {\n    name: 'Mathematical',\n    symbols: [\n      {\n        name: 'FOR ALL',\n        value: '∀',\n        codepoint: 8704,\n      },\n      {\n        name: 'COMPLEMENT',\n        value: '∁',\n        codepoint: 8705,\n      },\n      {\n        name: 'PARTIAL DIFFERENTIAL',\n        value: '∂',\n        codepoint: 8706,\n      },\n      {\n        name: 'THERE EXISTS',\n        value: '∃',\n        codepoint: 8707,\n      },\n      {\n        name: 'THERE DOES NOT EXIST',\n        value: '∄',\n        codepoint: 8708,\n      },\n      {\n        name: 'EMPTY SET',\n        value: '∅',\n        codepoint: 8709,\n      },\n      {\n        name: 'INCREMENT',\n        value: '∆',\n        codepoint: 8710,\n      },\n      {\n        name: 'NABLA',\n        value: '∇',\n        codepoint: 8711,\n      },\n      {\n        name: 'ELEMENT OF',\n        value: '∈',\n        codepoint: 8712,\n      },\n      {\n        name: 'NOT AN ELEMENT OF',\n        value: '∉',\n        codepoint: 8713,\n      },\n      {\n        name: 'SMALL ELEMENT OF',\n        value: '∊',\n        codepoint: 8714,\n      },\n      {\n        name: 'CONTAINS AS MEMBER',\n        value: '∋',\n        codepoint: 8715,\n      },\n      {\n        name: 'DOES NOT CONTAIN AS MEMBER',\n        value: '∌',\n        codepoint: 8716,\n      },\n      {\n        name: 'SMALL CONTAINS AS MEMBER',\n        value: '∍',\n        codepoint: 8717,\n      },\n      {\n        name: 'END OF PROOF',\n        value: '∎',\n        codepoint: 8718,\n      },\n      {\n        name: 'N-ARY PRODUCT',\n        value: '∏',\n        codepoint: 8719,\n      },\n      {\n        name: 'N-ARY COPRODUCT',\n        value: '∐',\n        codepoint: 8720,\n      },\n      {\n        name: 'N-ARY SUMMATION',\n        value: '∑',\n        codepoint: 8721,\n      },\n      {\n        name: 'MINUS SIGN',\n        value: '−',\n        codepoint: 8722,\n      },\n      {\n        name: 'MINUS-OR-PLUS SIGN',\n        value: '∓',\n        codepoint: 8723,\n      },\n      {\n        name: 'DOT PLUS',\n        value: '∔',\n        codepoint: 8724,\n      },\n      {\n        name: 'DIVISION SLASH',\n        value: '∕',\n        codepoint: 8725,\n      },\n      {\n        name: 'SET MINUS',\n        value: '∖',\n        codepoint: 8726,\n      },\n      {\n        name: 'ASTERISK OPERATOR',\n        value: '∗',\n        codepoint: 8727,\n      },\n      {\n        name: 'RING OPERATOR',\n        value: '∘',\n        codepoint: 8728,\n      },\n      {\n        name: 'BULLET OPERATOR',\n        value: '∙',\n        codepoint: 8729,\n      },\n      {\n        name: 'SQUARE ROOT',\n        value: '√',\n        codepoint: 8730,\n      },\n      {\n        name: 'CUBE ROOT',\n        value: '∛',\n        codepoint: 8731,\n      },\n      {\n        name: 'FOURTH ROOT',\n        value: '∜',\n        codepoint: 8732,\n      },\n      {\n        name: 'PROPORTIONAL TO',\n        value: '∝',\n        codepoint: 8733,\n      },\n      {\n        name: 'INFINITY',\n        value: '∞',\n        codepoint: 8734,\n      },\n      {\n        name: 'RIGHT ANGLE',\n        value: '∟',\n        codepoint: 8735,\n      },\n      {\n        name: 'ANGLE',\n        value: '∠',\n        codepoint: 8736,\n      },\n      {\n        name: 'MEASURED ANGLE',\n        value: '∡',\n        codepoint: 8737,\n      },\n      {\n        name: 'SPHERICAL ANGLE',\n        value: '∢',\n        codepoint: 8738,\n      },\n      {\n        name: 'DIVIDES',\n        value: '∣',\n        codepoint: 8739,\n      },\n      {\n        name: 'DOES NOT DIVIDE',\n        value: '∤',\n        codepoint: 8740,\n      },\n      {\n        name: 'PARALLEL TO',\n        value: '∥',\n        codepoint: 8741,\n      },\n      {\n        name: 'NOT PARALLEL TO',\n        value: '∦',\n        codepoint: 8742,\n      },\n      {\n        name: 'LOGICAL AND',\n        value: '∧',\n        codepoint: 8743,\n      },\n      {\n        name: 'LOGICAL OR',\n        value: '∨',\n        codepoint: 8744,\n      },\n      {\n        name: 'INTERSECTION',\n        value: '∩',\n        codepoint: 8745,\n      },\n      {\n        name: 'UNION',\n        value: '∪',\n        codepoint: 8746,\n      },\n      {\n        name: 'INTEGRAL',\n        value: '∫',\n        codepoint: 8747,\n      },\n      {\n        name: 'DOUBLE INTEGRAL',\n        value: '∬',\n        codepoint: 8748,\n      },\n      {\n        name: 'TRIPLE INTEGRAL',\n        value: '∭',\n        codepoint: 8749,\n      },\n      {\n        name: 'CONTOUR INTEGRAL',\n        value: '∮',\n        codepoint: 8750,\n      },\n      {\n        name: 'SURFACE INTEGRAL',\n        value: '∯',\n        codepoint: 8751,\n      },\n      {\n        name: 'VOLUME INTEGRAL',\n        value: '∰',\n        codepoint: 8752,\n      },\n      {\n        name: 'CLOCKWISE INTEGRAL',\n        value: '∱',\n        codepoint: 8753,\n      },\n      {\n        name: 'CLOCKWISE CONTOUR INTEGRAL',\n        value: '∲',\n        codepoint: 8754,\n      },\n      {\n        name: 'ANTICLOCKWISE CONTOUR INTEGRAL',\n        value: '∳',\n        codepoint: 8755,\n      },\n      {\n        name: 'THEREFORE',\n        value: '∴',\n        codepoint: 8756,\n      },\n      {\n        name: 'BECAUSE',\n        value: '∵',\n        codepoint: 8757,\n      },\n      {\n        name: 'RATIO',\n        value: '∶',\n        codepoint: 8758,\n      },\n      {\n        name: 'PROPORTION',\n        value: '∷',\n        codepoint: 8759,\n      },\n      {\n        name: 'DOT MINUS',\n        value: '∸',\n        codepoint: 8760,\n      },\n      {\n        name: 'EXCESS',\n        value: '∹',\n        codepoint: 8761,\n      },\n      {\n        name: 'GEOMETRIC PROPORTION',\n        value: '∺',\n        codepoint: 8762,\n      },\n      {\n        name: 'HOMOTHETIC',\n        value: '∻',\n        codepoint: 8763,\n      },\n      {\n        name: 'TILDE OPERATOR',\n        value: '∼',\n        codepoint: 8764,\n      },\n      {\n        name: 'REVERSED TILDE',\n        value: '∽',\n        codepoint: 8765,\n      },\n      {\n        name: 'INVERTED LAZY S',\n        value: '∾',\n        codepoint: 8766,\n      },\n      {\n        name: 'SINE WAVE',\n        value: '∿',\n        codepoint: 8767,\n      },\n      {\n        name: 'WREATH PRODUCT',\n        value: '≀',\n        codepoint: 8768,\n      },\n      {\n        name: 'NOT TILDE',\n        value: '≁',\n        codepoint: 8769,\n      },\n      {\n        name: 'MINUS TILDE',\n        value: '≂',\n        codepoint: 8770,\n      },\n      {\n        name: 'ASYMPTOTICALLY EQUAL TO',\n        value: '≃',\n        codepoint: 8771,\n      },\n      {\n        name: 'NOT ASYMPTOTICALLY EQUAL TO',\n        value: '≄',\n        codepoint: 8772,\n      },\n      {\n        name: 'APPROXIMATELY EQUAL TO',\n        value: '≅',\n        codepoint: 8773,\n      },\n      {\n        name: 'APPROXIMATELY BUT NOT ACTUALLY EQUAL TO',\n        value: '≆',\n        codepoint: 8774,\n      },\n      {\n        name: 'NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO',\n        value: '≇',\n        codepoint: 8775,\n      },\n      {\n        name: 'ALMOST EQUAL TO',\n        value: '≈',\n        codepoint: 8776,\n      },\n      {\n        name: 'NOT ALMOST EQUAL TO',\n        value: '≉',\n        codepoint: 8777,\n      },\n      {\n        name: 'ALMOST EQUAL OR EQUAL TO',\n        value: '≊',\n        codepoint: 8778,\n      },\n      {\n        name: 'TRIPLE TILDE',\n        value: '≋',\n        codepoint: 8779,\n      },\n      {\n        name: 'ALL EQUAL TO',\n        value: '≌',\n        codepoint: 8780,\n      },\n      {\n        name: 'EQUIVALENT TO',\n        value: '≍',\n        codepoint: 8781,\n      },\n      {\n        name: 'GEOMETRICALLY EQUIVALENT TO',\n        value: '≎',\n        codepoint: 8782,\n      },\n      {\n        name: 'DIFFERENCE BETWEEN',\n        value: '≏',\n        codepoint: 8783,\n      },\n      {\n        name: 'APPROACHES THE LIMIT',\n        value: '≐',\n        codepoint: 8784,\n      },\n      {\n        name: 'GEOMETRICALLY EQUAL TO',\n        value: '≑',\n        codepoint: 8785,\n      },\n      {\n        name: 'APPROXIMATELY EQUAL TO OR THE IMAGE OF',\n        value: '≒',\n        codepoint: 8786,\n      },\n      {\n        name: 'IMAGE OF OR APPROXIMATELY EQUAL TO',\n        value: '≓',\n        codepoint: 8787,\n      },\n      {\n        name: 'COLON EQUALS',\n        value: '≔',\n        codepoint: 8788,\n      },\n      {\n        name: 'EQUALS COLON',\n        value: '≕',\n        codepoint: 8789,\n      },\n      {\n        name: 'RING IN EQUAL TO',\n        value: '≖',\n        codepoint: 8790,\n      },\n      {\n        name: 'RING EQUAL TO',\n        value: '≗',\n        codepoint: 8791,\n      },\n      {\n        name: 'CORRESPONDS TO',\n        value: '≘',\n        codepoint: 8792,\n      },\n      {\n        name: 'ESTIMATES',\n        value: '≙',\n        codepoint: 8793,\n      },\n      {\n        name: 'EQUIANGULAR TO',\n        value: '≚',\n        codepoint: 8794,\n      },\n      {\n        name: 'STAR EQUALS',\n        value: '≛',\n        codepoint: 8795,\n      },\n      {\n        name: 'DELTA EQUAL TO',\n        value: '≜',\n        codepoint: 8796,\n      },\n      {\n        name: 'EQUAL TO BY DEFINITION',\n        value: '≝',\n        codepoint: 8797,\n      },\n      {\n        name: 'MEASURED BY',\n        value: '≞',\n        codepoint: 8798,\n      },\n      {\n        name: 'QUESTIONED EQUAL TO',\n        value: '≟',\n        codepoint: 8799,\n      },\n      {\n        name: 'NOT EQUAL TO',\n        value: '≠',\n        codepoint: 8800,\n      },\n      {\n        name: 'IDENTICAL TO',\n        value: '≡',\n        codepoint: 8801,\n      },\n      {\n        name: 'NOT IDENTICAL TO',\n        value: '≢',\n        codepoint: 8802,\n      },\n      {\n        name: 'STRICTLY EQUIVALENT TO',\n        value: '≣',\n        codepoint: 8803,\n      },\n      {\n        name: 'LESS-THAN OR EQUAL TO',\n        value: '≤',\n        codepoint: 8804,\n      },\n      {\n        name: 'GREATER-THAN OR EQUAL TO',\n        value: '≥',\n        codepoint: 8805,\n      },\n      {\n        name: 'LESS-THAN OVER EQUAL TO',\n        value: '≦',\n        codepoint: 8806,\n      },\n      {\n        name: 'GREATER-THAN OVER EQUAL TO',\n        value: '≧',\n        codepoint: 8807,\n      },\n      {\n        name: 'LESS-THAN BUT NOT EQUAL TO',\n        value: '≨',\n        codepoint: 8808,\n      },\n      {\n        name: 'GREATER-THAN BUT NOT EQUAL TO',\n        value: '≩',\n        codepoint: 8809,\n      },\n      {\n        name: 'MUCH LESS-THAN',\n        value: '≪',\n        codepoint: 8810,\n      },\n      {\n        name: 'MUCH GREATER-THAN',\n        value: '≫',\n        codepoint: 8811,\n      },\n      {\n        name: 'BETWEEN',\n        value: '≬',\n        codepoint: 8812,\n      },\n      {\n        name: 'NOT EQUIVALENT TO',\n        value: '≭',\n        codepoint: 8813,\n      },\n      {\n        name: 'NOT LESS-THAN',\n        value: '≮',\n        codepoint: 8814,\n      },\n      {\n        name: 'NOT GREATER-THAN',\n        value: '≯',\n        codepoint: 8815,\n      },\n      {\n        name: 'NEITHER LESS-THAN NOR EQUAL TO',\n        value: '≰',\n        codepoint: 8816,\n      },\n      {\n        name: 'NEITHER GREATER-THAN NOR EQUAL TO',\n        value: '≱',\n        codepoint: 8817,\n      },\n      {\n        name: 'LESS-THAN OR EQUIVALENT TO',\n        value: '≲',\n        codepoint: 8818,\n      },\n      {\n        name: 'GREATER-THAN OR EQUIVALENT TO',\n        value: '≳',\n        codepoint: 8819,\n      },\n      {\n        name: 'NEITHER LESS-THAN NOR EQUIVALENT TO',\n        value: '≴',\n        codepoint: 8820,\n      },\n      {\n        name: 'NEITHER GREATER-THAN NOR EQUIVALENT TO',\n        value: '≵',\n        codepoint: 8821,\n      },\n      {\n        name: 'LESS-THAN OR GREATER-THAN',\n        value: '≶',\n        codepoint: 8822,\n      },\n      {\n        name: 'GREATER-THAN OR LESS-THAN',\n        value: '≷',\n        codepoint: 8823,\n      },\n      {\n        name: 'NEITHER LESS-THAN NOR GREATER-THAN',\n        value: '≸',\n        codepoint: 8824,\n      },\n      {\n        name: 'NEITHER GREATER-THAN NOR LESS-THAN',\n        value: '≹',\n        codepoint: 8825,\n      },\n      {\n        name: 'PRECEDES',\n        value: '≺',\n        codepoint: 8826,\n      },\n      {\n        name: 'SUCCEEDS',\n        value: '≻',\n        codepoint: 8827,\n      },\n      {\n        name: 'PRECEDES OR EQUAL TO',\n        value: '≼',\n        codepoint: 8828,\n      },\n      {\n        name: 'SUCCEEDS OR EQUAL TO',\n        value: '≽',\n        codepoint: 8829,\n      },\n      {\n        name: 'PRECEDES OR EQUIVALENT TO',\n        value: '≾',\n        codepoint: 8830,\n      },\n      {\n        name: 'SUCCEEDS OR EQUIVALENT TO',\n        value: '≿',\n        codepoint: 8831,\n      },\n      {\n        name: 'DOES NOT PRECEDE',\n        value: '⊀',\n        codepoint: 8832,\n      },\n      {\n        name: 'DOES NOT SUCCEED',\n        value: '⊁',\n        codepoint: 8833,\n      },\n      {\n        name: 'SUBSET OF',\n        value: '⊂',\n        codepoint: 8834,\n      },\n      {\n        name: 'SUPERSET OF',\n        value: '⊃',\n        codepoint: 8835,\n      },\n      {\n        name: 'NOT A SUBSET OF',\n        value: '⊄',\n        codepoint: 8836,\n      },\n      {\n        name: 'NOT A SUPERSET OF',\n        value: '⊅',\n        codepoint: 8837,\n      },\n      {\n        name: 'SUBSET OF OR EQUAL TO',\n        value: '⊆',\n        codepoint: 8838,\n      },\n      {\n        name: 'SUPERSET OF OR EQUAL TO',\n        value: '⊇',\n        codepoint: 8839,\n      },\n      {\n        name: 'NEITHER A SUBSET OF NOR EQUAL TO',\n        value: '⊈',\n        codepoint: 8840,\n      },\n      {\n        name: 'NEITHER A SUPERSET OF NOR EQUAL TO',\n        value: '⊉',\n        codepoint: 8841,\n      },\n      {\n        name: 'SUBSET OF WITH NOT EQUAL TO',\n        value: '⊊',\n        codepoint: 8842,\n      },\n      {\n        name: 'SUPERSET OF WITH NOT EQUAL TO',\n        value: '⊋',\n        codepoint: 8843,\n      },\n      {\n        name: 'MULTISET',\n        value: '⊌',\n        codepoint: 8844,\n      },\n      {\n        name: 'MULTISET MULTIPLICATION',\n        value: '⊍',\n        codepoint: 8845,\n      },\n      {\n        name: 'MULTISET UNION',\n        value: '⊎',\n        codepoint: 8846,\n      },\n      {\n        name: 'SQUARE IMAGE OF',\n        value: '⊏',\n        codepoint: 8847,\n      },\n      {\n        name: 'SQUARE ORIGINAL OF',\n        value: '⊐',\n        codepoint: 8848,\n      },\n      {\n        name: 'SQUARE IMAGE OF OR EQUAL TO',\n        value: '⊑',\n        codepoint: 8849,\n      },\n      {\n        name: 'SQUARE ORIGINAL OF OR EQUAL TO',\n        value: '⊒',\n        codepoint: 8850,\n      },\n      {\n        name: 'SQUARE CAP',\n        value: '⊓',\n        codepoint: 8851,\n      },\n      {\n        name: 'SQUARE CUP',\n        value: '⊔',\n        codepoint: 8852,\n      },\n      {\n        name: 'CIRCLED PLUS',\n        value: '⊕',\n        codepoint: 8853,\n      },\n      {\n        name: 'CIRCLED MINUS',\n        value: '⊖',\n        codepoint: 8854,\n      },\n      {\n        name: 'CIRCLED TIMES',\n        value: '⊗',\n        codepoint: 8855,\n      },\n      {\n        name: 'CIRCLED DIVISION SLASH',\n        value: '⊘',\n        codepoint: 8856,\n      },\n      {\n        name: 'CIRCLED DOT OPERATOR',\n        value: '⊙',\n        codepoint: 8857,\n      },\n      {\n        name: 'CIRCLED RING OPERATOR',\n        value: '⊚',\n        codepoint: 8858,\n      },\n      {\n        name: 'CIRCLED ASTERISK OPERATOR',\n        value: '⊛',\n        codepoint: 8859,\n      },\n      {\n        name: 'CIRCLED EQUALS',\n        value: '⊜',\n        codepoint: 8860,\n      },\n      {\n        name: 'CIRCLED DASH',\n        value: '⊝',\n        codepoint: 8861,\n      },\n      {\n        name: 'SQUARED PLUS',\n        value: '⊞',\n        codepoint: 8862,\n      },\n      {\n        name: 'SQUARED MINUS',\n        value: '⊟',\n        codepoint: 8863,\n      },\n      {\n        name: 'SQUARED TIMES',\n        value: '⊠',\n        codepoint: 8864,\n      },\n      {\n        name: 'SQUARED DOT OPERATOR',\n        value: '⊡',\n        codepoint: 8865,\n      },\n      {\n        name: 'RIGHT TACK',\n        value: '⊢',\n        codepoint: 8866,\n      },\n      {\n        name: 'LEFT TACK',\n        value: '⊣',\n        codepoint: 8867,\n      },\n      {\n        name: 'DOWN TACK',\n        value: '⊤',\n        codepoint: 8868,\n      },\n      {\n        name: 'UP TACK',\n        value: '⊥',\n        codepoint: 8869,\n      },\n      {\n        name: 'ASSERTION',\n        value: '⊦',\n        codepoint: 8870,\n      },\n      {\n        name: 'MODELS',\n        value: '⊧',\n        codepoint: 8871,\n      },\n      {\n        name: 'TRUE',\n        value: '⊨',\n        codepoint: 8872,\n      },\n      {\n        name: 'FORCES',\n        value: '⊩',\n        codepoint: 8873,\n      },\n      {\n        name: 'TRIPLE VERTICAL BAR RIGHT TURNSTILE',\n        value: '⊪',\n        codepoint: 8874,\n      },\n      {\n        name: 'DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE',\n        value: '⊫',\n        codepoint: 8875,\n      },\n      {\n        name: 'DOES NOT PROVE',\n        value: '⊬',\n        codepoint: 8876,\n      },\n      {\n        name: 'NOT TRUE',\n        value: '⊭',\n        codepoint: 8877,\n      },\n      {\n        name: 'DOES NOT FORCE',\n        value: '⊮',\n        codepoint: 8878,\n      },\n      {\n        name: 'NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE',\n        value: '⊯',\n        codepoint: 8879,\n      },\n      {\n        name: 'PRECEDES UNDER RELATION',\n        value: '⊰',\n        codepoint: 8880,\n      },\n      {\n        name: 'SUCCEEDS UNDER RELATION',\n        value: '⊱',\n        codepoint: 8881,\n      },\n      {\n        name: 'NORMAL SUBGROUP OF',\n        value: '⊲',\n        codepoint: 8882,\n      },\n      {\n        name: 'CONTAINS AS NORMAL SUBGROUP',\n        value: '⊳',\n        codepoint: 8883,\n      },\n      {\n        name: 'NORMAL SUBGROUP OF OR EQUAL TO',\n        value: '⊴',\n        codepoint: 8884,\n      },\n      {\n        name: 'CONTAINS AS NORMAL SUBGROUP OR EQUAL TO',\n        value: '⊵',\n        codepoint: 8885,\n      },\n      {\n        name: 'ORIGINAL OF',\n        value: '⊶',\n        codepoint: 8886,\n      },\n      {\n        name: 'IMAGE OF',\n        value: '⊷',\n        codepoint: 8887,\n      },\n      {\n        name: 'MULTIMAP',\n        value: '⊸',\n        codepoint: 8888,\n      },\n      {\n        name: 'HERMITIAN CONJUGATE MATRIX',\n        value: '⊹',\n        codepoint: 8889,\n      },\n      {\n        name: 'INTERCALATE',\n        value: '⊺',\n        codepoint: 8890,\n      },\n      {\n        name: 'XOR',\n        value: '⊻',\n        codepoint: 8891,\n      },\n      {\n        name: 'NAND',\n        value: '⊼',\n        codepoint: 8892,\n      },\n      {\n        name: 'NOR',\n        value: '⊽',\n        codepoint: 8893,\n      },\n      {\n        name: 'RIGHT ANGLE WITH ARC',\n        value: '⊾',\n        codepoint: 8894,\n      },\n      {\n        name: 'RIGHT TRIANGLE',\n        value: '⊿',\n        codepoint: 8895,\n      },\n      {\n        name: 'N-ARY LOGICAL AND',\n        value: '⋀',\n        codepoint: 8896,\n      },\n      {\n        name: 'N-ARY LOGICAL OR',\n        value: '⋁',\n        codepoint: 8897,\n      },\n      {\n        name: 'N-ARY INTERSECTION',\n        value: '⋂',\n        codepoint: 8898,\n      },\n      {\n        name: 'N-ARY UNION',\n        value: '⋃',\n        codepoint: 8899,\n      },\n      {\n        name: 'DIAMOND OPERATOR',\n        value: '⋄',\n        codepoint: 8900,\n      },\n      {\n        name: 'DOT OPERATOR',\n        value: '⋅',\n        codepoint: 8901,\n      },\n      {\n        name: 'STAR OPERATOR',\n        value: '⋆',\n        codepoint: 8902,\n      },\n      {\n        name: 'DIVISION TIMES',\n        value: '⋇',\n        codepoint: 8903,\n      },\n      {\n        name: 'BOWTIE',\n        value: '⋈',\n        codepoint: 8904,\n      },\n      {\n        name: 'LEFT NORMAL FACTOR SEMIDIRECT PRODUCT',\n        value: '⋉',\n        codepoint: 8905,\n      },\n      {\n        name: 'RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT',\n        value: '⋊',\n        codepoint: 8906,\n      },\n      {\n        name: 'LEFT SEMIDIRECT PRODUCT',\n        value: '⋋',\n        codepoint: 8907,\n      },\n      {\n        name: 'RIGHT SEMIDIRECT PRODUCT',\n        value: '⋌',\n        codepoint: 8908,\n      },\n      {\n        name: 'REVERSED TILDE EQUALS',\n        value: '⋍',\n        codepoint: 8909,\n      },\n      {\n        name: 'CURLY LOGICAL OR',\n        value: '⋎',\n        codepoint: 8910,\n      },\n      {\n        name: 'CURLY LOGICAL AND',\n        value: '⋏',\n        codepoint: 8911,\n      },\n      {\n        name: 'DOUBLE SUBSET',\n        value: '⋐',\n        codepoint: 8912,\n      },\n      {\n        name: 'DOUBLE SUPERSET',\n        value: '⋑',\n        codepoint: 8913,\n      },\n      {\n        name: 'DOUBLE INTERSECTION',\n        value: '⋒',\n        codepoint: 8914,\n      },\n      {\n        name: 'DOUBLE UNION',\n        value: '⋓',\n        codepoint: 8915,\n      },\n      {\n        name: 'PITCHFORK',\n        value: '⋔',\n        codepoint: 8916,\n      },\n      {\n        name: 'EQUAL AND PARALLEL TO',\n        value: '⋕',\n        codepoint: 8917,\n      },\n      {\n        name: 'LESS-THAN WITH DOT',\n        value: '⋖',\n        codepoint: 8918,\n      },\n      {\n        name: 'GREATER-THAN WITH DOT',\n        value: '⋗',\n        codepoint: 8919,\n      },\n      {\n        name: 'VERY MUCH LESS-THAN',\n        value: '⋘',\n        codepoint: 8920,\n      },\n      {\n        name: 'VERY MUCH GREATER-THAN',\n        value: '⋙',\n        codepoint: 8921,\n      },\n      {\n        name: 'LESS-THAN EQUAL TO OR GREATER-THAN',\n        value: '⋚',\n        codepoint: 8922,\n      },\n      {\n        name: 'GREATER-THAN EQUAL TO OR LESS-THAN',\n        value: '⋛',\n        codepoint: 8923,\n      },\n      {\n        name: 'EQUAL TO OR LESS-THAN',\n        value: '⋜',\n        codepoint: 8924,\n      },\n      {\n        name: 'EQUAL TO OR GREATER-THAN',\n        value: '⋝',\n        codepoint: 8925,\n      },\n      {\n        name: 'EQUAL TO OR PRECEDES',\n        value: '⋞',\n        codepoint: 8926,\n      },\n      {\n        name: 'EQUAL TO OR SUCCEEDS',\n        value: '⋟',\n        codepoint: 8927,\n      },\n      {\n        name: 'DOES NOT PRECEDE OR EQUAL',\n        value: '⋠',\n        codepoint: 8928,\n      },\n      {\n        name: 'DOES NOT SUCCEED OR EQUAL',\n        value: '⋡',\n        codepoint: 8929,\n      },\n      {\n        name: 'NOT SQUARE IMAGE OF OR EQUAL TO',\n        value: '⋢',\n        codepoint: 8930,\n      },\n      {\n        name: 'NOT SQUARE ORIGINAL OF OR EQUAL TO',\n        value: '⋣',\n        codepoint: 8931,\n      },\n      {\n        name: 'SQUARE IMAGE OF OR NOT EQUAL TO',\n        value: '⋤',\n        codepoint: 8932,\n      },\n      {\n        name: 'SQUARE ORIGINAL OF OR NOT EQUAL TO',\n        value: '⋥',\n        codepoint: 8933,\n      },\n      {\n        name: 'LESS-THAN BUT NOT EQUIVALENT TO',\n        value: '⋦',\n        codepoint: 8934,\n      },\n      {\n        name: 'GREATER-THAN BUT NOT EQUIVALENT TO',\n        value: '⋧',\n        codepoint: 8935,\n      },\n      {\n        name: 'PRECEDES BUT NOT EQUIVALENT TO',\n        value: '⋨',\n        codepoint: 8936,\n      },\n      {\n        name: 'SUCCEEDS BUT NOT EQUIVALENT TO',\n        value: '⋩',\n        codepoint: 8937,\n      },\n      {\n        name: 'NOT NORMAL SUBGROUP OF',\n        value: '⋪',\n        codepoint: 8938,\n      },\n      {\n        name: 'DOES NOT CONTAIN AS NORMAL SUBGROUP',\n        value: '⋫',\n        codepoint: 8939,\n      },\n      {\n        name: 'NOT NORMAL SUBGROUP OF OR EQUAL TO',\n        value: '⋬',\n        codepoint: 8940,\n      },\n      {\n        name: 'DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL',\n        value: '⋭',\n        codepoint: 8941,\n      },\n      {\n        name: 'VERTICAL ELLIPSIS',\n        value: '⋮',\n        codepoint: 8942,\n      },\n      {\n        name: 'MIDLINE HORIZONTAL ELLIPSIS',\n        value: '⋯',\n        codepoint: 8943,\n      },\n      {\n        name: 'UP RIGHT DIAGONAL ELLIPSIS',\n        value: '⋰',\n        codepoint: 8944,\n      },\n      {\n        name: 'DOWN RIGHT DIAGONAL ELLIPSIS',\n        value: '⋱',\n        codepoint: 8945,\n      },\n      {\n        name: 'ELEMENT OF WITH LONG HORIZONTAL STROKE',\n        value: '⋲',\n        codepoint: 8946,\n      },\n      {\n        name: 'ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n        value: '⋳',\n        codepoint: 8947,\n      },\n      {\n        name: 'SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n        value: '⋴',\n        codepoint: 8948,\n      },\n      {\n        name: 'ELEMENT OF WITH DOT ABOVE',\n        value: '⋵',\n        codepoint: 8949,\n      },\n      {\n        name: 'ELEMENT OF WITH OVERBAR',\n        value: '⋶',\n        codepoint: 8950,\n      },\n      {\n        name: 'SMALL ELEMENT OF WITH OVERBAR',\n        value: '⋷',\n        codepoint: 8951,\n      },\n      {\n        name: 'ELEMENT OF WITH UNDERBAR',\n        value: '⋸',\n        codepoint: 8952,\n      },\n      {\n        name: 'ELEMENT OF WITH TWO HORIZONTAL STROKES',\n        value: '⋹',\n        codepoint: 8953,\n      },\n      {\n        name: 'CONTAINS WITH LONG HORIZONTAL STROKE',\n        value: '⋺',\n        codepoint: 8954,\n      },\n      {\n        name: 'CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n        value: '⋻',\n        codepoint: 8955,\n      },\n      {\n        name: 'SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n        value: '⋼',\n        codepoint: 8956,\n      },\n      {\n        name: 'CONTAINS WITH OVERBAR',\n        value: '⋽',\n        codepoint: 8957,\n      },\n      {\n        name: 'SMALL CONTAINS WITH OVERBAR',\n        value: '⋾',\n        codepoint: 8958,\n      },\n      {\n        name: 'Z NOTATION BAG MEMBERSHIP',\n        value: '⋿',\n        codepoint: 8959,\n      },\n      {\n        name: 'THREE DIMENSIONAL ANGLE',\n        value: '⟀',\n        codepoint: 10176,\n      },\n      {\n        name: 'WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE',\n        value: '⟁',\n        codepoint: 10177,\n      },\n      {\n        name: 'PERPENDICULAR',\n        value: '⟂',\n        codepoint: 10178,\n      },\n      {\n        name: 'OPEN SUBSET',\n        value: '⟃',\n        codepoint: 10179,\n      },\n      {\n        name: 'OPEN SUPERSET',\n        value: '⟄',\n        codepoint: 10180,\n      },\n      {\n        name: 'LEFT S-SHAPED BAG DELIMITER',\n        value: '⟅',\n        codepoint: 10181,\n      },\n      {\n        name: 'RIGHT S-SHAPED BAG DELIMITER',\n        value: '⟆',\n        codepoint: 10182,\n      },\n      {\n        name: 'OR WITH DOT INSIDE',\n        value: '⟇',\n        codepoint: 10183,\n      },\n      {\n        name: 'REVERSE SOLIDUS PRECEDING SUBSET',\n        value: '⟈',\n        codepoint: 10184,\n      },\n      {\n        name: 'SUPERSET PRECEDING SOLIDUS',\n        value: '⟉',\n        codepoint: 10185,\n      },\n      {\n        name: 'VERTICAL BAR WITH HORIZONTAL STROKE',\n        value: '⟊',\n        codepoint: 10186,\n      },\n      {\n        name: 'LONG DIVISION',\n        value: '⟌',\n        codepoint: 10188,\n      },\n      {\n        name: 'WHITE DIAMOND WITH CENTRED DOT',\n        value: '⟐',\n        codepoint: 10192,\n      },\n      {\n        name: 'AND WITH DOT',\n        value: '⟑',\n        codepoint: 10193,\n      },\n      {\n        name: 'ELEMENT OF OPENING UPWARDS',\n        value: '⟒',\n        codepoint: 10194,\n      },\n      {\n        name: 'LOWER RIGHT CORNER WITH DOT',\n        value: '⟓',\n        codepoint: 10195,\n      },\n      {\n        name: 'UPPER LEFT CORNER WITH DOT',\n        value: '⟔',\n        codepoint: 10196,\n      },\n      {\n        name: 'LEFT OUTER JOIN',\n        value: '⟕',\n        codepoint: 10197,\n      },\n      {\n        name: 'RIGHT OUTER JOIN',\n        value: '⟖',\n        codepoint: 10198,\n      },\n      {\n        name: 'FULL OUTER JOIN',\n        value: '⟗',\n        codepoint: 10199,\n      },\n      {\n        name: 'LARGE UP TACK',\n        value: '⟘',\n        codepoint: 10200,\n      },\n      {\n        name: 'LARGE DOWN TACK',\n        value: '⟙',\n        codepoint: 10201,\n      },\n      {\n        name: 'LEFT AND RIGHT DOUBLE TURNSTILE',\n        value: '⟚',\n        codepoint: 10202,\n      },\n      {\n        name: 'LEFT AND RIGHT TACK',\n        value: '⟛',\n        codepoint: 10203,\n      },\n      {\n        name: 'LEFT MULTIMAP',\n        value: '⟜',\n        codepoint: 10204,\n      },\n      {\n        name: 'LONG RIGHT TACK',\n        value: '⟝',\n        codepoint: 10205,\n      },\n      {\n        name: 'LONG LEFT TACK',\n        value: '⟞',\n        codepoint: 10206,\n      },\n      {\n        name: 'UP TACK WITH CIRCLE ABOVE',\n        value: '⟟',\n        codepoint: 10207,\n      },\n      {\n        name: 'LOZENGE DIVIDED BY HORIZONTAL RULE',\n        value: '⟠',\n        codepoint: 10208,\n      },\n      {\n        name: 'WHITE CONCAVE-SIDED DIAMOND',\n        value: '⟡',\n        codepoint: 10209,\n      },\n      {\n        name: 'WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK',\n        value: '⟢',\n        codepoint: 10210,\n      },\n      {\n        name: 'WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK',\n        value: '⟣',\n        codepoint: 10211,\n      },\n      {\n        name: 'WHITE SQUARE WITH LEFTWARDS TICK',\n        value: '⟤',\n        codepoint: 10212,\n      },\n      {\n        name: 'WHITE SQUARE WITH RIGHTWARDS TICK',\n        value: '⟥',\n        codepoint: 10213,\n      },\n      {\n        name: 'MATHEMATICAL LEFT WHITE SQUARE BRACKET',\n        value: '⟦',\n        codepoint: 10214,\n      },\n      {\n        name: 'MATHEMATICAL RIGHT WHITE SQUARE BRACKET',\n        value: '⟧',\n        codepoint: 10215,\n      },\n      {\n        name: 'MATHEMATICAL LEFT ANGLE BRACKET',\n        value: '⟨',\n        codepoint: 10216,\n      },\n      {\n        name: 'MATHEMATICAL RIGHT ANGLE BRACKET',\n        value: '⟩',\n        codepoint: 10217,\n      },\n      {\n        name: 'MATHEMATICAL LEFT DOUBLE ANGLE BRACKET',\n        value: '⟪',\n        codepoint: 10218,\n      },\n      {\n        name: 'MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET',\n        value: '⟫',\n        codepoint: 10219,\n      },\n      {\n        name: 'MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET',\n        value: '⟬',\n        codepoint: 10220,\n      },\n      {\n        name: 'MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET',\n        value: '⟭',\n        codepoint: 10221,\n      },\n      {\n        name: 'MATHEMATICAL LEFT FLATTENED PARENTHESIS',\n        value: '⟮',\n        codepoint: 10222,\n      },\n      {\n        name: 'MATHEMATICAL RIGHT FLATTENED PARENTHESIS',\n        value: '⟯',\n        codepoint: 10223,\n      },\n      {\n        name: 'TRIPLE VERTICAL BAR DELIMITER',\n        value: '⦀',\n        codepoint: 10624,\n      },\n      {\n        name: 'Z NOTATION SPOT',\n        value: '⦁',\n        codepoint: 10625,\n      },\n      {\n        name: 'Z NOTATION TYPE COLON',\n        value: '⦂',\n        codepoint: 10626,\n      },\n      {\n        name: 'LEFT WHITE CURLY BRACKET',\n        value: '⦃',\n        codepoint: 10627,\n      },\n      {\n        name: 'RIGHT WHITE CURLY BRACKET',\n        value: '⦄',\n        codepoint: 10628,\n      },\n      {\n        name: 'LEFT WHITE PARENTHESIS',\n        value: '⦅',\n        codepoint: 10629,\n      },\n      {\n        name: 'RIGHT WHITE PARENTHESIS',\n        value: '⦆',\n        codepoint: 10630,\n      },\n      {\n        name: 'Z NOTATION LEFT IMAGE BRACKET',\n        value: '⦇',\n        codepoint: 10631,\n      },\n      {\n        name: 'Z NOTATION RIGHT IMAGE BRACKET',\n        value: '⦈',\n        codepoint: 10632,\n      },\n      {\n        name: 'Z NOTATION LEFT BINDING BRACKET',\n        value: '⦉',\n        codepoint: 10633,\n      },\n      {\n        name: 'Z NOTATION RIGHT BINDING BRACKET',\n        value: '⦊',\n        codepoint: 10634,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET WITH UNDERBAR',\n        value: '⦋',\n        codepoint: 10635,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET WITH UNDERBAR',\n        value: '⦌',\n        codepoint: 10636,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET WITH TICK IN TOP CORNER',\n        value: '⦍',\n        codepoint: 10637,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER',\n        value: '⦎',\n        codepoint: 10638,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER',\n        value: '⦏',\n        codepoint: 10639,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER',\n        value: '⦐',\n        codepoint: 10640,\n      },\n      {\n        name: 'LEFT ANGLE BRACKET WITH DOT',\n        value: '⦑',\n        codepoint: 10641,\n      },\n      {\n        name: 'RIGHT ANGLE BRACKET WITH DOT',\n        value: '⦒',\n        codepoint: 10642,\n      },\n      {\n        name: 'LEFT ARC LESS-THAN BRACKET',\n        value: '⦓',\n        codepoint: 10643,\n      },\n      {\n        name: 'RIGHT ARC GREATER-THAN BRACKET',\n        value: '⦔',\n        codepoint: 10644,\n      },\n      {\n        name: 'DOUBLE LEFT ARC GREATER-THAN BRACKET',\n        value: '⦕',\n        codepoint: 10645,\n      },\n      {\n        name: 'DOUBLE RIGHT ARC LESS-THAN BRACKET',\n        value: '⦖',\n        codepoint: 10646,\n      },\n      {\n        name: 'LEFT BLACK TORTOISE SHELL BRACKET',\n        value: '⦗',\n        codepoint: 10647,\n      },\n      {\n        name: 'RIGHT BLACK TORTOISE SHELL BRACKET',\n        value: '⦘',\n        codepoint: 10648,\n      },\n      {\n        name: 'DOTTED FENCE',\n        value: '⦙',\n        codepoint: 10649,\n      },\n      {\n        name: 'VERTICAL ZIGZAG LINE',\n        value: '⦚',\n        codepoint: 10650,\n      },\n      {\n        name: 'MEASURED ANGLE OPENING LEFT',\n        value: '⦛',\n        codepoint: 10651,\n      },\n      {\n        name: 'RIGHT ANGLE VARIANT WITH SQUARE',\n        value: '⦜',\n        codepoint: 10652,\n      },\n      {\n        name: 'MEASURED RIGHT ANGLE WITH DOT',\n        value: '⦝',\n        codepoint: 10653,\n      },\n      {\n        name: 'ANGLE WITH S INSIDE',\n        value: '⦞',\n        codepoint: 10654,\n      },\n      {\n        name: 'ACUTE ANGLE',\n        value: '⦟',\n        codepoint: 10655,\n      },\n      {\n        name: 'SPHERICAL ANGLE OPENING LEFT',\n        value: '⦠',\n        codepoint: 10656,\n      },\n      {\n        name: 'SPHERICAL ANGLE OPENING UP',\n        value: '⦡',\n        codepoint: 10657,\n      },\n      {\n        name: 'TURNED ANGLE',\n        value: '⦢',\n        codepoint: 10658,\n      },\n      {\n        name: 'REVERSED ANGLE',\n        value: '⦣',\n        codepoint: 10659,\n      },\n      {\n        name: 'ANGLE WITH UNDERBAR',\n        value: '⦤',\n        codepoint: 10660,\n      },\n      {\n        name: 'REVERSED ANGLE WITH UNDERBAR',\n        value: '⦥',\n        codepoint: 10661,\n      },\n      {\n        name: 'OBLIQUE ANGLE OPENING UP',\n        value: '⦦',\n        codepoint: 10662,\n      },\n      {\n        name: 'OBLIQUE ANGLE OPENING DOWN',\n        value: '⦧',\n        codepoint: 10663,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT',\n        value: '⦨',\n        codepoint: 10664,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT',\n        value: '⦩',\n        codepoint: 10665,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT',\n        value: '⦪',\n        codepoint: 10666,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT',\n        value: '⦫',\n        codepoint: 10667,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP',\n        value: '⦬',\n        codepoint: 10668,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP',\n        value: '⦭',\n        codepoint: 10669,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN',\n        value: '⦮',\n        codepoint: 10670,\n      },\n      {\n        name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN',\n        value: '⦯',\n        codepoint: 10671,\n      },\n      {\n        name: 'REVERSED EMPTY SET',\n        value: '⦰',\n        codepoint: 10672,\n      },\n      {\n        name: 'EMPTY SET WITH OVERBAR',\n        value: '⦱',\n        codepoint: 10673,\n      },\n      {\n        name: 'EMPTY SET WITH SMALL CIRCLE ABOVE',\n        value: '⦲',\n        codepoint: 10674,\n      },\n      {\n        name: 'EMPTY SET WITH RIGHT ARROW ABOVE',\n        value: '⦳',\n        codepoint: 10675,\n      },\n      {\n        name: 'EMPTY SET WITH LEFT ARROW ABOVE',\n        value: '⦴',\n        codepoint: 10676,\n      },\n      {\n        name: 'CIRCLE WITH HORIZONTAL BAR',\n        value: '⦵',\n        codepoint: 10677,\n      },\n      {\n        name: 'CIRCLED VERTICAL BAR',\n        value: '⦶',\n        codepoint: 10678,\n      },\n      {\n        name: 'CIRCLED PARALLEL',\n        value: '⦷',\n        codepoint: 10679,\n      },\n      {\n        name: 'CIRCLED REVERSE SOLIDUS',\n        value: '⦸',\n        codepoint: 10680,\n      },\n      {\n        name: 'CIRCLED PERPENDICULAR',\n        value: '⦹',\n        codepoint: 10681,\n      },\n      {\n        name: 'CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR',\n        value: '⦺',\n        codepoint: 10682,\n      },\n      {\n        name: 'CIRCLE WITH SUPERIMPOSED X',\n        value: '⦻',\n        codepoint: 10683,\n      },\n      {\n        name: 'CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN',\n        value: '⦼',\n        codepoint: 10684,\n      },\n      {\n        name: 'UP ARROW THROUGH CIRCLE',\n        value: '⦽',\n        codepoint: 10685,\n      },\n      {\n        name: 'CIRCLED WHITE BULLET',\n        value: '⦾',\n        codepoint: 10686,\n      },\n      {\n        name: 'CIRCLED BULLET',\n        value: '⦿',\n        codepoint: 10687,\n      },\n      {\n        name: 'CIRCLED LESS-THAN',\n        value: '⧀',\n        codepoint: 10688,\n      },\n      {\n        name: 'CIRCLED GREATER-THAN',\n        value: '⧁',\n        codepoint: 10689,\n      },\n      {\n        name: 'CIRCLE WITH SMALL CIRCLE TO THE RIGHT',\n        value: '⧂',\n        codepoint: 10690,\n      },\n      {\n        name: 'CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT',\n        value: '⧃',\n        codepoint: 10691,\n      },\n      {\n        name: 'SQUARED RISING DIAGONAL SLASH',\n        value: '⧄',\n        codepoint: 10692,\n      },\n      {\n        name: 'SQUARED FALLING DIAGONAL SLASH',\n        value: '⧅',\n        codepoint: 10693,\n      },\n      {\n        name: 'SQUARED ASTERISK',\n        value: '⧆',\n        codepoint: 10694,\n      },\n      {\n        name: 'SQUARED SMALL CIRCLE',\n        value: '⧇',\n        codepoint: 10695,\n      },\n      {\n        name: 'SQUARED SQUARE',\n        value: '⧈',\n        codepoint: 10696,\n      },\n      {\n        name: 'TWO JOINED SQUARES',\n        value: '⧉',\n        codepoint: 10697,\n      },\n      {\n        name: 'TRIANGLE WITH DOT ABOVE',\n        value: '⧊',\n        codepoint: 10698,\n      },\n      {\n        name: 'TRIANGLE WITH UNDERBAR',\n        value: '⧋',\n        codepoint: 10699,\n      },\n      {\n        name: 'S IN TRIANGLE',\n        value: '⧌',\n        codepoint: 10700,\n      },\n      {\n        name: 'TRIANGLE WITH SERIFS AT BOTTOM',\n        value: '⧍',\n        codepoint: 10701,\n      },\n      {\n        name: 'RIGHT TRIANGLE ABOVE LEFT TRIANGLE',\n        value: '⧎',\n        codepoint: 10702,\n      },\n      {\n        name: 'LEFT TRIANGLE BESIDE VERTICAL BAR',\n        value: '⧏',\n        codepoint: 10703,\n      },\n      {\n        name: 'VERTICAL BAR BESIDE RIGHT TRIANGLE',\n        value: '⧐',\n        codepoint: 10704,\n      },\n      {\n        name: 'BOWTIE WITH LEFT HALF BLACK',\n        value: '⧑',\n        codepoint: 10705,\n      },\n      {\n        name: 'BOWTIE WITH RIGHT HALF BLACK',\n        value: '⧒',\n        codepoint: 10706,\n      },\n      {\n        name: 'BLACK BOWTIE',\n        value: '⧓',\n        codepoint: 10707,\n      },\n      {\n        name: 'TIMES WITH LEFT HALF BLACK',\n        value: '⧔',\n        codepoint: 10708,\n      },\n      {\n        name: 'TIMES WITH RIGHT HALF BLACK',\n        value: '⧕',\n        codepoint: 10709,\n      },\n      {\n        name: 'WHITE HOURGLASS',\n        value: '⧖',\n        codepoint: 10710,\n      },\n      {\n        name: 'BLACK HOURGLASS',\n        value: '⧗',\n        codepoint: 10711,\n      },\n      {\n        name: 'LEFT WIGGLY FENCE',\n        value: '⧘',\n        codepoint: 10712,\n      },\n      {\n        name: 'RIGHT WIGGLY FENCE',\n        value: '⧙',\n        codepoint: 10713,\n      },\n      {\n        name: 'LEFT DOUBLE WIGGLY FENCE',\n        value: '⧚',\n        codepoint: 10714,\n      },\n      {\n        name: 'RIGHT DOUBLE WIGGLY FENCE',\n        value: '⧛',\n        codepoint: 10715,\n      },\n      {\n        name: 'INCOMPLETE INFINITY',\n        value: '⧜',\n        codepoint: 10716,\n      },\n      {\n        name: 'TIE OVER INFINITY',\n        value: '⧝',\n        codepoint: 10717,\n      },\n      {\n        name: 'INFINITY NEGATED WITH VERTICAL BAR',\n        value: '⧞',\n        codepoint: 10718,\n      },\n      {\n        name: 'DOUBLE-ENDED MULTIMAP',\n        value: '⧟',\n        codepoint: 10719,\n      },\n      {\n        name: 'SQUARE WITH CONTOURED OUTLINE',\n        value: '⧠',\n        codepoint: 10720,\n      },\n      {\n        name: 'INCREASES AS',\n        value: '⧡',\n        codepoint: 10721,\n      },\n      {\n        name: 'SHUFFLE PRODUCT',\n        value: '⧢',\n        codepoint: 10722,\n      },\n      {\n        name: 'EQUALS SIGN AND SLANTED PARALLEL',\n        value: '⧣',\n        codepoint: 10723,\n      },\n      {\n        name: 'EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE',\n        value: '⧤',\n        codepoint: 10724,\n      },\n      {\n        name: 'IDENTICAL TO AND SLANTED PARALLEL',\n        value: '⧥',\n        codepoint: 10725,\n      },\n      {\n        name: 'GLEICH STARK',\n        value: '⧦',\n        codepoint: 10726,\n      },\n      {\n        name: 'THERMODYNAMIC',\n        value: '⧧',\n        codepoint: 10727,\n      },\n      {\n        name: 'DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK',\n        value: '⧨',\n        codepoint: 10728,\n      },\n      {\n        name: 'DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK',\n        value: '⧩',\n        codepoint: 10729,\n      },\n      {\n        name: 'BLACK DIAMOND WITH DOWN ARROW',\n        value: '⧪',\n        codepoint: 10730,\n      },\n      {\n        name: 'BLACK LOZENGE',\n        value: '⧫',\n        codepoint: 10731,\n      },\n      {\n        name: 'WHITE CIRCLE WITH DOWN ARROW',\n        value: '⧬',\n        codepoint: 10732,\n      },\n      {\n        name: 'BLACK CIRCLE WITH DOWN ARROW',\n        value: '⧭',\n        codepoint: 10733,\n      },\n      {\n        name: 'ERROR-BARRED WHITE SQUARE',\n        value: '⧮',\n        codepoint: 10734,\n      },\n      {\n        name: 'ERROR-BARRED BLACK SQUARE',\n        value: '⧯',\n        codepoint: 10735,\n      },\n      {\n        name: 'ERROR-BARRED WHITE DIAMOND',\n        value: '⧰',\n        codepoint: 10736,\n      },\n      {\n        name: 'ERROR-BARRED BLACK DIAMOND',\n        value: '⧱',\n        codepoint: 10737,\n      },\n      {\n        name: 'ERROR-BARRED WHITE CIRCLE',\n        value: '⧲',\n        codepoint: 10738,\n      },\n      {\n        name: 'ERROR-BARRED BLACK CIRCLE',\n        value: '⧳',\n        codepoint: 10739,\n      },\n      {\n        name: 'RULE-DELAYED',\n        value: '⧴',\n        codepoint: 10740,\n      },\n      {\n        name: 'REVERSE SOLIDUS OPERATOR',\n        value: '⧵',\n        codepoint: 10741,\n      },\n      {\n        name: 'SOLIDUS WITH OVERBAR',\n        value: '⧶',\n        codepoint: 10742,\n      },\n      {\n        name: 'REVERSE SOLIDUS WITH HORIZONTAL STROKE',\n        value: '⧷',\n        codepoint: 10743,\n      },\n      {\n        name: 'BIG SOLIDUS',\n        value: '⧸',\n        codepoint: 10744,\n      },\n      {\n        name: 'BIG REVERSE SOLIDUS',\n        value: '⧹',\n        codepoint: 10745,\n      },\n      {\n        name: 'DOUBLE PLUS',\n        value: '⧺',\n        codepoint: 10746,\n      },\n      {\n        name: 'TRIPLE PLUS',\n        value: '⧻',\n        codepoint: 10747,\n      },\n      {\n        name: 'LEFT-POINTING CURVED ANGLE BRACKET',\n        value: '⧼',\n        codepoint: 10748,\n      },\n      {\n        name: 'RIGHT-POINTING CURVED ANGLE BRACKET',\n        value: '⧽',\n        codepoint: 10749,\n      },\n      {\n        name: 'TINY',\n        value: '⧾',\n        codepoint: 10750,\n      },\n      {\n        name: 'MINY',\n        value: '⧿',\n        codepoint: 10751,\n      },\n      {\n        name: 'N-ARY CIRCLED DOT OPERATOR',\n        value: '⨀',\n        codepoint: 10752,\n      },\n      {\n        name: 'N-ARY CIRCLED PLUS OPERATOR',\n        value: '⨁',\n        codepoint: 10753,\n      },\n      {\n        name: 'N-ARY CIRCLED TIMES OPERATOR',\n        value: '⨂',\n        codepoint: 10754,\n      },\n      {\n        name: 'N-ARY UNION OPERATOR WITH DOT',\n        value: '⨃',\n        codepoint: 10755,\n      },\n      {\n        name: 'N-ARY UNION OPERATOR WITH PLUS',\n        value: '⨄',\n        codepoint: 10756,\n      },\n      {\n        name: 'N-ARY SQUARE INTERSECTION OPERATOR',\n        value: '⨅',\n        codepoint: 10757,\n      },\n      {\n        name: 'N-ARY SQUARE UNION OPERATOR',\n        value: '⨆',\n        codepoint: 10758,\n      },\n      {\n        name: 'TWO LOGICAL AND OPERATOR',\n        value: '⨇',\n        codepoint: 10759,\n      },\n      {\n        name: 'TWO LOGICAL OR OPERATOR',\n        value: '⨈',\n        codepoint: 10760,\n      },\n      {\n        name: 'N-ARY TIMES OPERATOR',\n        value: '⨉',\n        codepoint: 10761,\n      },\n      {\n        name: 'MODULO TWO SUM',\n        value: '⨊',\n        codepoint: 10762,\n      },\n      {\n        name: 'SUMMATION WITH INTEGRAL',\n        value: '⨋',\n        codepoint: 10763,\n      },\n      {\n        name: 'QUADRUPLE INTEGRAL OPERATOR',\n        value: '⨌',\n        codepoint: 10764,\n      },\n      {\n        name: 'FINITE PART INTEGRAL',\n        value: '⨍',\n        codepoint: 10765,\n      },\n      {\n        name: 'INTEGRAL WITH DOUBLE STROKE',\n        value: '⨎',\n        codepoint: 10766,\n      },\n      {\n        name: 'INTEGRAL AVERAGE WITH SLASH',\n        value: '⨏',\n        codepoint: 10767,\n      },\n      {\n        name: 'CIRCULATION FUNCTION',\n        value: '⨐',\n        codepoint: 10768,\n      },\n      {\n        name: 'ANTICLOCKWISE INTEGRATION',\n        value: '⨑',\n        codepoint: 10769,\n      },\n      {\n        name: 'LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE',\n        value: '⨒',\n        codepoint: 10770,\n      },\n      {\n        name: 'LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE',\n        value: '⨓',\n        codepoint: 10771,\n      },\n      {\n        name: 'LINE INTEGRATION NOT INCLUDING THE POLE',\n        value: '⨔',\n        codepoint: 10772,\n      },\n      {\n        name: 'INTEGRAL AROUND A POINT OPERATOR',\n        value: '⨕',\n        codepoint: 10773,\n      },\n      {\n        name: 'QUATERNION INTEGRAL OPERATOR',\n        value: '⨖',\n        codepoint: 10774,\n      },\n      {\n        name: 'INTEGRAL WITH LEFTWARDS ARROW WITH HOOK',\n        value: '⨗',\n        codepoint: 10775,\n      },\n      {\n        name: 'INTEGRAL WITH TIMES SIGN',\n        value: '⨘',\n        codepoint: 10776,\n      },\n      {\n        name: 'INTEGRAL WITH INTERSECTION',\n        value: '⨙',\n        codepoint: 10777,\n      },\n      {\n        name: 'INTEGRAL WITH UNION',\n        value: '⨚',\n        codepoint: 10778,\n      },\n      {\n        name: 'INTEGRAL WITH OVERBAR',\n        value: '⨛',\n        codepoint: 10779,\n      },\n      {\n        name: 'INTEGRAL WITH UNDERBAR',\n        value: '⨜',\n        codepoint: 10780,\n      },\n      {\n        name: 'JOIN',\n        value: '⨝',\n        codepoint: 10781,\n      },\n      {\n        name: 'LARGE LEFT TRIANGLE OPERATOR',\n        value: '⨞',\n        codepoint: 10782,\n      },\n      {\n        name: 'Z NOTATION SCHEMA COMPOSITION',\n        value: '⨟',\n        codepoint: 10783,\n      },\n      {\n        name: 'Z NOTATION SCHEMA PIPING',\n        value: '⨠',\n        codepoint: 10784,\n      },\n      {\n        name: 'Z NOTATION SCHEMA PROJECTION',\n        value: '⨡',\n        codepoint: 10785,\n      },\n      {\n        name: 'PLUS SIGN WITH SMALL CIRCLE ABOVE',\n        value: '⨢',\n        codepoint: 10786,\n      },\n      {\n        name: 'PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE',\n        value: '⨣',\n        codepoint: 10787,\n      },\n      {\n        name: 'PLUS SIGN WITH TILDE ABOVE',\n        value: '⨤',\n        codepoint: 10788,\n      },\n      {\n        name: 'PLUS SIGN WITH DOT BELOW',\n        value: '⨥',\n        codepoint: 10789,\n      },\n      {\n        name: 'PLUS SIGN WITH TILDE BELOW',\n        value: '⨦',\n        codepoint: 10790,\n      },\n      {\n        name: 'PLUS SIGN WITH SUBSCRIPT TWO',\n        value: '⨧',\n        codepoint: 10791,\n      },\n      {\n        name: 'PLUS SIGN WITH BLACK TRIANGLE',\n        value: '⨨',\n        codepoint: 10792,\n      },\n      {\n        name: 'MINUS SIGN WITH COMMA ABOVE',\n        value: '⨩',\n        codepoint: 10793,\n      },\n      {\n        name: 'MINUS SIGN WITH DOT BELOW',\n        value: '⨪',\n        codepoint: 10794,\n      },\n      {\n        name: 'MINUS SIGN WITH FALLING DOTS',\n        value: '⨫',\n        codepoint: 10795,\n      },\n      {\n        name: 'MINUS SIGN WITH RISING DOTS',\n        value: '⨬',\n        codepoint: 10796,\n      },\n      {\n        name: 'PLUS SIGN IN LEFT HALF CIRCLE',\n        value: '⨭',\n        codepoint: 10797,\n      },\n      {\n        name: 'PLUS SIGN IN RIGHT HALF CIRCLE',\n        value: '⨮',\n        codepoint: 10798,\n      },\n      {\n        name: 'VECTOR OR CROSS PRODUCT',\n        value: '⨯',\n        codepoint: 10799,\n      },\n      {\n        name: 'MULTIPLICATION SIGN WITH DOT ABOVE',\n        value: '⨰',\n        codepoint: 10800,\n      },\n      {\n        name: 'MULTIPLICATION SIGN WITH UNDERBAR',\n        value: '⨱',\n        codepoint: 10801,\n      },\n      {\n        name: 'SEMIDIRECT PRODUCT WITH BOTTOM CLOSED',\n        value: '⨲',\n        codepoint: 10802,\n      },\n      {\n        name: 'SMASH PRODUCT',\n        value: '⨳',\n        codepoint: 10803,\n      },\n      {\n        name: 'MULTIPLICATION SIGN IN LEFT HALF CIRCLE',\n        value: '⨴',\n        codepoint: 10804,\n      },\n      {\n        name: 'MULTIPLICATION SIGN IN RIGHT HALF CIRCLE',\n        value: '⨵',\n        codepoint: 10805,\n      },\n      {\n        name: 'CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT',\n        value: '⨶',\n        codepoint: 10806,\n      },\n      {\n        name: 'MULTIPLICATION SIGN IN DOUBLE CIRCLE',\n        value: '⨷',\n        codepoint: 10807,\n      },\n      {\n        name: 'CIRCLED DIVISION SIGN',\n        value: '⨸',\n        codepoint: 10808,\n      },\n      {\n        name: 'PLUS SIGN IN TRIANGLE',\n        value: '⨹',\n        codepoint: 10809,\n      },\n      {\n        name: 'MINUS SIGN IN TRIANGLE',\n        value: '⨺',\n        codepoint: 10810,\n      },\n      {\n        name: 'MULTIPLICATION SIGN IN TRIANGLE',\n        value: '⨻',\n        codepoint: 10811,\n      },\n      {\n        name: 'INTERIOR PRODUCT',\n        value: '⨼',\n        codepoint: 10812,\n      },\n      {\n        name: 'RIGHTHAND INTERIOR PRODUCT',\n        value: '⨽',\n        codepoint: 10813,\n      },\n      {\n        name: 'Z NOTATION RELATIONAL COMPOSITION',\n        value: '⨾',\n        codepoint: 10814,\n      },\n      {\n        name: 'AMALGAMATION OR COPRODUCT',\n        value: '⨿',\n        codepoint: 10815,\n      },\n      {\n        name: 'INTERSECTION WITH DOT',\n        value: '⩀',\n        codepoint: 10816,\n      },\n      {\n        name: 'UNION WITH MINUS SIGN',\n        value: '⩁',\n        codepoint: 10817,\n      },\n      {\n        name: 'UNION WITH OVERBAR',\n        value: '⩂',\n        codepoint: 10818,\n      },\n      {\n        name: 'INTERSECTION WITH OVERBAR',\n        value: '⩃',\n        codepoint: 10819,\n      },\n      {\n        name: 'INTERSECTION WITH LOGICAL AND',\n        value: '⩄',\n        codepoint: 10820,\n      },\n      {\n        name: 'UNION WITH LOGICAL OR',\n        value: '⩅',\n        codepoint: 10821,\n      },\n      {\n        name: 'UNION ABOVE INTERSECTION',\n        value: '⩆',\n        codepoint: 10822,\n      },\n      {\n        name: 'INTERSECTION ABOVE UNION',\n        value: '⩇',\n        codepoint: 10823,\n      },\n      {\n        name: 'UNION ABOVE BAR ABOVE INTERSECTION',\n        value: '⩈',\n        codepoint: 10824,\n      },\n      {\n        name: 'INTERSECTION ABOVE BAR ABOVE UNION',\n        value: '⩉',\n        codepoint: 10825,\n      },\n      {\n        name: 'UNION BESIDE AND JOINED WITH UNION',\n        value: '⩊',\n        codepoint: 10826,\n      },\n      {\n        name: 'INTERSECTION BESIDE AND JOINED WITH INTERSECTION',\n        value: '⩋',\n        codepoint: 10827,\n      },\n      {\n        name: 'CLOSED UNION WITH SERIFS',\n        value: '⩌',\n        codepoint: 10828,\n      },\n      {\n        name: 'CLOSED INTERSECTION WITH SERIFS',\n        value: '⩍',\n        codepoint: 10829,\n      },\n      {\n        name: 'DOUBLE SQUARE INTERSECTION',\n        value: '⩎',\n        codepoint: 10830,\n      },\n      {\n        name: 'DOUBLE SQUARE UNION',\n        value: '⩏',\n        codepoint: 10831,\n      },\n      {\n        name: 'CLOSED UNION WITH SERIFS AND SMASH PRODUCT',\n        value: '⩐',\n        codepoint: 10832,\n      },\n      {\n        name: 'LOGICAL AND WITH DOT ABOVE',\n        value: '⩑',\n        codepoint: 10833,\n      },\n      {\n        name: 'LOGICAL OR WITH DOT ABOVE',\n        value: '⩒',\n        codepoint: 10834,\n      },\n      {\n        name: 'DOUBLE LOGICAL AND',\n        value: '⩓',\n        codepoint: 10835,\n      },\n      {\n        name: 'DOUBLE LOGICAL OR',\n        value: '⩔',\n        codepoint: 10836,\n      },\n      {\n        name: 'TWO INTERSECTING LOGICAL AND',\n        value: '⩕',\n        codepoint: 10837,\n      },\n      {\n        name: 'TWO INTERSECTING LOGICAL OR',\n        value: '⩖',\n        codepoint: 10838,\n      },\n      {\n        name: 'SLOPING LARGE OR',\n        value: '⩗',\n        codepoint: 10839,\n      },\n      {\n        name: 'SLOPING LARGE AND',\n        value: '⩘',\n        codepoint: 10840,\n      },\n      {\n        name: 'LOGICAL OR OVERLAPPING LOGICAL AND',\n        value: '⩙',\n        codepoint: 10841,\n      },\n      {\n        name: 'LOGICAL AND WITH MIDDLE STEM',\n        value: '⩚',\n        codepoint: 10842,\n      },\n      {\n        name: 'LOGICAL OR WITH MIDDLE STEM',\n        value: '⩛',\n        codepoint: 10843,\n      },\n      {\n        name: 'LOGICAL AND WITH HORIZONTAL DASH',\n        value: '⩜',\n        codepoint: 10844,\n      },\n      {\n        name: 'LOGICAL OR WITH HORIZONTAL DASH',\n        value: '⩝',\n        codepoint: 10845,\n      },\n      {\n        name: 'LOGICAL AND WITH DOUBLE OVERBAR',\n        value: '⩞',\n        codepoint: 10846,\n      },\n      {\n        name: 'LOGICAL AND WITH UNDERBAR',\n        value: '⩟',\n        codepoint: 10847,\n      },\n      {\n        name: 'LOGICAL AND WITH DOUBLE UNDERBAR',\n        value: '⩠',\n        codepoint: 10848,\n      },\n      {\n        name: 'SMALL VEE WITH UNDERBAR',\n        value: '⩡',\n        codepoint: 10849,\n      },\n      {\n        name: 'LOGICAL OR WITH DOUBLE OVERBAR',\n        value: '⩢',\n        codepoint: 10850,\n      },\n      {\n        name: 'LOGICAL OR WITH DOUBLE UNDERBAR',\n        value: '⩣',\n        codepoint: 10851,\n      },\n      {\n        name: 'Z NOTATION DOMAIN ANTIRESTRICTION',\n        value: '⩤',\n        codepoint: 10852,\n      },\n      {\n        name: 'Z NOTATION RANGE ANTIRESTRICTION',\n        value: '⩥',\n        codepoint: 10853,\n      },\n      {\n        name: 'EQUALS SIGN WITH DOT BELOW',\n        value: '⩦',\n        codepoint: 10854,\n      },\n      {\n        name: 'IDENTICAL WITH DOT ABOVE',\n        value: '⩧',\n        codepoint: 10855,\n      },\n      {\n        name: 'TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE',\n        value: '⩨',\n        codepoint: 10856,\n      },\n      {\n        name: 'TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE',\n        value: '⩩',\n        codepoint: 10857,\n      },\n      {\n        name: 'TILDE OPERATOR WITH DOT ABOVE',\n        value: '⩪',\n        codepoint: 10858,\n      },\n      {\n        name: 'TILDE OPERATOR WITH RISING DOTS',\n        value: '⩫',\n        codepoint: 10859,\n      },\n      {\n        name: 'SIMILAR MINUS SIMILAR',\n        value: '⩬',\n        codepoint: 10860,\n      },\n      {\n        name: 'CONGRUENT WITH DOT ABOVE',\n        value: '⩭',\n        codepoint: 10861,\n      },\n      {\n        name: 'EQUALS WITH ASTERISK',\n        value: '⩮',\n        codepoint: 10862,\n      },\n      {\n        name: 'ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT',\n        value: '⩯',\n        codepoint: 10863,\n      },\n      {\n        name: 'APPROXIMATELY EQUAL OR EQUAL TO',\n        value: '⩰',\n        codepoint: 10864,\n      },\n      {\n        name: 'EQUALS SIGN ABOVE PLUS SIGN',\n        value: '⩱',\n        codepoint: 10865,\n      },\n      {\n        name: 'PLUS SIGN ABOVE EQUALS SIGN',\n        value: '⩲',\n        codepoint: 10866,\n      },\n      {\n        name: 'EQUALS SIGN ABOVE TILDE OPERATOR',\n        value: '⩳',\n        codepoint: 10867,\n      },\n      {\n        name: 'DOUBLE COLON EQUAL',\n        value: '⩴',\n        codepoint: 10868,\n      },\n      {\n        name: 'TWO CONSECUTIVE EQUALS SIGNS',\n        value: '⩵',\n        codepoint: 10869,\n      },\n      {\n        name: 'THREE CONSECUTIVE EQUALS SIGNS',\n        value: '⩶',\n        codepoint: 10870,\n      },\n      {\n        name: 'EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW',\n        value: '⩷',\n        codepoint: 10871,\n      },\n      {\n        name: 'EQUIVALENT WITH FOUR DOTS ABOVE',\n        value: '⩸',\n        codepoint: 10872,\n      },\n      {\n        name: 'LESS-THAN WITH CIRCLE INSIDE',\n        value: '⩹',\n        codepoint: 10873,\n      },\n      {\n        name: 'GREATER-THAN WITH CIRCLE INSIDE',\n        value: '⩺',\n        codepoint: 10874,\n      },\n      {\n        name: 'LESS-THAN WITH QUESTION MARK ABOVE',\n        value: '⩻',\n        codepoint: 10875,\n      },\n      {\n        name: 'GREATER-THAN WITH QUESTION MARK ABOVE',\n        value: '⩼',\n        codepoint: 10876,\n      },\n      {\n        name: 'LESS-THAN OR SLANTED EQUAL TO',\n        value: '⩽',\n        codepoint: 10877,\n      },\n      {\n        name: 'GREATER-THAN OR SLANTED EQUAL TO',\n        value: '⩾',\n        codepoint: 10878,\n      },\n      {\n        name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE',\n        value: '⩿',\n        codepoint: 10879,\n      },\n      {\n        name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE',\n        value: '⪀',\n        codepoint: 10880,\n      },\n      {\n        name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE',\n        value: '⪁',\n        codepoint: 10881,\n      },\n      {\n        name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE',\n        value: '⪂',\n        codepoint: 10882,\n      },\n      {\n        name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT',\n        value: '⪃',\n        codepoint: 10883,\n      },\n      {\n        name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT',\n        value: '⪄',\n        codepoint: 10884,\n      },\n      {\n        name: 'LESS-THAN OR APPROXIMATE',\n        value: '⪅',\n        codepoint: 10885,\n      },\n      {\n        name: 'GREATER-THAN OR APPROXIMATE',\n        value: '⪆',\n        codepoint: 10886,\n      },\n      {\n        name: 'LESS-THAN AND SINGLE-LINE NOT EQUAL TO',\n        value: '⪇',\n        codepoint: 10887,\n      },\n      {\n        name: 'GREATER-THAN AND SINGLE-LINE NOT EQUAL TO',\n        value: '⪈',\n        codepoint: 10888,\n      },\n      {\n        name: 'LESS-THAN AND NOT APPROXIMATE',\n        value: '⪉',\n        codepoint: 10889,\n      },\n      {\n        name: 'GREATER-THAN AND NOT APPROXIMATE',\n        value: '⪊',\n        codepoint: 10890,\n      },\n      {\n        name: 'LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN',\n        value: '⪋',\n        codepoint: 10891,\n      },\n      {\n        name: 'GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN',\n        value: '⪌',\n        codepoint: 10892,\n      },\n      {\n        name: 'LESS-THAN ABOVE SIMILAR OR EQUAL',\n        value: '⪍',\n        codepoint: 10893,\n      },\n      {\n        name: 'GREATER-THAN ABOVE SIMILAR OR EQUAL',\n        value: '⪎',\n        codepoint: 10894,\n      },\n      {\n        name: 'LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN',\n        value: '⪏',\n        codepoint: 10895,\n      },\n      {\n        name: 'GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN',\n        value: '⪐',\n        codepoint: 10896,\n      },\n      {\n        name: 'LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL',\n        value: '⪑',\n        codepoint: 10897,\n      },\n      {\n        name: 'GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL',\n        value: '⪒',\n        codepoint: 10898,\n      },\n      {\n        name: 'LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL',\n        value: '⪓',\n        codepoint: 10899,\n      },\n      {\n        name: 'GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL',\n        value: '⪔',\n        codepoint: 10900,\n      },\n      {\n        name: 'SLANTED EQUAL TO OR LESS-THAN',\n        value: '⪕',\n        codepoint: 10901,\n      },\n      {\n        name: 'SLANTED EQUAL TO OR GREATER-THAN',\n        value: '⪖',\n        codepoint: 10902,\n      },\n      {\n        name: 'SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE',\n        value: '⪗',\n        codepoint: 10903,\n      },\n      {\n        name: 'SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE',\n        value: '⪘',\n        codepoint: 10904,\n      },\n      {\n        name: 'DOUBLE-LINE EQUAL TO OR LESS-THAN',\n        value: '⪙',\n        codepoint: 10905,\n      },\n      {\n        name: 'DOUBLE-LINE EQUAL TO OR GREATER-THAN',\n        value: '⪚',\n        codepoint: 10906,\n      },\n      {\n        name: 'DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN',\n        value: '⪛',\n        codepoint: 10907,\n      },\n      {\n        name: 'DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN',\n        value: '⪜',\n        codepoint: 10908,\n      },\n      {\n        name: 'SIMILAR OR LESS-THAN',\n        value: '⪝',\n        codepoint: 10909,\n      },\n      {\n        name: 'SIMILAR OR GREATER-THAN',\n        value: '⪞',\n        codepoint: 10910,\n      },\n      {\n        name: 'SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN',\n        value: '⪟',\n        codepoint: 10911,\n      },\n      {\n        name: 'SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN',\n        value: '⪠',\n        codepoint: 10912,\n      },\n      {\n        name: 'DOUBLE NESTED LESS-THAN',\n        value: '⪡',\n        codepoint: 10913,\n      },\n      {\n        name: 'DOUBLE NESTED GREATER-THAN',\n        value: '⪢',\n        codepoint: 10914,\n      },\n      {\n        name: 'DOUBLE NESTED LESS-THAN WITH UNDERBAR',\n        value: '⪣',\n        codepoint: 10915,\n      },\n      {\n        name: 'GREATER-THAN OVERLAPPING LESS-THAN',\n        value: '⪤',\n        codepoint: 10916,\n      },\n      {\n        name: 'GREATER-THAN BESIDE LESS-THAN',\n        value: '⪥',\n        codepoint: 10917,\n      },\n      {\n        name: 'LESS-THAN CLOSED BY CURVE',\n        value: '⪦',\n        codepoint: 10918,\n      },\n      {\n        name: 'GREATER-THAN CLOSED BY CURVE',\n        value: '⪧',\n        codepoint: 10919,\n      },\n      {\n        name: 'LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL',\n        value: '⪨',\n        codepoint: 10920,\n      },\n      {\n        name: 'GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL',\n        value: '⪩',\n        codepoint: 10921,\n      },\n      {\n        name: 'SMALLER THAN',\n        value: '⪪',\n        codepoint: 10922,\n      },\n      {\n        name: 'LARGER THAN',\n        value: '⪫',\n        codepoint: 10923,\n      },\n      {\n        name: 'SMALLER THAN OR EQUAL TO',\n        value: '⪬',\n        codepoint: 10924,\n      },\n      {\n        name: 'LARGER THAN OR EQUAL TO',\n        value: '⪭',\n        codepoint: 10925,\n      },\n      {\n        name: 'EQUALS SIGN WITH BUMPY ABOVE',\n        value: '⪮',\n        codepoint: 10926,\n      },\n      {\n        name: 'PRECEDES ABOVE SINGLE-LINE EQUALS SIGN',\n        value: '⪯',\n        codepoint: 10927,\n      },\n      {\n        name: 'SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN',\n        value: '⪰',\n        codepoint: 10928,\n      },\n      {\n        name: 'PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO',\n        value: '⪱',\n        codepoint: 10929,\n      },\n      {\n        name: 'SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO',\n        value: '⪲',\n        codepoint: 10930,\n      },\n      {\n        name: 'PRECEDES ABOVE EQUALS SIGN',\n        value: '⪳',\n        codepoint: 10931,\n      },\n      {\n        name: 'SUCCEEDS ABOVE EQUALS SIGN',\n        value: '⪴',\n        codepoint: 10932,\n      },\n      {\n        name: 'PRECEDES ABOVE NOT EQUAL TO',\n        value: '⪵',\n        codepoint: 10933,\n      },\n      {\n        name: 'SUCCEEDS ABOVE NOT EQUAL TO',\n        value: '⪶',\n        codepoint: 10934,\n      },\n      {\n        name: 'PRECEDES ABOVE ALMOST EQUAL TO',\n        value: '⪷',\n        codepoint: 10935,\n      },\n      {\n        name: 'SUCCEEDS ABOVE ALMOST EQUAL TO',\n        value: '⪸',\n        codepoint: 10936,\n      },\n      {\n        name: 'PRECEDES ABOVE NOT ALMOST EQUAL TO',\n        value: '⪹',\n        codepoint: 10937,\n      },\n      {\n        name: 'SUCCEEDS ABOVE NOT ALMOST EQUAL TO',\n        value: '⪺',\n        codepoint: 10938,\n      },\n      {\n        name: 'DOUBLE PRECEDES',\n        value: '⪻',\n        codepoint: 10939,\n      },\n      {\n        name: 'DOUBLE SUCCEEDS',\n        value: '⪼',\n        codepoint: 10940,\n      },\n      {\n        name: 'SUBSET WITH DOT',\n        value: '⪽',\n        codepoint: 10941,\n      },\n      {\n        name: 'SUPERSET WITH DOT',\n        value: '⪾',\n        codepoint: 10942,\n      },\n      {\n        name: 'SUBSET WITH PLUS SIGN BELOW',\n        value: '⪿',\n        codepoint: 10943,\n      },\n      {\n        name: 'SUPERSET WITH PLUS SIGN BELOW',\n        value: '⫀',\n        codepoint: 10944,\n      },\n      {\n        name: 'SUBSET WITH MULTIPLICATION SIGN BELOW',\n        value: '⫁',\n        codepoint: 10945,\n      },\n      {\n        name: 'SUPERSET WITH MULTIPLICATION SIGN BELOW',\n        value: '⫂',\n        codepoint: 10946,\n      },\n      {\n        name: 'SUBSET OF OR EQUAL TO WITH DOT ABOVE',\n        value: '⫃',\n        codepoint: 10947,\n      },\n      {\n        name: 'SUPERSET OF OR EQUAL TO WITH DOT ABOVE',\n        value: '⫄',\n        codepoint: 10948,\n      },\n      {\n        name: 'SUBSET OF ABOVE EQUALS SIGN',\n        value: '⫅',\n        codepoint: 10949,\n      },\n      {\n        name: 'SUPERSET OF ABOVE EQUALS SIGN',\n        value: '⫆',\n        codepoint: 10950,\n      },\n      {\n        name: 'SUBSET OF ABOVE TILDE OPERATOR',\n        value: '⫇',\n        codepoint: 10951,\n      },\n      {\n        name: 'SUPERSET OF ABOVE TILDE OPERATOR',\n        value: '⫈',\n        codepoint: 10952,\n      },\n      {\n        name: 'SUBSET OF ABOVE ALMOST EQUAL TO',\n        value: '⫉',\n        codepoint: 10953,\n      },\n      {\n        name: 'SUPERSET OF ABOVE ALMOST EQUAL TO',\n        value: '⫊',\n        codepoint: 10954,\n      },\n      {\n        name: 'SUBSET OF ABOVE NOT EQUAL TO',\n        value: '⫋',\n        codepoint: 10955,\n      },\n      {\n        name: 'SUPERSET OF ABOVE NOT EQUAL TO',\n        value: '⫌',\n        codepoint: 10956,\n      },\n      {\n        name: 'SQUARE LEFT OPEN BOX OPERATOR',\n        value: '⫍',\n        codepoint: 10957,\n      },\n      {\n        name: 'SQUARE RIGHT OPEN BOX OPERATOR',\n        value: '⫎',\n        codepoint: 10958,\n      },\n      {\n        name: 'CLOSED SUBSET',\n        value: '⫏',\n        codepoint: 10959,\n      },\n      {\n        name: 'CLOSED SUPERSET',\n        value: '⫐',\n        codepoint: 10960,\n      },\n      {\n        name: 'CLOSED SUBSET OR EQUAL TO',\n        value: '⫑',\n        codepoint: 10961,\n      },\n      {\n        name: 'CLOSED SUPERSET OR EQUAL TO',\n        value: '⫒',\n        codepoint: 10962,\n      },\n      {\n        name: 'SUBSET ABOVE SUPERSET',\n        value: '⫓',\n        codepoint: 10963,\n      },\n      {\n        name: 'SUPERSET ABOVE SUBSET',\n        value: '⫔',\n        codepoint: 10964,\n      },\n      {\n        name: 'SUBSET ABOVE SUBSET',\n        value: '⫕',\n        codepoint: 10965,\n      },\n      {\n        name: 'SUPERSET ABOVE SUPERSET',\n        value: '⫖',\n        codepoint: 10966,\n      },\n      {\n        name: 'SUPERSET BESIDE SUBSET',\n        value: '⫗',\n        codepoint: 10967,\n      },\n      {\n        name: 'SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET',\n        value: '⫘',\n        codepoint: 10968,\n      },\n      {\n        name: 'ELEMENT OF OPENING DOWNWARDS',\n        value: '⫙',\n        codepoint: 10969,\n      },\n      {\n        name: 'PITCHFORK WITH TEE TOP',\n        value: '⫚',\n        codepoint: 10970,\n      },\n      {\n        name: 'TRANSVERSAL INTERSECTION',\n        value: '⫛',\n        codepoint: 10971,\n      },\n      {\n        name: 'FORKING',\n        value: '⫝̸',\n        codepoint: 10972,\n      },\n      {\n        name: 'NONFORKING',\n        value: '⫝',\n        codepoint: 10973,\n      },\n      {\n        name: 'SHORT LEFT TACK',\n        value: '⫞',\n        codepoint: 10974,\n      },\n      {\n        name: 'SHORT DOWN TACK',\n        value: '⫟',\n        codepoint: 10975,\n      },\n      {\n        name: 'SHORT UP TACK',\n        value: '⫠',\n        codepoint: 10976,\n      },\n      {\n        name: 'PERPENDICULAR WITH S',\n        value: '⫡',\n        codepoint: 10977,\n      },\n      {\n        name: 'VERTICAL BAR TRIPLE RIGHT TURNSTILE',\n        value: '⫢',\n        codepoint: 10978,\n      },\n      {\n        name: 'DOUBLE VERTICAL BAR LEFT TURNSTILE',\n        value: '⫣',\n        codepoint: 10979,\n      },\n      {\n        name: 'VERTICAL BAR DOUBLE LEFT TURNSTILE',\n        value: '⫤',\n        codepoint: 10980,\n      },\n      {\n        name: 'DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE',\n        value: '⫥',\n        codepoint: 10981,\n      },\n      {\n        name: 'LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL',\n        value: '⫦',\n        codepoint: 10982,\n      },\n      {\n        name: 'SHORT DOWN TACK WITH OVERBAR',\n        value: '⫧',\n        codepoint: 10983,\n      },\n      {\n        name: 'SHORT UP TACK WITH UNDERBAR',\n        value: '⫨',\n        codepoint: 10984,\n      },\n      {\n        name: 'SHORT UP TACK ABOVE SHORT DOWN TACK',\n        value: '⫩',\n        codepoint: 10985,\n      },\n      {\n        name: 'DOUBLE DOWN TACK',\n        value: '⫪',\n        codepoint: 10986,\n      },\n      {\n        name: 'DOUBLE UP TACK',\n        value: '⫫',\n        codepoint: 10987,\n      },\n      {\n        name: 'DOUBLE STROKE NOT SIGN',\n        value: '⫬',\n        codepoint: 10988,\n      },\n      {\n        name: 'REVERSED DOUBLE STROKE NOT SIGN',\n        value: '⫭',\n        codepoint: 10989,\n      },\n      {\n        name: 'DOES NOT DIVIDE WITH REVERSED NEGATION SLASH',\n        value: '⫮',\n        codepoint: 10990,\n      },\n      {\n        name: 'VERTICAL LINE WITH CIRCLE ABOVE',\n        value: '⫯',\n        codepoint: 10991,\n      },\n      {\n        name: 'VERTICAL LINE WITH CIRCLE BELOW',\n        value: '⫰',\n        codepoint: 10992,\n      },\n      {\n        name: 'DOWN TACK WITH CIRCLE BELOW',\n        value: '⫱',\n        codepoint: 10993,\n      },\n      {\n        name: 'PARALLEL WITH HORIZONTAL STROKE',\n        value: '⫲',\n        codepoint: 10994,\n      },\n      {\n        name: 'PARALLEL WITH TILDE OPERATOR',\n        value: '⫳',\n        codepoint: 10995,\n      },\n      {\n        name: 'TRIPLE VERTICAL BAR BINARY RELATION',\n        value: '⫴',\n        codepoint: 10996,\n      },\n      {\n        name: 'TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE',\n        value: '⫵',\n        codepoint: 10997,\n      },\n      {\n        name: 'TRIPLE COLON OPERATOR',\n        value: '⫶',\n        codepoint: 10998,\n      },\n      {\n        name: 'TRIPLE NESTED LESS-THAN',\n        value: '⫷',\n        codepoint: 10999,\n      },\n      {\n        name: 'TRIPLE NESTED GREATER-THAN',\n        value: '⫸',\n        codepoint: 11000,\n      },\n      {\n        name: 'DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO',\n        value: '⫹',\n        codepoint: 11001,\n      },\n      {\n        name: 'DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO',\n        value: '⫺',\n        codepoint: 11002,\n      },\n      {\n        name: 'TRIPLE SOLIDUS BINARY RELATION',\n        value: '⫻',\n        codepoint: 11003,\n      },\n      {\n        name: 'LARGE TRIPLE VERTICAL BAR OPERATOR',\n        value: '⫼',\n        codepoint: 11004,\n      },\n      {\n        name: 'DOUBLE SOLIDUS OPERATOR',\n        value: '⫽',\n        codepoint: 11005,\n      },\n      {\n        name: 'WHITE VERTICAL BAR',\n        value: '⫾',\n        codepoint: 11006,\n      },\n      {\n        name: 'N-ARY WHITE VERTICAL BAR',\n        value: '⫿',\n        codepoint: 11007,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL A',\n        value: '𝐀',\n        codepoint: 119808,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL B',\n        value: '𝐁',\n        codepoint: 119809,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL C',\n        value: '𝐂',\n        codepoint: 119810,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL D',\n        value: '𝐃',\n        codepoint: 119811,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL E',\n        value: '𝐄',\n        codepoint: 119812,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL F',\n        value: '𝐅',\n        codepoint: 119813,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL G',\n        value: '𝐆',\n        codepoint: 119814,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL H',\n        value: '𝐇',\n        codepoint: 119815,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL I',\n        value: '𝐈',\n        codepoint: 119816,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL J',\n        value: '𝐉',\n        codepoint: 119817,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL K',\n        value: '𝐊',\n        codepoint: 119818,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL L',\n        value: '𝐋',\n        codepoint: 119819,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL M',\n        value: '𝐌',\n        codepoint: 119820,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL N',\n        value: '𝐍',\n        codepoint: 119821,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL O',\n        value: '𝐎',\n        codepoint: 119822,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL P',\n        value: '𝐏',\n        codepoint: 119823,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL Q',\n        value: '𝐐',\n        codepoint: 119824,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL R',\n        value: '𝐑',\n        codepoint: 119825,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL S',\n        value: '𝐒',\n        codepoint: 119826,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL T',\n        value: '𝐓',\n        codepoint: 119827,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL U',\n        value: '𝐔',\n        codepoint: 119828,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL V',\n        value: '𝐕',\n        codepoint: 119829,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL W',\n        value: '𝐖',\n        codepoint: 119830,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL X',\n        value: '𝐗',\n        codepoint: 119831,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL Y',\n        value: '𝐘',\n        codepoint: 119832,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL Z',\n        value: '𝐙',\n        codepoint: 119833,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL A',\n        value: '𝐚',\n        codepoint: 119834,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL B',\n        value: '𝐛',\n        codepoint: 119835,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL C',\n        value: '𝐜',\n        codepoint: 119836,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL D',\n        value: '𝐝',\n        codepoint: 119837,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL E',\n        value: '𝐞',\n        codepoint: 119838,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL F',\n        value: '𝐟',\n        codepoint: 119839,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL G',\n        value: '𝐠',\n        codepoint: 119840,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL H',\n        value: '𝐡',\n        codepoint: 119841,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL I',\n        value: '𝐢',\n        codepoint: 119842,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL J',\n        value: '𝐣',\n        codepoint: 119843,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL K',\n        value: '𝐤',\n        codepoint: 119844,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL L',\n        value: '𝐥',\n        codepoint: 119845,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL M',\n        value: '𝐦',\n        codepoint: 119846,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL N',\n        value: '𝐧',\n        codepoint: 119847,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL O',\n        value: '𝐨',\n        codepoint: 119848,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL P',\n        value: '𝐩',\n        codepoint: 119849,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL Q',\n        value: '𝐪',\n        codepoint: 119850,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL R',\n        value: '𝐫',\n        codepoint: 119851,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL S',\n        value: '𝐬',\n        codepoint: 119852,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL T',\n        value: '𝐭',\n        codepoint: 119853,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL U',\n        value: '𝐮',\n        codepoint: 119854,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL V',\n        value: '𝐯',\n        codepoint: 119855,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL W',\n        value: '𝐰',\n        codepoint: 119856,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL X',\n        value: '𝐱',\n        codepoint: 119857,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL Y',\n        value: '𝐲',\n        codepoint: 119858,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL Z',\n        value: '𝐳',\n        codepoint: 119859,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL A',\n        value: '𝐴',\n        codepoint: 119860,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL B',\n        value: '𝐵',\n        codepoint: 119861,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL C',\n        value: '𝐶',\n        codepoint: 119862,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL D',\n        value: '𝐷',\n        codepoint: 119863,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL E',\n        value: '𝐸',\n        codepoint: 119864,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL F',\n        value: '𝐹',\n        codepoint: 119865,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL G',\n        value: '𝐺',\n        codepoint: 119866,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL H',\n        value: '𝐻',\n        codepoint: 119867,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL I',\n        value: '𝐼',\n        codepoint: 119868,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL J',\n        value: '𝐽',\n        codepoint: 119869,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL K',\n        value: '𝐾',\n        codepoint: 119870,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL L',\n        value: '𝐿',\n        codepoint: 119871,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL M',\n        value: '𝑀',\n        codepoint: 119872,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL N',\n        value: '𝑁',\n        codepoint: 119873,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL O',\n        value: '𝑂',\n        codepoint: 119874,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL P',\n        value: '𝑃',\n        codepoint: 119875,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL Q',\n        value: '𝑄',\n        codepoint: 119876,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL R',\n        value: '𝑅',\n        codepoint: 119877,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL S',\n        value: '𝑆',\n        codepoint: 119878,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL T',\n        value: '𝑇',\n        codepoint: 119879,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL U',\n        value: '𝑈',\n        codepoint: 119880,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL V',\n        value: '𝑉',\n        codepoint: 119881,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL W',\n        value: '𝑊',\n        codepoint: 119882,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL X',\n        value: '𝑋',\n        codepoint: 119883,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL Y',\n        value: '𝑌',\n        codepoint: 119884,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL Z',\n        value: '𝑍',\n        codepoint: 119885,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL A',\n        value: '𝑎',\n        codepoint: 119886,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL B',\n        value: '𝑏',\n        codepoint: 119887,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL C',\n        value: '𝑐',\n        codepoint: 119888,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL D',\n        value: '𝑑',\n        codepoint: 119889,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL E',\n        value: '𝑒',\n        codepoint: 119890,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL F',\n        value: '𝑓',\n        codepoint: 119891,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL G',\n        value: '𝑔',\n        codepoint: 119892,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL I',\n        value: '𝑖',\n        codepoint: 119894,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL J',\n        value: '𝑗',\n        codepoint: 119895,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL K',\n        value: '𝑘',\n        codepoint: 119896,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL L',\n        value: '𝑙',\n        codepoint: 119897,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL M',\n        value: '𝑚',\n        codepoint: 119898,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL N',\n        value: '𝑛',\n        codepoint: 119899,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL O',\n        value: '𝑜',\n        codepoint: 119900,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL P',\n        value: '𝑝',\n        codepoint: 119901,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL Q',\n        value: '𝑞',\n        codepoint: 119902,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL R',\n        value: '𝑟',\n        codepoint: 119903,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL S',\n        value: '𝑠',\n        codepoint: 119904,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL T',\n        value: '𝑡',\n        codepoint: 119905,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL U',\n        value: '𝑢',\n        codepoint: 119906,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL V',\n        value: '𝑣',\n        codepoint: 119907,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL W',\n        value: '𝑤',\n        codepoint: 119908,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL X',\n        value: '𝑥',\n        codepoint: 119909,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL Y',\n        value: '𝑦',\n        codepoint: 119910,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL Z',\n        value: '𝑧',\n        codepoint: 119911,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL A',\n        value: '𝑨',\n        codepoint: 119912,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL B',\n        value: '𝑩',\n        codepoint: 119913,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL C',\n        value: '𝑪',\n        codepoint: 119914,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL D',\n        value: '𝑫',\n        codepoint: 119915,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL E',\n        value: '𝑬',\n        codepoint: 119916,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL F',\n        value: '𝑭',\n        codepoint: 119917,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL G',\n        value: '𝑮',\n        codepoint: 119918,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL H',\n        value: '𝑯',\n        codepoint: 119919,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL I',\n        value: '𝑰',\n        codepoint: 119920,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL J',\n        value: '𝑱',\n        codepoint: 119921,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL K',\n        value: '𝑲',\n        codepoint: 119922,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL L',\n        value: '𝑳',\n        codepoint: 119923,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL M',\n        value: '𝑴',\n        codepoint: 119924,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL N',\n        value: '𝑵',\n        codepoint: 119925,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL O',\n        value: '𝑶',\n        codepoint: 119926,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL P',\n        value: '𝑷',\n        codepoint: 119927,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL Q',\n        value: '𝑸',\n        codepoint: 119928,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL R',\n        value: '𝑹',\n        codepoint: 119929,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL S',\n        value: '𝑺',\n        codepoint: 119930,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL T',\n        value: '𝑻',\n        codepoint: 119931,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL U',\n        value: '𝑼',\n        codepoint: 119932,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL V',\n        value: '𝑽',\n        codepoint: 119933,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL W',\n        value: '𝑾',\n        codepoint: 119934,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL X',\n        value: '𝑿',\n        codepoint: 119935,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL Y',\n        value: '𝒀',\n        codepoint: 119936,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL Z',\n        value: '𝒁',\n        codepoint: 119937,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL A',\n        value: '𝒂',\n        codepoint: 119938,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL B',\n        value: '𝒃',\n        codepoint: 119939,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL C',\n        value: '𝒄',\n        codepoint: 119940,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL D',\n        value: '𝒅',\n        codepoint: 119941,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL E',\n        value: '𝒆',\n        codepoint: 119942,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL F',\n        value: '𝒇',\n        codepoint: 119943,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL G',\n        value: '𝒈',\n        codepoint: 119944,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL H',\n        value: '𝒉',\n        codepoint: 119945,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL I',\n        value: '𝒊',\n        codepoint: 119946,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL J',\n        value: '𝒋',\n        codepoint: 119947,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL K',\n        value: '𝒌',\n        codepoint: 119948,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL L',\n        value: '𝒍',\n        codepoint: 119949,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL M',\n        value: '𝒎',\n        codepoint: 119950,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL N',\n        value: '𝒏',\n        codepoint: 119951,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL O',\n        value: '𝒐',\n        codepoint: 119952,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL P',\n        value: '𝒑',\n        codepoint: 119953,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL Q',\n        value: '𝒒',\n        codepoint: 119954,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL R',\n        value: '𝒓',\n        codepoint: 119955,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL S',\n        value: '𝒔',\n        codepoint: 119956,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL T',\n        value: '𝒕',\n        codepoint: 119957,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL U',\n        value: '𝒖',\n        codepoint: 119958,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL V',\n        value: '𝒗',\n        codepoint: 119959,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL W',\n        value: '𝒘',\n        codepoint: 119960,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL X',\n        value: '𝒙',\n        codepoint: 119961,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL Y',\n        value: '𝒚',\n        codepoint: 119962,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL Z',\n        value: '𝒛',\n        codepoint: 119963,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL A',\n        value: '𝒜',\n        codepoint: 119964,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL C',\n        value: '𝒞',\n        codepoint: 119966,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL D',\n        value: '𝒟',\n        codepoint: 119967,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL G',\n        value: '𝒢',\n        codepoint: 119970,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL J',\n        value: '𝒥',\n        codepoint: 119973,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL K',\n        value: '𝒦',\n        codepoint: 119974,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL N',\n        value: '𝒩',\n        codepoint: 119977,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL O',\n        value: '𝒪',\n        codepoint: 119978,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL P',\n        value: '𝒫',\n        codepoint: 119979,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL Q',\n        value: '𝒬',\n        codepoint: 119980,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL S',\n        value: '𝒮',\n        codepoint: 119982,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL T',\n        value: '𝒯',\n        codepoint: 119983,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL U',\n        value: '𝒰',\n        codepoint: 119984,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL V',\n        value: '𝒱',\n        codepoint: 119985,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL W',\n        value: '𝒲',\n        codepoint: 119986,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL X',\n        value: '𝒳',\n        codepoint: 119987,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL Y',\n        value: '𝒴',\n        codepoint: 119988,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT CAPITAL Z',\n        value: '𝒵',\n        codepoint: 119989,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL A',\n        value: '𝒶',\n        codepoint: 119990,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL B',\n        value: '𝒷',\n        codepoint: 119991,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL C',\n        value: '𝒸',\n        codepoint: 119992,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL D',\n        value: '𝒹',\n        codepoint: 119993,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL F',\n        value: '𝒻',\n        codepoint: 119995,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL H',\n        value: '𝒽',\n        codepoint: 119997,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL I',\n        value: '𝒾',\n        codepoint: 119998,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL J',\n        value: '𝒿',\n        codepoint: 119999,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL K',\n        value: '𝓀',\n        codepoint: 120000,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL L',\n        value: '𝓁',\n        codepoint: 120001,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL M',\n        value: '𝓂',\n        codepoint: 120002,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL N',\n        value: '𝓃',\n        codepoint: 120003,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL P',\n        value: '𝓅',\n        codepoint: 120005,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL Q',\n        value: '𝓆',\n        codepoint: 120006,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL R',\n        value: '𝓇',\n        codepoint: 120007,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL S',\n        value: '𝓈',\n        codepoint: 120008,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL T',\n        value: '𝓉',\n        codepoint: 120009,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL U',\n        value: '𝓊',\n        codepoint: 120010,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL V',\n        value: '𝓋',\n        codepoint: 120011,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL W',\n        value: '𝓌',\n        codepoint: 120012,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL X',\n        value: '𝓍',\n        codepoint: 120013,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL Y',\n        value: '𝓎',\n        codepoint: 120014,\n      },\n      {\n        name: 'MATHEMATICAL SCRIPT SMALL Z',\n        value: '𝓏',\n        codepoint: 120015,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL A',\n        value: '𝓐',\n        codepoint: 120016,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL B',\n        value: '𝓑',\n        codepoint: 120017,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL C',\n        value: '𝓒',\n        codepoint: 120018,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL D',\n        value: '𝓓',\n        codepoint: 120019,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL E',\n        value: '𝓔',\n        codepoint: 120020,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL F',\n        value: '𝓕',\n        codepoint: 120021,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL G',\n        value: '𝓖',\n        codepoint: 120022,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL H',\n        value: '𝓗',\n        codepoint: 120023,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL I',\n        value: '𝓘',\n        codepoint: 120024,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL J',\n        value: '𝓙',\n        codepoint: 120025,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL K',\n        value: '𝓚',\n        codepoint: 120026,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL L',\n        value: '𝓛',\n        codepoint: 120027,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL M',\n        value: '𝓜',\n        codepoint: 120028,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL N',\n        value: '𝓝',\n        codepoint: 120029,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL O',\n        value: '𝓞',\n        codepoint: 120030,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL P',\n        value: '𝓟',\n        codepoint: 120031,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Q',\n        value: '𝓠',\n        codepoint: 120032,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL R',\n        value: '𝓡',\n        codepoint: 120033,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL S',\n        value: '𝓢',\n        codepoint: 120034,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL T',\n        value: '𝓣',\n        codepoint: 120035,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL U',\n        value: '𝓤',\n        codepoint: 120036,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL V',\n        value: '𝓥',\n        codepoint: 120037,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL W',\n        value: '𝓦',\n        codepoint: 120038,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL X',\n        value: '𝓧',\n        codepoint: 120039,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Y',\n        value: '𝓨',\n        codepoint: 120040,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Z',\n        value: '𝓩',\n        codepoint: 120041,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL A',\n        value: '𝓪',\n        codepoint: 120042,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL B',\n        value: '𝓫',\n        codepoint: 120043,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL C',\n        value: '𝓬',\n        codepoint: 120044,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL D',\n        value: '𝓭',\n        codepoint: 120045,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL E',\n        value: '𝓮',\n        codepoint: 120046,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL F',\n        value: '𝓯',\n        codepoint: 120047,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL G',\n        value: '𝓰',\n        codepoint: 120048,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL H',\n        value: '𝓱',\n        codepoint: 120049,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL I',\n        value: '𝓲',\n        codepoint: 120050,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL J',\n        value: '𝓳',\n        codepoint: 120051,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL K',\n        value: '𝓴',\n        codepoint: 120052,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL L',\n        value: '𝓵',\n        codepoint: 120053,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL M',\n        value: '𝓶',\n        codepoint: 120054,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL N',\n        value: '𝓷',\n        codepoint: 120055,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL O',\n        value: '𝓸',\n        codepoint: 120056,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL P',\n        value: '𝓹',\n        codepoint: 120057,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL Q',\n        value: '𝓺',\n        codepoint: 120058,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL R',\n        value: '𝓻',\n        codepoint: 120059,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL S',\n        value: '𝓼',\n        codepoint: 120060,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL T',\n        value: '𝓽',\n        codepoint: 120061,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL U',\n        value: '𝓾',\n        codepoint: 120062,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL V',\n        value: '𝓿',\n        codepoint: 120063,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL W',\n        value: '𝔀',\n        codepoint: 120064,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL X',\n        value: '𝔁',\n        codepoint: 120065,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL Y',\n        value: '𝔂',\n        codepoint: 120066,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SCRIPT SMALL Z',\n        value: '𝔃',\n        codepoint: 120067,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL A',\n        value: '𝔄',\n        codepoint: 120068,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL B',\n        value: '𝔅',\n        codepoint: 120069,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL D',\n        value: '𝔇',\n        codepoint: 120071,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL E',\n        value: '𝔈',\n        codepoint: 120072,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL F',\n        value: '𝔉',\n        codepoint: 120073,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL G',\n        value: '𝔊',\n        codepoint: 120074,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL J',\n        value: '𝔍',\n        codepoint: 120077,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL K',\n        value: '𝔎',\n        codepoint: 120078,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL L',\n        value: '𝔏',\n        codepoint: 120079,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL M',\n        value: '𝔐',\n        codepoint: 120080,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL N',\n        value: '𝔑',\n        codepoint: 120081,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL O',\n        value: '𝔒',\n        codepoint: 120082,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL P',\n        value: '𝔓',\n        codepoint: 120083,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL Q',\n        value: '𝔔',\n        codepoint: 120084,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL S',\n        value: '𝔖',\n        codepoint: 120086,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL T',\n        value: '𝔗',\n        codepoint: 120087,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL U',\n        value: '𝔘',\n        codepoint: 120088,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL V',\n        value: '𝔙',\n        codepoint: 120089,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL W',\n        value: '𝔚',\n        codepoint: 120090,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL X',\n        value: '𝔛',\n        codepoint: 120091,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR CAPITAL Y',\n        value: '𝔜',\n        codepoint: 120092,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL A',\n        value: '𝔞',\n        codepoint: 120094,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL B',\n        value: '𝔟',\n        codepoint: 120095,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL C',\n        value: '𝔠',\n        codepoint: 120096,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL D',\n        value: '𝔡',\n        codepoint: 120097,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL E',\n        value: '𝔢',\n        codepoint: 120098,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL F',\n        value: '𝔣',\n        codepoint: 120099,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL G',\n        value: '𝔤',\n        codepoint: 120100,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL H',\n        value: '𝔥',\n        codepoint: 120101,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL I',\n        value: '𝔦',\n        codepoint: 120102,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL J',\n        value: '𝔧',\n        codepoint: 120103,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL K',\n        value: '𝔨',\n        codepoint: 120104,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL L',\n        value: '𝔩',\n        codepoint: 120105,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL M',\n        value: '𝔪',\n        codepoint: 120106,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL N',\n        value: '𝔫',\n        codepoint: 120107,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL O',\n        value: '𝔬',\n        codepoint: 120108,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL P',\n        value: '𝔭',\n        codepoint: 120109,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL Q',\n        value: '𝔮',\n        codepoint: 120110,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL R',\n        value: '𝔯',\n        codepoint: 120111,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL S',\n        value: '𝔰',\n        codepoint: 120112,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL T',\n        value: '𝔱',\n        codepoint: 120113,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL U',\n        value: '𝔲',\n        codepoint: 120114,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL V',\n        value: '𝔳',\n        codepoint: 120115,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL W',\n        value: '𝔴',\n        codepoint: 120116,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL X',\n        value: '𝔵',\n        codepoint: 120117,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL Y',\n        value: '𝔶',\n        codepoint: 120118,\n      },\n      {\n        name: 'MATHEMATICAL FRAKTUR SMALL Z',\n        value: '𝔷',\n        codepoint: 120119,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL A',\n        value: '𝔸',\n        codepoint: 120120,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL B',\n        value: '𝔹',\n        codepoint: 120121,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL D',\n        value: '𝔻',\n        codepoint: 120123,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL E',\n        value: '𝔼',\n        codepoint: 120124,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL F',\n        value: '𝔽',\n        codepoint: 120125,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL G',\n        value: '𝔾',\n        codepoint: 120126,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL I',\n        value: '𝕀',\n        codepoint: 120128,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL J',\n        value: '𝕁',\n        codepoint: 120129,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL K',\n        value: '𝕂',\n        codepoint: 120130,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL L',\n        value: '𝕃',\n        codepoint: 120131,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL M',\n        value: '𝕄',\n        codepoint: 120132,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL O',\n        value: '𝕆',\n        codepoint: 120134,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL S',\n        value: '𝕊',\n        codepoint: 120138,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL T',\n        value: '𝕋',\n        codepoint: 120139,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL U',\n        value: '𝕌',\n        codepoint: 120140,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL V',\n        value: '𝕍',\n        codepoint: 120141,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL W',\n        value: '𝕎',\n        codepoint: 120142,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL X',\n        value: '𝕏',\n        codepoint: 120143,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL Y',\n        value: '𝕐',\n        codepoint: 120144,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL A',\n        value: '𝕒',\n        codepoint: 120146,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL B',\n        value: '𝕓',\n        codepoint: 120147,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL C',\n        value: '𝕔',\n        codepoint: 120148,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL D',\n        value: '𝕕',\n        codepoint: 120149,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL E',\n        value: '𝕖',\n        codepoint: 120150,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL F',\n        value: '𝕗',\n        codepoint: 120151,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL G',\n        value: '𝕘',\n        codepoint: 120152,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL H',\n        value: '𝕙',\n        codepoint: 120153,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL I',\n        value: '𝕚',\n        codepoint: 120154,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL J',\n        value: '𝕛',\n        codepoint: 120155,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL K',\n        value: '𝕜',\n        codepoint: 120156,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL L',\n        value: '𝕝',\n        codepoint: 120157,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL M',\n        value: '𝕞',\n        codepoint: 120158,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL N',\n        value: '𝕟',\n        codepoint: 120159,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL O',\n        value: '𝕠',\n        codepoint: 120160,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL P',\n        value: '𝕡',\n        codepoint: 120161,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Q',\n        value: '𝕢',\n        codepoint: 120162,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL R',\n        value: '𝕣',\n        codepoint: 120163,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL S',\n        value: '𝕤',\n        codepoint: 120164,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL T',\n        value: '𝕥',\n        codepoint: 120165,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL U',\n        value: '𝕦',\n        codepoint: 120166,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL V',\n        value: '𝕧',\n        codepoint: 120167,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL W',\n        value: '𝕨',\n        codepoint: 120168,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL X',\n        value: '𝕩',\n        codepoint: 120169,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Y',\n        value: '𝕪',\n        codepoint: 120170,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Z',\n        value: '𝕫',\n        codepoint: 120171,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL A',\n        value: '𝕬',\n        codepoint: 120172,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL B',\n        value: '𝕭',\n        codepoint: 120173,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL C',\n        value: '𝕮',\n        codepoint: 120174,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL D',\n        value: '𝕯',\n        codepoint: 120175,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL E',\n        value: '𝕰',\n        codepoint: 120176,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL F',\n        value: '𝕱',\n        codepoint: 120177,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL G',\n        value: '𝕲',\n        codepoint: 120178,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL H',\n        value: '𝕳',\n        codepoint: 120179,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL I',\n        value: '𝕴',\n        codepoint: 120180,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL J',\n        value: '𝕵',\n        codepoint: 120181,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL K',\n        value: '𝕶',\n        codepoint: 120182,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL L',\n        value: '𝕷',\n        codepoint: 120183,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL M',\n        value: '𝕸',\n        codepoint: 120184,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL N',\n        value: '𝕹',\n        codepoint: 120185,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL O',\n        value: '𝕺',\n        codepoint: 120186,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL P',\n        value: '𝕻',\n        codepoint: 120187,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Q',\n        value: '𝕼',\n        codepoint: 120188,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL R',\n        value: '𝕽',\n        codepoint: 120189,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL S',\n        value: '𝕾',\n        codepoint: 120190,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL T',\n        value: '𝕿',\n        codepoint: 120191,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL U',\n        value: '𝖀',\n        codepoint: 120192,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL V',\n        value: '𝖁',\n        codepoint: 120193,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL W',\n        value: '𝖂',\n        codepoint: 120194,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL X',\n        value: '𝖃',\n        codepoint: 120195,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Y',\n        value: '𝖄',\n        codepoint: 120196,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Z',\n        value: '𝖅',\n        codepoint: 120197,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL A',\n        value: '𝖆',\n        codepoint: 120198,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL B',\n        value: '𝖇',\n        codepoint: 120199,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL C',\n        value: '𝖈',\n        codepoint: 120200,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL D',\n        value: '𝖉',\n        codepoint: 120201,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL E',\n        value: '𝖊',\n        codepoint: 120202,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL F',\n        value: '𝖋',\n        codepoint: 120203,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL G',\n        value: '𝖌',\n        codepoint: 120204,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL H',\n        value: '𝖍',\n        codepoint: 120205,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL I',\n        value: '𝖎',\n        codepoint: 120206,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL J',\n        value: '𝖏',\n        codepoint: 120207,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL K',\n        value: '𝖐',\n        codepoint: 120208,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL L',\n        value: '𝖑',\n        codepoint: 120209,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL M',\n        value: '𝖒',\n        codepoint: 120210,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL N',\n        value: '𝖓',\n        codepoint: 120211,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL O',\n        value: '𝖔',\n        codepoint: 120212,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL P',\n        value: '𝖕',\n        codepoint: 120213,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL Q',\n        value: '𝖖',\n        codepoint: 120214,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL R',\n        value: '𝖗',\n        codepoint: 120215,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL S',\n        value: '𝖘',\n        codepoint: 120216,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL T',\n        value: '𝖙',\n        codepoint: 120217,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL U',\n        value: '𝖚',\n        codepoint: 120218,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL V',\n        value: '𝖛',\n        codepoint: 120219,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL W',\n        value: '𝖜',\n        codepoint: 120220,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL X',\n        value: '𝖝',\n        codepoint: 120221,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL Y',\n        value: '𝖞',\n        codepoint: 120222,\n      },\n      {\n        name: 'MATHEMATICAL BOLD FRAKTUR SMALL Z',\n        value: '𝖟',\n        codepoint: 120223,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL A',\n        value: '𝖠',\n        codepoint: 120224,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL B',\n        value: '𝖡',\n        codepoint: 120225,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL C',\n        value: '𝖢',\n        codepoint: 120226,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL D',\n        value: '𝖣',\n        codepoint: 120227,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL E',\n        value: '𝖤',\n        codepoint: 120228,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL F',\n        value: '𝖥',\n        codepoint: 120229,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL G',\n        value: '𝖦',\n        codepoint: 120230,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL H',\n        value: '𝖧',\n        codepoint: 120231,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL I',\n        value: '𝖨',\n        codepoint: 120232,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL J',\n        value: '𝖩',\n        codepoint: 120233,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL K',\n        value: '𝖪',\n        codepoint: 120234,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL L',\n        value: '𝖫',\n        codepoint: 120235,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL M',\n        value: '𝖬',\n        codepoint: 120236,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL N',\n        value: '𝖭',\n        codepoint: 120237,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL O',\n        value: '𝖮',\n        codepoint: 120238,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL P',\n        value: '𝖯',\n        codepoint: 120239,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL Q',\n        value: '𝖰',\n        codepoint: 120240,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL R',\n        value: '𝖱',\n        codepoint: 120241,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL S',\n        value: '𝖲',\n        codepoint: 120242,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL T',\n        value: '𝖳',\n        codepoint: 120243,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL U',\n        value: '𝖴',\n        codepoint: 120244,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL V',\n        value: '𝖵',\n        codepoint: 120245,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL W',\n        value: '𝖶',\n        codepoint: 120246,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL X',\n        value: '𝖷',\n        codepoint: 120247,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL Y',\n        value: '𝖸',\n        codepoint: 120248,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF CAPITAL Z',\n        value: '𝖹',\n        codepoint: 120249,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL A',\n        value: '𝖺',\n        codepoint: 120250,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL B',\n        value: '𝖻',\n        codepoint: 120251,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL C',\n        value: '𝖼',\n        codepoint: 120252,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL D',\n        value: '𝖽',\n        codepoint: 120253,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL E',\n        value: '𝖾',\n        codepoint: 120254,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL F',\n        value: '𝖿',\n        codepoint: 120255,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL G',\n        value: '𝗀',\n        codepoint: 120256,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL H',\n        value: '𝗁',\n        codepoint: 120257,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL I',\n        value: '𝗂',\n        codepoint: 120258,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL J',\n        value: '𝗃',\n        codepoint: 120259,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL K',\n        value: '𝗄',\n        codepoint: 120260,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL L',\n        value: '𝗅',\n        codepoint: 120261,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL M',\n        value: '𝗆',\n        codepoint: 120262,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL N',\n        value: '𝗇',\n        codepoint: 120263,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL O',\n        value: '𝗈',\n        codepoint: 120264,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL P',\n        value: '𝗉',\n        codepoint: 120265,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL Q',\n        value: '𝗊',\n        codepoint: 120266,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL R',\n        value: '𝗋',\n        codepoint: 120267,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL S',\n        value: '𝗌',\n        codepoint: 120268,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL T',\n        value: '𝗍',\n        codepoint: 120269,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL U',\n        value: '𝗎',\n        codepoint: 120270,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL V',\n        value: '𝗏',\n        codepoint: 120271,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL W',\n        value: '𝗐',\n        codepoint: 120272,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL X',\n        value: '𝗑',\n        codepoint: 120273,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL Y',\n        value: '𝗒',\n        codepoint: 120274,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF SMALL Z',\n        value: '𝗓',\n        codepoint: 120275,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL A',\n        value: '𝗔',\n        codepoint: 120276,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL B',\n        value: '𝗕',\n        codepoint: 120277,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL C',\n        value: '𝗖',\n        codepoint: 120278,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL D',\n        value: '𝗗',\n        codepoint: 120279,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL E',\n        value: '𝗘',\n        codepoint: 120280,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL F',\n        value: '𝗙',\n        codepoint: 120281,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL G',\n        value: '𝗚',\n        codepoint: 120282,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL H',\n        value: '𝗛',\n        codepoint: 120283,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL I',\n        value: '𝗜',\n        codepoint: 120284,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL J',\n        value: '𝗝',\n        codepoint: 120285,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL K',\n        value: '𝗞',\n        codepoint: 120286,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL L',\n        value: '𝗟',\n        codepoint: 120287,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL M',\n        value: '𝗠',\n        codepoint: 120288,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL N',\n        value: '𝗡',\n        codepoint: 120289,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL O',\n        value: '𝗢',\n        codepoint: 120290,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL P',\n        value: '𝗣',\n        codepoint: 120291,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Q',\n        value: '𝗤',\n        codepoint: 120292,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL R',\n        value: '𝗥',\n        codepoint: 120293,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL S',\n        value: '𝗦',\n        codepoint: 120294,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL T',\n        value: '𝗧',\n        codepoint: 120295,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL U',\n        value: '𝗨',\n        codepoint: 120296,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL V',\n        value: '𝗩',\n        codepoint: 120297,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL W',\n        value: '𝗪',\n        codepoint: 120298,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL X',\n        value: '𝗫',\n        codepoint: 120299,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Y',\n        value: '𝗬',\n        codepoint: 120300,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Z',\n        value: '𝗭',\n        codepoint: 120301,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL A',\n        value: '𝗮',\n        codepoint: 120302,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL B',\n        value: '𝗯',\n        codepoint: 120303,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL C',\n        value: '𝗰',\n        codepoint: 120304,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL D',\n        value: '𝗱',\n        codepoint: 120305,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL E',\n        value: '𝗲',\n        codepoint: 120306,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL F',\n        value: '𝗳',\n        codepoint: 120307,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL G',\n        value: '𝗴',\n        codepoint: 120308,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL H',\n        value: '𝗵',\n        codepoint: 120309,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL I',\n        value: '𝗶',\n        codepoint: 120310,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL J',\n        value: '𝗷',\n        codepoint: 120311,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL K',\n        value: '𝗸',\n        codepoint: 120312,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL L',\n        value: '𝗹',\n        codepoint: 120313,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL M',\n        value: '𝗺',\n        codepoint: 120314,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL N',\n        value: '𝗻',\n        codepoint: 120315,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL O',\n        value: '𝗼',\n        codepoint: 120316,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL P',\n        value: '𝗽',\n        codepoint: 120317,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Q',\n        value: '𝗾',\n        codepoint: 120318,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL R',\n        value: '𝗿',\n        codepoint: 120319,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL S',\n        value: '𝘀',\n        codepoint: 120320,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL T',\n        value: '𝘁',\n        codepoint: 120321,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL U',\n        value: '𝘂',\n        codepoint: 120322,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL V',\n        value: '𝘃',\n        codepoint: 120323,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL W',\n        value: '𝘄',\n        codepoint: 120324,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL X',\n        value: '𝘅',\n        codepoint: 120325,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Y',\n        value: '𝘆',\n        codepoint: 120326,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Z',\n        value: '𝘇',\n        codepoint: 120327,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL A',\n        value: '𝘈',\n        codepoint: 120328,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL B',\n        value: '𝘉',\n        codepoint: 120329,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL C',\n        value: '𝘊',\n        codepoint: 120330,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL D',\n        value: '𝘋',\n        codepoint: 120331,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL E',\n        value: '𝘌',\n        codepoint: 120332,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL F',\n        value: '𝘍',\n        codepoint: 120333,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL G',\n        value: '𝘎',\n        codepoint: 120334,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL H',\n        value: '𝘏',\n        codepoint: 120335,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL I',\n        value: '𝘐',\n        codepoint: 120336,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL J',\n        value: '𝘑',\n        codepoint: 120337,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL K',\n        value: '𝘒',\n        codepoint: 120338,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL L',\n        value: '𝘓',\n        codepoint: 120339,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL M',\n        value: '𝘔',\n        codepoint: 120340,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL N',\n        value: '𝘕',\n        codepoint: 120341,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL O',\n        value: '𝘖',\n        codepoint: 120342,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL P',\n        value: '𝘗',\n        codepoint: 120343,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q',\n        value: '𝘘',\n        codepoint: 120344,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL R',\n        value: '𝘙',\n        codepoint: 120345,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL S',\n        value: '𝘚',\n        codepoint: 120346,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL T',\n        value: '𝘛',\n        codepoint: 120347,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL U',\n        value: '𝘜',\n        codepoint: 120348,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL V',\n        value: '𝘝',\n        codepoint: 120349,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL W',\n        value: '𝘞',\n        codepoint: 120350,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL X',\n        value: '𝘟',\n        codepoint: 120351,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y',\n        value: '𝘠',\n        codepoint: 120352,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z',\n        value: '𝘡',\n        codepoint: 120353,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL A',\n        value: '𝘢',\n        codepoint: 120354,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL B',\n        value: '𝘣',\n        codepoint: 120355,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL C',\n        value: '𝘤',\n        codepoint: 120356,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL D',\n        value: '𝘥',\n        codepoint: 120357,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL E',\n        value: '𝘦',\n        codepoint: 120358,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL F',\n        value: '𝘧',\n        codepoint: 120359,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL G',\n        value: '𝘨',\n        codepoint: 120360,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL H',\n        value: '𝘩',\n        codepoint: 120361,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL I',\n        value: '𝘪',\n        codepoint: 120362,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL J',\n        value: '𝘫',\n        codepoint: 120363,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL K',\n        value: '𝘬',\n        codepoint: 120364,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL L',\n        value: '𝘭',\n        codepoint: 120365,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL M',\n        value: '𝘮',\n        codepoint: 120366,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL N',\n        value: '𝘯',\n        codepoint: 120367,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL O',\n        value: '𝘰',\n        codepoint: 120368,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL P',\n        value: '𝘱',\n        codepoint: 120369,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Q',\n        value: '𝘲',\n        codepoint: 120370,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL R',\n        value: '𝘳',\n        codepoint: 120371,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL S',\n        value: '𝘴',\n        codepoint: 120372,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL T',\n        value: '𝘵',\n        codepoint: 120373,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL U',\n        value: '𝘶',\n        codepoint: 120374,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL V',\n        value: '𝘷',\n        codepoint: 120375,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL W',\n        value: '𝘸',\n        codepoint: 120376,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL X',\n        value: '𝘹',\n        codepoint: 120377,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Y',\n        value: '𝘺',\n        codepoint: 120378,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Z',\n        value: '𝘻',\n        codepoint: 120379,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A',\n        value: '𝘼',\n        codepoint: 120380,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B',\n        value: '𝘽',\n        codepoint: 120381,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C',\n        value: '𝘾',\n        codepoint: 120382,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D',\n        value: '𝘿',\n        codepoint: 120383,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E',\n        value: '𝙀',\n        codepoint: 120384,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F',\n        value: '𝙁',\n        codepoint: 120385,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G',\n        value: '𝙂',\n        codepoint: 120386,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H',\n        value: '𝙃',\n        codepoint: 120387,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I',\n        value: '𝙄',\n        codepoint: 120388,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J',\n        value: '𝙅',\n        codepoint: 120389,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K',\n        value: '𝙆',\n        codepoint: 120390,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L',\n        value: '𝙇',\n        codepoint: 120391,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M',\n        value: '𝙈',\n        codepoint: 120392,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N',\n        value: '𝙉',\n        codepoint: 120393,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O',\n        value: '𝙊',\n        codepoint: 120394,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P',\n        value: '𝙋',\n        codepoint: 120395,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q',\n        value: '𝙌',\n        codepoint: 120396,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R',\n        value: '𝙍',\n        codepoint: 120397,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S',\n        value: '𝙎',\n        codepoint: 120398,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T',\n        value: '𝙏',\n        codepoint: 120399,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U',\n        value: '𝙐',\n        codepoint: 120400,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V',\n        value: '𝙑',\n        codepoint: 120401,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W',\n        value: '𝙒',\n        codepoint: 120402,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X',\n        value: '𝙓',\n        codepoint: 120403,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y',\n        value: '𝙔',\n        codepoint: 120404,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z',\n        value: '𝙕',\n        codepoint: 120405,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A',\n        value: '𝙖',\n        codepoint: 120406,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B',\n        value: '𝙗',\n        codepoint: 120407,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C',\n        value: '𝙘',\n        codepoint: 120408,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D',\n        value: '𝙙',\n        codepoint: 120409,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E',\n        value: '𝙚',\n        codepoint: 120410,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F',\n        value: '𝙛',\n        codepoint: 120411,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G',\n        value: '𝙜',\n        codepoint: 120412,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H',\n        value: '𝙝',\n        codepoint: 120413,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I',\n        value: '𝙞',\n        codepoint: 120414,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J',\n        value: '𝙟',\n        codepoint: 120415,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K',\n        value: '𝙠',\n        codepoint: 120416,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L',\n        value: '𝙡',\n        codepoint: 120417,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M',\n        value: '𝙢',\n        codepoint: 120418,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N',\n        value: '𝙣',\n        codepoint: 120419,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O',\n        value: '𝙤',\n        codepoint: 120420,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P',\n        value: '𝙥',\n        codepoint: 120421,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q',\n        value: '𝙦',\n        codepoint: 120422,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R',\n        value: '𝙧',\n        codepoint: 120423,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S',\n        value: '𝙨',\n        codepoint: 120424,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T',\n        value: '𝙩',\n        codepoint: 120425,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U',\n        value: '𝙪',\n        codepoint: 120426,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V',\n        value: '𝙫',\n        codepoint: 120427,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W',\n        value: '𝙬',\n        codepoint: 120428,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X',\n        value: '𝙭',\n        codepoint: 120429,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y',\n        value: '𝙮',\n        codepoint: 120430,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z',\n        value: '𝙯',\n        codepoint: 120431,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL A',\n        value: '𝙰',\n        codepoint: 120432,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL B',\n        value: '𝙱',\n        codepoint: 120433,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL C',\n        value: '𝙲',\n        codepoint: 120434,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL D',\n        value: '𝙳',\n        codepoint: 120435,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL E',\n        value: '𝙴',\n        codepoint: 120436,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL F',\n        value: '𝙵',\n        codepoint: 120437,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL G',\n        value: '𝙶',\n        codepoint: 120438,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL H',\n        value: '𝙷',\n        codepoint: 120439,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL I',\n        value: '𝙸',\n        codepoint: 120440,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL J',\n        value: '𝙹',\n        codepoint: 120441,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL K',\n        value: '𝙺',\n        codepoint: 120442,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL L',\n        value: '𝙻',\n        codepoint: 120443,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL M',\n        value: '𝙼',\n        codepoint: 120444,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL N',\n        value: '𝙽',\n        codepoint: 120445,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL O',\n        value: '𝙾',\n        codepoint: 120446,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL P',\n        value: '𝙿',\n        codepoint: 120447,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL Q',\n        value: '𝚀',\n        codepoint: 120448,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL R',\n        value: '𝚁',\n        codepoint: 120449,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL S',\n        value: '𝚂',\n        codepoint: 120450,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL T',\n        value: '𝚃',\n        codepoint: 120451,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL U',\n        value: '𝚄',\n        codepoint: 120452,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL V',\n        value: '𝚅',\n        codepoint: 120453,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL W',\n        value: '𝚆',\n        codepoint: 120454,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL X',\n        value: '𝚇',\n        codepoint: 120455,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL Y',\n        value: '𝚈',\n        codepoint: 120456,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE CAPITAL Z',\n        value: '𝚉',\n        codepoint: 120457,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL A',\n        value: '𝚊',\n        codepoint: 120458,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL B',\n        value: '𝚋',\n        codepoint: 120459,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL C',\n        value: '𝚌',\n        codepoint: 120460,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL D',\n        value: '𝚍',\n        codepoint: 120461,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL E',\n        value: '𝚎',\n        codepoint: 120462,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL F',\n        value: '𝚏',\n        codepoint: 120463,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL G',\n        value: '𝚐',\n        codepoint: 120464,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL H',\n        value: '𝚑',\n        codepoint: 120465,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL I',\n        value: '𝚒',\n        codepoint: 120466,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL J',\n        value: '𝚓',\n        codepoint: 120467,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL K',\n        value: '𝚔',\n        codepoint: 120468,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL L',\n        value: '𝚕',\n        codepoint: 120469,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL M',\n        value: '𝚖',\n        codepoint: 120470,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL N',\n        value: '𝚗',\n        codepoint: 120471,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL O',\n        value: '𝚘',\n        codepoint: 120472,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL P',\n        value: '𝚙',\n        codepoint: 120473,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL Q',\n        value: '𝚚',\n        codepoint: 120474,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL R',\n        value: '𝚛',\n        codepoint: 120475,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL S',\n        value: '𝚜',\n        codepoint: 120476,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL T',\n        value: '𝚝',\n        codepoint: 120477,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL U',\n        value: '𝚞',\n        codepoint: 120478,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL V',\n        value: '𝚟',\n        codepoint: 120479,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL W',\n        value: '𝚠',\n        codepoint: 120480,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL X',\n        value: '𝚡',\n        codepoint: 120481,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL Y',\n        value: '𝚢',\n        codepoint: 120482,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE SMALL Z',\n        value: '𝚣',\n        codepoint: 120483,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL DOTLESS I',\n        value: '𝚤',\n        codepoint: 120484,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL DOTLESS J',\n        value: '𝚥',\n        codepoint: 120485,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL ALPHA',\n        value: '𝚨',\n        codepoint: 120488,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL BETA',\n        value: '𝚩',\n        codepoint: 120489,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL GAMMA',\n        value: '𝚪',\n        codepoint: 120490,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL DELTA',\n        value: '𝚫',\n        codepoint: 120491,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL EPSILON',\n        value: '𝚬',\n        codepoint: 120492,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL ZETA',\n        value: '𝚭',\n        codepoint: 120493,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL ETA',\n        value: '𝚮',\n        codepoint: 120494,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL THETA',\n        value: '𝚯',\n        codepoint: 120495,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL IOTA',\n        value: '𝚰',\n        codepoint: 120496,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL KAPPA',\n        value: '𝚱',\n        codepoint: 120497,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL LAMDA',\n        value: '𝚲',\n        codepoint: 120498,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL MU',\n        value: '𝚳',\n        codepoint: 120499,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL NU',\n        value: '𝚴',\n        codepoint: 120500,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL XI',\n        value: '𝚵',\n        codepoint: 120501,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL OMICRON',\n        value: '𝚶',\n        codepoint: 120502,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL PI',\n        value: '𝚷',\n        codepoint: 120503,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL RHO',\n        value: '𝚸',\n        codepoint: 120504,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL THETA SYMBOL',\n        value: '𝚹',\n        codepoint: 120505,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL SIGMA',\n        value: '𝚺',\n        codepoint: 120506,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL TAU',\n        value: '𝚻',\n        codepoint: 120507,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL UPSILON',\n        value: '𝚼',\n        codepoint: 120508,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL PHI',\n        value: '𝚽',\n        codepoint: 120509,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL CHI',\n        value: '𝚾',\n        codepoint: 120510,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL PSI',\n        value: '𝚿',\n        codepoint: 120511,\n      },\n      {\n        name: 'MATHEMATICAL BOLD CAPITAL OMEGA',\n        value: '𝛀',\n        codepoint: 120512,\n      },\n      {\n        name: 'MATHEMATICAL BOLD NABLA',\n        value: '𝛁',\n        codepoint: 120513,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL ALPHA',\n        value: '𝛂',\n        codepoint: 120514,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL BETA',\n        value: '𝛃',\n        codepoint: 120515,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL GAMMA',\n        value: '𝛄',\n        codepoint: 120516,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL DELTA',\n        value: '𝛅',\n        codepoint: 120517,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL EPSILON',\n        value: '𝛆',\n        codepoint: 120518,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL ZETA',\n        value: '𝛇',\n        codepoint: 120519,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL ETA',\n        value: '𝛈',\n        codepoint: 120520,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL THETA',\n        value: '𝛉',\n        codepoint: 120521,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL IOTA',\n        value: '𝛊',\n        codepoint: 120522,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL KAPPA',\n        value: '𝛋',\n        codepoint: 120523,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL LAMDA',\n        value: '𝛌',\n        codepoint: 120524,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL MU',\n        value: '𝛍',\n        codepoint: 120525,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL NU',\n        value: '𝛎',\n        codepoint: 120526,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL XI',\n        value: '𝛏',\n        codepoint: 120527,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL OMICRON',\n        value: '𝛐',\n        codepoint: 120528,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL PI',\n        value: '𝛑',\n        codepoint: 120529,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL RHO',\n        value: '𝛒',\n        codepoint: 120530,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL FINAL SIGMA',\n        value: '𝛓',\n        codepoint: 120531,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL SIGMA',\n        value: '𝛔',\n        codepoint: 120532,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL TAU',\n        value: '𝛕',\n        codepoint: 120533,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL UPSILON',\n        value: '𝛖',\n        codepoint: 120534,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL PHI',\n        value: '𝛗',\n        codepoint: 120535,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL CHI',\n        value: '𝛘',\n        codepoint: 120536,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL PSI',\n        value: '𝛙',\n        codepoint: 120537,\n      },\n      {\n        name: 'MATHEMATICAL BOLD SMALL OMEGA',\n        value: '𝛚',\n        codepoint: 120538,\n      },\n      {\n        name: 'MATHEMATICAL BOLD PARTIAL DIFFERENTIAL',\n        value: '𝛛',\n        codepoint: 120539,\n      },\n      {\n        name: 'MATHEMATICAL BOLD EPSILON SYMBOL',\n        value: '𝛜',\n        codepoint: 120540,\n      },\n      {\n        name: 'MATHEMATICAL BOLD THETA SYMBOL',\n        value: '𝛝',\n        codepoint: 120541,\n      },\n      {\n        name: 'MATHEMATICAL BOLD KAPPA SYMBOL',\n        value: '𝛞',\n        codepoint: 120542,\n      },\n      {\n        name: 'MATHEMATICAL BOLD PHI SYMBOL',\n        value: '𝛟',\n        codepoint: 120543,\n      },\n      {\n        name: 'MATHEMATICAL BOLD RHO SYMBOL',\n        value: '𝛠',\n        codepoint: 120544,\n      },\n      {\n        name: 'MATHEMATICAL BOLD PI SYMBOL',\n        value: '𝛡',\n        codepoint: 120545,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL ALPHA',\n        value: '𝛢',\n        codepoint: 120546,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL BETA',\n        value: '𝛣',\n        codepoint: 120547,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL GAMMA',\n        value: '𝛤',\n        codepoint: 120548,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL DELTA',\n        value: '𝛥',\n        codepoint: 120549,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL EPSILON',\n        value: '𝛦',\n        codepoint: 120550,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL ZETA',\n        value: '𝛧',\n        codepoint: 120551,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL ETA',\n        value: '𝛨',\n        codepoint: 120552,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL THETA',\n        value: '𝛩',\n        codepoint: 120553,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL IOTA',\n        value: '𝛪',\n        codepoint: 120554,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL KAPPA',\n        value: '𝛫',\n        codepoint: 120555,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL LAMDA',\n        value: '𝛬',\n        codepoint: 120556,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL MU',\n        value: '𝛭',\n        codepoint: 120557,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL NU',\n        value: '𝛮',\n        codepoint: 120558,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL XI',\n        value: '𝛯',\n        codepoint: 120559,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL OMICRON',\n        value: '𝛰',\n        codepoint: 120560,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL PI',\n        value: '𝛱',\n        codepoint: 120561,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL RHO',\n        value: '𝛲',\n        codepoint: 120562,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL THETA SYMBOL',\n        value: '𝛳',\n        codepoint: 120563,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL SIGMA',\n        value: '𝛴',\n        codepoint: 120564,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL TAU',\n        value: '𝛵',\n        codepoint: 120565,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL UPSILON',\n        value: '𝛶',\n        codepoint: 120566,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL PHI',\n        value: '𝛷',\n        codepoint: 120567,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL CHI',\n        value: '𝛸',\n        codepoint: 120568,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL PSI',\n        value: '𝛹',\n        codepoint: 120569,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC CAPITAL OMEGA',\n        value: '𝛺',\n        codepoint: 120570,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC NABLA',\n        value: '𝛻',\n        codepoint: 120571,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL ALPHA',\n        value: '𝛼',\n        codepoint: 120572,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL BETA',\n        value: '𝛽',\n        codepoint: 120573,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL GAMMA',\n        value: '𝛾',\n        codepoint: 120574,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL DELTA',\n        value: '𝛿',\n        codepoint: 120575,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL EPSILON',\n        value: '𝜀',\n        codepoint: 120576,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL ZETA',\n        value: '𝜁',\n        codepoint: 120577,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL ETA',\n        value: '𝜂',\n        codepoint: 120578,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL THETA',\n        value: '𝜃',\n        codepoint: 120579,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL IOTA',\n        value: '𝜄',\n        codepoint: 120580,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL KAPPA',\n        value: '𝜅',\n        codepoint: 120581,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL LAMDA',\n        value: '𝜆',\n        codepoint: 120582,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL MU',\n        value: '𝜇',\n        codepoint: 120583,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL NU',\n        value: '𝜈',\n        codepoint: 120584,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL XI',\n        value: '𝜉',\n        codepoint: 120585,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL OMICRON',\n        value: '𝜊',\n        codepoint: 120586,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL PI',\n        value: '𝜋',\n        codepoint: 120587,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL RHO',\n        value: '𝜌',\n        codepoint: 120588,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL FINAL SIGMA',\n        value: '𝜍',\n        codepoint: 120589,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL SIGMA',\n        value: '𝜎',\n        codepoint: 120590,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL TAU',\n        value: '𝜏',\n        codepoint: 120591,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL UPSILON',\n        value: '𝜐',\n        codepoint: 120592,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL PHI',\n        value: '𝜑',\n        codepoint: 120593,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL CHI',\n        value: '𝜒',\n        codepoint: 120594,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL PSI',\n        value: '𝜓',\n        codepoint: 120595,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC SMALL OMEGA',\n        value: '𝜔',\n        codepoint: 120596,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL',\n        value: '𝜕',\n        codepoint: 120597,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC EPSILON SYMBOL',\n        value: '𝜖',\n        codepoint: 120598,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC THETA SYMBOL',\n        value: '𝜗',\n        codepoint: 120599,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC KAPPA SYMBOL',\n        value: '𝜘',\n        codepoint: 120600,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC PHI SYMBOL',\n        value: '𝜙',\n        codepoint: 120601,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC RHO SYMBOL',\n        value: '𝜚',\n        codepoint: 120602,\n      },\n      {\n        name: 'MATHEMATICAL ITALIC PI SYMBOL',\n        value: '𝜛',\n        codepoint: 120603,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL ALPHA',\n        value: '𝜜',\n        codepoint: 120604,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL BETA',\n        value: '𝜝',\n        codepoint: 120605,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL GAMMA',\n        value: '𝜞',\n        codepoint: 120606,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL DELTA',\n        value: '𝜟',\n        codepoint: 120607,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL EPSILON',\n        value: '𝜠',\n        codepoint: 120608,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL ZETA',\n        value: '𝜡',\n        codepoint: 120609,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL ETA',\n        value: '𝜢',\n        codepoint: 120610,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL THETA',\n        value: '𝜣',\n        codepoint: 120611,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL IOTA',\n        value: '𝜤',\n        codepoint: 120612,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL KAPPA',\n        value: '𝜥',\n        codepoint: 120613,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL LAMDA',\n        value: '𝜦',\n        codepoint: 120614,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL MU',\n        value: '𝜧',\n        codepoint: 120615,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL NU',\n        value: '𝜨',\n        codepoint: 120616,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL XI',\n        value: '𝜩',\n        codepoint: 120617,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL OMICRON',\n        value: '𝜪',\n        codepoint: 120618,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL PI',\n        value: '𝜫',\n        codepoint: 120619,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL RHO',\n        value: '𝜬',\n        codepoint: 120620,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL',\n        value: '𝜭',\n        codepoint: 120621,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL SIGMA',\n        value: '𝜮',\n        codepoint: 120622,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL TAU',\n        value: '𝜯',\n        codepoint: 120623,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL UPSILON',\n        value: '𝜰',\n        codepoint: 120624,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL PHI',\n        value: '𝜱',\n        codepoint: 120625,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL CHI',\n        value: '𝜲',\n        codepoint: 120626,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL PSI',\n        value: '𝜳',\n        codepoint: 120627,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC CAPITAL OMEGA',\n        value: '𝜴',\n        codepoint: 120628,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC NABLA',\n        value: '𝜵',\n        codepoint: 120629,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL ALPHA',\n        value: '𝜶',\n        codepoint: 120630,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL BETA',\n        value: '𝜷',\n        codepoint: 120631,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL GAMMA',\n        value: '𝜸',\n        codepoint: 120632,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL DELTA',\n        value: '𝜹',\n        codepoint: 120633,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL EPSILON',\n        value: '𝜺',\n        codepoint: 120634,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL ZETA',\n        value: '𝜻',\n        codepoint: 120635,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL ETA',\n        value: '𝜼',\n        codepoint: 120636,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL THETA',\n        value: '𝜽',\n        codepoint: 120637,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL IOTA',\n        value: '𝜾',\n        codepoint: 120638,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL KAPPA',\n        value: '𝜿',\n        codepoint: 120639,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL LAMDA',\n        value: '𝝀',\n        codepoint: 120640,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL MU',\n        value: '𝝁',\n        codepoint: 120641,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL NU',\n        value: '𝝂',\n        codepoint: 120642,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL XI',\n        value: '𝝃',\n        codepoint: 120643,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL OMICRON',\n        value: '𝝄',\n        codepoint: 120644,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL PI',\n        value: '𝝅',\n        codepoint: 120645,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL RHO',\n        value: '𝝆',\n        codepoint: 120646,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA',\n        value: '𝝇',\n        codepoint: 120647,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL SIGMA',\n        value: '𝝈',\n        codepoint: 120648,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL TAU',\n        value: '𝝉',\n        codepoint: 120649,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL UPSILON',\n        value: '𝝊',\n        codepoint: 120650,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL PHI',\n        value: '𝝋',\n        codepoint: 120651,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL CHI',\n        value: '𝝌',\n        codepoint: 120652,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL PSI',\n        value: '𝝍',\n        codepoint: 120653,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC SMALL OMEGA',\n        value: '𝝎',\n        codepoint: 120654,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL',\n        value: '𝝏',\n        codepoint: 120655,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC EPSILON SYMBOL',\n        value: '𝝐',\n        codepoint: 120656,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC THETA SYMBOL',\n        value: '𝝑',\n        codepoint: 120657,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC KAPPA SYMBOL',\n        value: '𝝒',\n        codepoint: 120658,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC PHI SYMBOL',\n        value: '𝝓',\n        codepoint: 120659,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC RHO SYMBOL',\n        value: '𝝔',\n        codepoint: 120660,\n      },\n      {\n        name: 'MATHEMATICAL BOLD ITALIC PI SYMBOL',\n        value: '𝝕',\n        codepoint: 120661,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA',\n        value: '𝝖',\n        codepoint: 120662,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA',\n        value: '𝝗',\n        codepoint: 120663,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA',\n        value: '𝝘',\n        codepoint: 120664,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA',\n        value: '𝝙',\n        codepoint: 120665,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON',\n        value: '𝝚',\n        codepoint: 120666,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA',\n        value: '𝝛',\n        codepoint: 120667,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA',\n        value: '𝝜',\n        codepoint: 120668,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA',\n        value: '𝝝',\n        codepoint: 120669,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA',\n        value: '𝝞',\n        codepoint: 120670,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA',\n        value: '𝝟',\n        codepoint: 120671,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA',\n        value: '𝝠',\n        codepoint: 120672,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL MU',\n        value: '𝝡',\n        codepoint: 120673,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL NU',\n        value: '𝝢',\n        codepoint: 120674,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL XI',\n        value: '𝝣',\n        codepoint: 120675,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON',\n        value: '𝝤',\n        codepoint: 120676,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PI',\n        value: '𝝥',\n        codepoint: 120677,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO',\n        value: '𝝦',\n        codepoint: 120678,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL',\n        value: '𝝧',\n        codepoint: 120679,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA',\n        value: '𝝨',\n        codepoint: 120680,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU',\n        value: '𝝩',\n        codepoint: 120681,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON',\n        value: '𝝪',\n        codepoint: 120682,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI',\n        value: '𝝫',\n        codepoint: 120683,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI',\n        value: '𝝬',\n        codepoint: 120684,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI',\n        value: '𝝭',\n        codepoint: 120685,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA',\n        value: '𝝮',\n        codepoint: 120686,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD NABLA',\n        value: '𝝯',\n        codepoint: 120687,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA',\n        value: '𝝰',\n        codepoint: 120688,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL BETA',\n        value: '𝝱',\n        codepoint: 120689,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA',\n        value: '𝝲',\n        codepoint: 120690,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL DELTA',\n        value: '𝝳',\n        codepoint: 120691,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON',\n        value: '𝝴',\n        codepoint: 120692,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ZETA',\n        value: '𝝵',\n        codepoint: 120693,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ETA',\n        value: '𝝶',\n        codepoint: 120694,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL THETA',\n        value: '𝝷',\n        codepoint: 120695,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL IOTA',\n        value: '𝝸',\n        codepoint: 120696,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA',\n        value: '𝝹',\n        codepoint: 120697,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA',\n        value: '𝝺',\n        codepoint: 120698,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL MU',\n        value: '𝝻',\n        codepoint: 120699,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL NU',\n        value: '𝝼',\n        codepoint: 120700,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL XI',\n        value: '𝝽',\n        codepoint: 120701,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON',\n        value: '𝝾',\n        codepoint: 120702,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PI',\n        value: '𝝿',\n        codepoint: 120703,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL RHO',\n        value: '𝞀',\n        codepoint: 120704,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA',\n        value: '𝞁',\n        codepoint: 120705,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA',\n        value: '𝞂',\n        codepoint: 120706,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL TAU',\n        value: '𝞃',\n        codepoint: 120707,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON',\n        value: '𝞄',\n        codepoint: 120708,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PHI',\n        value: '𝞅',\n        codepoint: 120709,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL CHI',\n        value: '𝞆',\n        codepoint: 120710,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PSI',\n        value: '𝞇',\n        codepoint: 120711,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA',\n        value: '𝞈',\n        codepoint: 120712,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL',\n        value: '𝞉',\n        codepoint: 120713,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL',\n        value: '𝞊',\n        codepoint: 120714,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL',\n        value: '𝞋',\n        codepoint: 120715,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL',\n        value: '𝞌',\n        codepoint: 120716,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL',\n        value: '𝞍',\n        codepoint: 120717,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL',\n        value: '𝞎',\n        codepoint: 120718,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD PI SYMBOL',\n        value: '𝞏',\n        codepoint: 120719,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA',\n        value: '𝞐',\n        codepoint: 120720,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA',\n        value: '𝞑',\n        codepoint: 120721,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA',\n        value: '𝞒',\n        codepoint: 120722,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA',\n        value: '𝞓',\n        codepoint: 120723,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON',\n        value: '𝞔',\n        codepoint: 120724,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA',\n        value: '𝞕',\n        codepoint: 120725,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA',\n        value: '𝞖',\n        codepoint: 120726,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA',\n        value: '𝞗',\n        codepoint: 120727,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA',\n        value: '𝞘',\n        codepoint: 120728,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA',\n        value: '𝞙',\n        codepoint: 120729,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA',\n        value: '𝞚',\n        codepoint: 120730,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU',\n        value: '𝞛',\n        codepoint: 120731,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU',\n        value: '𝞜',\n        codepoint: 120732,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI',\n        value: '𝞝',\n        codepoint: 120733,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON',\n        value: '𝞞',\n        codepoint: 120734,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI',\n        value: '𝞟',\n        codepoint: 120735,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO',\n        value: '𝞠',\n        codepoint: 120736,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL',\n        value: '𝞡',\n        codepoint: 120737,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA',\n        value: '𝞢',\n        codepoint: 120738,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU',\n        value: '𝞣',\n        codepoint: 120739,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON',\n        value: '𝞤',\n        codepoint: 120740,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI',\n        value: '𝞥',\n        codepoint: 120741,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI',\n        value: '𝞦',\n        codepoint: 120742,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI',\n        value: '𝞧',\n        codepoint: 120743,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA',\n        value: '𝞨',\n        codepoint: 120744,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA',\n        value: '𝞩',\n        codepoint: 120745,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA',\n        value: '𝞪',\n        codepoint: 120746,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA',\n        value: '𝞫',\n        codepoint: 120747,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA',\n        value: '𝞬',\n        codepoint: 120748,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA',\n        value: '𝞭',\n        codepoint: 120749,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON',\n        value: '𝞮',\n        codepoint: 120750,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA',\n        value: '𝞯',\n        codepoint: 120751,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA',\n        value: '𝞰',\n        codepoint: 120752,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA',\n        value: '𝞱',\n        codepoint: 120753,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA',\n        value: '𝞲',\n        codepoint: 120754,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA',\n        value: '𝞳',\n        codepoint: 120755,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA',\n        value: '𝞴',\n        codepoint: 120756,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU',\n        value: '𝞵',\n        codepoint: 120757,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU',\n        value: '𝞶',\n        codepoint: 120758,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI',\n        value: '𝞷',\n        codepoint: 120759,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON',\n        value: '𝞸',\n        codepoint: 120760,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI',\n        value: '𝞹',\n        codepoint: 120761,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO',\n        value: '𝞺',\n        codepoint: 120762,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA',\n        value: '𝞻',\n        codepoint: 120763,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA',\n        value: '𝞼',\n        codepoint: 120764,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU',\n        value: '𝞽',\n        codepoint: 120765,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON',\n        value: '𝞾',\n        codepoint: 120766,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI',\n        value: '𝞿',\n        codepoint: 120767,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI',\n        value: '𝟀',\n        codepoint: 120768,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI',\n        value: '𝟁',\n        codepoint: 120769,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA',\n        value: '𝟂',\n        codepoint: 120770,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL',\n        value: '𝟃',\n        codepoint: 120771,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL',\n        value: '𝟄',\n        codepoint: 120772,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL',\n        value: '𝟅',\n        codepoint: 120773,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL',\n        value: '𝟆',\n        codepoint: 120774,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL',\n        value: '𝟇',\n        codepoint: 120775,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL',\n        value: '𝟈',\n        codepoint: 120776,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL',\n        value: '𝟉',\n        codepoint: 120777,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT ZERO',\n        value: '𝟎',\n        codepoint: 120782,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT ONE',\n        value: '𝟏',\n        codepoint: 120783,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT TWO',\n        value: '𝟐',\n        codepoint: 120784,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT THREE',\n        value: '𝟑',\n        codepoint: 120785,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT FOUR',\n        value: '𝟒',\n        codepoint: 120786,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT FIVE',\n        value: '𝟓',\n        codepoint: 120787,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT SIX',\n        value: '𝟔',\n        codepoint: 120788,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT SEVEN',\n        value: '𝟕',\n        codepoint: 120789,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT EIGHT',\n        value: '𝟖',\n        codepoint: 120790,\n      },\n      {\n        name: 'MATHEMATICAL BOLD DIGIT NINE',\n        value: '𝟗',\n        codepoint: 120791,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO',\n        value: '𝟘',\n        codepoint: 120792,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT ONE',\n        value: '𝟙',\n        codepoint: 120793,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT TWO',\n        value: '𝟚',\n        codepoint: 120794,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT THREE',\n        value: '𝟛',\n        codepoint: 120795,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR',\n        value: '𝟜',\n        codepoint: 120796,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE',\n        value: '𝟝',\n        codepoint: 120797,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT SIX',\n        value: '𝟞',\n        codepoint: 120798,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN',\n        value: '𝟟',\n        codepoint: 120799,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT',\n        value: '𝟠',\n        codepoint: 120800,\n      },\n      {\n        name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT NINE',\n        value: '𝟡',\n        codepoint: 120801,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT ZERO',\n        value: '𝟢',\n        codepoint: 120802,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT ONE',\n        value: '𝟣',\n        codepoint: 120803,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT TWO',\n        value: '𝟤',\n        codepoint: 120804,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT THREE',\n        value: '𝟥',\n        codepoint: 120805,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT FOUR',\n        value: '𝟦',\n        codepoint: 120806,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT FIVE',\n        value: '𝟧',\n        codepoint: 120807,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT SIX',\n        value: '𝟨',\n        codepoint: 120808,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT SEVEN',\n        value: '𝟩',\n        codepoint: 120809,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT EIGHT',\n        value: '𝟪',\n        codepoint: 120810,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF DIGIT NINE',\n        value: '𝟫',\n        codepoint: 120811,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO',\n        value: '𝟬',\n        codepoint: 120812,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT ONE',\n        value: '𝟭',\n        codepoint: 120813,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT TWO',\n        value: '𝟮',\n        codepoint: 120814,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT THREE',\n        value: '𝟯',\n        codepoint: 120815,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR',\n        value: '𝟰',\n        codepoint: 120816,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE',\n        value: '𝟱',\n        codepoint: 120817,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT SIX',\n        value: '𝟲',\n        codepoint: 120818,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN',\n        value: '𝟳',\n        codepoint: 120819,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT',\n        value: '𝟴',\n        codepoint: 120820,\n      },\n      {\n        name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT NINE',\n        value: '𝟵',\n        codepoint: 120821,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT ZERO',\n        value: '𝟶',\n        codepoint: 120822,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT ONE',\n        value: '𝟷',\n        codepoint: 120823,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT TWO',\n        value: '𝟸',\n        codepoint: 120824,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT THREE',\n        value: '𝟹',\n        codepoint: 120825,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT FOUR',\n        value: '𝟺',\n        codepoint: 120826,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT FIVE',\n        value: '𝟻',\n        codepoint: 120827,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT SIX',\n        value: '𝟼',\n        codepoint: 120828,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT SEVEN',\n        value: '𝟽',\n        codepoint: 120829,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT EIGHT',\n        value: '𝟾',\n        codepoint: 120830,\n      },\n      {\n        name: 'MATHEMATICAL MONOSPACE DIGIT NINE',\n        value: '𝟿',\n        codepoint: 120831,\n      },\n    ],\n  },\n  {\n    name: 'Punctuation',\n    symbols: [\n      {\n        name: 'HYPHEN',\n        value: '‐',\n        codepoint: 8208,\n      },\n      {\n        name: 'NON-BREAKING HYPHEN',\n        value: '‑',\n        codepoint: 8209,\n      },\n      {\n        name: 'FIGURE DASH',\n        value: '‒',\n        codepoint: 8210,\n      },\n      {\n        name: 'EN DASH',\n        value: '–',\n        codepoint: 8211,\n      },\n      {\n        name: 'EM DASH',\n        value: '—',\n        codepoint: 8212,\n      },\n      {\n        name: 'HORIZONTAL BAR',\n        value: '―',\n        codepoint: 8213,\n      },\n      {\n        name: 'DOUBLE VERTICAL LINE',\n        value: '‖',\n        codepoint: 8214,\n      },\n      {\n        name: 'DOUBLE LOW LINE',\n        value: '‗',\n        codepoint: 8215,\n      },\n      {\n        name: 'LEFT SINGLE QUOTATION MARK',\n        value: '‘',\n        codepoint: 8216,\n      },\n      {\n        name: 'RIGHT SINGLE QUOTATION MARK',\n        value: '’',\n        codepoint: 8217,\n      },\n      {\n        name: 'SINGLE LOW-9 QUOTATION MARK',\n        value: '‚',\n        codepoint: 8218,\n      },\n      {\n        name: 'SINGLE HIGH-REVERSED-9 QUOTATION MARK',\n        value: '‛',\n        codepoint: 8219,\n      },\n      {\n        name: 'LEFT DOUBLE QUOTATION MARK',\n        value: '“',\n        codepoint: 8220,\n      },\n      {\n        name: 'RIGHT DOUBLE QUOTATION MARK',\n        value: '”',\n        codepoint: 8221,\n      },\n      {\n        name: 'DOUBLE LOW-9 QUOTATION MARK',\n        value: '„',\n        codepoint: 8222,\n      },\n      {\n        name: 'DOUBLE HIGH-REVERSED-9 QUOTATION MARK',\n        value: '‟',\n        codepoint: 8223,\n      },\n      {\n        name: 'DAGGER',\n        value: '†',\n        codepoint: 8224,\n      },\n      {\n        name: 'DOUBLE DAGGER',\n        value: '‡',\n        codepoint: 8225,\n      },\n      {\n        name: 'BULLET',\n        value: '•',\n        codepoint: 8226,\n      },\n      {\n        name: 'TRIANGULAR BULLET',\n        value: '‣',\n        codepoint: 8227,\n      },\n      {\n        name: 'ONE DOT LEADER',\n        value: '․',\n        codepoint: 8228,\n      },\n      {\n        name: 'TWO DOT LEADER',\n        value: '‥',\n        codepoint: 8229,\n      },\n      {\n        name: 'HORIZONTAL ELLIPSIS',\n        value: '…',\n        codepoint: 8230,\n      },\n      {\n        name: 'HYPHENATION POINT',\n        value: '‧',\n        codepoint: 8231,\n      },\n      {\n        name: 'NARROW NO-BREAK SPACE',\n        value: ' ',\n        codepoint: 8239,\n      },\n      {\n        name: 'PER MILLE SIGN',\n        value: '‰',\n        codepoint: 8240,\n      },\n      {\n        name: 'PER TEN THOUSAND SIGN',\n        value: '‱',\n        codepoint: 8241,\n      },\n      {\n        name: 'PRIME',\n        value: '′',\n        codepoint: 8242,\n      },\n      {\n        name: 'DOUBLE PRIME',\n        value: '″',\n        codepoint: 8243,\n      },\n      {\n        name: 'TRIPLE PRIME',\n        value: '‴',\n        codepoint: 8244,\n      },\n      {\n        name: 'REVERSED PRIME',\n        value: '‵',\n        codepoint: 8245,\n      },\n      {\n        name: 'REVERSED DOUBLE PRIME',\n        value: '‶',\n        codepoint: 8246,\n      },\n      {\n        name: 'REVERSED TRIPLE PRIME',\n        value: '‷',\n        codepoint: 8247,\n      },\n      {\n        name: 'CARET',\n        value: '‸',\n        codepoint: 8248,\n      },\n      {\n        name: 'SINGLE LEFT-POINTING ANGLE QUOTATION MARK',\n        value: '‹',\n        codepoint: 8249,\n      },\n      {\n        name: 'SINGLE RIGHT-POINTING ANGLE QUOTATION MARK',\n        value: '›',\n        codepoint: 8250,\n      },\n      {\n        name: 'REFERENCE MARK',\n        value: '※',\n        codepoint: 8251,\n      },\n      {\n        name: 'INTERROBANG',\n        value: '‽',\n        codepoint: 8253,\n      },\n      {\n        name: 'OVERLINE',\n        value: '‾',\n        codepoint: 8254,\n      },\n      {\n        name: 'UNDERTIE',\n        value: '‿',\n        codepoint: 8255,\n      },\n      {\n        name: 'CHARACTER TIE',\n        value: '⁀',\n        codepoint: 8256,\n      },\n      {\n        name: 'CARET INSERTION POINT',\n        value: '⁁',\n        codepoint: 8257,\n      },\n      {\n        name: 'ASTERISM',\n        value: '⁂',\n        codepoint: 8258,\n      },\n      {\n        name: 'HYPHEN BULLET',\n        value: '⁃',\n        codepoint: 8259,\n      },\n      {\n        name: 'FRACTION SLASH',\n        value: '⁄',\n        codepoint: 8260,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET WITH QUILL',\n        value: '⁅',\n        codepoint: 8261,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET WITH QUILL',\n        value: '⁆',\n        codepoint: 8262,\n      },\n      {\n        name: 'DOUBLE QUESTION MARK',\n        value: '⁇',\n        codepoint: 8263,\n      },\n      {\n        name: 'QUESTION EXCLAMATION MARK',\n        value: '⁈',\n        codepoint: 8264,\n      },\n      {\n        name: 'TIRONIAN SIGN ET',\n        value: '⁊',\n        codepoint: 8266,\n      },\n      {\n        name: 'REVERSED PILCROW SIGN',\n        value: '⁋',\n        codepoint: 8267,\n      },\n      {\n        name: 'BLACK LEFTWARDS BULLET',\n        value: '⁌',\n        codepoint: 8268,\n      },\n      {\n        name: 'BLACK RIGHTWARDS BULLET',\n        value: '⁍',\n        codepoint: 8269,\n      },\n      {\n        name: 'LOW ASTERISK',\n        value: '⁎',\n        codepoint: 8270,\n      },\n      {\n        name: 'REVERSED SEMICOLON',\n        value: '⁏',\n        codepoint: 8271,\n      },\n      {\n        name: 'CLOSE UP',\n        value: '⁐',\n        codepoint: 8272,\n      },\n      {\n        name: 'TWO ASTERISKS ALIGNED VERTICALLY',\n        value: '⁑',\n        codepoint: 8273,\n      },\n      {\n        name: 'COMMERCIAL MINUS SIGN',\n        value: '⁒',\n        codepoint: 8274,\n      },\n      {\n        name: 'SWUNG DASH',\n        value: '⁓',\n        codepoint: 8275,\n      },\n      {\n        name: 'INVERTED UNDERTIE',\n        value: '⁔',\n        codepoint: 8276,\n      },\n      {\n        name: 'FLOWER PUNCTUATION MARK',\n        value: '⁕',\n        codepoint: 8277,\n      },\n      {\n        name: 'THREE DOT PUNCTUATION',\n        value: '⁖',\n        codepoint: 8278,\n      },\n      {\n        name: 'QUADRUPLE PRIME',\n        value: '⁗',\n        codepoint: 8279,\n      },\n      {\n        name: 'FOUR DOT PUNCTUATION',\n        value: '⁘',\n        codepoint: 8280,\n      },\n      {\n        name: 'FIVE DOT PUNCTUATION',\n        value: '⁙',\n        codepoint: 8281,\n      },\n      {\n        name: 'TWO DOT PUNCTUATION',\n        value: '⁚',\n        codepoint: 8282,\n      },\n      {\n        name: 'FOUR DOT MARK',\n        value: '⁛',\n        codepoint: 8283,\n      },\n      {\n        name: 'DOTTED CROSS',\n        value: '⁜',\n        codepoint: 8284,\n      },\n      {\n        name: 'TRICOLON',\n        value: '⁝',\n        codepoint: 8285,\n      },\n      {\n        name: 'VERTICAL FOUR DOTS',\n        value: '⁞',\n        codepoint: 8286,\n      },\n      {\n        name: 'MEDIUM MATHEMATICAL SPACE',\n        value: ' ',\n        codepoint: 8287,\n      },\n      {\n        name: 'RIGHT ANGLE SUBSTITUTION MARKER',\n        value: '⸀',\n        codepoint: 11776,\n      },\n      {\n        name: 'RIGHT ANGLE DOTTED SUBSTITUTION MARKER',\n        value: '⸁',\n        codepoint: 11777,\n      },\n      {\n        name: 'LEFT SUBSTITUTION BRACKET',\n        value: '⸂',\n        codepoint: 11778,\n      },\n      {\n        name: 'RIGHT SUBSTITUTION BRACKET',\n        value: '⸃',\n        codepoint: 11779,\n      },\n      {\n        name: 'LEFT DOTTED SUBSTITUTION BRACKET',\n        value: '⸄',\n        codepoint: 11780,\n      },\n      {\n        name: 'RIGHT DOTTED SUBSTITUTION BRACKET',\n        value: '⸅',\n        codepoint: 11781,\n      },\n      {\n        name: 'RAISED INTERPOLATION MARKER',\n        value: '⸆',\n        codepoint: 11782,\n      },\n      {\n        name: 'RAISED DOTTED INTERPOLATION MARKER',\n        value: '⸇',\n        codepoint: 11783,\n      },\n      {\n        name: 'DOTTED TRANSPOSITION MARKER',\n        value: '⸈',\n        codepoint: 11784,\n      },\n      {\n        name: 'LEFT TRANSPOSITION BRACKET',\n        value: '⸉',\n        codepoint: 11785,\n      },\n      {\n        name: 'RIGHT TRANSPOSITION BRACKET',\n        value: '⸊',\n        codepoint: 11786,\n      },\n      {\n        name: 'RAISED SQUARE',\n        value: '⸋',\n        codepoint: 11787,\n      },\n      {\n        name: 'LEFT RAISED OMISSION BRACKET',\n        value: '⸌',\n        codepoint: 11788,\n      },\n      {\n        name: 'RIGHT RAISED OMISSION BRACKET',\n        value: '⸍',\n        codepoint: 11789,\n      },\n      {\n        name: 'EDITORIAL CORONIS',\n        value: '⸎',\n        codepoint: 11790,\n      },\n      {\n        name: 'PARAGRAPHOS',\n        value: '⸏',\n        codepoint: 11791,\n      },\n      {\n        name: 'FORKED PARAGRAPHOS',\n        value: '⸐',\n        codepoint: 11792,\n      },\n      {\n        name: 'REVERSED FORKED PARAGRAPHOS',\n        value: '⸑',\n        codepoint: 11793,\n      },\n      {\n        name: 'HYPODIASTOLE',\n        value: '⸒',\n        codepoint: 11794,\n      },\n      {\n        name: 'DOTTED OBELOS',\n        value: '⸓',\n        codepoint: 11795,\n      },\n      {\n        name: 'DOWNWARDS ANCORA',\n        value: '⸔',\n        codepoint: 11796,\n      },\n      {\n        name: 'UPWARDS ANCORA',\n        value: '⸕',\n        codepoint: 11797,\n      },\n      {\n        name: 'DOTTED RIGHT-POINTING ANGLE',\n        value: '⸖',\n        codepoint: 11798,\n      },\n      {\n        name: 'DOUBLE OBLIQUE HYPHEN',\n        value: '⸗',\n        codepoint: 11799,\n      },\n      {\n        name: 'INVERTED INTERROBANG',\n        value: '⸘',\n        codepoint: 11800,\n      },\n      {\n        name: 'HYPHEN WITH DIAERESIS',\n        value: '⸚',\n        codepoint: 11802,\n      },\n      {\n        name: 'TILDE WITH RING ABOVE',\n        value: '⸛',\n        codepoint: 11803,\n      },\n      {\n        name: 'LEFT LOW PARAPHRASE BRACKET',\n        value: '⸜',\n        codepoint: 11804,\n      },\n      {\n        name: 'RIGHT LOW PARAPHRASE BRACKET',\n        value: '⸝',\n        codepoint: 11805,\n      },\n      {\n        name: 'TILDE WITH DOT ABOVE',\n        value: '⸞',\n        codepoint: 11806,\n      },\n      {\n        name: 'TILDE WITH DOT BELOW',\n        value: '⸟',\n        codepoint: 11807,\n      },\n      {\n        name: 'LEFT VERTICAL BAR WITH QUILL',\n        value: '⸠',\n        codepoint: 11808,\n      },\n      {\n        name: 'RIGHT VERTICAL BAR WITH QUILL',\n        value: '⸡',\n        codepoint: 11809,\n      },\n      {\n        name: 'TOP LEFT HALF BRACKET',\n        value: '⸢',\n        codepoint: 11810,\n      },\n      {\n        name: 'TOP RIGHT HALF BRACKET',\n        value: '⸣',\n        codepoint: 11811,\n      },\n      {\n        name: 'BOTTOM LEFT HALF BRACKET',\n        value: '⸤',\n        codepoint: 11812,\n      },\n      {\n        name: 'BOTTOM RIGHT HALF BRACKET',\n        value: '⸥',\n        codepoint: 11813,\n      },\n      {\n        name: 'LEFT SIDEWAYS U BRACKET',\n        value: '⸦',\n        codepoint: 11814,\n      },\n      {\n        name: 'RIGHT SIDEWAYS U BRACKET',\n        value: '⸧',\n        codepoint: 11815,\n      },\n      {\n        name: 'LEFT DOUBLE PARENTHESIS',\n        value: '⸨',\n        codepoint: 11816,\n      },\n      {\n        name: 'RIGHT DOUBLE PARENTHESIS',\n        value: '⸩',\n        codepoint: 11817,\n      },\n      {\n        name: 'TWO DOTS OVER ONE DOT PUNCTUATION',\n        value: '⸪',\n        codepoint: 11818,\n      },\n      {\n        name: 'ONE DOT OVER TWO DOTS PUNCTUATION',\n        value: '⸫',\n        codepoint: 11819,\n      },\n      {\n        name: 'SQUARED FOUR DOT PUNCTUATION',\n        value: '⸬',\n        codepoint: 11820,\n      },\n      {\n        name: 'FIVE DOT MARK',\n        value: '⸭',\n        codepoint: 11821,\n      },\n      {\n        name: 'REVERSED QUESTION MARK',\n        value: '⸮',\n        codepoint: 11822,\n      },\n      {\n        name: 'VERTICAL TILDE',\n        value: 'ⸯ',\n        codepoint: 11823,\n      },\n      {\n        name: 'RING POINT',\n        value: '⸰',\n        codepoint: 11824,\n      },\n      {\n        name: 'WORD SEPARATOR MIDDLE DOT',\n        value: '⸱',\n        codepoint: 11825,\n      },\n    ],\n  },\n  {\n    name: 'Technical',\n    symbols: [\n      {\n        name: 'DIAMETER SIGN',\n        value: '⌀',\n        codepoint: 8960,\n      },\n      {\n        name: 'ELECTRIC ARROW',\n        value: '⌁',\n        codepoint: 8961,\n      },\n      {\n        name: 'HOUSE',\n        value: '⌂',\n        codepoint: 8962,\n      },\n      {\n        name: 'UP ARROWHEAD',\n        value: '⌃',\n        codepoint: 8963,\n      },\n      {\n        name: 'DOWN ARROWHEAD',\n        value: '⌄',\n        codepoint: 8964,\n      },\n      {\n        name: 'PROJECTIVE',\n        value: '⌅',\n        codepoint: 8965,\n      },\n      {\n        name: 'PERSPECTIVE',\n        value: '⌆',\n        codepoint: 8966,\n      },\n      {\n        name: 'WAVY LINE',\n        value: '⌇',\n        codepoint: 8967,\n      },\n      {\n        name: 'LEFT CEILING',\n        value: '⌈',\n        codepoint: 8968,\n      },\n      {\n        name: 'RIGHT CEILING',\n        value: '⌉',\n        codepoint: 8969,\n      },\n      {\n        name: 'LEFT FLOOR',\n        value: '⌊',\n        codepoint: 8970,\n      },\n      {\n        name: 'RIGHT FLOOR',\n        value: '⌋',\n        codepoint: 8971,\n      },\n      {\n        name: 'BOTTOM RIGHT CROP',\n        value: '⌌',\n        codepoint: 8972,\n      },\n      {\n        name: 'BOTTOM LEFT CROP',\n        value: '⌍',\n        codepoint: 8973,\n      },\n      {\n        name: 'TOP RIGHT CROP',\n        value: '⌎',\n        codepoint: 8974,\n      },\n      {\n        name: 'TOP LEFT CROP',\n        value: '⌏',\n        codepoint: 8975,\n      },\n      {\n        name: 'REVERSED NOT SIGN',\n        value: '⌐',\n        codepoint: 8976,\n      },\n      {\n        name: 'SQUARE LOZENGE',\n        value: '⌑',\n        codepoint: 8977,\n      },\n      {\n        name: 'ARC',\n        value: '⌒',\n        codepoint: 8978,\n      },\n      {\n        name: 'SEGMENT',\n        value: '⌓',\n        codepoint: 8979,\n      },\n      {\n        name: 'SECTOR',\n        value: '⌔',\n        codepoint: 8980,\n      },\n      {\n        name: 'TELEPHONE RECORDER',\n        value: '⌕',\n        codepoint: 8981,\n      },\n      {\n        name: 'POSITION INDICATOR',\n        value: '⌖',\n        codepoint: 8982,\n      },\n      {\n        name: 'VIEWDATA SQUARE',\n        value: '⌗',\n        codepoint: 8983,\n      },\n      {\n        name: 'PLACE OF INTEREST SIGN',\n        value: '⌘',\n        codepoint: 8984,\n      },\n      {\n        name: 'TURNED NOT SIGN',\n        value: '⌙',\n        codepoint: 8985,\n      },\n      {\n        name: 'TOP LEFT CORNER',\n        value: '⌜',\n        codepoint: 8988,\n      },\n      {\n        name: 'TOP RIGHT CORNER',\n        value: '⌝',\n        codepoint: 8989,\n      },\n      {\n        name: 'BOTTOM LEFT CORNER',\n        value: '⌞',\n        codepoint: 8990,\n      },\n      {\n        name: 'BOTTOM RIGHT CORNER',\n        value: '⌟',\n        codepoint: 8991,\n      },\n      {\n        name: 'TOP HALF INTEGRAL',\n        value: '⌠',\n        codepoint: 8992,\n      },\n      {\n        name: 'BOTTOM HALF INTEGRAL',\n        value: '⌡',\n        codepoint: 8993,\n      },\n      {\n        name: 'FROWN',\n        value: '⌢',\n        codepoint: 8994,\n      },\n      {\n        name: 'SMILE',\n        value: '⌣',\n        codepoint: 8995,\n      },\n      {\n        name: 'UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS',\n        value: '⌤',\n        codepoint: 8996,\n      },\n      {\n        name: 'OPTION KEY',\n        value: '⌥',\n        codepoint: 8997,\n      },\n      {\n        name: 'ERASE TO THE RIGHT',\n        value: '⌦',\n        codepoint: 8998,\n      },\n      {\n        name: 'X IN A RECTANGLE BOX',\n        value: '⌧',\n        codepoint: 8999,\n      },\n      {\n        name: 'LEFT-POINTING ANGLE BRACKET',\n        value: '〈',\n        codepoint: 9001,\n      },\n      {\n        name: 'RIGHT-POINTING ANGLE BRACKET',\n        value: '〉',\n        codepoint: 9002,\n      },\n      {\n        name: 'ERASE TO THE LEFT',\n        value: '⌫',\n        codepoint: 9003,\n      },\n      {\n        name: 'BENZENE RING',\n        value: '⌬',\n        codepoint: 9004,\n      },\n      {\n        name: 'CYLINDRICITY',\n        value: '⌭',\n        codepoint: 9005,\n      },\n      {\n        name: 'ALL AROUND-PROFILE',\n        value: '⌮',\n        codepoint: 9006,\n      },\n      {\n        name: 'SYMMETRY',\n        value: '⌯',\n        codepoint: 9007,\n      },\n      {\n        name: 'TOTAL RUNOUT',\n        value: '⌰',\n        codepoint: 9008,\n      },\n      {\n        name: 'DIMENSION ORIGIN',\n        value: '⌱',\n        codepoint: 9009,\n      },\n      {\n        name: 'CONICAL TAPER',\n        value: '⌲',\n        codepoint: 9010,\n      },\n      {\n        name: 'SLOPE',\n        value: '⌳',\n        codepoint: 9011,\n      },\n      {\n        name: 'COUNTERBORE',\n        value: '⌴',\n        codepoint: 9012,\n      },\n      {\n        name: 'COUNTERSINK',\n        value: '⌵',\n        codepoint: 9013,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL I-BEAM',\n        value: '⌶',\n        codepoint: 9014,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL SQUISH QUAD',\n        value: '⌷',\n        codepoint: 9015,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD EQUAL',\n        value: '⌸',\n        codepoint: 9016,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DIVIDE',\n        value: '⌹',\n        codepoint: 9017,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DIAMOND',\n        value: '⌺',\n        codepoint: 9018,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD JOT',\n        value: '⌻',\n        codepoint: 9019,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD CIRCLE',\n        value: '⌼',\n        codepoint: 9020,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE STILE',\n        value: '⌽',\n        codepoint: 9021,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE JOT',\n        value: '⌾',\n        codepoint: 9022,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL SLASH BAR',\n        value: '⌿',\n        codepoint: 9023,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL BACKSLASH BAR',\n        value: '⍀',\n        codepoint: 9024,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD SLASH',\n        value: '⍁',\n        codepoint: 9025,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD BACKSLASH',\n        value: '⍂',\n        codepoint: 9026,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD LESS-THAN',\n        value: '⍃',\n        codepoint: 9027,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD GREATER-THAN',\n        value: '⍄',\n        codepoint: 9028,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL LEFTWARDS VANE',\n        value: '⍅',\n        codepoint: 9029,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL RIGHTWARDS VANE',\n        value: '⍆',\n        codepoint: 9030,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW',\n        value: '⍇',\n        codepoint: 9031,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW',\n        value: '⍈',\n        codepoint: 9032,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH',\n        value: '⍉',\n        codepoint: 9033,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR',\n        value: '⍊',\n        codepoint: 9034,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DELTA STILE',\n        value: '⍋',\n        codepoint: 9035,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DOWN CARET',\n        value: '⍌',\n        codepoint: 9036,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DELTA',\n        value: '⍍',\n        codepoint: 9037,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DOWN TACK JOT',\n        value: '⍎',\n        codepoint: 9038,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UPWARDS VANE',\n        value: '⍏',\n        codepoint: 9039,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW',\n        value: '⍐',\n        codepoint: 9040,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UP TACK OVERBAR',\n        value: '⍑',\n        codepoint: 9041,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DEL STILE',\n        value: '⍒',\n        codepoint: 9042,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD UP CARET',\n        value: '⍓',\n        codepoint: 9043,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DEL',\n        value: '⍔',\n        codepoint: 9044,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UP TACK JOT',\n        value: '⍕',\n        codepoint: 9045,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DOWNWARDS VANE',\n        value: '⍖',\n        codepoint: 9046,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW',\n        value: '⍗',\n        codepoint: 9047,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUOTE UNDERBAR',\n        value: '⍘',\n        codepoint: 9048,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DELTA UNDERBAR',\n        value: '⍙',\n        codepoint: 9049,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR',\n        value: '⍚',\n        codepoint: 9050,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL JOT UNDERBAR',\n        value: '⍛',\n        codepoint: 9051,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR',\n        value: '⍜',\n        codepoint: 9052,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UP SHOE JOT',\n        value: '⍝',\n        codepoint: 9053,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUOTE QUAD',\n        value: '⍞',\n        codepoint: 9054,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE STAR',\n        value: '⍟',\n        codepoint: 9055,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD COLON',\n        value: '⍠',\n        codepoint: 9056,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UP TACK DIAERESIS',\n        value: '⍡',\n        codepoint: 9057,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DEL DIAERESIS',\n        value: '⍢',\n        codepoint: 9058,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL STAR DIAERESIS',\n        value: '⍣',\n        codepoint: 9059,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL JOT DIAERESIS',\n        value: '⍤',\n        codepoint: 9060,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS',\n        value: '⍥',\n        codepoint: 9061,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DOWN SHOE STILE',\n        value: '⍦',\n        codepoint: 9062,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL LEFT SHOE STILE',\n        value: '⍧',\n        codepoint: 9063,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL TILDE DIAERESIS',\n        value: '⍨',\n        codepoint: 9064,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS',\n        value: '⍩',\n        codepoint: 9065,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL COMMA BAR',\n        value: '⍪',\n        codepoint: 9066,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DEL TILDE',\n        value: '⍫',\n        codepoint: 9067,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL ZILDE',\n        value: '⍬',\n        codepoint: 9068,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL STILE TILDE',\n        value: '⍭',\n        codepoint: 9069,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR',\n        value: '⍮',\n        codepoint: 9070,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD NOT EQUAL',\n        value: '⍯',\n        codepoint: 9071,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD QUESTION',\n        value: '⍰',\n        codepoint: 9072,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL DOWN CARET TILDE',\n        value: '⍱',\n        codepoint: 9073,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL UP CARET TILDE',\n        value: '⍲',\n        codepoint: 9074,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL IOTA',\n        value: '⍳',\n        codepoint: 9075,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL RHO',\n        value: '⍴',\n        codepoint: 9076,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL OMEGA',\n        value: '⍵',\n        codepoint: 9077,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL ALPHA UNDERBAR',\n        value: '⍶',\n        codepoint: 9078,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL EPSILON UNDERBAR',\n        value: '⍷',\n        codepoint: 9079,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL IOTA UNDERBAR',\n        value: '⍸',\n        codepoint: 9080,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL OMEGA UNDERBAR',\n        value: '⍹',\n        codepoint: 9081,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL ALPHA',\n        value: '⍺',\n        codepoint: 9082,\n      },\n      {\n        name: 'NOT CHECK MARK',\n        value: '⍻',\n        codepoint: 9083,\n      },\n      {\n        name: 'RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW',\n        value: '⍼',\n        codepoint: 9084,\n      },\n      {\n        name: 'SHOULDERED OPEN BOX',\n        value: '⍽',\n        codepoint: 9085,\n      },\n      {\n        name: 'BELL SYMBOL',\n        value: '⍾',\n        codepoint: 9086,\n      },\n      {\n        name: 'VERTICAL LINE WITH MIDDLE DOT',\n        value: '⍿',\n        codepoint: 9087,\n      },\n      {\n        name: 'INSERTION SYMBOL',\n        value: '⎀',\n        codepoint: 9088,\n      },\n      {\n        name: 'CONTINUOUS UNDERLINE SYMBOL',\n        value: '⎁',\n        codepoint: 9089,\n      },\n      {\n        name: 'DISCONTINUOUS UNDERLINE SYMBOL',\n        value: '⎂',\n        codepoint: 9090,\n      },\n      {\n        name: 'EMPHASIS SYMBOL',\n        value: '⎃',\n        codepoint: 9091,\n      },\n      {\n        name: 'COMPOSITION SYMBOL',\n        value: '⎄',\n        codepoint: 9092,\n      },\n      {\n        name: 'WHITE SQUARE WITH CENTRE VERTICAL LINE',\n        value: '⎅',\n        codepoint: 9093,\n      },\n      {\n        name: 'ENTER SYMBOL',\n        value: '⎆',\n        codepoint: 9094,\n      },\n      {\n        name: 'ALTERNATIVE KEY SYMBOL',\n        value: '⎇',\n        codepoint: 9095,\n      },\n      {\n        name: 'HELM SYMBOL',\n        value: '⎈',\n        codepoint: 9096,\n      },\n      {\n        name: 'CIRCLED HORIZONTAL BAR WITH NOTCH',\n        value: '⎉',\n        codepoint: 9097,\n      },\n      {\n        name: 'CIRCLED TRIANGLE DOWN',\n        value: '⎊',\n        codepoint: 9098,\n      },\n      {\n        name: 'BROKEN CIRCLE WITH NORTHWEST ARROW',\n        value: '⎋',\n        codepoint: 9099,\n      },\n      {\n        name: 'UNDO SYMBOL',\n        value: '⎌',\n        codepoint: 9100,\n      },\n      {\n        name: 'MONOSTABLE SYMBOL',\n        value: '⎍',\n        codepoint: 9101,\n      },\n      {\n        name: 'HYSTERESIS SYMBOL',\n        value: '⎎',\n        codepoint: 9102,\n      },\n      {\n        name: 'OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL',\n        value: '⎏',\n        codepoint: 9103,\n      },\n      {\n        name: 'OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL',\n        value: '⎐',\n        codepoint: 9104,\n      },\n      {\n        name: 'PASSIVE-PULL-DOWN-OUTPUT SYMBOL',\n        value: '⎑',\n        codepoint: 9105,\n      },\n      {\n        name: 'PASSIVE-PULL-UP-OUTPUT SYMBOL',\n        value: '⎒',\n        codepoint: 9106,\n      },\n      {\n        name: 'DIRECT CURRENT SYMBOL FORM TWO',\n        value: '⎓',\n        codepoint: 9107,\n      },\n      {\n        name: 'SOFTWARE-FUNCTION SYMBOL',\n        value: '⎔',\n        codepoint: 9108,\n      },\n      {\n        name: 'APL FUNCTIONAL SYMBOL QUAD',\n        value: '⎕',\n        codepoint: 9109,\n      },\n      {\n        name: 'DECIMAL SEPARATOR KEY SYMBOL',\n        value: '⎖',\n        codepoint: 9110,\n      },\n      {\n        name: 'PREVIOUS PAGE',\n        value: '⎗',\n        codepoint: 9111,\n      },\n      {\n        name: 'NEXT PAGE',\n        value: '⎘',\n        codepoint: 9112,\n      },\n      {\n        name: 'PRINT SCREEN SYMBOL',\n        value: '⎙',\n        codepoint: 9113,\n      },\n      {\n        name: 'CLEAR SCREEN SYMBOL',\n        value: '⎚',\n        codepoint: 9114,\n      },\n      {\n        name: 'LEFT PARENTHESIS UPPER HOOK',\n        value: '⎛',\n        codepoint: 9115,\n      },\n      {\n        name: 'LEFT PARENTHESIS EXTENSION',\n        value: '⎜',\n        codepoint: 9116,\n      },\n      {\n        name: 'LEFT PARENTHESIS LOWER HOOK',\n        value: '⎝',\n        codepoint: 9117,\n      },\n      {\n        name: 'RIGHT PARENTHESIS UPPER HOOK',\n        value: '⎞',\n        codepoint: 9118,\n      },\n      {\n        name: 'RIGHT PARENTHESIS EXTENSION',\n        value: '⎟',\n        codepoint: 9119,\n      },\n      {\n        name: 'RIGHT PARENTHESIS LOWER HOOK',\n        value: '⎠',\n        codepoint: 9120,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET UPPER CORNER',\n        value: '⎡',\n        codepoint: 9121,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET EXTENSION',\n        value: '⎢',\n        codepoint: 9122,\n      },\n      {\n        name: 'LEFT SQUARE BRACKET LOWER CORNER',\n        value: '⎣',\n        codepoint: 9123,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET UPPER CORNER',\n        value: '⎤',\n        codepoint: 9124,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET EXTENSION',\n        value: '⎥',\n        codepoint: 9125,\n      },\n      {\n        name: 'RIGHT SQUARE BRACKET LOWER CORNER',\n        value: '⎦',\n        codepoint: 9126,\n      },\n      {\n        name: 'LEFT CURLY BRACKET UPPER HOOK',\n        value: '⎧',\n        codepoint: 9127,\n      },\n      {\n        name: 'LEFT CURLY BRACKET MIDDLE PIECE',\n        value: '⎨',\n        codepoint: 9128,\n      },\n      {\n        name: 'LEFT CURLY BRACKET LOWER HOOK',\n        value: '⎩',\n        codepoint: 9129,\n      },\n      {\n        name: 'CURLY BRACKET EXTENSION',\n        value: '⎪',\n        codepoint: 9130,\n      },\n      {\n        name: 'RIGHT CURLY BRACKET UPPER HOOK',\n        value: '⎫',\n        codepoint: 9131,\n      },\n      {\n        name: 'RIGHT CURLY BRACKET MIDDLE PIECE',\n        value: '⎬',\n        codepoint: 9132,\n      },\n      {\n        name: 'RIGHT CURLY BRACKET LOWER HOOK',\n        value: '⎭',\n        codepoint: 9133,\n      },\n      {\n        name: 'INTEGRAL EXTENSION',\n        value: '⎮',\n        codepoint: 9134,\n      },\n      {\n        name: 'HORIZONTAL LINE EXTENSION',\n        value: '⎯',\n        codepoint: 9135,\n      },\n      {\n        name: 'UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION',\n        value: '⎰',\n        codepoint: 9136,\n      },\n      {\n        name: 'UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION',\n        value: '⎱',\n        codepoint: 9137,\n      },\n      {\n        name: 'SUMMATION TOP',\n        value: '⎲',\n        codepoint: 9138,\n      },\n      {\n        name: 'SUMMATION BOTTOM',\n        value: '⎳',\n        codepoint: 9139,\n      },\n      {\n        name: 'TOP SQUARE BRACKET',\n        value: '⎴',\n        codepoint: 9140,\n      },\n      {\n        name: 'BOTTOM SQUARE BRACKET',\n        value: '⎵',\n        codepoint: 9141,\n      },\n      {\n        name: 'BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET',\n        value: '⎶',\n        codepoint: 9142,\n      },\n      {\n        name: 'RADICAL SYMBOL BOTTOM',\n        value: '⎷',\n        codepoint: 9143,\n      },\n      {\n        name: 'LEFT VERTICAL BOX LINE',\n        value: '⎸',\n        codepoint: 9144,\n      },\n      {\n        name: 'RIGHT VERTICAL BOX LINE',\n        value: '⎹',\n        codepoint: 9145,\n      },\n      {\n        name: 'HORIZONTAL SCAN LINE-1',\n        value: '⎺',\n        codepoint: 9146,\n      },\n      {\n        name: 'HORIZONTAL SCAN LINE-3',\n        value: '⎻',\n        codepoint: 9147,\n      },\n      {\n        name: 'HORIZONTAL SCAN LINE-7',\n        value: '⎼',\n        codepoint: 9148,\n      },\n      {\n        name: 'HORIZONTAL SCAN LINE-9',\n        value: '⎽',\n        codepoint: 9149,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT',\n        value: '⎾',\n        codepoint: 9150,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT',\n        value: '⎿',\n        codepoint: 9151,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE',\n        value: '⏀',\n        codepoint: 9152,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE',\n        value: '⏁',\n        codepoint: 9153,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE',\n        value: '⏂',\n        codepoint: 9154,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE',\n        value: '⏃',\n        codepoint: 9155,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE',\n        value: '⏄',\n        codepoint: 9156,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE',\n        value: '⏅',\n        codepoint: 9157,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE',\n        value: '⏆',\n        codepoint: 9158,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE',\n        value: '⏇',\n        codepoint: 9159,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE',\n        value: '⏈',\n        codepoint: 9160,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL',\n        value: '⏉',\n        codepoint: 9161,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL',\n        value: '⏊',\n        codepoint: 9162,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT',\n        value: '⏋',\n        codepoint: 9163,\n      },\n      {\n        name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT',\n        value: '⏌',\n        codepoint: 9164,\n      },\n      {\n        name: 'SQUARE FOOT',\n        value: '⏍',\n        codepoint: 9165,\n      },\n      {\n        name: 'RETURN SYMBOL',\n        value: '⏎',\n        codepoint: 9166,\n      },\n      {\n        name: 'VERTICAL LINE EXTENSION',\n        value: '⏐',\n        codepoint: 9168,\n      },\n      {\n        name: 'METRICAL BREVE',\n        value: '⏑',\n        codepoint: 9169,\n      },\n      {\n        name: 'METRICAL LONG OVER SHORT',\n        value: '⏒',\n        codepoint: 9170,\n      },\n      {\n        name: 'METRICAL SHORT OVER LONG',\n        value: '⏓',\n        codepoint: 9171,\n      },\n      {\n        name: 'METRICAL LONG OVER TWO SHORTS',\n        value: '⏔',\n        codepoint: 9172,\n      },\n      {\n        name: 'METRICAL TWO SHORTS OVER LONG',\n        value: '⏕',\n        codepoint: 9173,\n      },\n      {\n        name: 'METRICAL TWO SHORTS JOINED',\n        value: '⏖',\n        codepoint: 9174,\n      },\n      {\n        name: 'METRICAL TRISEME',\n        value: '⏗',\n        codepoint: 9175,\n      },\n      {\n        name: 'METRICAL TETRASEME',\n        value: '⏘',\n        codepoint: 9176,\n      },\n      {\n        name: 'METRICAL PENTASEME',\n        value: '⏙',\n        codepoint: 9177,\n      },\n      {\n        name: 'EARTH GROUND',\n        value: '⏚',\n        codepoint: 9178,\n      },\n      {\n        name: 'FUSE',\n        value: '⏛',\n        codepoint: 9179,\n      },\n      {\n        name: 'TOP PARENTHESIS',\n        value: '⏜',\n        codepoint: 9180,\n      },\n      {\n        name: 'BOTTOM PARENTHESIS',\n        value: '⏝',\n        codepoint: 9181,\n      },\n      {\n        name: 'TOP CURLY BRACKET',\n        value: '⏞',\n        codepoint: 9182,\n      },\n      {\n        name: 'BOTTOM CURLY BRACKET',\n        value: '⏟',\n        codepoint: 9183,\n      },\n      {\n        name: 'TOP TORTOISE SHELL BRACKET',\n        value: '⏠',\n        codepoint: 9184,\n      },\n      {\n        name: 'BOTTOM TORTOISE SHELL BRACKET',\n        value: '⏡',\n        codepoint: 9185,\n      },\n      {\n        name: 'WHITE TRAPEZIUM',\n        value: '⏢',\n        codepoint: 9186,\n      },\n      {\n        name: 'BENZENE RING WITH CIRCLE',\n        value: '⏣',\n        codepoint: 9187,\n      },\n      {\n        name: 'STRAIGHTNESS',\n        value: '⏤',\n        codepoint: 9188,\n      },\n      {\n        name: 'FLATNESS',\n        value: '⏥',\n        codepoint: 9189,\n      },\n      {\n        name: 'AC CURRENT',\n        value: '⏦',\n        codepoint: 9190,\n      },\n      {\n        name: 'ELECTRICAL INTERSECTION',\n        value: '⏧',\n        codepoint: 9191,\n      },\n    ],\n  },\n  {\n    name: 'Arrows',\n    symbols: [\n      {\n        name: 'UPWARDS QUADRUPLE ARROW',\n        value: '⟰',\n        codepoint: 10224,\n      },\n      {\n        name: 'DOWNWARDS QUADRUPLE ARROW',\n        value: '⟱',\n        codepoint: 10225,\n      },\n      {\n        name: 'ANTICLOCKWISE GAPPED CIRCLE ARROW',\n        value: '⟲',\n        codepoint: 10226,\n      },\n      {\n        name: 'CLOCKWISE GAPPED CIRCLE ARROW',\n        value: '⟳',\n        codepoint: 10227,\n      },\n      {\n        name: 'RIGHT ARROW WITH CIRCLED PLUS',\n        value: '⟴',\n        codepoint: 10228,\n      },\n      {\n        name: 'LONG LEFTWARDS ARROW',\n        value: '⟵',\n        codepoint: 10229,\n      },\n      {\n        name: 'LONG RIGHTWARDS ARROW',\n        value: '⟶',\n        codepoint: 10230,\n      },\n      {\n        name: 'LONG LEFT RIGHT ARROW',\n        value: '⟷',\n        codepoint: 10231,\n      },\n      {\n        name: 'LONG LEFTWARDS DOUBLE ARROW',\n        value: '⟸',\n        codepoint: 10232,\n      },\n      {\n        name: 'LONG RIGHTWARDS DOUBLE ARROW',\n        value: '⟹',\n        codepoint: 10233,\n      },\n      {\n        name: 'LONG LEFT RIGHT DOUBLE ARROW',\n        value: '⟺',\n        codepoint: 10234,\n      },\n      {\n        name: 'LONG LEFTWARDS ARROW FROM BAR',\n        value: '⟻',\n        codepoint: 10235,\n      },\n      {\n        name: 'LONG RIGHTWARDS ARROW FROM BAR',\n        value: '⟼',\n        codepoint: 10236,\n      },\n      {\n        name: 'LONG LEFTWARDS DOUBLE ARROW FROM BAR',\n        value: '⟽',\n        codepoint: 10237,\n      },\n      {\n        name: 'LONG RIGHTWARDS DOUBLE ARROW FROM BAR',\n        value: '⟾',\n        codepoint: 10238,\n      },\n      {\n        name: 'LONG RIGHTWARDS SQUIGGLE ARROW',\n        value: '⟿',\n        codepoint: 10239,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE',\n        value: '⤀',\n        codepoint: 10496,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE',\n        value: '⤁',\n        codepoint: 10497,\n      },\n      {\n        name: 'LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE',\n        value: '⤂',\n        codepoint: 10498,\n      },\n      {\n        name: 'RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE',\n        value: '⤃',\n        codepoint: 10499,\n      },\n      {\n        name: 'LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE',\n        value: '⤄',\n        codepoint: 10500,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW FROM BAR',\n        value: '⤅',\n        codepoint: 10501,\n      },\n      {\n        name: 'LEFTWARDS DOUBLE ARROW FROM BAR',\n        value: '⤆',\n        codepoint: 10502,\n      },\n      {\n        name: 'RIGHTWARDS DOUBLE ARROW FROM BAR',\n        value: '⤇',\n        codepoint: 10503,\n      },\n      {\n        name: 'DOWNWARDS ARROW WITH HORIZONTAL STROKE',\n        value: '⤈',\n        codepoint: 10504,\n      },\n      {\n        name: 'UPWARDS ARROW WITH HORIZONTAL STROKE',\n        value: '⤉',\n        codepoint: 10505,\n      },\n      {\n        name: 'UPWARDS TRIPLE ARROW',\n        value: '⤊',\n        codepoint: 10506,\n      },\n      {\n        name: 'DOWNWARDS TRIPLE ARROW',\n        value: '⤋',\n        codepoint: 10507,\n      },\n      {\n        name: 'LEFTWARDS DOUBLE DASH ARROW',\n        value: '⤌',\n        codepoint: 10508,\n      },\n      {\n        name: 'RIGHTWARDS DOUBLE DASH ARROW',\n        value: '⤍',\n        codepoint: 10509,\n      },\n      {\n        name: 'LEFTWARDS TRIPLE DASH ARROW',\n        value: '⤎',\n        codepoint: 10510,\n      },\n      {\n        name: 'RIGHTWARDS TRIPLE DASH ARROW',\n        value: '⤏',\n        codepoint: 10511,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW',\n        value: '⤐',\n        codepoint: 10512,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH DOTTED STEM',\n        value: '⤑',\n        codepoint: 10513,\n      },\n      {\n        name: 'UPWARDS ARROW TO BAR',\n        value: '⤒',\n        codepoint: 10514,\n      },\n      {\n        name: 'DOWNWARDS ARROW TO BAR',\n        value: '⤓',\n        codepoint: 10515,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE',\n        value: '⤔',\n        codepoint: 10516,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n        value: '⤕',\n        codepoint: 10517,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL',\n        value: '⤖',\n        codepoint: 10518,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE',\n        value: '⤗',\n        codepoint: 10519,\n      },\n      {\n        name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n        value: '⤘',\n        codepoint: 10520,\n      },\n      {\n        name: 'LEFTWARDS ARROW-TAIL',\n        value: '⤙',\n        codepoint: 10521,\n      },\n      {\n        name: 'RIGHTWARDS ARROW-TAIL',\n        value: '⤚',\n        codepoint: 10522,\n      },\n      {\n        name: 'LEFTWARDS DOUBLE ARROW-TAIL',\n        value: '⤛',\n        codepoint: 10523,\n      },\n      {\n        name: 'RIGHTWARDS DOUBLE ARROW-TAIL',\n        value: '⤜',\n        codepoint: 10524,\n      },\n      {\n        name: 'LEFTWARDS ARROW TO BLACK DIAMOND',\n        value: '⤝',\n        codepoint: 10525,\n      },\n      {\n        name: 'RIGHTWARDS ARROW TO BLACK DIAMOND',\n        value: '⤞',\n        codepoint: 10526,\n      },\n      {\n        name: 'LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND',\n        value: '⤟',\n        codepoint: 10527,\n      },\n      {\n        name: 'RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND',\n        value: '⤠',\n        codepoint: 10528,\n      },\n      {\n        name: 'NORTH WEST AND SOUTH EAST ARROW',\n        value: '⤡',\n        codepoint: 10529,\n      },\n      {\n        name: 'NORTH EAST AND SOUTH WEST ARROW',\n        value: '⤢',\n        codepoint: 10530,\n      },\n      {\n        name: 'NORTH WEST ARROW WITH HOOK',\n        value: '⤣',\n        codepoint: 10531,\n      },\n      {\n        name: 'NORTH EAST ARROW WITH HOOK',\n        value: '⤤',\n        codepoint: 10532,\n      },\n      {\n        name: 'SOUTH EAST ARROW WITH HOOK',\n        value: '⤥',\n        codepoint: 10533,\n      },\n      {\n        name: 'SOUTH WEST ARROW WITH HOOK',\n        value: '⤦',\n        codepoint: 10534,\n      },\n      {\n        name: 'NORTH WEST ARROW AND NORTH EAST ARROW',\n        value: '⤧',\n        codepoint: 10535,\n      },\n      {\n        name: 'NORTH EAST ARROW AND SOUTH EAST ARROW',\n        value: '⤨',\n        codepoint: 10536,\n      },\n      {\n        name: 'SOUTH EAST ARROW AND SOUTH WEST ARROW',\n        value: '⤩',\n        codepoint: 10537,\n      },\n      {\n        name: 'SOUTH WEST ARROW AND NORTH WEST ARROW',\n        value: '⤪',\n        codepoint: 10538,\n      },\n      {\n        name: 'RISING DIAGONAL CROSSING FALLING DIAGONAL',\n        value: '⤫',\n        codepoint: 10539,\n      },\n      {\n        name: 'FALLING DIAGONAL CROSSING RISING DIAGONAL',\n        value: '⤬',\n        codepoint: 10540,\n      },\n      {\n        name: 'SOUTH EAST ARROW CROSSING NORTH EAST ARROW',\n        value: '⤭',\n        codepoint: 10541,\n      },\n      {\n        name: 'NORTH EAST ARROW CROSSING SOUTH EAST ARROW',\n        value: '⤮',\n        codepoint: 10542,\n      },\n      {\n        name: 'FALLING DIAGONAL CROSSING NORTH EAST ARROW',\n        value: '⤯',\n        codepoint: 10543,\n      },\n      {\n        name: 'RISING DIAGONAL CROSSING SOUTH EAST ARROW',\n        value: '⤰',\n        codepoint: 10544,\n      },\n      {\n        name: 'NORTH EAST ARROW CROSSING NORTH WEST ARROW',\n        value: '⤱',\n        codepoint: 10545,\n      },\n      {\n        name: 'NORTH WEST ARROW CROSSING NORTH EAST ARROW',\n        value: '⤲',\n        codepoint: 10546,\n      },\n      {\n        name: 'WAVE ARROW POINTING DIRECTLY RIGHT',\n        value: '⤳',\n        codepoint: 10547,\n      },\n      {\n        name: 'ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS',\n        value: '⤶',\n        codepoint: 10550,\n      },\n      {\n        name: 'ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS',\n        value: '⤷',\n        codepoint: 10551,\n      },\n      {\n        name: 'RIGHT-SIDE ARC CLOCKWISE ARROW',\n        value: '⤸',\n        codepoint: 10552,\n      },\n      {\n        name: 'LEFT-SIDE ARC ANTICLOCKWISE ARROW',\n        value: '⤹',\n        codepoint: 10553,\n      },\n      {\n        name: 'TOP ARC ANTICLOCKWISE ARROW',\n        value: '⤺',\n        codepoint: 10554,\n      },\n      {\n        name: 'BOTTOM ARC ANTICLOCKWISE ARROW',\n        value: '⤻',\n        codepoint: 10555,\n      },\n      {\n        name: 'TOP ARC CLOCKWISE ARROW WITH MINUS',\n        value: '⤼',\n        codepoint: 10556,\n      },\n      {\n        name: 'TOP ARC ANTICLOCKWISE ARROW WITH PLUS',\n        value: '⤽',\n        codepoint: 10557,\n      },\n      {\n        name: 'LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW',\n        value: '⤾',\n        codepoint: 10558,\n      },\n      {\n        name: 'LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW',\n        value: '⤿',\n        codepoint: 10559,\n      },\n      {\n        name: 'ANTICLOCKWISE CLOSED CIRCLE ARROW',\n        value: '⥀',\n        codepoint: 10560,\n      },\n      {\n        name: 'CLOCKWISE CLOSED CIRCLE ARROW',\n        value: '⥁',\n        codepoint: 10561,\n      },\n      {\n        name: 'RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW',\n        value: '⥂',\n        codepoint: 10562,\n      },\n      {\n        name: 'LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW',\n        value: '⥃',\n        codepoint: 10563,\n      },\n      {\n        name: 'SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW',\n        value: '⥄',\n        codepoint: 10564,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH PLUS BELOW',\n        value: '⥅',\n        codepoint: 10565,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH PLUS BELOW',\n        value: '⥆',\n        codepoint: 10566,\n      },\n      {\n        name: 'RIGHTWARDS ARROW THROUGH X',\n        value: '⥇',\n        codepoint: 10567,\n      },\n      {\n        name: 'LEFT RIGHT ARROW THROUGH SMALL CIRCLE',\n        value: '⥈',\n        codepoint: 10568,\n      },\n      {\n        name: 'UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE',\n        value: '⥉',\n        codepoint: 10569,\n      },\n      {\n        name: 'LEFT BARB UP RIGHT BARB DOWN HARPOON',\n        value: '⥊',\n        codepoint: 10570,\n      },\n      {\n        name: 'LEFT BARB DOWN RIGHT BARB UP HARPOON',\n        value: '⥋',\n        codepoint: 10571,\n      },\n      {\n        name: 'UP BARB RIGHT DOWN BARB LEFT HARPOON',\n        value: '⥌',\n        codepoint: 10572,\n      },\n      {\n        name: 'UP BARB LEFT DOWN BARB RIGHT HARPOON',\n        value: '⥍',\n        codepoint: 10573,\n      },\n      {\n        name: 'LEFT BARB UP RIGHT BARB UP HARPOON',\n        value: '⥎',\n        codepoint: 10574,\n      },\n      {\n        name: 'UP BARB RIGHT DOWN BARB RIGHT HARPOON',\n        value: '⥏',\n        codepoint: 10575,\n      },\n      {\n        name: 'LEFT BARB DOWN RIGHT BARB DOWN HARPOON',\n        value: '⥐',\n        codepoint: 10576,\n      },\n      {\n        name: 'UP BARB LEFT DOWN BARB LEFT HARPOON',\n        value: '⥑',\n        codepoint: 10577,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB UP TO BAR',\n        value: '⥒',\n        codepoint: 10578,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB UP TO BAR',\n        value: '⥓',\n        codepoint: 10579,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB RIGHT TO BAR',\n        value: '⥔',\n        codepoint: 10580,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB RIGHT TO BAR',\n        value: '⥕',\n        codepoint: 10581,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB DOWN TO BAR',\n        value: '⥖',\n        codepoint: 10582,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB DOWN TO BAR',\n        value: '⥗',\n        codepoint: 10583,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB LEFT TO BAR',\n        value: '⥘',\n        codepoint: 10584,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB LEFT TO BAR',\n        value: '⥙',\n        codepoint: 10585,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB UP FROM BAR',\n        value: '⥚',\n        codepoint: 10586,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB UP FROM BAR',\n        value: '⥛',\n        codepoint: 10587,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB RIGHT FROM BAR',\n        value: '⥜',\n        codepoint: 10588,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR',\n        value: '⥝',\n        codepoint: 10589,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB DOWN FROM BAR',\n        value: '⥞',\n        codepoint: 10590,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR',\n        value: '⥟',\n        codepoint: 10591,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB LEFT FROM BAR',\n        value: '⥠',\n        codepoint: 10592,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB LEFT FROM BAR',\n        value: '⥡',\n        codepoint: 10593,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN',\n        value: '⥢',\n        codepoint: 10594,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT',\n        value: '⥣',\n        codepoint: 10595,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN',\n        value: '⥤',\n        codepoint: 10596,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT',\n        value: '⥥',\n        codepoint: 10597,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP',\n        value: '⥦',\n        codepoint: 10598,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN',\n        value: '⥧',\n        codepoint: 10599,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP',\n        value: '⥨',\n        codepoint: 10600,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN',\n        value: '⥩',\n        codepoint: 10601,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH',\n        value: '⥪',\n        codepoint: 10602,\n      },\n      {\n        name: 'LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH',\n        value: '⥫',\n        codepoint: 10603,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH',\n        value: '⥬',\n        codepoint: 10604,\n      },\n      {\n        name: 'RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH',\n        value: '⥭',\n        codepoint: 10605,\n      },\n      {\n        name: 'UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT',\n        value: '⥮',\n        codepoint: 10606,\n      },\n      {\n        name: 'DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT',\n        value: '⥯',\n        codepoint: 10607,\n      },\n      {\n        name: 'RIGHT DOUBLE ARROW WITH ROUNDED HEAD',\n        value: '⥰',\n        codepoint: 10608,\n      },\n      {\n        name: 'EQUALS SIGN ABOVE RIGHTWARDS ARROW',\n        value: '⥱',\n        codepoint: 10609,\n      },\n      {\n        name: 'TILDE OPERATOR ABOVE RIGHTWARDS ARROW',\n        value: '⥲',\n        codepoint: 10610,\n      },\n      {\n        name: 'LEFTWARDS ARROW ABOVE TILDE OPERATOR',\n        value: '⥳',\n        codepoint: 10611,\n      },\n      {\n        name: 'RIGHTWARDS ARROW ABOVE TILDE OPERATOR',\n        value: '⥴',\n        codepoint: 10612,\n      },\n      {\n        name: 'RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO',\n        value: '⥵',\n        codepoint: 10613,\n      },\n      {\n        name: 'LESS-THAN ABOVE LEFTWARDS ARROW',\n        value: '⥶',\n        codepoint: 10614,\n      },\n      {\n        name: 'LEFTWARDS ARROW THROUGH LESS-THAN',\n        value: '⥷',\n        codepoint: 10615,\n      },\n      {\n        name: 'GREATER-THAN ABOVE RIGHTWARDS ARROW',\n        value: '⥸',\n        codepoint: 10616,\n      },\n      {\n        name: 'SUBSET ABOVE RIGHTWARDS ARROW',\n        value: '⥹',\n        codepoint: 10617,\n      },\n      {\n        name: 'LEFTWARDS ARROW THROUGH SUBSET',\n        value: '⥺',\n        codepoint: 10618,\n      },\n      {\n        name: 'SUPERSET ABOVE LEFTWARDS ARROW',\n        value: '⥻',\n        codepoint: 10619,\n      },\n      {\n        name: 'LEFT FISH TAIL',\n        value: '⥼',\n        codepoint: 10620,\n      },\n      {\n        name: 'RIGHT FISH TAIL',\n        value: '⥽',\n        codepoint: 10621,\n      },\n      {\n        name: 'UP FISH TAIL',\n        value: '⥾',\n        codepoint: 10622,\n      },\n      {\n        name: 'DOWN FISH TAIL',\n        value: '⥿',\n        codepoint: 10623,\n      },\n      {\n        name: 'NORTH EAST WHITE ARROW',\n        value: '⬀',\n        codepoint: 11008,\n      },\n      {\n        name: 'NORTH WEST WHITE ARROW',\n        value: '⬁',\n        codepoint: 11009,\n      },\n      {\n        name: 'SOUTH EAST WHITE ARROW',\n        value: '⬂',\n        codepoint: 11010,\n      },\n      {\n        name: 'SOUTH WEST WHITE ARROW',\n        value: '⬃',\n        codepoint: 11011,\n      },\n      {\n        name: 'LEFT RIGHT WHITE ARROW',\n        value: '⬄',\n        codepoint: 11012,\n      },\n      {\n        name: 'NORTH EAST BLACK ARROW',\n        value: '⬈',\n        codepoint: 11016,\n      },\n      {\n        name: 'NORTH WEST BLACK ARROW',\n        value: '⬉',\n        codepoint: 11017,\n      },\n      {\n        name: 'SOUTH EAST BLACK ARROW',\n        value: '⬊',\n        codepoint: 11018,\n      },\n      {\n        name: 'SOUTH WEST BLACK ARROW',\n        value: '⬋',\n        codepoint: 11019,\n      },\n      {\n        name: 'LEFT RIGHT BLACK ARROW',\n        value: '⬌',\n        codepoint: 11020,\n      },\n      {\n        name: 'UP DOWN BLACK ARROW',\n        value: '⬍',\n        codepoint: 11021,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH TIP DOWNWARDS',\n        value: '⬎',\n        codepoint: 11022,\n      },\n      {\n        name: 'RIGHTWARDS ARROW WITH TIP UPWARDS',\n        value: '⬏',\n        codepoint: 11023,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH TIP DOWNWARDS',\n        value: '⬐',\n        codepoint: 11024,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH TIP UPWARDS',\n        value: '⬑',\n        codepoint: 11025,\n      },\n      {\n        name: 'SQUARE WITH TOP HALF BLACK',\n        value: '⬒',\n        codepoint: 11026,\n      },\n      {\n        name: 'SQUARE WITH BOTTOM HALF BLACK',\n        value: '⬓',\n        codepoint: 11027,\n      },\n      {\n        name: 'SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK',\n        value: '⬔',\n        codepoint: 11028,\n      },\n      {\n        name: 'SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK',\n        value: '⬕',\n        codepoint: 11029,\n      },\n      {\n        name: 'DIAMOND WITH LEFT HALF BLACK',\n        value: '⬖',\n        codepoint: 11030,\n      },\n      {\n        name: 'DIAMOND WITH RIGHT HALF BLACK',\n        value: '⬗',\n        codepoint: 11031,\n      },\n      {\n        name: 'DIAMOND WITH TOP HALF BLACK',\n        value: '⬘',\n        codepoint: 11032,\n      },\n      {\n        name: 'DIAMOND WITH BOTTOM HALF BLACK',\n        value: '⬙',\n        codepoint: 11033,\n      },\n      {\n        name: 'DOTTED SQUARE',\n        value: '⬚',\n        codepoint: 11034,\n      },\n      {\n        name: 'BLACK VERY SMALL SQUARE',\n        value: '⬝',\n        codepoint: 11037,\n      },\n      {\n        name: 'WHITE VERY SMALL SQUARE',\n        value: '⬞',\n        codepoint: 11038,\n      },\n      {\n        name: 'BLACK PENTAGON',\n        value: '⬟',\n        codepoint: 11039,\n      },\n      {\n        name: 'WHITE PENTAGON',\n        value: '⬠',\n        codepoint: 11040,\n      },\n      {\n        name: 'WHITE HEXAGON',\n        value: '⬡',\n        codepoint: 11041,\n      },\n      {\n        name: 'BLACK HEXAGON',\n        value: '⬢',\n        codepoint: 11042,\n      },\n      {\n        name: 'HORIZONTAL BLACK HEXAGON',\n        value: '⬣',\n        codepoint: 11043,\n      },\n      {\n        name: 'BLACK LARGE CIRCLE',\n        value: '⬤',\n        codepoint: 11044,\n      },\n      {\n        name: 'BLACK MEDIUM DIAMOND',\n        value: '⬥',\n        codepoint: 11045,\n      },\n      {\n        name: 'WHITE MEDIUM DIAMOND',\n        value: '⬦',\n        codepoint: 11046,\n      },\n      {\n        name: 'BLACK MEDIUM LOZENGE',\n        value: '⬧',\n        codepoint: 11047,\n      },\n      {\n        name: 'WHITE MEDIUM LOZENGE',\n        value: '⬨',\n        codepoint: 11048,\n      },\n      {\n        name: 'BLACK SMALL DIAMOND',\n        value: '⬩',\n        codepoint: 11049,\n      },\n      {\n        name: 'BLACK SMALL LOZENGE',\n        value: '⬪',\n        codepoint: 11050,\n      },\n      {\n        name: 'WHITE SMALL LOZENGE',\n        value: '⬫',\n        codepoint: 11051,\n      },\n      {\n        name: 'BLACK HORIZONTAL ELLIPSE',\n        value: '⬬',\n        codepoint: 11052,\n      },\n      {\n        name: 'WHITE HORIZONTAL ELLIPSE',\n        value: '⬭',\n        codepoint: 11053,\n      },\n      {\n        name: 'BLACK VERTICAL ELLIPSE',\n        value: '⬮',\n        codepoint: 11054,\n      },\n      {\n        name: 'WHITE VERTICAL ELLIPSE',\n        value: '⬯',\n        codepoint: 11055,\n      },\n      {\n        name: 'LEFT ARROW WITH SMALL CIRCLE',\n        value: '⬰',\n        codepoint: 11056,\n      },\n      {\n        name: 'THREE LEFTWARDS ARROWS',\n        value: '⬱',\n        codepoint: 11057,\n      },\n      {\n        name: 'LEFT ARROW WITH CIRCLED PLUS',\n        value: '⬲',\n        codepoint: 11058,\n      },\n      {\n        name: 'LONG LEFTWARDS SQUIGGLE ARROW',\n        value: '⬳',\n        codepoint: 11059,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE',\n        value: '⬴',\n        codepoint: 11060,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE',\n        value: '⬵',\n        codepoint: 11061,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW FROM BAR',\n        value: '⬶',\n        codepoint: 11062,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED TRIPLE DASH ARROW',\n        value: '⬷',\n        codepoint: 11063,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH DOTTED STEM',\n        value: '⬸',\n        codepoint: 11064,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE',\n        value: '⬹',\n        codepoint: 11065,\n      },\n      {\n        name: 'LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n        value: '⬺',\n        codepoint: 11066,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL',\n        value: '⬻',\n        codepoint: 11067,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE',\n        value: '⬼',\n        codepoint: 11068,\n      },\n      {\n        name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n        value: '⬽',\n        codepoint: 11069,\n      },\n      {\n        name: 'LEFTWARDS ARROW THROUGH X',\n        value: '⬾',\n        codepoint: 11070,\n      },\n      {\n        name: 'WAVE ARROW POINTING DIRECTLY LEFT',\n        value: '⬿',\n        codepoint: 11071,\n      },\n      {\n        name: 'EQUALS SIGN ABOVE LEFTWARDS ARROW',\n        value: '⭀',\n        codepoint: 11072,\n      },\n      {\n        name: 'REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW',\n        value: '⭁',\n        codepoint: 11073,\n      },\n      {\n        name: 'LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO',\n        value: '⭂',\n        codepoint: 11074,\n      },\n      {\n        name: 'RIGHTWARDS ARROW THROUGH GREATER-THAN',\n        value: '⭃',\n        codepoint: 11075,\n      },\n      {\n        name: 'RIGHTWARDS ARROW THROUGH SUPERSET',\n        value: '⭄',\n        codepoint: 11076,\n      },\n      {\n        name: 'LEFTWARDS QUADRUPLE ARROW',\n        value: '⭅',\n        codepoint: 11077,\n      },\n      {\n        name: 'RIGHTWARDS QUADRUPLE ARROW',\n        value: '⭆',\n        codepoint: 11078,\n      },\n      {\n        name: 'REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW',\n        value: '⭇',\n        codepoint: 11079,\n      },\n      {\n        name: 'RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO',\n        value: '⭈',\n        codepoint: 11080,\n      },\n      {\n        name: 'TILDE OPERATOR ABOVE LEFTWARDS ARROW',\n        value: '⭉',\n        codepoint: 11081,\n      },\n      {\n        name: 'LEFTWARDS ARROW ABOVE ALMOST EQUAL TO',\n        value: '⭊',\n        codepoint: 11082,\n      },\n      {\n        name: 'LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR',\n        value: '⭋',\n        codepoint: 11083,\n      },\n      {\n        name: 'RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR',\n        value: '⭌',\n        codepoint: 11084,\n      },\n      {\n        name: 'BLACK SMALL STAR',\n        value: '⭑',\n        codepoint: 11089,\n      },\n      {\n        name: 'WHITE SMALL STAR',\n        value: '⭒',\n        codepoint: 11090,\n      },\n      {\n        name: 'BLACK RIGHT-POINTING PENTAGON',\n        value: '⭓',\n        codepoint: 11091,\n      },\n      {\n        name: 'WHITE RIGHT-POINTING PENTAGON',\n        value: '⭔',\n        codepoint: 11092,\n      },\n    ],\n  },\n  {\n    name: 'Ancient',\n    symbols: [\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE QUARTER',\n        value: '𐅀',\n        codepoint: 65856,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE HALF',\n        value: '𐅁',\n        codepoint: 65857,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE DRACHMA',\n        value: '𐅂',\n        codepoint: 65858,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE',\n        value: '𐅃',\n        codepoint: 65859,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE THOUSAND',\n        value: '𐅆',\n        codepoint: 65862,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIFTY THOUSAND',\n        value: '𐅇',\n        codepoint: 65863,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE TALENTS',\n        value: '𐅈',\n        codepoint: 65864,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC TEN TALENTS',\n        value: '𐅉',\n        codepoint: 65865,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIFTY TALENTS',\n        value: '𐅊',\n        codepoint: 65866,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS',\n        value: '𐅋',\n        codepoint: 65867,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS',\n        value: '𐅌',\n        codepoint: 65868,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS',\n        value: '𐅍',\n        codepoint: 65869,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS',\n        value: '𐅎',\n        codepoint: 65870,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE STATERS',\n        value: '𐅏',\n        codepoint: 65871,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC TEN STATERS',\n        value: '𐅐',\n        codepoint: 65872,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIFTY STATERS',\n        value: '𐅑',\n        codepoint: 65873,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS',\n        value: '𐅒',\n        codepoint: 65874,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS',\n        value: '𐅓',\n        codepoint: 65875,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS',\n        value: '𐅔',\n        codepoint: 65876,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS',\n        value: '𐅕',\n        codepoint: 65877,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS',\n        value: '𐅖',\n        codepoint: 65878,\n      },\n      {\n        name: 'GREEK ACROPHONIC ATTIC TEN MNAS',\n        value: '𐅗',\n        codepoint: 65879,\n      },\n      {\n        name: 'GREEK ACROPHONIC HERAEUM ONE PLETHRON',\n        value: '𐅘',\n        codepoint: 65880,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN ONE',\n        value: '𐅙',\n        codepoint: 65881,\n      },\n      {\n        name: 'GREEK ACROPHONIC HERMIONIAN ONE',\n        value: '𐅚',\n        codepoint: 65882,\n      },\n      {\n        name: 'GREEK ACROPHONIC EPIDAUREAN TWO',\n        value: '𐅛',\n        codepoint: 65883,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN TWO',\n        value: '𐅜',\n        codepoint: 65884,\n      },\n      {\n        name: 'GREEK ACROPHONIC CYRENAIC TWO DRACHMAS',\n        value: '𐅝',\n        codepoint: 65885,\n      },\n      {\n        name: 'GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS',\n        value: '𐅞',\n        codepoint: 65886,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN FIVE',\n        value: '𐅟',\n        codepoint: 65887,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN TEN',\n        value: '𐅠',\n        codepoint: 65888,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM',\n        value: '𐅡',\n        codepoint: 65889,\n      },\n      {\n        name: 'GREEK ACROPHONIC HERMIONIAN TEN',\n        value: '𐅢',\n        codepoint: 65890,\n      },\n      {\n        name: 'GREEK ACROPHONIC MESSENIAN TEN',\n        value: '𐅣',\n        codepoint: 65891,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN TEN',\n        value: '𐅤',\n        codepoint: 65892,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN THIRTY',\n        value: '𐅥',\n        codepoint: 65893,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN FIFTY',\n        value: '𐅦',\n        codepoint: 65894,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM',\n        value: '𐅧',\n        codepoint: 65895,\n      },\n      {\n        name: 'GREEK ACROPHONIC HERMIONIAN FIFTY',\n        value: '𐅨',\n        codepoint: 65896,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN FIFTY',\n        value: '𐅩',\n        codepoint: 65897,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN ONE HUNDRED',\n        value: '𐅪',\n        codepoint: 65898,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN THREE HUNDRED',\n        value: '𐅫',\n        codepoint: 65899,\n      },\n      {\n        name: 'GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED',\n        value: '𐅬',\n        codepoint: 65900,\n      },\n      {\n        name: 'GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED',\n        value: '𐅭',\n        codepoint: 65901,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN FIVE HUNDRED',\n        value: '𐅮',\n        codepoint: 65902,\n      },\n      {\n        name: 'GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED',\n        value: '𐅯',\n        codepoint: 65903,\n      },\n      {\n        name: 'GREEK ACROPHONIC NAXIAN FIVE HUNDRED',\n        value: '𐅰',\n        codepoint: 65904,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN ONE THOUSAND',\n        value: '𐅱',\n        codepoint: 65905,\n      },\n      {\n        name: 'GREEK ACROPHONIC THESPIAN FIVE THOUSAND',\n        value: '𐅲',\n        codepoint: 65906,\n      },\n      {\n        name: 'GREEK ACROPHONIC DELPHIC FIVE MNAS',\n        value: '𐅳',\n        codepoint: 65907,\n      },\n      {\n        name: 'GREEK ACROPHONIC STRATIAN FIFTY MNAS',\n        value: '𐅴',\n        codepoint: 65908,\n      },\n      {\n        name: 'GREEK ONE HALF SIGN',\n        value: '𐅵',\n        codepoint: 65909,\n      },\n      {\n        name: 'GREEK YEAR SIGN',\n        value: '𐅹',\n        codepoint: 65913,\n      },\n      {\n        name: 'GREEK TALENT SIGN',\n        value: '𐅺',\n        codepoint: 65914,\n      },\n      {\n        name: 'GREEK DRACHMA SIGN',\n        value: '𐅻',\n        codepoint: 65915,\n      },\n      {\n        name: 'GREEK OBOL SIGN',\n        value: '𐅼',\n        codepoint: 65916,\n      },\n      {\n        name: 'GREEK TWO OBOLS SIGN',\n        value: '𐅽',\n        codepoint: 65917,\n      },\n      {\n        name: 'GREEK THREE OBOLS SIGN',\n        value: '𐅾',\n        codepoint: 65918,\n      },\n      {\n        name: 'GREEK FOUR OBOLS SIGN',\n        value: '𐅿',\n        codepoint: 65919,\n      },\n      {\n        name: 'GREEK FIVE OBOLS SIGN',\n        value: '𐆀',\n        codepoint: 65920,\n      },\n      {\n        name: 'GREEK METRETES SIGN',\n        value: '𐆁',\n        codepoint: 65921,\n      },\n      {\n        name: 'GREEK KYATHOS BASE SIGN',\n        value: '𐆂',\n        codepoint: 65922,\n      },\n      {\n        name: 'GREEK OUNKIA SIGN',\n        value: '𐆄',\n        codepoint: 65924,\n      },\n      {\n        name: 'GREEK XESTES SIGN',\n        value: '𐆅',\n        codepoint: 65925,\n      },\n      {\n        name: 'GREEK ARTABE SIGN',\n        value: '𐆆',\n        codepoint: 65926,\n      },\n      {\n        name: 'GREEK ZERO SIGN',\n        value: '𐆊',\n        codepoint: 65930,\n      },\n      {\n        name: 'ROMAN SEXTANS SIGN',\n        value: '𐆐',\n        codepoint: 65936,\n      },\n      {\n        name: 'ROMAN UNCIA SIGN',\n        value: '𐆑',\n        codepoint: 65937,\n      },\n      {\n        name: 'ROMAN SEMUNCIA SIGN',\n        value: '𐆒',\n        codepoint: 65938,\n      },\n      {\n        name: 'ROMAN SEXTULA SIGN',\n        value: '𐆓',\n        codepoint: 65939,\n      },\n      {\n        name: 'ROMAN DIMIDIA SEXTULA SIGN',\n        value: '𐆔',\n        codepoint: 65940,\n      },\n      {\n        name: 'ROMAN SILIQUA SIGN',\n        value: '𐆕',\n        codepoint: 65941,\n      },\n      {\n        name: 'ROMAN DENARIUS SIGN',\n        value: '𐆖',\n        codepoint: 65942,\n      },\n      {\n        name: 'ROMAN QUINARIUS SIGN',\n        value: '𐆗',\n        codepoint: 65943,\n      },\n      {\n        name: 'ROMAN SESTERTIUS SIGN',\n        value: '𐆘',\n        codepoint: 65944,\n      },\n      {\n        name: 'ROMAN DUPONDIUS SIGN',\n        value: '𐆙',\n        codepoint: 65945,\n      },\n      {\n        name: 'ROMAN AS SIGN',\n        value: '𐆚',\n        codepoint: 65946,\n      },\n      {\n        name: 'ROMAN CENTURIAL SIGN',\n        value: '𐆛',\n        codepoint: 65947,\n      },\n    ],\n  },\n  {\n    name: 'Braille',\n    symbols: [\n      {\n        name: 'BRAILLE PATTERN BLANK',\n        value: '⠀',\n        codepoint: 10240,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1',\n        value: '⠁',\n        codepoint: 10241,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2',\n        value: '⠂',\n        codepoint: 10242,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12',\n        value: '⠃',\n        codepoint: 10243,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3',\n        value: '⠄',\n        codepoint: 10244,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13',\n        value: '⠅',\n        codepoint: 10245,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23',\n        value: '⠆',\n        codepoint: 10246,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123',\n        value: '⠇',\n        codepoint: 10247,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-4',\n        value: '⠈',\n        codepoint: 10248,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-14',\n        value: '⠉',\n        codepoint: 10249,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-24',\n        value: '⠊',\n        codepoint: 10250,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-124',\n        value: '⠋',\n        codepoint: 10251,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-34',\n        value: '⠌',\n        codepoint: 10252,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-134',\n        value: '⠍',\n        codepoint: 10253,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-234',\n        value: '⠎',\n        codepoint: 10254,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1234',\n        value: '⠏',\n        codepoint: 10255,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-5',\n        value: '⠐',\n        codepoint: 10256,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-15',\n        value: '⠑',\n        codepoint: 10257,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-25',\n        value: '⠒',\n        codepoint: 10258,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-125',\n        value: '⠓',\n        codepoint: 10259,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-35',\n        value: '⠔',\n        codepoint: 10260,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-135',\n        value: '⠕',\n        codepoint: 10261,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-235',\n        value: '⠖',\n        codepoint: 10262,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1235',\n        value: '⠗',\n        codepoint: 10263,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-45',\n        value: '⠘',\n        codepoint: 10264,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-145',\n        value: '⠙',\n        codepoint: 10265,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-245',\n        value: '⠚',\n        codepoint: 10266,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1245',\n        value: '⠛',\n        codepoint: 10267,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-345',\n        value: '⠜',\n        codepoint: 10268,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1345',\n        value: '⠝',\n        codepoint: 10269,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2345',\n        value: '⠞',\n        codepoint: 10270,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12345',\n        value: '⠟',\n        codepoint: 10271,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-6',\n        value: '⠠',\n        codepoint: 10272,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-16',\n        value: '⠡',\n        codepoint: 10273,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-26',\n        value: '⠢',\n        codepoint: 10274,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-126',\n        value: '⠣',\n        codepoint: 10275,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-36',\n        value: '⠤',\n        codepoint: 10276,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-136',\n        value: '⠥',\n        codepoint: 10277,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-236',\n        value: '⠦',\n        codepoint: 10278,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1236',\n        value: '⠧',\n        codepoint: 10279,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-46',\n        value: '⠨',\n        codepoint: 10280,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-146',\n        value: '⠩',\n        codepoint: 10281,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-246',\n        value: '⠪',\n        codepoint: 10282,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1246',\n        value: '⠫',\n        codepoint: 10283,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-346',\n        value: '⠬',\n        codepoint: 10284,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1346',\n        value: '⠭',\n        codepoint: 10285,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2346',\n        value: '⠮',\n        codepoint: 10286,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12346',\n        value: '⠯',\n        codepoint: 10287,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-56',\n        value: '⠰',\n        codepoint: 10288,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-156',\n        value: '⠱',\n        codepoint: 10289,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-256',\n        value: '⠲',\n        codepoint: 10290,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1256',\n        value: '⠳',\n        codepoint: 10291,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-356',\n        value: '⠴',\n        codepoint: 10292,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1356',\n        value: '⠵',\n        codepoint: 10293,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2356',\n        value: '⠶',\n        codepoint: 10294,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12356',\n        value: '⠷',\n        codepoint: 10295,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-456',\n        value: '⠸',\n        codepoint: 10296,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1456',\n        value: '⠹',\n        codepoint: 10297,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2456',\n        value: '⠺',\n        codepoint: 10298,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12456',\n        value: '⠻',\n        codepoint: 10299,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3456',\n        value: '⠼',\n        codepoint: 10300,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13456',\n        value: '⠽',\n        codepoint: 10301,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23456',\n        value: '⠾',\n        codepoint: 10302,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123456',\n        value: '⠿',\n        codepoint: 10303,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-7',\n        value: '⡀',\n        codepoint: 10304,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-17',\n        value: '⡁',\n        codepoint: 10305,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-27',\n        value: '⡂',\n        codepoint: 10306,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-127',\n        value: '⡃',\n        codepoint: 10307,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-37',\n        value: '⡄',\n        codepoint: 10308,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-137',\n        value: '⡅',\n        codepoint: 10309,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-237',\n        value: '⡆',\n        codepoint: 10310,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1237',\n        value: '⡇',\n        codepoint: 10311,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-47',\n        value: '⡈',\n        codepoint: 10312,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-147',\n        value: '⡉',\n        codepoint: 10313,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-247',\n        value: '⡊',\n        codepoint: 10314,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1247',\n        value: '⡋',\n        codepoint: 10315,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-347',\n        value: '⡌',\n        codepoint: 10316,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1347',\n        value: '⡍',\n        codepoint: 10317,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2347',\n        value: '⡎',\n        codepoint: 10318,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12347',\n        value: '⡏',\n        codepoint: 10319,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-57',\n        value: '⡐',\n        codepoint: 10320,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-157',\n        value: '⡑',\n        codepoint: 10321,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-257',\n        value: '⡒',\n        codepoint: 10322,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1257',\n        value: '⡓',\n        codepoint: 10323,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-357',\n        value: '⡔',\n        codepoint: 10324,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1357',\n        value: '⡕',\n        codepoint: 10325,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2357',\n        value: '⡖',\n        codepoint: 10326,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12357',\n        value: '⡗',\n        codepoint: 10327,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-457',\n        value: '⡘',\n        codepoint: 10328,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1457',\n        value: '⡙',\n        codepoint: 10329,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2457',\n        value: '⡚',\n        codepoint: 10330,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12457',\n        value: '⡛',\n        codepoint: 10331,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3457',\n        value: '⡜',\n        codepoint: 10332,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13457',\n        value: '⡝',\n        codepoint: 10333,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23457',\n        value: '⡞',\n        codepoint: 10334,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123457',\n        value: '⡟',\n        codepoint: 10335,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-67',\n        value: '⡠',\n        codepoint: 10336,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-167',\n        value: '⡡',\n        codepoint: 10337,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-267',\n        value: '⡢',\n        codepoint: 10338,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1267',\n        value: '⡣',\n        codepoint: 10339,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-367',\n        value: '⡤',\n        codepoint: 10340,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1367',\n        value: '⡥',\n        codepoint: 10341,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2367',\n        value: '⡦',\n        codepoint: 10342,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12367',\n        value: '⡧',\n        codepoint: 10343,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-467',\n        value: '⡨',\n        codepoint: 10344,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1467',\n        value: '⡩',\n        codepoint: 10345,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2467',\n        value: '⡪',\n        codepoint: 10346,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12467',\n        value: '⡫',\n        codepoint: 10347,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3467',\n        value: '⡬',\n        codepoint: 10348,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13467',\n        value: '⡭',\n        codepoint: 10349,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23467',\n        value: '⡮',\n        codepoint: 10350,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123467',\n        value: '⡯',\n        codepoint: 10351,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-567',\n        value: '⡰',\n        codepoint: 10352,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1567',\n        value: '⡱',\n        codepoint: 10353,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2567',\n        value: '⡲',\n        codepoint: 10354,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12567',\n        value: '⡳',\n        codepoint: 10355,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3567',\n        value: '⡴',\n        codepoint: 10356,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13567',\n        value: '⡵',\n        codepoint: 10357,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23567',\n        value: '⡶',\n        codepoint: 10358,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123567',\n        value: '⡷',\n        codepoint: 10359,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-4567',\n        value: '⡸',\n        codepoint: 10360,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-14567',\n        value: '⡹',\n        codepoint: 10361,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-24567',\n        value: '⡺',\n        codepoint: 10362,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-124567',\n        value: '⡻',\n        codepoint: 10363,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-34567',\n        value: '⡼',\n        codepoint: 10364,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-134567',\n        value: '⡽',\n        codepoint: 10365,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-234567',\n        value: '⡾',\n        codepoint: 10366,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1234567',\n        value: '⡿',\n        codepoint: 10367,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-8',\n        value: '⢀',\n        codepoint: 10368,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-18',\n        value: '⢁',\n        codepoint: 10369,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-28',\n        value: '⢂',\n        codepoint: 10370,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-128',\n        value: '⢃',\n        codepoint: 10371,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-38',\n        value: '⢄',\n        codepoint: 10372,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-138',\n        value: '⢅',\n        codepoint: 10373,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-238',\n        value: '⢆',\n        codepoint: 10374,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1238',\n        value: '⢇',\n        codepoint: 10375,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-48',\n        value: '⢈',\n        codepoint: 10376,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-148',\n        value: '⢉',\n        codepoint: 10377,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-248',\n        value: '⢊',\n        codepoint: 10378,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1248',\n        value: '⢋',\n        codepoint: 10379,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-348',\n        value: '⢌',\n        codepoint: 10380,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1348',\n        value: '⢍',\n        codepoint: 10381,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2348',\n        value: '⢎',\n        codepoint: 10382,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12348',\n        value: '⢏',\n        codepoint: 10383,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-58',\n        value: '⢐',\n        codepoint: 10384,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-158',\n        value: '⢑',\n        codepoint: 10385,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-258',\n        value: '⢒',\n        codepoint: 10386,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1258',\n        value: '⢓',\n        codepoint: 10387,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-358',\n        value: '⢔',\n        codepoint: 10388,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1358',\n        value: '⢕',\n        codepoint: 10389,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2358',\n        value: '⢖',\n        codepoint: 10390,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12358',\n        value: '⢗',\n        codepoint: 10391,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-458',\n        value: '⢘',\n        codepoint: 10392,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1458',\n        value: '⢙',\n        codepoint: 10393,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2458',\n        value: '⢚',\n        codepoint: 10394,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12458',\n        value: '⢛',\n        codepoint: 10395,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3458',\n        value: '⢜',\n        codepoint: 10396,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13458',\n        value: '⢝',\n        codepoint: 10397,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23458',\n        value: '⢞',\n        codepoint: 10398,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123458',\n        value: '⢟',\n        codepoint: 10399,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-68',\n        value: '⢠',\n        codepoint: 10400,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-168',\n        value: '⢡',\n        codepoint: 10401,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-268',\n        value: '⢢',\n        codepoint: 10402,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1268',\n        value: '⢣',\n        codepoint: 10403,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-368',\n        value: '⢤',\n        codepoint: 10404,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1368',\n        value: '⢥',\n        codepoint: 10405,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2368',\n        value: '⢦',\n        codepoint: 10406,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12368',\n        value: '⢧',\n        codepoint: 10407,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-468',\n        value: '⢨',\n        codepoint: 10408,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1468',\n        value: '⢩',\n        codepoint: 10409,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2468',\n        value: '⢪',\n        codepoint: 10410,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12468',\n        value: '⢫',\n        codepoint: 10411,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3468',\n        value: '⢬',\n        codepoint: 10412,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13468',\n        value: '⢭',\n        codepoint: 10413,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23468',\n        value: '⢮',\n        codepoint: 10414,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123468',\n        value: '⢯',\n        codepoint: 10415,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-568',\n        value: '⢰',\n        codepoint: 10416,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1568',\n        value: '⢱',\n        codepoint: 10417,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2568',\n        value: '⢲',\n        codepoint: 10418,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12568',\n        value: '⢳',\n        codepoint: 10419,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3568',\n        value: '⢴',\n        codepoint: 10420,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13568',\n        value: '⢵',\n        codepoint: 10421,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23568',\n        value: '⢶',\n        codepoint: 10422,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123568',\n        value: '⢷',\n        codepoint: 10423,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-4568',\n        value: '⢸',\n        codepoint: 10424,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-14568',\n        value: '⢹',\n        codepoint: 10425,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-24568',\n        value: '⢺',\n        codepoint: 10426,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-124568',\n        value: '⢻',\n        codepoint: 10427,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-34568',\n        value: '⢼',\n        codepoint: 10428,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-134568',\n        value: '⢽',\n        codepoint: 10429,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-234568',\n        value: '⢾',\n        codepoint: 10430,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1234568',\n        value: '⢿',\n        codepoint: 10431,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-78',\n        value: '⣀',\n        codepoint: 10432,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-178',\n        value: '⣁',\n        codepoint: 10433,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-278',\n        value: '⣂',\n        codepoint: 10434,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1278',\n        value: '⣃',\n        codepoint: 10435,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-378',\n        value: '⣄',\n        codepoint: 10436,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1378',\n        value: '⣅',\n        codepoint: 10437,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2378',\n        value: '⣆',\n        codepoint: 10438,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12378',\n        value: '⣇',\n        codepoint: 10439,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-478',\n        value: '⣈',\n        codepoint: 10440,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1478',\n        value: '⣉',\n        codepoint: 10441,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2478',\n        value: '⣊',\n        codepoint: 10442,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12478',\n        value: '⣋',\n        codepoint: 10443,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3478',\n        value: '⣌',\n        codepoint: 10444,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13478',\n        value: '⣍',\n        codepoint: 10445,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23478',\n        value: '⣎',\n        codepoint: 10446,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123478',\n        value: '⣏',\n        codepoint: 10447,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-578',\n        value: '⣐',\n        codepoint: 10448,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1578',\n        value: '⣑',\n        codepoint: 10449,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2578',\n        value: '⣒',\n        codepoint: 10450,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12578',\n        value: '⣓',\n        codepoint: 10451,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3578',\n        value: '⣔',\n        codepoint: 10452,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13578',\n        value: '⣕',\n        codepoint: 10453,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23578',\n        value: '⣖',\n        codepoint: 10454,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123578',\n        value: '⣗',\n        codepoint: 10455,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-4578',\n        value: '⣘',\n        codepoint: 10456,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-14578',\n        value: '⣙',\n        codepoint: 10457,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-24578',\n        value: '⣚',\n        codepoint: 10458,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-124578',\n        value: '⣛',\n        codepoint: 10459,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-34578',\n        value: '⣜',\n        codepoint: 10460,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-134578',\n        value: '⣝',\n        codepoint: 10461,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-234578',\n        value: '⣞',\n        codepoint: 10462,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1234578',\n        value: '⣟',\n        codepoint: 10463,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-678',\n        value: '⣠',\n        codepoint: 10464,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1678',\n        value: '⣡',\n        codepoint: 10465,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2678',\n        value: '⣢',\n        codepoint: 10466,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12678',\n        value: '⣣',\n        codepoint: 10467,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-3678',\n        value: '⣤',\n        codepoint: 10468,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-13678',\n        value: '⣥',\n        codepoint: 10469,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-23678',\n        value: '⣦',\n        codepoint: 10470,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-123678',\n        value: '⣧',\n        codepoint: 10471,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-4678',\n        value: '⣨',\n        codepoint: 10472,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-14678',\n        value: '⣩',\n        codepoint: 10473,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-24678',\n        value: '⣪',\n        codepoint: 10474,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-124678',\n        value: '⣫',\n        codepoint: 10475,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-34678',\n        value: '⣬',\n        codepoint: 10476,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-134678',\n        value: '⣭',\n        codepoint: 10477,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-234678',\n        value: '⣮',\n        codepoint: 10478,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1234678',\n        value: '⣯',\n        codepoint: 10479,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-5678',\n        value: '⣰',\n        codepoint: 10480,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-15678',\n        value: '⣱',\n        codepoint: 10481,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-25678',\n        value: '⣲',\n        codepoint: 10482,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-125678',\n        value: '⣳',\n        codepoint: 10483,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-35678',\n        value: '⣴',\n        codepoint: 10484,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-135678',\n        value: '⣵',\n        codepoint: 10485,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-235678',\n        value: '⣶',\n        codepoint: 10486,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1235678',\n        value: '⣷',\n        codepoint: 10487,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-45678',\n        value: '⣸',\n        codepoint: 10488,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-145678',\n        value: '⣹',\n        codepoint: 10489,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-245678',\n        value: '⣺',\n        codepoint: 10490,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1245678',\n        value: '⣻',\n        codepoint: 10491,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-345678',\n        value: '⣼',\n        codepoint: 10492,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-1345678',\n        value: '⣽',\n        codepoint: 10493,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-2345678',\n        value: '⣾',\n        codepoint: 10494,\n      },\n      {\n        name: 'BRAILLE PATTERN DOTS-12345678',\n        value: '⣿',\n        codepoint: 10495,\n      },\n    ],\n  },\n  {\n    name: 'Currency',\n    symbols: [\n      {\n        name: 'EURO-CURRENCY SIGN',\n        value: '₠',\n        codepoint: 8352,\n      },\n      {\n        name: 'COLON SIGN',\n        value: '₡',\n        codepoint: 8353,\n      },\n      {\n        name: 'CRUZEIRO SIGN',\n        value: '₢',\n        codepoint: 8354,\n      },\n      {\n        name: 'FRENCH FRANC SIGN',\n        value: '₣',\n        codepoint: 8355,\n      },\n      {\n        name: 'LIRA SIGN',\n        value: '₤',\n        codepoint: 8356,\n      },\n      {\n        name: 'MILL SIGN',\n        value: '₥',\n        codepoint: 8357,\n      },\n      {\n        name: 'NAIRA SIGN',\n        value: '₦',\n        codepoint: 8358,\n      },\n      {\n        name: 'PESETA SIGN',\n        value: '₧',\n        codepoint: 8359,\n      },\n      {\n        name: 'RUPEE SIGN',\n        value: '₨',\n        codepoint: 8360,\n      },\n      {\n        name: 'WON SIGN',\n        value: '₩',\n        codepoint: 8361,\n      },\n      {\n        name: 'NEW SHEQEL SIGN',\n        value: '₪',\n        codepoint: 8362,\n      },\n      {\n        name: 'DONG SIGN',\n        value: '₫',\n        codepoint: 8363,\n      },\n      {\n        name: 'EURO SIGN',\n        value: '€',\n        codepoint: 8364,\n      },\n      {\n        name: 'KIP SIGN',\n        value: '₭',\n        codepoint: 8365,\n      },\n      {\n        name: 'TUGRIK SIGN',\n        value: '₮',\n        codepoint: 8366,\n      },\n      {\n        name: 'DRACHMA SIGN',\n        value: '₯',\n        codepoint: 8367,\n      },\n      {\n        name: 'GERMAN PENNY SIGN',\n        value: '₰',\n        codepoint: 8368,\n      },\n      {\n        name: 'PESO SIGN',\n        value: '₱',\n        codepoint: 8369,\n      },\n      {\n        name: 'GUARANI SIGN',\n        value: '₲',\n        codepoint: 8370,\n      },\n      {\n        name: 'AUSTRAL SIGN',\n        value: '₳',\n        codepoint: 8371,\n      },\n      {\n        name: 'HRYVNIA SIGN',\n        value: '₴',\n        codepoint: 8372,\n      },\n      {\n        name: 'CEDI SIGN',\n        value: '₵',\n        codepoint: 8373,\n      },\n      {\n        name: 'LIVRE TOURNOIS SIGN',\n        value: '₶',\n        codepoint: 8374,\n      },\n      {\n        name: 'SPESMILO SIGN',\n        value: '₷',\n        codepoint: 8375,\n      },\n      {\n        name: 'TENGE SIGN',\n        value: '₸',\n        codepoint: 8376,\n      },\n      {\n        name: 'INDIAN RUPEE SIGN',\n        value: '₹',\n        codepoint: 8377,\n      },\n    ],\n  },\n  {\n    name: 'Game Symbols',\n    symbols: [\n      {\n        name: 'MAHJONG TILE EAST WIND',\n        value: '🀀',\n        codepoint: 126976,\n      },\n      {\n        name: 'MAHJONG TILE SOUTH WIND',\n        value: '🀁',\n        codepoint: 126977,\n      },\n      {\n        name: 'MAHJONG TILE WEST WIND',\n        value: '🀂',\n        codepoint: 126978,\n      },\n      {\n        name: 'MAHJONG TILE NORTH WIND',\n        value: '🀃',\n        codepoint: 126979,\n      },\n      {\n        name: 'MAHJONG TILE GREEN DRAGON',\n        value: '🀅',\n        codepoint: 126981,\n      },\n      {\n        name: 'MAHJONG TILE WHITE DRAGON',\n        value: '🀆',\n        codepoint: 126982,\n      },\n      {\n        name: 'MAHJONG TILE ONE OF CHARACTERS',\n        value: '🀇',\n        codepoint: 126983,\n      },\n      {\n        name: 'MAHJONG TILE TWO OF CHARACTERS',\n        value: '🀈',\n        codepoint: 126984,\n      },\n      {\n        name: 'MAHJONG TILE THREE OF CHARACTERS',\n        value: '🀉',\n        codepoint: 126985,\n      },\n      {\n        name: 'MAHJONG TILE FOUR OF CHARACTERS',\n        value: '🀊',\n        codepoint: 126986,\n      },\n      {\n        name: 'MAHJONG TILE FIVE OF CHARACTERS',\n        value: '🀋',\n        codepoint: 126987,\n      },\n      {\n        name: 'MAHJONG TILE SIX OF CHARACTERS',\n        value: '🀌',\n        codepoint: 126988,\n      },\n      {\n        name: 'MAHJONG TILE SEVEN OF CHARACTERS',\n        value: '🀍',\n        codepoint: 126989,\n      },\n      {\n        name: 'MAHJONG TILE EIGHT OF CHARACTERS',\n        value: '🀎',\n        codepoint: 126990,\n      },\n      {\n        name: 'MAHJONG TILE NINE OF CHARACTERS',\n        value: '🀏',\n        codepoint: 126991,\n      },\n      {\n        name: 'MAHJONG TILE ONE OF BAMBOOS',\n        value: '🀐',\n        codepoint: 126992,\n      },\n      {\n        name: 'MAHJONG TILE TWO OF BAMBOOS',\n        value: '🀑',\n        codepoint: 126993,\n      },\n      {\n        name: 'MAHJONG TILE THREE OF BAMBOOS',\n        value: '🀒',\n        codepoint: 126994,\n      },\n      {\n        name: 'MAHJONG TILE FOUR OF BAMBOOS',\n        value: '🀓',\n        codepoint: 126995,\n      },\n      {\n        name: 'MAHJONG TILE FIVE OF BAMBOOS',\n        value: '🀔',\n        codepoint: 126996,\n      },\n      {\n        name: 'MAHJONG TILE SIX OF BAMBOOS',\n        value: '🀕',\n        codepoint: 126997,\n      },\n      {\n        name: 'MAHJONG TILE SEVEN OF BAMBOOS',\n        value: '🀖',\n        codepoint: 126998,\n      },\n      {\n        name: 'MAHJONG TILE EIGHT OF BAMBOOS',\n        value: '🀗',\n        codepoint: 126999,\n      },\n      {\n        name: 'MAHJONG TILE NINE OF BAMBOOS',\n        value: '🀘',\n        codepoint: 127000,\n      },\n      {\n        name: 'MAHJONG TILE ONE OF CIRCLES',\n        value: '🀙',\n        codepoint: 127001,\n      },\n      {\n        name: 'MAHJONG TILE TWO OF CIRCLES',\n        value: '🀚',\n        codepoint: 127002,\n      },\n      {\n        name: 'MAHJONG TILE THREE OF CIRCLES',\n        value: '🀛',\n        codepoint: 127003,\n      },\n      {\n        name: 'MAHJONG TILE FOUR OF CIRCLES',\n        value: '🀜',\n        codepoint: 127004,\n      },\n      {\n        name: 'MAHJONG TILE FIVE OF CIRCLES',\n        value: '🀝',\n        codepoint: 127005,\n      },\n      {\n        name: 'MAHJONG TILE SIX OF CIRCLES',\n        value: '🀞',\n        codepoint: 127006,\n      },\n      {\n        name: 'MAHJONG TILE SEVEN OF CIRCLES',\n        value: '🀟',\n        codepoint: 127007,\n      },\n      {\n        name: 'MAHJONG TILE EIGHT OF CIRCLES',\n        value: '🀠',\n        codepoint: 127008,\n      },\n      {\n        name: 'MAHJONG TILE NINE OF CIRCLES',\n        value: '🀡',\n        codepoint: 127009,\n      },\n      {\n        name: 'MAHJONG TILE PLUM',\n        value: '🀢',\n        codepoint: 127010,\n      },\n      {\n        name: 'MAHJONG TILE ORCHID',\n        value: '🀣',\n        codepoint: 127011,\n      },\n      {\n        name: 'MAHJONG TILE BAMBOO',\n        value: '🀤',\n        codepoint: 127012,\n      },\n      {\n        name: 'MAHJONG TILE CHRYSANTHEMUM',\n        value: '🀥',\n        codepoint: 127013,\n      },\n      {\n        name: 'MAHJONG TILE SPRING',\n        value: '🀦',\n        codepoint: 127014,\n      },\n      {\n        name: 'MAHJONG TILE SUMMER',\n        value: '🀧',\n        codepoint: 127015,\n      },\n      {\n        name: 'MAHJONG TILE AUTUMN',\n        value: '🀨',\n        codepoint: 127016,\n      },\n      {\n        name: 'MAHJONG TILE WINTER',\n        value: '🀩',\n        codepoint: 127017,\n      },\n      {\n        name: 'MAHJONG TILE JOKER',\n        value: '🀪',\n        codepoint: 127018,\n      },\n      {\n        name: 'MAHJONG TILE BACK',\n        value: '🀫',\n        codepoint: 127019,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL BACK',\n        value: '🀰',\n        codepoint: 127024,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-00',\n        value: '🀱',\n        codepoint: 127025,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-01',\n        value: '🀲',\n        codepoint: 127026,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-02',\n        value: '🀳',\n        codepoint: 127027,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-03',\n        value: '🀴',\n        codepoint: 127028,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-04',\n        value: '🀵',\n        codepoint: 127029,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-05',\n        value: '🀶',\n        codepoint: 127030,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-00-06',\n        value: '🀷',\n        codepoint: 127031,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-00',\n        value: '🀸',\n        codepoint: 127032,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-01',\n        value: '🀹',\n        codepoint: 127033,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-02',\n        value: '🀺',\n        codepoint: 127034,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-03',\n        value: '🀻',\n        codepoint: 127035,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-04',\n        value: '🀼',\n        codepoint: 127036,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-05',\n        value: '🀽',\n        codepoint: 127037,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-01-06',\n        value: '🀾',\n        codepoint: 127038,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-00',\n        value: '🀿',\n        codepoint: 127039,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-01',\n        value: '🁀',\n        codepoint: 127040,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-02',\n        value: '🁁',\n        codepoint: 127041,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-03',\n        value: '🁂',\n        codepoint: 127042,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-04',\n        value: '🁃',\n        codepoint: 127043,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-05',\n        value: '🁄',\n        codepoint: 127044,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-02-06',\n        value: '🁅',\n        codepoint: 127045,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-00',\n        value: '🁆',\n        codepoint: 127046,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-01',\n        value: '🁇',\n        codepoint: 127047,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-02',\n        value: '🁈',\n        codepoint: 127048,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-03',\n        value: '🁉',\n        codepoint: 127049,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-04',\n        value: '🁊',\n        codepoint: 127050,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-05',\n        value: '🁋',\n        codepoint: 127051,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-03-06',\n        value: '🁌',\n        codepoint: 127052,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-00',\n        value: '🁍',\n        codepoint: 127053,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-01',\n        value: '🁎',\n        codepoint: 127054,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-02',\n        value: '🁏',\n        codepoint: 127055,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-03',\n        value: '🁐',\n        codepoint: 127056,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-04',\n        value: '🁑',\n        codepoint: 127057,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-05',\n        value: '🁒',\n        codepoint: 127058,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-04-06',\n        value: '🁓',\n        codepoint: 127059,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-00',\n        value: '🁔',\n        codepoint: 127060,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-01',\n        value: '🁕',\n        codepoint: 127061,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-02',\n        value: '🁖',\n        codepoint: 127062,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-03',\n        value: '🁗',\n        codepoint: 127063,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-04',\n        value: '🁘',\n        codepoint: 127064,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-05',\n        value: '🁙',\n        codepoint: 127065,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-05-06',\n        value: '🁚',\n        codepoint: 127066,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-00',\n        value: '🁛',\n        codepoint: 127067,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-01',\n        value: '🁜',\n        codepoint: 127068,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-02',\n        value: '🁝',\n        codepoint: 127069,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-03',\n        value: '🁞',\n        codepoint: 127070,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-04',\n        value: '🁟',\n        codepoint: 127071,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-05',\n        value: '🁠',\n        codepoint: 127072,\n      },\n      {\n        name: 'DOMINO TILE HORIZONTAL-06-06',\n        value: '🁡',\n        codepoint: 127073,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL BACK',\n        value: '🁢',\n        codepoint: 127074,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-00',\n        value: '🁣',\n        codepoint: 127075,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-01',\n        value: '🁤',\n        codepoint: 127076,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-02',\n        value: '🁥',\n        codepoint: 127077,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-03',\n        value: '🁦',\n        codepoint: 127078,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-04',\n        value: '🁧',\n        codepoint: 127079,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-05',\n        value: '🁨',\n        codepoint: 127080,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-00-06',\n        value: '🁩',\n        codepoint: 127081,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-00',\n        value: '🁪',\n        codepoint: 127082,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-01',\n        value: '🁫',\n        codepoint: 127083,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-02',\n        value: '🁬',\n        codepoint: 127084,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-03',\n        value: '🁭',\n        codepoint: 127085,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-04',\n        value: '🁮',\n        codepoint: 127086,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-05',\n        value: '🁯',\n        codepoint: 127087,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-01-06',\n        value: '🁰',\n        codepoint: 127088,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-00',\n        value: '🁱',\n        codepoint: 127089,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-01',\n        value: '🁲',\n        codepoint: 127090,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-02',\n        value: '🁳',\n        codepoint: 127091,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-03',\n        value: '🁴',\n        codepoint: 127092,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-04',\n        value: '🁵',\n        codepoint: 127093,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-05',\n        value: '🁶',\n        codepoint: 127094,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-02-06',\n        value: '🁷',\n        codepoint: 127095,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-00',\n        value: '🁸',\n        codepoint: 127096,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-01',\n        value: '🁹',\n        codepoint: 127097,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-02',\n        value: '🁺',\n        codepoint: 127098,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-03',\n        value: '🁻',\n        codepoint: 127099,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-04',\n        value: '🁼',\n        codepoint: 127100,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-05',\n        value: '🁽',\n        codepoint: 127101,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-03-06',\n        value: '🁾',\n        codepoint: 127102,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-00',\n        value: '🁿',\n        codepoint: 127103,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-01',\n        value: '🂀',\n        codepoint: 127104,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-02',\n        value: '🂁',\n        codepoint: 127105,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-03',\n        value: '🂂',\n        codepoint: 127106,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-04',\n        value: '🂃',\n        codepoint: 127107,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-05',\n        value: '🂄',\n        codepoint: 127108,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-04-06',\n        value: '🂅',\n        codepoint: 127109,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-00',\n        value: '🂆',\n        codepoint: 127110,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-01',\n        value: '🂇',\n        codepoint: 127111,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-02',\n        value: '🂈',\n        codepoint: 127112,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-03',\n        value: '🂉',\n        codepoint: 127113,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-04',\n        value: '🂊',\n        codepoint: 127114,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-05',\n        value: '🂋',\n        codepoint: 127115,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-05-06',\n        value: '🂌',\n        codepoint: 127116,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-00',\n        value: '🂍',\n        codepoint: 127117,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-01',\n        value: '🂎',\n        codepoint: 127118,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-02',\n        value: '🂏',\n        codepoint: 127119,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-03',\n        value: '🂐',\n        codepoint: 127120,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-04',\n        value: '🂑',\n        codepoint: 127121,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-05',\n        value: '🂒',\n        codepoint: 127122,\n      },\n      {\n        name: 'DOMINO TILE VERTICAL-06-06',\n        value: '🂓',\n        codepoint: 127123,\n      },\n      {\n        name: 'PLAYING CARD BACK',\n        value: '🂠',\n        codepoint: 127136,\n      },\n      {\n        name: 'PLAYING CARD ACE OF SPADES',\n        value: '🂡',\n        codepoint: 127137,\n      },\n      {\n        name: 'PLAYING CARD TWO OF SPADES',\n        value: '🂢',\n        codepoint: 127138,\n      },\n      {\n        name: 'PLAYING CARD THREE OF SPADES',\n        value: '🂣',\n        codepoint: 127139,\n      },\n      {\n        name: 'PLAYING CARD FOUR OF SPADES',\n        value: '🂤',\n        codepoint: 127140,\n      },\n      {\n        name: 'PLAYING CARD FIVE OF SPADES',\n        value: '🂥',\n        codepoint: 127141,\n      },\n      {\n        name: 'PLAYING CARD SIX OF SPADES',\n        value: '🂦',\n        codepoint: 127142,\n      },\n      {\n        name: 'PLAYING CARD SEVEN OF SPADES',\n        value: '🂧',\n        codepoint: 127143,\n      },\n      {\n        name: 'PLAYING CARD EIGHT OF SPADES',\n        value: '🂨',\n        codepoint: 127144,\n      },\n      {\n        name: 'PLAYING CARD NINE OF SPADES',\n        value: '🂩',\n        codepoint: 127145,\n      },\n      {\n        name: 'PLAYING CARD TEN OF SPADES',\n        value: '🂪',\n        codepoint: 127146,\n      },\n      {\n        name: 'PLAYING CARD JACK OF SPADES',\n        value: '🂫',\n        codepoint: 127147,\n      },\n      {\n        name: 'PLAYING CARD KNIGHT OF SPADES',\n        value: '🂬',\n        codepoint: 127148,\n      },\n      {\n        name: 'PLAYING CARD QUEEN OF SPADES',\n        value: '🂭',\n        codepoint: 127149,\n      },\n      {\n        name: 'PLAYING CARD KING OF SPADES',\n        value: '🂮',\n        codepoint: 127150,\n      },\n      {\n        name: 'PLAYING CARD ACE OF HEARTS',\n        value: '🂱',\n        codepoint: 127153,\n      },\n      {\n        name: 'PLAYING CARD TWO OF HEARTS',\n        value: '🂲',\n        codepoint: 127154,\n      },\n      {\n        name: 'PLAYING CARD THREE OF HEARTS',\n        value: '🂳',\n        codepoint: 127155,\n      },\n      {\n        name: 'PLAYING CARD FOUR OF HEARTS',\n        value: '🂴',\n        codepoint: 127156,\n      },\n      {\n        name: 'PLAYING CARD FIVE OF HEARTS',\n        value: '🂵',\n        codepoint: 127157,\n      },\n      {\n        name: 'PLAYING CARD SIX OF HEARTS',\n        value: '🂶',\n        codepoint: 127158,\n      },\n      {\n        name: 'PLAYING CARD SEVEN OF HEARTS',\n        value: '🂷',\n        codepoint: 127159,\n      },\n      {\n        name: 'PLAYING CARD EIGHT OF HEARTS',\n        value: '🂸',\n        codepoint: 127160,\n      },\n      {\n        name: 'PLAYING CARD NINE OF HEARTS',\n        value: '🂹',\n        codepoint: 127161,\n      },\n      {\n        name: 'PLAYING CARD TEN OF HEARTS',\n        value: '🂺',\n        codepoint: 127162,\n      },\n      {\n        name: 'PLAYING CARD JACK OF HEARTS',\n        value: '🂻',\n        codepoint: 127163,\n      },\n      {\n        name: 'PLAYING CARD KNIGHT OF HEARTS',\n        value: '🂼',\n        codepoint: 127164,\n      },\n      {\n        name: 'PLAYING CARD QUEEN OF HEARTS',\n        value: '🂽',\n        codepoint: 127165,\n      },\n      {\n        name: 'PLAYING CARD KING OF HEARTS',\n        value: '🂾',\n        codepoint: 127166,\n      },\n      {\n        name: 'PLAYING CARD ACE OF DIAMONDS',\n        value: '🃁',\n        codepoint: 127169,\n      },\n      {\n        name: 'PLAYING CARD TWO OF DIAMONDS',\n        value: '🃂',\n        codepoint: 127170,\n      },\n      {\n        name: 'PLAYING CARD THREE OF DIAMONDS',\n        value: '🃃',\n        codepoint: 127171,\n      },\n      {\n        name: 'PLAYING CARD FOUR OF DIAMONDS',\n        value: '🃄',\n        codepoint: 127172,\n      },\n      {\n        name: 'PLAYING CARD FIVE OF DIAMONDS',\n        value: '🃅',\n        codepoint: 127173,\n      },\n      {\n        name: 'PLAYING CARD SIX OF DIAMONDS',\n        value: '🃆',\n        codepoint: 127174,\n      },\n      {\n        name: 'PLAYING CARD SEVEN OF DIAMONDS',\n        value: '🃇',\n        codepoint: 127175,\n      },\n      {\n        name: 'PLAYING CARD EIGHT OF DIAMONDS',\n        value: '🃈',\n        codepoint: 127176,\n      },\n      {\n        name: 'PLAYING CARD NINE OF DIAMONDS',\n        value: '🃉',\n        codepoint: 127177,\n      },\n      {\n        name: 'PLAYING CARD TEN OF DIAMONDS',\n        value: '🃊',\n        codepoint: 127178,\n      },\n      {\n        name: 'PLAYING CARD JACK OF DIAMONDS',\n        value: '🃋',\n        codepoint: 127179,\n      },\n      {\n        name: 'PLAYING CARD KNIGHT OF DIAMONDS',\n        value: '🃌',\n        codepoint: 127180,\n      },\n      {\n        name: 'PLAYING CARD QUEEN OF DIAMONDS',\n        value: '🃍',\n        codepoint: 127181,\n      },\n      {\n        name: 'PLAYING CARD KING OF DIAMONDS',\n        value: '🃎',\n        codepoint: 127182,\n      },\n      {\n        name: 'PLAYING CARD ACE OF CLUBS',\n        value: '🃑',\n        codepoint: 127185,\n      },\n      {\n        name: 'PLAYING CARD TWO OF CLUBS',\n        value: '🃒',\n        codepoint: 127186,\n      },\n      {\n        name: 'PLAYING CARD THREE OF CLUBS',\n        value: '🃓',\n        codepoint: 127187,\n      },\n      {\n        name: 'PLAYING CARD FOUR OF CLUBS',\n        value: '🃔',\n        codepoint: 127188,\n      },\n      {\n        name: 'PLAYING CARD FIVE OF CLUBS',\n        value: '🃕',\n        codepoint: 127189,\n      },\n      {\n        name: 'PLAYING CARD SIX OF CLUBS',\n        value: '🃖',\n        codepoint: 127190,\n      },\n      {\n        name: 'PLAYING CARD SEVEN OF CLUBS',\n        value: '🃗',\n        codepoint: 127191,\n      },\n      {\n        name: 'PLAYING CARD EIGHT OF CLUBS',\n        value: '🃘',\n        codepoint: 127192,\n      },\n      {\n        name: 'PLAYING CARD NINE OF CLUBS',\n        value: '🃙',\n        codepoint: 127193,\n      },\n      {\n        name: 'PLAYING CARD TEN OF CLUBS',\n        value: '🃚',\n        codepoint: 127194,\n      },\n      {\n        name: 'PLAYING CARD JACK OF CLUBS',\n        value: '🃛',\n        codepoint: 127195,\n      },\n      {\n        name: 'PLAYING CARD KNIGHT OF CLUBS',\n        value: '🃜',\n        codepoint: 127196,\n      },\n      {\n        name: 'PLAYING CARD QUEEN OF CLUBS',\n        value: '🃝',\n        codepoint: 127197,\n      },\n      {\n        name: 'PLAYING CARD KING OF CLUBS',\n        value: '🃞',\n        codepoint: 127198,\n      },\n      {\n        name: 'PLAYING CARD WHITE JOKER',\n        value: '🃟',\n        codepoint: 127199,\n      },\n    ],\n  },\n  {\n    name: 'Music',\n    symbols: [\n      {\n        name: 'MUSICAL SYMBOL SINGLE BARLINE',\n        value: '𝄀',\n        codepoint: 119040,\n      },\n      {\n        name: 'MUSICAL SYMBOL DOUBLE BARLINE',\n        value: '𝄁',\n        codepoint: 119041,\n      },\n      {\n        name: 'MUSICAL SYMBOL FINAL BARLINE',\n        value: '𝄂',\n        codepoint: 119042,\n      },\n      {\n        name: 'MUSICAL SYMBOL REVERSE FINAL BARLINE',\n        value: '𝄃',\n        codepoint: 119043,\n      },\n      {\n        name: 'MUSICAL SYMBOL DASHED BARLINE',\n        value: '𝄄',\n        codepoint: 119044,\n      },\n      {\n        name: 'MUSICAL SYMBOL SHORT BARLINE',\n        value: '𝄅',\n        codepoint: 119045,\n      },\n      {\n        name: 'MUSICAL SYMBOL LEFT REPEAT SIGN',\n        value: '𝄆',\n        codepoint: 119046,\n      },\n      {\n        name: 'MUSICAL SYMBOL RIGHT REPEAT SIGN',\n        value: '𝄇',\n        codepoint: 119047,\n      },\n      {\n        name: 'MUSICAL SYMBOL REPEAT DOTS',\n        value: '𝄈',\n        codepoint: 119048,\n      },\n      {\n        name: 'MUSICAL SYMBOL FERMATA',\n        value: '𝄐',\n        codepoint: 119056,\n      },\n      {\n        name: 'MUSICAL SYMBOL FERMATA BELOW',\n        value: '𝄑',\n        codepoint: 119057,\n      },\n      {\n        name: 'MUSICAL SYMBOL BREATH MARK',\n        value: '𝄒',\n        codepoint: 119058,\n      },\n      {\n        name: 'MUSICAL SYMBOL G CLEF',\n        value: '𝄞',\n        codepoint: 119070,\n      },\n      {\n        name: 'MUSICAL SYMBOL C CLEF',\n        value: '𝄡',\n        codepoint: 119073,\n      },\n      {\n        name: 'MUSICAL SYMBOL F CLEF',\n        value: '𝄢',\n        codepoint: 119074,\n      },\n      {\n        name: 'MUSICAL SYMBOL DOUBLE SHARP',\n        value: '𝄪',\n        codepoint: 119082,\n      },\n      {\n        name: 'MUSICAL SYMBOL DOUBLE FLAT',\n        value: '𝄫',\n        codepoint: 119083,\n      },\n      {\n        name: 'MUSICAL SYMBOL CRESCENDO',\n        value: '𝆒',\n        codepoint: 119186,\n      },\n      {\n        name: 'MUSICAL SYMBOL DECRESCENDO',\n        value: '𝆓',\n        codepoint: 119187,\n      },\n      {\n        name: 'MUSICAL SYMBOL HAUPTSTIMME',\n        value: '𝆦',\n        codepoint: 119206,\n      },\n      {\n        name: 'MUSICAL SYMBOL NEBENSTIMME',\n        value: '𝆧',\n        codepoint: 119207,\n      },\n      {\n        name: 'MUSICAL SYMBOL END OF STIMME',\n        value: '𝆨',\n        codepoint: 119208,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA',\n        value: '𝇇',\n        codepoint: 119239,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA',\n        value: '𝇈',\n        codepoint: 119240,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1',\n        value: '𝇉',\n        codepoint: 119241,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA',\n        value: '𝇊',\n        codepoint: 119242,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA',\n        value: '𝇋',\n        codepoint: 119243,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1',\n        value: '𝇌',\n        codepoint: 119244,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2',\n        value: '𝇍',\n        codepoint: 119245,\n      },\n      {\n        name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3',\n        value: '𝇎',\n        codepoint: 119246,\n      },\n    ],\n  },\n  {\n    name: 'Geometric Shapes',\n    symbols: [\n      {\n        name: 'BLACK SQUARE',\n        value: '■',\n        codepoint: 9632,\n      },\n      {\n        name: 'WHITE SQUARE',\n        value: '□',\n        codepoint: 9633,\n      },\n      {\n        name: 'WHITE SQUARE WITH ROUNDED CORNERS',\n        value: '▢',\n        codepoint: 9634,\n      },\n      {\n        name: 'WHITE SQUARE CONTAINING BLACK SMALL SQUARE',\n        value: '▣',\n        codepoint: 9635,\n      },\n      {\n        name: 'SQUARE WITH HORIZONTAL FILL',\n        value: '▤',\n        codepoint: 9636,\n      },\n      {\n        name: 'SQUARE WITH VERTICAL FILL',\n        value: '▥',\n        codepoint: 9637,\n      },\n      {\n        name: 'SQUARE WITH ORTHOGONAL CROSSHATCH FILL',\n        value: '▦',\n        codepoint: 9638,\n      },\n      {\n        name: 'SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL',\n        value: '▧',\n        codepoint: 9639,\n      },\n      {\n        name: 'SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL',\n        value: '▨',\n        codepoint: 9640,\n      },\n      {\n        name: 'SQUARE WITH DIAGONAL CROSSHATCH FILL',\n        value: '▩',\n        codepoint: 9641,\n      },\n      {\n        name: 'BLACK RECTANGLE',\n        value: '▬',\n        codepoint: 9644,\n      },\n      {\n        name: 'WHITE RECTANGLE',\n        value: '▭',\n        codepoint: 9645,\n      },\n      {\n        name: 'BLACK VERTICAL RECTANGLE',\n        value: '▮',\n        codepoint: 9646,\n      },\n      {\n        name: 'WHITE VERTICAL RECTANGLE',\n        value: '▯',\n        codepoint: 9647,\n      },\n      {\n        name: 'BLACK PARALLELOGRAM',\n        value: '▰',\n        codepoint: 9648,\n      },\n      {\n        name: 'WHITE PARALLELOGRAM',\n        value: '▱',\n        codepoint: 9649,\n      },\n      {\n        name: 'BLACK UP-POINTING TRIANGLE',\n        value: '▲',\n        codepoint: 9650,\n      },\n      {\n        name: 'WHITE UP-POINTING TRIANGLE',\n        value: '△',\n        codepoint: 9651,\n      },\n      {\n        name: 'BLACK UP-POINTING SMALL TRIANGLE',\n        value: '▴',\n        codepoint: 9652,\n      },\n      {\n        name: 'WHITE UP-POINTING SMALL TRIANGLE',\n        value: '▵',\n        codepoint: 9653,\n      },\n      {\n        name: 'WHITE RIGHT-POINTING TRIANGLE',\n        value: '▷',\n        codepoint: 9655,\n      },\n      {\n        name: 'BLACK RIGHT-POINTING SMALL TRIANGLE',\n        value: '▸',\n        codepoint: 9656,\n      },\n      {\n        name: 'WHITE RIGHT-POINTING SMALL TRIANGLE',\n        value: '▹',\n        codepoint: 9657,\n      },\n      {\n        name: 'BLACK RIGHT-POINTING POINTER',\n        value: '►',\n        codepoint: 9658,\n      },\n      {\n        name: 'WHITE RIGHT-POINTING POINTER',\n        value: '▻',\n        codepoint: 9659,\n      },\n      {\n        name: 'BLACK DOWN-POINTING TRIANGLE',\n        value: '▼',\n        codepoint: 9660,\n      },\n      {\n        name: 'WHITE DOWN-POINTING TRIANGLE',\n        value: '▽',\n        codepoint: 9661,\n      },\n      {\n        name: 'BLACK DOWN-POINTING SMALL TRIANGLE',\n        value: '▾',\n        codepoint: 9662,\n      },\n      {\n        name: 'WHITE DOWN-POINTING SMALL TRIANGLE',\n        value: '▿',\n        codepoint: 9663,\n      },\n      {\n        name: 'WHITE LEFT-POINTING TRIANGLE',\n        value: '◁',\n        codepoint: 9665,\n      },\n      {\n        name: 'BLACK LEFT-POINTING SMALL TRIANGLE',\n        value: '◂',\n        codepoint: 9666,\n      },\n      {\n        name: 'WHITE LEFT-POINTING SMALL TRIANGLE',\n        value: '◃',\n        codepoint: 9667,\n      },\n      {\n        name: 'BLACK LEFT-POINTING POINTER',\n        value: '◄',\n        codepoint: 9668,\n      },\n      {\n        name: 'WHITE LEFT-POINTING POINTER',\n        value: '◅',\n        codepoint: 9669,\n      },\n      {\n        name: 'BLACK DIAMOND',\n        value: '◆',\n        codepoint: 9670,\n      },\n      {\n        name: 'WHITE DIAMOND',\n        value: '◇',\n        codepoint: 9671,\n      },\n      {\n        name: 'WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND',\n        value: '◈',\n        codepoint: 9672,\n      },\n      {\n        name: 'FISHEYE',\n        value: '◉',\n        codepoint: 9673,\n      },\n      {\n        name: 'LOZENGE',\n        value: '◊',\n        codepoint: 9674,\n      },\n      {\n        name: 'WHITE CIRCLE',\n        value: '○',\n        codepoint: 9675,\n      },\n      {\n        name: 'DOTTED CIRCLE',\n        value: '◌',\n        codepoint: 9676,\n      },\n      {\n        name: 'CIRCLE WITH VERTICAL FILL',\n        value: '◍',\n        codepoint: 9677,\n      },\n      {\n        name: 'BULLSEYE',\n        value: '◎',\n        codepoint: 9678,\n      },\n      {\n        name: 'BLACK CIRCLE',\n        value: '●',\n        codepoint: 9679,\n      },\n      {\n        name: 'CIRCLE WITH LEFT HALF BLACK',\n        value: '◐',\n        codepoint: 9680,\n      },\n      {\n        name: 'CIRCLE WITH RIGHT HALF BLACK',\n        value: '◑',\n        codepoint: 9681,\n      },\n      {\n        name: 'CIRCLE WITH LOWER HALF BLACK',\n        value: '◒',\n        codepoint: 9682,\n      },\n      {\n        name: 'CIRCLE WITH UPPER HALF BLACK',\n        value: '◓',\n        codepoint: 9683,\n      },\n      {\n        name: 'CIRCLE WITH UPPER RIGHT QUADRANT BLACK',\n        value: '◔',\n        codepoint: 9684,\n      },\n      {\n        name: 'CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK',\n        value: '◕',\n        codepoint: 9685,\n      },\n      {\n        name: 'LEFT HALF BLACK CIRCLE',\n        value: '◖',\n        codepoint: 9686,\n      },\n      {\n        name: 'RIGHT HALF BLACK CIRCLE',\n        value: '◗',\n        codepoint: 9687,\n      },\n      {\n        name: 'INVERSE BULLET',\n        value: '◘',\n        codepoint: 9688,\n      },\n      {\n        name: 'INVERSE WHITE CIRCLE',\n        value: '◙',\n        codepoint: 9689,\n      },\n      {\n        name: 'UPPER HALF INVERSE WHITE CIRCLE',\n        value: '◚',\n        codepoint: 9690,\n      },\n      {\n        name: 'LOWER HALF INVERSE WHITE CIRCLE',\n        value: '◛',\n        codepoint: 9691,\n      },\n      {\n        name: 'UPPER LEFT QUADRANT CIRCULAR ARC',\n        value: '◜',\n        codepoint: 9692,\n      },\n      {\n        name: 'UPPER RIGHT QUADRANT CIRCULAR ARC',\n        value: '◝',\n        codepoint: 9693,\n      },\n      {\n        name: 'LOWER RIGHT QUADRANT CIRCULAR ARC',\n        value: '◞',\n        codepoint: 9694,\n      },\n      {\n        name: 'LOWER LEFT QUADRANT CIRCULAR ARC',\n        value: '◟',\n        codepoint: 9695,\n      },\n      {\n        name: 'UPPER HALF CIRCLE',\n        value: '◠',\n        codepoint: 9696,\n      },\n      {\n        name: 'LOWER HALF CIRCLE',\n        value: '◡',\n        codepoint: 9697,\n      },\n      {\n        name: 'BLACK LOWER RIGHT TRIANGLE',\n        value: '◢',\n        codepoint: 9698,\n      },\n      {\n        name: 'BLACK LOWER LEFT TRIANGLE',\n        value: '◣',\n        codepoint: 9699,\n      },\n      {\n        name: 'BLACK UPPER LEFT TRIANGLE',\n        value: '◤',\n        codepoint: 9700,\n      },\n      {\n        name: 'BLACK UPPER RIGHT TRIANGLE',\n        value: '◥',\n        codepoint: 9701,\n      },\n      {\n        name: 'WHITE BULLET',\n        value: '◦',\n        codepoint: 9702,\n      },\n      {\n        name: 'SQUARE WITH LEFT HALF BLACK',\n        value: '◧',\n        codepoint: 9703,\n      },\n      {\n        name: 'SQUARE WITH RIGHT HALF BLACK',\n        value: '◨',\n        codepoint: 9704,\n      },\n      {\n        name: 'SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK',\n        value: '◩',\n        codepoint: 9705,\n      },\n      {\n        name: 'SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK',\n        value: '◪',\n        codepoint: 9706,\n      },\n      {\n        name: 'WHITE SQUARE WITH VERTICAL BISECTING LINE',\n        value: '◫',\n        codepoint: 9707,\n      },\n      {\n        name: 'WHITE UP-POINTING TRIANGLE WITH DOT',\n        value: '◬',\n        codepoint: 9708,\n      },\n      {\n        name: 'UP-POINTING TRIANGLE WITH LEFT HALF BLACK',\n        value: '◭',\n        codepoint: 9709,\n      },\n      {\n        name: 'UP-POINTING TRIANGLE WITH RIGHT HALF BLACK',\n        value: '◮',\n        codepoint: 9710,\n      },\n      {\n        name: 'LARGE CIRCLE',\n        value: '◯',\n        codepoint: 9711,\n      },\n      {\n        name: 'WHITE SQUARE WITH UPPER LEFT QUADRANT',\n        value: '◰',\n        codepoint: 9712,\n      },\n      {\n        name: 'WHITE SQUARE WITH LOWER LEFT QUADRANT',\n        value: '◱',\n        codepoint: 9713,\n      },\n      {\n        name: 'WHITE SQUARE WITH LOWER RIGHT QUADRANT',\n        value: '◲',\n        codepoint: 9714,\n      },\n      {\n        name: 'WHITE SQUARE WITH UPPER RIGHT QUADRANT',\n        value: '◳',\n        codepoint: 9715,\n      },\n      {\n        name: 'WHITE CIRCLE WITH UPPER LEFT QUADRANT',\n        value: '◴',\n        codepoint: 9716,\n      },\n      {\n        name: 'WHITE CIRCLE WITH LOWER LEFT QUADRANT',\n        value: '◵',\n        codepoint: 9717,\n      },\n      {\n        name: 'WHITE CIRCLE WITH LOWER RIGHT QUADRANT',\n        value: '◶',\n        codepoint: 9718,\n      },\n      {\n        name: 'WHITE CIRCLE WITH UPPER RIGHT QUADRANT',\n        value: '◷',\n        codepoint: 9719,\n      },\n      {\n        name: 'UPPER LEFT TRIANGLE',\n        value: '◸',\n        codepoint: 9720,\n      },\n      {\n        name: 'UPPER RIGHT TRIANGLE',\n        value: '◹',\n        codepoint: 9721,\n      },\n      {\n        name: 'LOWER LEFT TRIANGLE',\n        value: '◺',\n        codepoint: 9722,\n      },\n      {\n        name: 'LOWER RIGHT TRIANGLE',\n        value: '◿',\n        codepoint: 9727,\n      },\n    ],\n  },\n  {\n    name: 'Ideographic',\n    symbols: [\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT',\n        value: '⿰',\n        codepoint: 12272,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW',\n        value: '⿱',\n        codepoint: 12273,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT',\n        value: '⿲',\n        codepoint: 12274,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW',\n        value: '⿳',\n        codepoint: 12275,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND',\n        value: '⿴',\n        codepoint: 12276,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE',\n        value: '⿵',\n        codepoint: 12277,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW',\n        value: '⿶',\n        codepoint: 12278,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT',\n        value: '⿷',\n        codepoint: 12279,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT',\n        value: '⿸',\n        codepoint: 12280,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT',\n        value: '⿹',\n        codepoint: 12281,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT',\n        value: '⿺',\n        codepoint: 12282,\n      },\n      {\n        name: 'IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID',\n        value: '⿻',\n        codepoint: 12283,\n      },\n    ],\n  },\n];\n\nexport default symbols;\n","/*\n * insert_emoji.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey, EditorState } from 'prosemirror-state';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { emojiCategories, emojis, Emoji, emojiFromString, SkinTone } from '../../api/emoji';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { nodeForEmoji } from '../../marks/emoji/emoji';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { performInsertSymbol, InsertSymbolPlugin } from './insert_symbol-plugin';\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\nimport { SymbolEmojiPreferencesPanel } from './insert_symbol-emoji-skintone';\n\nconst key = new PluginKey<boolean>('insert-emoji');\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { ui, events } = context;\n  return {\n    commands: () => {\n      return [new ProsemirrorCommand(EditorCommandId.Emoji, [], performInsertSymbol(key), emojiOmniInsert(ui))];\n    },\n    plugins: (_schema: Schema) => {\n      return [new InsertSymbolPlugin(key, new EmojiSymbolDataProvider(ui), ui, events)];\n    },\n  };\n};\n\nfunction emojiOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Emoji...'),\n    description: ui.context.translateText('Image expressing idea, emotion, etc.'),\n    group: OmniInsertGroup.Content,\n    priority: 6,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.emoji_dark! : ui.images.omni_insert?.emoji!),\n  };\n}\n\nexport class EmojiSymbolDataProvider implements SymbolDataProvider {\n  public constructor(ui: EditorUI) {\n    this.ui = ui;\n  }\n  private readonly ui: EditorUI;\n\n  public readonly filterPlaceholderHint = 'emoji name';\n\n  public readonly symbolPreviewStyle: React.CSSProperties = { fontSize: '36px' } as React.CSSProperties;\n\n  public symbolPreferencesPanel = SymbolEmojiPreferencesPanel;\n\n  public insertSymbolTransaction(symbolCharacter: SymbolCharacter, searchTerm: string, state: EditorState) {\n    const emoji = emojiFromString(symbolCharacter.value, this.skinTone());\n    const tr = state.tr;\n    if (emoji) {\n      // Try to find an alias that matches the user's search term\n      const bestAlias = emoji.aliases.find(alias => alias.includes(searchTerm));\n      tr.replaceSelectionWith(nodeForEmoji(state.schema, emoji, bestAlias || emoji.aliases[0], false), false);\n    } else {\n      // This doesn't appear to be an emoji or it doesn't have a markdown representation,\n      // just insert the text\n      tr.insertText(symbolCharacter.value);\n    }\n    return tr;\n  }\n\n  public symbolGroupNames(): string[] {\n    return [kCategoryAll, ...emojiCategories()];\n  }\n\n  public getSymbols(groupName: string | undefined) {\n    if (groupName === kCategoryAll || groupName === undefined) {\n      return emojis(this.skinTone()).map(emoji => symbolForEmoji(emoji));\n    } else {\n      return emojis(this.skinTone())\n        .filter(emoji => emoji.category === groupName)\n        .map(emoji => symbolForEmoji(emoji));\n    }\n  }\n\n  public filterSymbols(filterText: string, symbols: SymbolCharacter[]): SymbolCharacter[] {\n    const filteredSymbols = symbols.filter(symbol => {\n      // Search by name\n      if (symbol.name.includes(filterText)) {\n        return true;\n      }\n\n      // search each of the aliases\n      if (symbol.aliases && symbol.aliases.find(alias => alias.includes(filterText))) {\n        return true;\n      }\n\n      return false;\n    });\n    return filteredSymbols;\n  }\n\n  private skinTone(): SkinTone {\n    return this.ui.prefs.emojiSkinTone();\n  }\n}\n\nconst kCategoryAll = 'All';\nfunction symbolForEmoji(emoji: Emoji): SymbolCharacter {\n  return {\n    name: emoji.description,\n    value: emoji.emoji,\n    markdown: emoji.hasMarkdownRepresentation ? `:${emoji.aliases[0]}:` : undefined,\n    aliases: emoji.aliases,\n    description: emoji.description,\n  };\n}\n\nexport default extension;\n","/*\n * emoji.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport kEmojis from './emojis-all';\n\nexport const kEmojiAttr = 0;\nexport const kEmojiContent = 1;\n\n// A raw emoji which doesn't include skin tone information\nexport interface EmojiRaw {\n  emojiRaw: string;\n  aliases: string[];\n  category: string;\n  description: string;\n  supportsSkinTone?: boolean;\n  hasMarkdownRepresentation: boolean;\n}\n\n// A complete emoji that may additional render skintone\nexport interface Emoji extends EmojiRaw {\n  emoji: string;\n  skinTone: SkinTone;\n}\n\n// Skin tones that are permitted for emoji\n// None = user hasn't expressed a preference\n// Default = don't apply a skin tone (use yellow emoji)\nexport enum SkinTone {\n  None = -1,\n  Default = 0,\n  Light = 0x1f3fb,\n  MediumLight = 0x1f3fc,\n  Medium = 0x1f3fd,\n  MediumDark = 0x1f3fe,\n  Dark = 0x1f3ff,\n}\n\nfunction hasSkinTone(skinTone: SkinTone): boolean {\n  return skinTone !== SkinTone.None && skinTone !== SkinTone.Default;\n}\n\nexport function emojis(skinTone: SkinTone): Emoji[] {\n  return kEmojis.map(emoji => emojiWithSkinTone(emoji, skinTone));\n}\n\nexport function emojiCategories(): string[] {\n  return kEmojis\n    .map(emoji => emoji.category)\n    .filter((catgegory, index, categories) => categories.indexOf(catgegory) === index);\n}\n\nexport function emojiFromString(emojiString: string, skinTone: SkinTone): Emoji | undefined {\n  return emojis(skinTone).find(em => em.emoji === emojiString);\n}\n\nexport function emojiWithSkinTonePreference(emoji: EmojiRaw, skinTone: SkinTone): Emoji {\n  return emojiWithSkinTone(emoji, skinTone);\n}\n\n// Find a matching non skin toned emoji for a given string\nexport function emojiFromChar(emojiString: string): EmojiRaw | undefined {\n  return kEmojis.find(emoji => emoji.emojiRaw === emojiString);\n}\n\n// Returns a non skin tonned emoji for a given alias.\nexport function emojiFromAlias(emojiAlias: string): EmojiRaw | undefined {\n  for (const emoji of kEmojis) {\n    if (emoji.aliases.includes(emojiAlias)) {\n      return emoji;\n    }\n  }\n  return undefined;\n}\n\n// Returns an array of skin toned emoji including the unskintoned emoji. If the emoji\n// doesn't support skin tones, this returns the original emoji.\nexport function emojiForAllSkinTones(emoji: EmojiRaw): Emoji[] {\n  if (emoji.supportsSkinTone) {\n    return [\n      emojiWithSkinTone(emoji, SkinTone.Default),\n      emojiWithSkinTone(emoji, SkinTone.Light),\n      emojiWithSkinTone(emoji, SkinTone.MediumLight),\n      emojiWithSkinTone(emoji, SkinTone.Medium),\n      emojiWithSkinTone(emoji, SkinTone.MediumDark),\n      emojiWithSkinTone(emoji, SkinTone.Dark),\n    ];\n  } else {\n    return [emojiWithSkinTone(emoji, SkinTone.Default)];\n  }\n}\n\n// Returns a skin toned version of the emoji, or the original emoji if it\n// doesn't support skin tones\nfunction emojiWithSkinTone(emoji: EmojiRaw, skinTone: SkinTone): Emoji {\n  if (!emoji.supportsSkinTone) {\n    return { ...emoji, emoji: emoji.emojiRaw, skinTone: SkinTone.Default };\n  }\n\n  const skinToneEmoji: Emoji = {\n    emojiRaw: emoji.emojiRaw,\n    aliases: emoji.aliases,\n    category: emoji.category,\n    description: emoji.description,\n    supportsSkinTone: emoji.supportsSkinTone,\n    hasMarkdownRepresentation: emoji.hasMarkdownRepresentation,\n    emoji: emoji.emojiRaw + characterForSkinTone(skinTone), //\n    skinTone,\n  };\n  return skinToneEmoji;\n}\n\n// No skin tone returns an empty string, otherwise the skintone codepoint\n// is converted into a string\nfunction characterForSkinTone(skinTone: SkinTone): string {\n  return hasSkinTone(skinTone) ? String.fromCodePoint(skinTone) : '';\n}\n","import { EmojiRaw } from './emoji';\n\nconst emjois: EmojiRaw[] = [\n  {\n    \"emojiRaw\": \"😀\",\n    \"description\": \"grinning face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"grinning\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😃\",\n    \"description\": \"grinning face with big eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smiley\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😄\",\n    \"description\": \"grinning face with smiling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smile\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😁\",\n    \"description\": \"beaming face with smiling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"grin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😆\",\n    \"description\": \"grinning squinting face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"laughing\",\n      \"satisfied\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😅\",\n    \"description\": \"grinning face with sweat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sweat_smile\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤣\",\n    \"description\": \"rolling on the floor laughing\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"rofl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😂\",\n    \"description\": \"face with tears of joy\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"joy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙂\",\n    \"description\": \"slightly smiling face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"slightly_smiling_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙃\",\n    \"description\": \"upside-down face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"upside_down_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😉\",\n    \"description\": \"winking face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"wink\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😊\",\n    \"description\": \"smiling face with smiling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"blush\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😇\",\n    \"description\": \"smiling face with halo\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"innocent\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥰\",\n    \"description\": \"smiling face with hearts\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smiling_face_with_three_hearts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😍\",\n    \"description\": \"smiling face with heart-eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heart_eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤩\",\n    \"description\": \"star-struck\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"star_struck\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😘\",\n    \"description\": \"face blowing a kiss\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kissing_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😗\",\n    \"description\": \"kissing face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kissing\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😚\",\n    \"description\": \"kissing face with closed eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kissing_closed_eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😙\",\n    \"description\": \"kissing face with smiling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kissing_smiling_eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😋\",\n    \"description\": \"face savoring food\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"yum\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😛\",\n    \"description\": \"face with tongue\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"stuck_out_tongue\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😜\",\n    \"description\": \"winking face with tongue\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"stuck_out_tongue_winking_eye\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤪\",\n    \"description\": \"zany face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"zany_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😝\",\n    \"description\": \"squinting face with tongue\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"stuck_out_tongue_closed_eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤑\",\n    \"description\": \"money-mouth face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"money_mouth_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤗\",\n    \"description\": \"hugging face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hugs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤭\",\n    \"description\": \"face with hand over mouth\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hand_over_mouth\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤫\",\n    \"description\": \"shushing face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"shushing_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤔\",\n    \"description\": \"thinking face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"thinking\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤐\",\n    \"description\": \"zipper-mouth face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"zipper_mouth_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤨\",\n    \"description\": \"face with raised eyebrow\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"raised_eyebrow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😐\",\n    \"description\": \"neutral face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"neutral_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😑\",\n    \"description\": \"expressionless face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"expressionless\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😶\",\n    \"description\": \"face without mouth\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"no_mouth\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😏\",\n    \"description\": \"smirking face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smirk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😒\",\n    \"description\": \"unamused face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"unamused\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙄\",\n    \"description\": \"face with rolling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"roll_eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😬\",\n    \"description\": \"grimacing face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"grimacing\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤥\",\n    \"description\": \"lying face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"lying_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😌\",\n    \"description\": \"relieved face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"relieved\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😔\",\n    \"description\": \"pensive face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"pensive\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😪\",\n    \"description\": \"sleepy face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sleepy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤤\",\n    \"description\": \"drooling face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"drooling_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😴\",\n    \"description\": \"sleeping face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sleeping\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😷\",\n    \"description\": \"face with medical mask\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"mask\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤒\",\n    \"description\": \"face with thermometer\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"face_with_thermometer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤕\",\n    \"description\": \"face with head-bandage\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"face_with_head_bandage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤢\",\n    \"description\": \"nauseated face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"nauseated_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤮\",\n    \"description\": \"face vomiting\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"vomiting_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤧\",\n    \"description\": \"sneezing face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sneezing_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥵\",\n    \"description\": \"hot face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hot_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥶\",\n    \"description\": \"cold face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cold_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥴\",\n    \"description\": \"woozy face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"woozy_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😵\",\n    \"description\": \"dizzy face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"dizzy_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤯\",\n    \"description\": \"exploding head\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"exploding_head\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤠\",\n    \"description\": \"cowboy hat face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cowboy_hat_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥳\",\n    \"description\": \"partying face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"partying_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😎\",\n    \"description\": \"smiling face with sunglasses\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sunglasses\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤓\",\n    \"description\": \"nerd face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"nerd_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧐\",\n    \"description\": \"face with monocle\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"monocle_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😕\",\n    \"description\": \"confused face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"confused\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😟\",\n    \"description\": \"worried face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"worried\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙁\",\n    \"description\": \"slightly frowning face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"slightly_frowning_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😮\",\n    \"description\": \"face with open mouth\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"open_mouth\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😯\",\n    \"description\": \"hushed face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hushed\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😲\",\n    \"description\": \"astonished face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"astonished\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😳\",\n    \"description\": \"flushed face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"flushed\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥺\",\n    \"description\": \"pleading face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"pleading_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😦\",\n    \"description\": \"frowning face with open mouth\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"frowning\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😧\",\n    \"description\": \"anguished face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"anguished\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😨\",\n    \"description\": \"fearful face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"fearful\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😰\",\n    \"description\": \"anxious face with sweat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cold_sweat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😥\",\n    \"description\": \"sad but relieved face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"disappointed_relieved\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😢\",\n    \"description\": \"crying face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😭\",\n    \"description\": \"loudly crying face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sob\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😱\",\n    \"description\": \"face screaming in fear\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"scream\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😖\",\n    \"description\": \"confounded face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"confounded\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😣\",\n    \"description\": \"persevering face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"persevere\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😞\",\n    \"description\": \"disappointed face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"disappointed\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😓\",\n    \"description\": \"downcast face with sweat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sweat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😩\",\n    \"description\": \"weary face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"weary\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😫\",\n    \"description\": \"tired face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"tired_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥱\",\n    \"description\": \"yawning face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"yawning_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😤\",\n    \"description\": \"face with steam from nose\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"triumph\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😡\",\n    \"description\": \"pouting face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"rage\",\n      \"pout\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😠\",\n    \"description\": \"angry face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"angry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤬\",\n    \"description\": \"face with symbols on mouth\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cursing_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😈\",\n    \"description\": \"smiling face with horns\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smiling_imp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👿\",\n    \"description\": \"angry face with horns\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"imp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💀\",\n    \"description\": \"skull\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"skull\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☠️\",\n    \"description\": \"skull and crossbones\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"skull_and_crossbones\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💩\",\n    \"description\": \"pile of poo\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hankey\",\n      \"poop\",\n      \"shit\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤡\",\n    \"description\": \"clown face\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"clown_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👹\",\n    \"description\": \"ogre\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"japanese_ogre\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👺\",\n    \"description\": \"goblin\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"japanese_goblin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👻\",\n    \"description\": \"ghost\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"ghost\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👽\",\n    \"description\": \"alien\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"alien\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👾\",\n    \"description\": \"alien monster\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"space_invader\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤖\",\n    \"description\": \"robot\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"robot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😺\",\n    \"description\": \"grinning cat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smiley_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😸\",\n    \"description\": \"grinning cat with smiling eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smile_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😹\",\n    \"description\": \"cat with tears of joy\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"joy_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😻\",\n    \"description\": \"smiling cat with heart-eyes\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heart_eyes_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😼\",\n    \"description\": \"cat with wry smile\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"smirk_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😽\",\n    \"description\": \"kissing cat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kissing_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙀\",\n    \"description\": \"weary cat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"scream_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😿\",\n    \"description\": \"crying cat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"crying_cat_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"😾\",\n    \"description\": \"pouting cat\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"pouting_cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙈\",\n    \"description\": \"see-no-evil monkey\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"see_no_evil\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙉\",\n    \"description\": \"hear-no-evil monkey\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hear_no_evil\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙊\",\n    \"description\": \"speak-no-evil monkey\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"speak_no_evil\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💋\",\n    \"description\": \"kiss mark\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"kiss\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💌\",\n    \"description\": \"love letter\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"love_letter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💘\",\n    \"description\": \"heart with arrow\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"cupid\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💝\",\n    \"description\": \"heart with ribbon\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"gift_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💖\",\n    \"description\": \"sparkling heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sparkling_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💗\",\n    \"description\": \"growing heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heartpulse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💓\",\n    \"description\": \"beating heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heartbeat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💞\",\n    \"description\": \"revolving hearts\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"revolving_hearts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💕\",\n    \"description\": \"two hearts\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"two_hearts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💟\",\n    \"description\": \"heart decoration\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heart_decoration\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❣️\",\n    \"description\": \"heart exclamation\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heavy_heart_exclamation\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💔\",\n    \"description\": \"broken heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"broken_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❤️\",\n    \"description\": \"red heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧡\",\n    \"description\": \"orange heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"orange_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💛\",\n    \"description\": \"yellow heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"yellow_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💚\",\n    \"description\": \"green heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"green_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💙\",\n    \"description\": \"blue heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"blue_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💜\",\n    \"description\": \"purple heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"purple_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤎\",\n    \"description\": \"brown heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"brown_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖤\",\n    \"description\": \"black heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"black_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤍\",\n    \"description\": \"white heart\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"white_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💯\",\n    \"description\": \"hundred points\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"100\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💢\",\n    \"description\": \"anger symbol\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"anger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💥\",\n    \"description\": \"collision\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"boom\",\n      \"collision\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💫\",\n    \"description\": \"dizzy\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"dizzy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💦\",\n    \"description\": \"sweat droplets\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"sweat_drops\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💨\",\n    \"description\": \"dashing away\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"dash\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕳️\",\n    \"description\": \"hole\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"hole\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💣\",\n    \"description\": \"bomb\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"bomb\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💬\",\n    \"description\": \"speech balloon\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"speech_balloon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👁️‍🗨️\",\n    \"description\": \"eye in speech bubble\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"eye_speech_bubble\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗨️\",\n    \"description\": \"left speech bubble\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"left_speech_bubble\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗯️\",\n    \"description\": \"right anger bubble\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"right_anger_bubble\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💭\",\n    \"description\": \"thought balloon\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"thought_balloon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💤\",\n    \"description\": \"zzz\",\n    \"category\": \"Smileys & Emotion\",\n    \"aliases\": [\n      \"zzz\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👋\",\n    \"description\": \"waving hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"wave\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤚\",\n    \"description\": \"raised back of hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raised_back_of_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖐️\",\n    \"description\": \"hand with fingers splayed\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raised_hand_with_fingers_splayed\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✋\",\n    \"description\": \"raised hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"hand\",\n      \"raised_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖖\",\n    \"description\": \"vulcan salute\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"vulcan_salute\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👌\",\n    \"description\": \"OK hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ok_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤏\",\n    \"description\": \"pinching hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pinching_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✌️\",\n    \"description\": \"victory hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"v\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤞\",\n    \"description\": \"crossed fingers\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"crossed_fingers\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤟\",\n    \"description\": \"love-you gesture\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"love_you_gesture\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤘\",\n    \"description\": \"sign of the horns\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"metal\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤙\",\n    \"description\": \"call me hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"call_me_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👈\",\n    \"description\": \"backhand index pointing left\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"point_left\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👉\",\n    \"description\": \"backhand index pointing right\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"point_right\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👆\",\n    \"description\": \"backhand index pointing up\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"point_up_2\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖕\",\n    \"description\": \"middle finger\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"middle_finger\",\n      \"fu\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👇\",\n    \"description\": \"backhand index pointing down\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"point_down\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☝️\",\n    \"description\": \"index pointing up\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"point_up\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👍\",\n    \"description\": \"thumbs up\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"+1\",\n      \"thumbsup\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👎\",\n    \"description\": \"thumbs down\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"-1\",\n      \"thumbsdown\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✊\",\n    \"description\": \"raised fist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fist_raised\",\n      \"fist\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👊\",\n    \"description\": \"oncoming fist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fist_oncoming\",\n      \"facepunch\",\n      \"punch\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤛\",\n    \"description\": \"left-facing fist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fist_left\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤜\",\n    \"description\": \"right-facing fist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fist_right\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👏\",\n    \"description\": \"clapping hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"clap\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙌\",\n    \"description\": \"raising hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raised_hands\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👐\",\n    \"description\": \"open hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"open_hands\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤲\",\n    \"description\": \"palms up together\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"palms_up_together\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤝\",\n    \"description\": \"handshake\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"handshake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙏\",\n    \"description\": \"folded hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pray\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✍️\",\n    \"description\": \"writing hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"writing_hand\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💅\",\n    \"description\": \"nail polish\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"nail_care\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤳\",\n    \"description\": \"selfie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"selfie\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💪\",\n    \"description\": \"flexed biceps\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"muscle\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦾\",\n    \"description\": \"mechanical arm\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mechanical_arm\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦿\",\n    \"description\": \"mechanical leg\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mechanical_leg\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦵\",\n    \"description\": \"leg\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"leg\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦶\",\n    \"description\": \"foot\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"foot\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👂\",\n    \"description\": \"ear\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ear\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦻\",\n    \"description\": \"ear with hearing aid\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ear_with_hearing_aid\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👃\",\n    \"description\": \"nose\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"nose\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧠\",\n    \"description\": \"brain\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"brain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦷\",\n    \"description\": \"tooth\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"tooth\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦴\",\n    \"description\": \"bone\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👀\",\n    \"description\": \"eyes\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"eyes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👁️\",\n    \"description\": \"eye\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"eye\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👅\",\n    \"description\": \"tongue\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"tongue\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👄\",\n    \"description\": \"mouth\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"lips\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👶\",\n    \"description\": \"baby\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"baby\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧒\",\n    \"description\": \"child\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"child\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👦\",\n    \"description\": \"boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"boy\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👧\",\n    \"description\": \"girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"girl\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑\",\n    \"description\": \"person\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"adult\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👱\",\n    \"description\": \"person: blond hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"blond_haired_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨\",\n    \"description\": \"man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧔\",\n    \"description\": \"man: beard\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bearded_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦰\",\n    \"description\": \"man: red hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"red_haired_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦱\",\n    \"description\": \"man: curly hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"curly_haired_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦳\",\n    \"description\": \"man: white hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"white_haired_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦲\",\n    \"description\": \"man: bald\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bald_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩\",\n    \"description\": \"woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦰\",\n    \"description\": \"woman: red hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"red_haired_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦰\",\n    \"description\": \"person: red hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_red_hair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦱\",\n    \"description\": \"woman: curly hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"curly_haired_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦱\",\n    \"description\": \"person: curly hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_curly_hair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦳\",\n    \"description\": \"woman: white hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"white_haired_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦳\",\n    \"description\": \"person: white hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_white_hair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦲\",\n    \"description\": \"woman: bald\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bald_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦲\",\n    \"description\": \"person: bald\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_bald\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👱‍♀️\",\n    \"description\": \"woman: blond hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"blond_haired_woman\",\n      \"blonde_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👱‍♂️\",\n    \"description\": \"man: blond hair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"blond_haired_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧓\",\n    \"description\": \"older person\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"older_adult\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👴\",\n    \"description\": \"old man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"older_man\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👵\",\n    \"description\": \"old woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"older_woman\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙍\",\n    \"description\": \"person frowning\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"frowning_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙍‍♂️\",\n    \"description\": \"man frowning\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"frowning_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙍‍♀️\",\n    \"description\": \"woman frowning\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"frowning_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙎\",\n    \"description\": \"person pouting\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pouting_face\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙎‍♂️\",\n    \"description\": \"man pouting\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pouting_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙎‍♀️\",\n    \"description\": \"woman pouting\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pouting_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙅\",\n    \"description\": \"person gesturing NO\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"no_good\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙅‍♂️\",\n    \"description\": \"man gesturing NO\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"no_good_man\",\n      \"ng_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙅‍♀️\",\n    \"description\": \"woman gesturing NO\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"no_good_woman\",\n      \"ng_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙆\",\n    \"description\": \"person gesturing OK\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ok_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙆‍♂️\",\n    \"description\": \"man gesturing OK\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ok_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙆‍♀️\",\n    \"description\": \"woman gesturing OK\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"ok_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💁\",\n    \"description\": \"person tipping hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"tipping_hand_person\",\n      \"information_desk_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💁‍♂️\",\n    \"description\": \"man tipping hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"tipping_hand_man\",\n      \"sassy_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💁‍♀️\",\n    \"description\": \"woman tipping hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"tipping_hand_woman\",\n      \"sassy_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙋\",\n    \"description\": \"person raising hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raising_hand\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙋‍♂️\",\n    \"description\": \"man raising hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raising_hand_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙋‍♀️\",\n    \"description\": \"woman raising hand\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"raising_hand_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧏\",\n    \"description\": \"deaf person\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"deaf_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧏‍♂️\",\n    \"description\": \"deaf man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"deaf_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧏‍♀️\",\n    \"description\": \"deaf woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"deaf_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙇\",\n    \"description\": \"person bowing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bow\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙇‍♂️\",\n    \"description\": \"man bowing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bowing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🙇‍♀️\",\n    \"description\": \"woman bowing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bowing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤦\",\n    \"description\": \"person facepalming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"facepalm\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤦‍♂️\",\n    \"description\": \"man facepalming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_facepalming\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤦‍♀️\",\n    \"description\": \"woman facepalming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_facepalming\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤷\",\n    \"description\": \"person shrugging\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"shrug\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤷‍♂️\",\n    \"description\": \"man shrugging\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_shrugging\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤷‍♀️\",\n    \"description\": \"woman shrugging\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_shrugging\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍⚕️\",\n    \"description\": \"health worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"health_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍⚕️\",\n    \"description\": \"man health worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_health_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍⚕️\",\n    \"description\": \"woman health worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_health_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🎓\",\n    \"description\": \"student\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"student\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🎓\",\n    \"description\": \"man student\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_student\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🎓\",\n    \"description\": \"woman student\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_student\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🏫\",\n    \"description\": \"teacher\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"teacher\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🏫\",\n    \"description\": \"man teacher\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_teacher\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🏫\",\n    \"description\": \"woman teacher\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_teacher\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍⚖️\",\n    \"description\": \"judge\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"judge\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍⚖️\",\n    \"description\": \"man judge\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_judge\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍⚖️\",\n    \"description\": \"woman judge\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_judge\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🌾\",\n    \"description\": \"farmer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"farmer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🌾\",\n    \"description\": \"man farmer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_farmer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🌾\",\n    \"description\": \"woman farmer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_farmer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🍳\",\n    \"description\": \"cook\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"cook\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🍳\",\n    \"description\": \"man cook\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_cook\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🍳\",\n    \"description\": \"woman cook\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_cook\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🔧\",\n    \"description\": \"mechanic\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mechanic\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🔧\",\n    \"description\": \"man mechanic\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_mechanic\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🔧\",\n    \"description\": \"woman mechanic\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_mechanic\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🏭\",\n    \"description\": \"factory worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"factory_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🏭\",\n    \"description\": \"man factory worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_factory_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🏭\",\n    \"description\": \"woman factory worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_factory_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍💼\",\n    \"description\": \"office worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"office_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍💼\",\n    \"description\": \"man office worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_office_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍💼\",\n    \"description\": \"woman office worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_office_worker\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🔬\",\n    \"description\": \"scientist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"scientist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🔬\",\n    \"description\": \"man scientist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_scientist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🔬\",\n    \"description\": \"woman scientist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_scientist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍💻\",\n    \"description\": \"technologist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"technologist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍💻\",\n    \"description\": \"man technologist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_technologist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍💻\",\n    \"description\": \"woman technologist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_technologist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🎤\",\n    \"description\": \"singer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"singer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🎤\",\n    \"description\": \"man singer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_singer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🎤\",\n    \"description\": \"woman singer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_singer\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🎨\",\n    \"description\": \"artist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"artist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🎨\",\n    \"description\": \"man artist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_artist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🎨\",\n    \"description\": \"woman artist\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_artist\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍✈️\",\n    \"description\": \"pilot\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pilot\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍✈️\",\n    \"description\": \"man pilot\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_pilot\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍✈️\",\n    \"description\": \"woman pilot\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_pilot\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🚀\",\n    \"description\": \"astronaut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"astronaut\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🚀\",\n    \"description\": \"man astronaut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_astronaut\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🚀\",\n    \"description\": \"woman astronaut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_astronaut\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🚒\",\n    \"description\": \"firefighter\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"firefighter\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🚒\",\n    \"description\": \"man firefighter\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_firefighter\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🚒\",\n    \"description\": \"woman firefighter\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_firefighter\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👮\",\n    \"description\": \"police officer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"police_officer\",\n      \"cop\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👮‍♂️\",\n    \"description\": \"man police officer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"policeman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👮‍♀️\",\n    \"description\": \"woman police officer\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"policewoman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕵️\",\n    \"description\": \"detective\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"detective\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕵️‍♂️\",\n    \"description\": \"man detective\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"male_detective\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕵️‍♀️\",\n    \"description\": \"woman detective\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"female_detective\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💂\",\n    \"description\": \"guard\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"guard\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💂‍♂️\",\n    \"description\": \"man guard\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"guardsman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💂‍♀️\",\n    \"description\": \"woman guard\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"guardswoman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👷\",\n    \"description\": \"construction worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"construction_worker\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👷‍♂️\",\n    \"description\": \"man construction worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"construction_worker_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👷‍♀️\",\n    \"description\": \"woman construction worker\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"construction_worker_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤴\",\n    \"description\": \"prince\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"prince\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👸\",\n    \"description\": \"princess\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"princess\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👳\",\n    \"description\": \"person wearing turban\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_with_turban\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👳‍♂️\",\n    \"description\": \"man wearing turban\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_with_turban\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👳‍♀️\",\n    \"description\": \"woman wearing turban\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_with_turban\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👲\",\n    \"description\": \"person with skullcap\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_with_gua_pi_mao\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧕\",\n    \"description\": \"woman with headscarf\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_with_headscarf\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤵\",\n    \"description\": \"person in tuxedo\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_in_tuxedo\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👰\",\n    \"description\": \"person with veil\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_with_veil\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤰\",\n    \"description\": \"pregnant woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"pregnant_woman\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤱\",\n    \"description\": \"breast-feeding\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"breast_feeding\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👼\",\n    \"description\": \"baby angel\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"angel\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎅\",\n    \"description\": \"Santa Claus\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"santa\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤶\",\n    \"description\": \"Mrs. Claus\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mrs_claus\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🎄\",\n    \"description\": \"mx claus\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mx_claus\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"🦸\",\n    \"description\": \"superhero\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"superhero\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦸‍♂️\",\n    \"description\": \"man superhero\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"superhero_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦸‍♀️\",\n    \"description\": \"woman superhero\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"superhero_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦹\",\n    \"description\": \"supervillain\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"supervillain\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦹‍♂️\",\n    \"description\": \"man supervillain\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"supervillain_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦹‍♀️\",\n    \"description\": \"woman supervillain\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"supervillain_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧙\",\n    \"description\": \"mage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mage\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧙‍♂️\",\n    \"description\": \"man mage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mage_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧙‍♀️\",\n    \"description\": \"woman mage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mage_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧚\",\n    \"description\": \"fairy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fairy\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧚‍♂️\",\n    \"description\": \"man fairy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fairy_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧚‍♀️\",\n    \"description\": \"woman fairy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"fairy_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧛\",\n    \"description\": \"vampire\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"vampire\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧛‍♂️\",\n    \"description\": \"man vampire\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"vampire_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧛‍♀️\",\n    \"description\": \"woman vampire\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"vampire_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧜\",\n    \"description\": \"merperson\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"merperson\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧜‍♂️\",\n    \"description\": \"merman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"merman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧜‍♀️\",\n    \"description\": \"mermaid\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mermaid\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧝\",\n    \"description\": \"elf\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"elf\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧝‍♂️\",\n    \"description\": \"man elf\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"elf_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧝‍♀️\",\n    \"description\": \"woman elf\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"elf_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧞\",\n    \"description\": \"genie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"genie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧞‍♂️\",\n    \"description\": \"man genie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"genie_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧞‍♀️\",\n    \"description\": \"woman genie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"genie_woman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧟\",\n    \"description\": \"zombie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"zombie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧟‍♂️\",\n    \"description\": \"man zombie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"zombie_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧟‍♀️\",\n    \"description\": \"woman zombie\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"zombie_woman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💆\",\n    \"description\": \"person getting massage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"massage\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💆‍♂️\",\n    \"description\": \"man getting massage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"massage_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💆‍♀️\",\n    \"description\": \"woman getting massage\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"massage_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💇\",\n    \"description\": \"person getting haircut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"haircut\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💇‍♂️\",\n    \"description\": \"man getting haircut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"haircut_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💇‍♀️\",\n    \"description\": \"woman getting haircut\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"haircut_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚶\",\n    \"description\": \"person walking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"walking\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚶‍♂️\",\n    \"description\": \"man walking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"walking_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚶‍♀️\",\n    \"description\": \"woman walking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"walking_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧍\",\n    \"description\": \"person standing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"standing_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧍‍♂️\",\n    \"description\": \"man standing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"standing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧍‍♀️\",\n    \"description\": \"woman standing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"standing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧎\",\n    \"description\": \"person kneeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"kneeling_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧎‍♂️\",\n    \"description\": \"man kneeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"kneeling_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧎‍♀️\",\n    \"description\": \"woman kneeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"kneeling_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦯\",\n    \"description\": \"person with white cane\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_with_probing_cane\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦯\",\n    \"description\": \"man with white cane\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_with_probing_cane\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦯\",\n    \"description\": \"woman with white cane\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_with_probing_cane\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦼\",\n    \"description\": \"person in motorized wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_in_motorized_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦼\",\n    \"description\": \"man in motorized wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_in_motorized_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦼\",\n    \"description\": \"woman in motorized wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_in_motorized_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🦽\",\n    \"description\": \"person in manual wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_in_manual_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍🦽\",\n    \"description\": \"man in manual wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_in_manual_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍🦽\",\n    \"description\": \"woman in manual wheelchair\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_in_manual_wheelchair\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏃\",\n    \"description\": \"person running\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"runner\",\n      \"running\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏃‍♂️\",\n    \"description\": \"man running\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"running_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏃‍♀️\",\n    \"description\": \"woman running\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"running_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💃\",\n    \"description\": \"woman dancing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_dancing\",\n      \"dancer\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕺\",\n    \"description\": \"man dancing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_dancing\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕴️\",\n    \"description\": \"person in suit levitating\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"business_suit_levitating\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👯\",\n    \"description\": \"people with bunny ears\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"dancers\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👯‍♂️\",\n    \"description\": \"men with bunny ears\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"dancing_men\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👯‍♀️\",\n    \"description\": \"women with bunny ears\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"dancing_women\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧖\",\n    \"description\": \"person in steamy room\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"sauna_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧖‍♂️\",\n    \"description\": \"man in steamy room\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"sauna_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧖‍♀️\",\n    \"description\": \"woman in steamy room\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"sauna_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧗\",\n    \"description\": \"person climbing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"climbing\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧗‍♂️\",\n    \"description\": \"man climbing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"climbing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧗‍♀️\",\n    \"description\": \"woman climbing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"climbing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤺\",\n    \"description\": \"person fencing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"person_fencing\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏇\",\n    \"description\": \"horse racing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"horse_racing\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛷️\",\n    \"description\": \"skier\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"skier\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏂\",\n    \"description\": \"snowboarder\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"snowboarder\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏌️\",\n    \"description\": \"person golfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"golfing\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏌️‍♂️\",\n    \"description\": \"man golfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"golfing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏌️‍♀️\",\n    \"description\": \"woman golfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"golfing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏄\",\n    \"description\": \"person surfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"surfer\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏄‍♂️\",\n    \"description\": \"man surfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"surfing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏄‍♀️\",\n    \"description\": \"woman surfing\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"surfing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚣\",\n    \"description\": \"person rowing boat\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"rowboat\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚣‍♂️\",\n    \"description\": \"man rowing boat\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"rowing_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚣‍♀️\",\n    \"description\": \"woman rowing boat\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"rowing_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏊\",\n    \"description\": \"person swimming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"swimmer\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏊‍♂️\",\n    \"description\": \"man swimming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"swimming_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏊‍♀️\",\n    \"description\": \"woman swimming\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"swimming_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛹️\",\n    \"description\": \"person bouncing ball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bouncing_ball_person\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛹️‍♂️\",\n    \"description\": \"man bouncing ball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bouncing_ball_man\",\n      \"basketball_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛹️‍♀️\",\n    \"description\": \"woman bouncing ball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bouncing_ball_woman\",\n      \"basketball_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏋️\",\n    \"description\": \"person lifting weights\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"weight_lifting\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏋️‍♂️\",\n    \"description\": \"man lifting weights\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"weight_lifting_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏋️‍♀️\",\n    \"description\": \"woman lifting weights\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"weight_lifting_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚴\",\n    \"description\": \"person biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bicyclist\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚴‍♂️\",\n    \"description\": \"man biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"biking_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚴‍♀️\",\n    \"description\": \"woman biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"biking_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚵\",\n    \"description\": \"person mountain biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mountain_bicyclist\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚵‍♂️\",\n    \"description\": \"man mountain biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mountain_biking_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚵‍♀️\",\n    \"description\": \"woman mountain biking\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"mountain_biking_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤸\",\n    \"description\": \"person cartwheeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"cartwheeling\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤸‍♂️\",\n    \"description\": \"man cartwheeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_cartwheeling\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤸‍♀️\",\n    \"description\": \"woman cartwheeling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_cartwheeling\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤼\",\n    \"description\": \"people wrestling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"wrestling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤼‍♂️\",\n    \"description\": \"men wrestling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"men_wrestling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤼‍♀️\",\n    \"description\": \"women wrestling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"women_wrestling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤽\",\n    \"description\": \"person playing water polo\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"water_polo\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤽‍♂️\",\n    \"description\": \"man playing water polo\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_playing_water_polo\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤽‍♀️\",\n    \"description\": \"woman playing water polo\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_playing_water_polo\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤾\",\n    \"description\": \"person playing handball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"handball_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤾‍♂️\",\n    \"description\": \"man playing handball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_playing_handball\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤾‍♀️\",\n    \"description\": \"woman playing handball\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_playing_handball\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤹\",\n    \"description\": \"person juggling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"juggling_person\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤹‍♂️\",\n    \"description\": \"man juggling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"man_juggling\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤹‍♀️\",\n    \"description\": \"woman juggling\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"woman_juggling\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧘\",\n    \"description\": \"person in lotus position\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"lotus_position\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧘‍♂️\",\n    \"description\": \"man in lotus position\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"lotus_position_man\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧘‍♀️\",\n    \"description\": \"woman in lotus position\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"lotus_position_woman\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛀\",\n    \"description\": \"person taking bath\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bath\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛌\",\n    \"description\": \"person in bed\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"sleeping_bed\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧑‍🤝‍🧑\",\n    \"description\": \"people holding hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"people_holding_hands\"\n    ],\n    \"supportsSkinTone\": false,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👭\",\n    \"description\": \"women holding hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"two_women_holding_hands\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👫\",\n    \"description\": \"woman and man holding hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couple\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👬\",\n    \"description\": \"men holding hands\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"two_men_holding_hands\"\n    ],\n    \"supportsSkinTone\": true,\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💏\",\n    \"description\": \"kiss\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couplekiss\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍❤️‍💋‍👨\",\n    \"description\": \"kiss: woman, man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couplekiss_man_woman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍❤️‍💋‍👨\",\n    \"description\": \"kiss: man, man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couplekiss_man_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍❤️‍💋‍👩\",\n    \"description\": \"kiss: woman, woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couplekiss_woman_woman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💑\",\n    \"description\": \"couple with heart\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couple_with_heart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍❤️‍👨\",\n    \"description\": \"couple with heart: woman, man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couple_with_heart_woman_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍❤️‍👨\",\n    \"description\": \"couple with heart: man, man\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couple_with_heart_man_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍❤️‍👩\",\n    \"description\": \"couple with heart: woman, woman\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"couple_with_heart_woman_woman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👪\",\n    \"description\": \"family\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👩‍👦\",\n    \"description\": \"family: man, woman, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_woman_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👩‍👧\",\n    \"description\": \"family: man, woman, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_woman_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👩‍👧‍👦\",\n    \"description\": \"family: man, woman, girl, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_woman_girl_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👩‍👦‍👦\",\n    \"description\": \"family: man, woman, boy, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_woman_boy_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👩‍👧‍👧\",\n    \"description\": \"family: man, woman, girl, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_woman_girl_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👨‍👦\",\n    \"description\": \"family: man, man, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_man_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👨‍👧\",\n    \"description\": \"family: man, man, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_man_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👨‍👧‍👦\",\n    \"description\": \"family: man, man, girl, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_man_girl_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👨‍👦‍👦\",\n    \"description\": \"family: man, man, boy, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_man_boy_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👨‍👧‍👧\",\n    \"description\": \"family: man, man, girl, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_man_girl_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👩‍👦\",\n    \"description\": \"family: woman, woman, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_woman_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👩‍👧\",\n    \"description\": \"family: woman, woman, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_woman_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👩‍👧‍👦\",\n    \"description\": \"family: woman, woman, girl, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_woman_girl_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👩‍👦‍👦\",\n    \"description\": \"family: woman, woman, boy, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_woman_boy_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👩‍👧‍👧\",\n    \"description\": \"family: woman, woman, girl, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_woman_girl_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👦\",\n    \"description\": \"family: man, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👦‍👦\",\n    \"description\": \"family: man, boy, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_boy_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👧\",\n    \"description\": \"family: man, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👧‍👦\",\n    \"description\": \"family: man, girl, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_girl_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👨‍👧‍👧\",\n    \"description\": \"family: man, girl, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_man_girl_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👦\",\n    \"description\": \"family: woman, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👦‍👦\",\n    \"description\": \"family: woman, boy, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_boy_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👧\",\n    \"description\": \"family: woman, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👧‍👦\",\n    \"description\": \"family: woman, girl, boy\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_girl_boy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👩‍👧‍👧\",\n    \"description\": \"family: woman, girl, girl\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"family_woman_girl_girl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗣️\",\n    \"description\": \"speaking head\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"speaking_head\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👤\",\n    \"description\": \"bust in silhouette\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"bust_in_silhouette\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👥\",\n    \"description\": \"busts in silhouette\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"busts_in_silhouette\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👣\",\n    \"description\": \"footprints\",\n    \"category\": \"People & Body\",\n    \"aliases\": [\n      \"footprints\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐵\",\n    \"description\": \"monkey face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"monkey_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐒\",\n    \"description\": \"monkey\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"monkey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦍\",\n    \"description\": \"gorilla\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"gorilla\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦧\",\n    \"description\": \"orangutan\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"orangutan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐶\",\n    \"description\": \"dog face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐕\",\n    \"description\": \"dog\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dog2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦮\",\n    \"description\": \"guide dog\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"guide_dog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐕‍🦺\",\n    \"description\": \"service dog\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"service_dog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐩\",\n    \"description\": \"poodle\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"poodle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐺\",\n    \"description\": \"wolf\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"wolf\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦊\",\n    \"description\": \"fox\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"fox_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦝\",\n    \"description\": \"raccoon\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"raccoon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐱\",\n    \"description\": \"cat face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐈\",\n    \"description\": \"cat\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cat2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦁\",\n    \"description\": \"lion\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"lion\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐯\",\n    \"description\": \"tiger face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"tiger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐅\",\n    \"description\": \"tiger\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"tiger2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐆\",\n    \"description\": \"leopard\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"leopard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐴\",\n    \"description\": \"horse face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"horse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐎\",\n    \"description\": \"horse\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"racehorse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦄\",\n    \"description\": \"unicorn\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"unicorn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦓\",\n    \"description\": \"zebra\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"zebra\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦌\",\n    \"description\": \"deer\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"deer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐮\",\n    \"description\": \"cow face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐂\",\n    \"description\": \"ox\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"ox\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐃\",\n    \"description\": \"water buffalo\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"water_buffalo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐄\",\n    \"description\": \"cow\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cow2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐷\",\n    \"description\": \"pig face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"pig\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐖\",\n    \"description\": \"pig\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"pig2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐗\",\n    \"description\": \"boar\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"boar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐽\",\n    \"description\": \"pig nose\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"pig_nose\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐏\",\n    \"description\": \"ram\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"ram\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐑\",\n    \"description\": \"ewe\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"sheep\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐐\",\n    \"description\": \"goat\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"goat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐪\",\n    \"description\": \"camel\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dromedary_camel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐫\",\n    \"description\": \"two-hump camel\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"camel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦙\",\n    \"description\": \"llama\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"llama\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦒\",\n    \"description\": \"giraffe\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"giraffe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐘\",\n    \"description\": \"elephant\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"elephant\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦏\",\n    \"description\": \"rhinoceros\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rhinoceros\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦛\",\n    \"description\": \"hippopotamus\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hippopotamus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐭\",\n    \"description\": \"mouse face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"mouse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐁\",\n    \"description\": \"mouse\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"mouse2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐀\",\n    \"description\": \"rat\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐹\",\n    \"description\": \"hamster\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hamster\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐰\",\n    \"description\": \"rabbit face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rabbit\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐇\",\n    \"description\": \"rabbit\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rabbit2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐿️\",\n    \"description\": \"chipmunk\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"chipmunk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦔\",\n    \"description\": \"hedgehog\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hedgehog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦇\",\n    \"description\": \"bat\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐻\",\n    \"description\": \"bear\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bear\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐻‍❄️\",\n    \"description\": \"polar bear\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"polar_bear\"\n    ],\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"🐨\",\n    \"description\": \"koala\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"koala\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐼\",\n    \"description\": \"panda\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"panda_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦥\",\n    \"description\": \"sloth\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"sloth\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦦\",\n    \"description\": \"otter\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"otter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦨\",\n    \"description\": \"skunk\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"skunk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦘\",\n    \"description\": \"kangaroo\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"kangaroo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦡\",\n    \"description\": \"badger\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"badger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐾\",\n    \"description\": \"paw prints\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"feet\",\n      \"paw_prints\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦃\",\n    \"description\": \"turkey\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"turkey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐔\",\n    \"description\": \"chicken\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"chicken\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐓\",\n    \"description\": \"rooster\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rooster\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐣\",\n    \"description\": \"hatching chick\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hatching_chick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐤\",\n    \"description\": \"baby chick\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"baby_chick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐥\",\n    \"description\": \"front-facing baby chick\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hatched_chick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐦\",\n    \"description\": \"bird\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bird\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐧\",\n    \"description\": \"penguin\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"penguin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕊️\",\n    \"description\": \"dove\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dove\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦅\",\n    \"description\": \"eagle\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"eagle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦆\",\n    \"description\": \"duck\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"duck\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦢\",\n    \"description\": \"swan\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"swan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦉\",\n    \"description\": \"owl\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"owl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦩\",\n    \"description\": \"flamingo\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"flamingo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦚\",\n    \"description\": \"peacock\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"peacock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦜\",\n    \"description\": \"parrot\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"parrot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐸\",\n    \"description\": \"frog\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"frog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐊\",\n    \"description\": \"crocodile\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"crocodile\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐢\",\n    \"description\": \"turtle\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"turtle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦎\",\n    \"description\": \"lizard\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"lizard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐍\",\n    \"description\": \"snake\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"snake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐲\",\n    \"description\": \"dragon face\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dragon_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐉\",\n    \"description\": \"dragon\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dragon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦕\",\n    \"description\": \"sauropod\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"sauropod\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦖\",\n    \"description\": \"T-Rex\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"t-rex\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐳\",\n    \"description\": \"spouting whale\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"whale\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐋\",\n    \"description\": \"whale\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"whale2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐬\",\n    \"description\": \"dolphin\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"dolphin\",\n      \"flipper\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐟\",\n    \"description\": \"fish\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"fish\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐠\",\n    \"description\": \"tropical fish\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"tropical_fish\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐡\",\n    \"description\": \"blowfish\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"blowfish\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦈\",\n    \"description\": \"shark\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"shark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐙\",\n    \"description\": \"octopus\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"octopus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐚\",\n    \"description\": \"spiral shell\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"shell\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐌\",\n    \"description\": \"snail\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"snail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦋\",\n    \"description\": \"butterfly\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"butterfly\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐛\",\n    \"description\": \"bug\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bug\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐜\",\n    \"description\": \"ant\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"ant\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐝\",\n    \"description\": \"honeybee\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bee\",\n      \"honeybee\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🐞\",\n    \"description\": \"lady beetle\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"lady_beetle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦗\",\n    \"description\": \"cricket\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cricket\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕷️\",\n    \"description\": \"spider\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"spider\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕸️\",\n    \"description\": \"spider web\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"spider_web\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦂\",\n    \"description\": \"scorpion\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"scorpion\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦟\",\n    \"description\": \"mosquito\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"mosquito\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦠\",\n    \"description\": \"microbe\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"microbe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💐\",\n    \"description\": \"bouquet\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"bouquet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌸\",\n    \"description\": \"cherry blossom\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cherry_blossom\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💮\",\n    \"description\": \"white flower\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"white_flower\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏵️\",\n    \"description\": \"rosette\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rosette\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌹\",\n    \"description\": \"rose\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"rose\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥀\",\n    \"description\": \"wilted flower\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"wilted_flower\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌺\",\n    \"description\": \"hibiscus\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"hibiscus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌻\",\n    \"description\": \"sunflower\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"sunflower\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌼\",\n    \"description\": \"blossom\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"blossom\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌷\",\n    \"description\": \"tulip\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"tulip\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌱\",\n    \"description\": \"seedling\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"seedling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌲\",\n    \"description\": \"evergreen tree\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"evergreen_tree\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌳\",\n    \"description\": \"deciduous tree\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"deciduous_tree\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌴\",\n    \"description\": \"palm tree\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"palm_tree\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌵\",\n    \"description\": \"cactus\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"cactus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌾\",\n    \"description\": \"sheaf of rice\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"ear_of_rice\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌿\",\n    \"description\": \"herb\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"herb\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☘️\",\n    \"description\": \"shamrock\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"shamrock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍀\",\n    \"description\": \"four leaf clover\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"four_leaf_clover\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍁\",\n    \"description\": \"maple leaf\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"maple_leaf\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍂\",\n    \"description\": \"fallen leaf\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"fallen_leaf\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍃\",\n    \"description\": \"leaf fluttering in wind\",\n    \"category\": \"Animals & Nature\",\n    \"aliases\": [\n      \"leaves\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍇\",\n    \"description\": \"grapes\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"grapes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍈\",\n    \"description\": \"melon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"melon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍉\",\n    \"description\": \"watermelon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"watermelon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍊\",\n    \"description\": \"tangerine\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"tangerine\",\n      \"orange\",\n      \"mandarin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍋\",\n    \"description\": \"lemon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"lemon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍌\",\n    \"description\": \"banana\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"banana\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍍\",\n    \"description\": \"pineapple\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pineapple\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥭\",\n    \"description\": \"mango\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"mango\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍎\",\n    \"description\": \"red apple\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"apple\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍏\",\n    \"description\": \"green apple\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"green_apple\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍐\",\n    \"description\": \"pear\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pear\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍑\",\n    \"description\": \"peach\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"peach\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍒\",\n    \"description\": \"cherries\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cherries\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍓\",\n    \"description\": \"strawberry\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"strawberry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥝\",\n    \"description\": \"kiwi fruit\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"kiwi_fruit\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍅\",\n    \"description\": \"tomato\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"tomato\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥥\",\n    \"description\": \"coconut\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"coconut\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥑\",\n    \"description\": \"avocado\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"avocado\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍆\",\n    \"description\": \"eggplant\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"eggplant\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥔\",\n    \"description\": \"potato\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"potato\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥕\",\n    \"description\": \"carrot\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"carrot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌽\",\n    \"description\": \"ear of corn\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"corn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌶️\",\n    \"description\": \"hot pepper\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"hot_pepper\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥒\",\n    \"description\": \"cucumber\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cucumber\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥬\",\n    \"description\": \"leafy green\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"leafy_green\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥦\",\n    \"description\": \"broccoli\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"broccoli\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧄\",\n    \"description\": \"garlic\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"garlic\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧅\",\n    \"description\": \"onion\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"onion\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍄\",\n    \"description\": \"mushroom\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"mushroom\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥜\",\n    \"description\": \"peanuts\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"peanuts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌰\",\n    \"description\": \"chestnut\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"chestnut\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍞\",\n    \"description\": \"bread\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"bread\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥐\",\n    \"description\": \"croissant\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"croissant\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥖\",\n    \"description\": \"baguette bread\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"baguette_bread\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥨\",\n    \"description\": \"pretzel\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pretzel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥯\",\n    \"description\": \"bagel\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"bagel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥞\",\n    \"description\": \"pancakes\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pancakes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧇\",\n    \"description\": \"waffle\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"waffle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧀\",\n    \"description\": \"cheese wedge\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cheese\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍖\",\n    \"description\": \"meat on bone\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"meat_on_bone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍗\",\n    \"description\": \"poultry leg\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"poultry_leg\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥩\",\n    \"description\": \"cut of meat\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cut_of_meat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥓\",\n    \"description\": \"bacon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"bacon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍔\",\n    \"description\": \"hamburger\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"hamburger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍟\",\n    \"description\": \"french fries\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fries\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍕\",\n    \"description\": \"pizza\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pizza\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌭\",\n    \"description\": \"hot dog\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"hotdog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥪\",\n    \"description\": \"sandwich\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"sandwich\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌮\",\n    \"description\": \"taco\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"taco\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌯\",\n    \"description\": \"burrito\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"burrito\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥙\",\n    \"description\": \"stuffed flatbread\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"stuffed_flatbread\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧆\",\n    \"description\": \"falafel\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"falafel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥚\",\n    \"description\": \"egg\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"egg\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍳\",\n    \"description\": \"cooking\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fried_egg\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥘\",\n    \"description\": \"shallow pan of food\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"shallow_pan_of_food\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍲\",\n    \"description\": \"pot of food\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"stew\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥣\",\n    \"description\": \"bowl with spoon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"bowl_with_spoon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥗\",\n    \"description\": \"green salad\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"green_salad\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍿\",\n    \"description\": \"popcorn\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"popcorn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧈\",\n    \"description\": \"butter\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"butter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧂\",\n    \"description\": \"salt\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"salt\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥫\",\n    \"description\": \"canned food\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"canned_food\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍱\",\n    \"description\": \"bento box\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"bento\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍘\",\n    \"description\": \"rice cracker\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"rice_cracker\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍙\",\n    \"description\": \"rice ball\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"rice_ball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍚\",\n    \"description\": \"cooked rice\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"rice\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍛\",\n    \"description\": \"curry rice\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"curry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍜\",\n    \"description\": \"steaming bowl\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"ramen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍝\",\n    \"description\": \"spaghetti\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"spaghetti\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍠\",\n    \"description\": \"roasted sweet potato\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"sweet_potato\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍢\",\n    \"description\": \"oden\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"oden\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍣\",\n    \"description\": \"sushi\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"sushi\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍤\",\n    \"description\": \"fried shrimp\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fried_shrimp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍥\",\n    \"description\": \"fish cake with swirl\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fish_cake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥮\",\n    \"description\": \"moon cake\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"moon_cake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍡\",\n    \"description\": \"dango\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"dango\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥟\",\n    \"description\": \"dumpling\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"dumpling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥠\",\n    \"description\": \"fortune cookie\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fortune_cookie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥡\",\n    \"description\": \"takeout box\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"takeout_box\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦀\",\n    \"description\": \"crab\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"crab\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦞\",\n    \"description\": \"lobster\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"lobster\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦐\",\n    \"description\": \"shrimp\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"shrimp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦑\",\n    \"description\": \"squid\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"squid\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦪\",\n    \"description\": \"oyster\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"oyster\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍦\",\n    \"description\": \"soft ice cream\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"icecream\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍧\",\n    \"description\": \"shaved ice\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"shaved_ice\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍨\",\n    \"description\": \"ice cream\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"ice_cream\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍩\",\n    \"description\": \"doughnut\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"doughnut\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍪\",\n    \"description\": \"cookie\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cookie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎂\",\n    \"description\": \"birthday cake\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"birthday\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍰\",\n    \"description\": \"shortcake\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧁\",\n    \"description\": \"cupcake\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cupcake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥧\",\n    \"description\": \"pie\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"pie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍫\",\n    \"description\": \"chocolate bar\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"chocolate_bar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍬\",\n    \"description\": \"candy\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"candy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍭\",\n    \"description\": \"lollipop\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"lollipop\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍮\",\n    \"description\": \"custard\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"custard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍯\",\n    \"description\": \"honey pot\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"honey_pot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍼\",\n    \"description\": \"baby bottle\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"baby_bottle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥛\",\n    \"description\": \"glass of milk\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"milk_glass\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☕\",\n    \"description\": \"hot beverage\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"coffee\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍵\",\n    \"description\": \"teacup without handle\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"tea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍶\",\n    \"description\": \"sake\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"sake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍾\",\n    \"description\": \"bottle with popping cork\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"champagne\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍷\",\n    \"description\": \"wine glass\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"wine_glass\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍸\",\n    \"description\": \"cocktail glass\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cocktail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍹\",\n    \"description\": \"tropical drink\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"tropical_drink\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍺\",\n    \"description\": \"beer mug\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"beer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍻\",\n    \"description\": \"clinking beer mugs\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"beers\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥂\",\n    \"description\": \"clinking glasses\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"clinking_glasses\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥃\",\n    \"description\": \"tumbler glass\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"tumbler_glass\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥤\",\n    \"description\": \"cup with straw\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"cup_with_straw\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧃\",\n    \"description\": \"beverage box\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"beverage_box\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧉\",\n    \"description\": \"mate\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"mate\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧊\",\n    \"description\": \"ice\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"ice_cube\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥢\",\n    \"description\": \"chopsticks\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"chopsticks\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍽️\",\n    \"description\": \"fork and knife with plate\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"plate_with_cutlery\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🍴\",\n    \"description\": \"fork and knife\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"fork_and_knife\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥄\",\n    \"description\": \"spoon\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"spoon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔪\",\n    \"description\": \"kitchen knife\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"hocho\",\n      \"knife\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏺\",\n    \"description\": \"amphora\",\n    \"category\": \"Food & Drink\",\n    \"aliases\": [\n      \"amphora\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌍\",\n    \"description\": \"globe showing Europe-Africa\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"earth_africa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌎\",\n    \"description\": \"globe showing Americas\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"earth_americas\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌏\",\n    \"description\": \"globe showing Asia-Australia\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"earth_asia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌐\",\n    \"description\": \"globe with meridians\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"globe_with_meridians\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗺️\",\n    \"description\": \"world map\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"world_map\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗾\",\n    \"description\": \"map of Japan\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"japan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧭\",\n    \"description\": \"compass\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"compass\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏔️\",\n    \"description\": \"snow-capped mountain\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mountain_snow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛰️\",\n    \"description\": \"mountain\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mountain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌋\",\n    \"description\": \"volcano\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"volcano\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗻\",\n    \"description\": \"mount fuji\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mount_fuji\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏕️\",\n    \"description\": \"camping\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"camping\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏖️\",\n    \"description\": \"beach with umbrella\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"beach_umbrella\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏜️\",\n    \"description\": \"desert\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"desert\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏝️\",\n    \"description\": \"desert island\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"desert_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏞️\",\n    \"description\": \"national park\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"national_park\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏟️\",\n    \"description\": \"stadium\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"stadium\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏛️\",\n    \"description\": \"classical building\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"classical_building\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏗️\",\n    \"description\": \"building construction\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"building_construction\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧱\",\n    \"description\": \"brick\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bricks\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏘️\",\n    \"description\": \"houses\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"houses\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏚️\",\n    \"description\": \"derelict house\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"derelict_house\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏠\",\n    \"description\": \"house\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"house\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏡\",\n    \"description\": \"house with garden\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"house_with_garden\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏢\",\n    \"description\": \"office building\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"office\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏣\",\n    \"description\": \"Japanese post office\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"post_office\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏤\",\n    \"description\": \"post office\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"european_post_office\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏥\",\n    \"description\": \"hospital\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hospital\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏦\",\n    \"description\": \"bank\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bank\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏨\",\n    \"description\": \"hotel\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hotel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏩\",\n    \"description\": \"love hotel\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"love_hotel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏪\",\n    \"description\": \"convenience store\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"convenience_store\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏫\",\n    \"description\": \"school\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"school\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏬\",\n    \"description\": \"department store\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"department_store\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏭\",\n    \"description\": \"factory\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"factory\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏯\",\n    \"description\": \"Japanese castle\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"japanese_castle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏰\",\n    \"description\": \"castle\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"european_castle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💒\",\n    \"description\": \"wedding\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"wedding\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗼\",\n    \"description\": \"Tokyo tower\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"tokyo_tower\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗽\",\n    \"description\": \"Statue of Liberty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"statue_of_liberty\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛪\",\n    \"description\": \"church\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"church\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕌\",\n    \"description\": \"mosque\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mosque\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛕\",\n    \"description\": \"hindu temple\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hindu_temple\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕍\",\n    \"description\": \"synagogue\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"synagogue\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛩️\",\n    \"description\": \"shinto shrine\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"shinto_shrine\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕋\",\n    \"description\": \"kaaba\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"kaaba\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛲\",\n    \"description\": \"fountain\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"fountain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛺\",\n    \"description\": \"tent\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"tent\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌁\",\n    \"description\": \"foggy\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"foggy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌃\",\n    \"description\": \"night with stars\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"night_with_stars\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏙️\",\n    \"description\": \"cityscape\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cityscape\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌄\",\n    \"description\": \"sunrise over mountains\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sunrise_over_mountains\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌅\",\n    \"description\": \"sunrise\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sunrise\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌆\",\n    \"description\": \"cityscape at dusk\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"city_sunset\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌇\",\n    \"description\": \"sunset\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"city_sunrise\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌉\",\n    \"description\": \"bridge at night\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bridge_at_night\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♨️\",\n    \"description\": \"hot springs\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hotsprings\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎠\",\n    \"description\": \"carousel horse\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"carousel_horse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎡\",\n    \"description\": \"ferris wheel\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ferris_wheel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎢\",\n    \"description\": \"roller coaster\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"roller_coaster\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💈\",\n    \"description\": \"barber pole\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"barber\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎪\",\n    \"description\": \"circus tent\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"circus_tent\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚂\",\n    \"description\": \"locomotive\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"steam_locomotive\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚃\",\n    \"description\": \"railway car\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"railway_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚄\",\n    \"description\": \"high-speed train\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bullettrain_side\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚅\",\n    \"description\": \"bullet train\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bullettrain_front\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚆\",\n    \"description\": \"train\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"train2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚇\",\n    \"description\": \"metro\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"metro\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚈\",\n    \"description\": \"light rail\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"light_rail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚉\",\n    \"description\": \"station\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"station\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚊\",\n    \"description\": \"tram\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"tram\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚝\",\n    \"description\": \"monorail\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"monorail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚞\",\n    \"description\": \"mountain railway\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mountain_railway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚋\",\n    \"description\": \"tram car\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"train\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚌\",\n    \"description\": \"bus\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚍\",\n    \"description\": \"oncoming bus\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"oncoming_bus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚎\",\n    \"description\": \"trolleybus\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"trolleybus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚐\",\n    \"description\": \"minibus\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"minibus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚑\",\n    \"description\": \"ambulance\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ambulance\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚒\",\n    \"description\": \"fire engine\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"fire_engine\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚓\",\n    \"description\": \"police car\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"police_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚔\",\n    \"description\": \"oncoming police car\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"oncoming_police_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚕\",\n    \"description\": \"taxi\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"taxi\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚖\",\n    \"description\": \"oncoming taxi\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"oncoming_taxi\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚗\",\n    \"description\": \"automobile\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"car\",\n      \"red_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚘\",\n    \"description\": \"oncoming automobile\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"oncoming_automobile\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚙\",\n    \"description\": \"sport utility vehicle\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"blue_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚚\",\n    \"description\": \"delivery truck\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"truck\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚛\",\n    \"description\": \"articulated lorry\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"articulated_lorry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚜\",\n    \"description\": \"tractor\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"tractor\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏎️\",\n    \"description\": \"racing car\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"racing_car\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏍️\",\n    \"description\": \"motorcycle\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"motorcycle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛵\",\n    \"description\": \"motor scooter\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"motor_scooter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦽\",\n    \"description\": \"manual wheelchair\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"manual_wheelchair\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦼\",\n    \"description\": \"motorized wheelchair\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"motorized_wheelchair\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛺\",\n    \"description\": \"auto rickshaw\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"auto_rickshaw\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚲\",\n    \"description\": \"bicycle\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bike\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛴\",\n    \"description\": \"kick scooter\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"kick_scooter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛹\",\n    \"description\": \"skateboard\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"skateboard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚏\",\n    \"description\": \"bus stop\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"busstop\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛣️\",\n    \"description\": \"motorway\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"motorway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛤️\",\n    \"description\": \"railway track\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"railway_track\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛢️\",\n    \"description\": \"oil drum\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"oil_drum\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛽\",\n    \"description\": \"fuel pump\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"fuelpump\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚨\",\n    \"description\": \"police car light\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"rotating_light\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚥\",\n    \"description\": \"horizontal traffic light\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"traffic_light\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚦\",\n    \"description\": \"vertical traffic light\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"vertical_traffic_light\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛑\",\n    \"description\": \"stop sign\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"stop_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚧\",\n    \"description\": \"construction\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"construction\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚓\",\n    \"description\": \"anchor\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"anchor\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛵\",\n    \"description\": \"sailboat\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"boat\",\n      \"sailboat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛶\",\n    \"description\": \"canoe\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"canoe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚤\",\n    \"description\": \"speedboat\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"speedboat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛳️\",\n    \"description\": \"passenger ship\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"passenger_ship\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛴️\",\n    \"description\": \"ferry\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ferry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛥️\",\n    \"description\": \"motor boat\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"motor_boat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚢\",\n    \"description\": \"ship\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ship\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✈️\",\n    \"description\": \"airplane\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"airplane\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛩️\",\n    \"description\": \"small airplane\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"small_airplane\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛫\",\n    \"description\": \"airplane departure\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"flight_departure\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛬\",\n    \"description\": \"airplane arrival\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"flight_arrival\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪂\",\n    \"description\": \"parachute\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"parachute\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💺\",\n    \"description\": \"seat\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"seat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚁\",\n    \"description\": \"helicopter\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"helicopter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚟\",\n    \"description\": \"suspension railway\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"suspension_railway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚠\",\n    \"description\": \"mountain cableway\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mountain_cableway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚡\",\n    \"description\": \"aerial tramway\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"aerial_tramway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛰️\",\n    \"description\": \"satellite\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"artificial_satellite\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚀\",\n    \"description\": \"rocket\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"rocket\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛸\",\n    \"description\": \"flying saucer\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"flying_saucer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛎️\",\n    \"description\": \"bellhop bell\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"bellhop_bell\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧳\",\n    \"description\": \"luggage\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"luggage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⌛\",\n    \"description\": \"hourglass done\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hourglass\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏳\",\n    \"description\": \"hourglass not done\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"hourglass_flowing_sand\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⌚\",\n    \"description\": \"watch\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"watch\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏰\",\n    \"description\": \"alarm clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"alarm_clock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏱️\",\n    \"description\": \"stopwatch\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"stopwatch\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏲️\",\n    \"description\": \"timer clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"timer_clock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕰️\",\n    \"description\": \"mantelpiece clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"mantelpiece_clock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕛\",\n    \"description\": \"twelve o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock12\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕧\",\n    \"description\": \"twelve-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock1230\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕐\",\n    \"description\": \"one o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock1\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕜\",\n    \"description\": \"one-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock130\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕑\",\n    \"description\": \"two o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕝\",\n    \"description\": \"two-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock230\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕒\",\n    \"description\": \"three o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock3\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕞\",\n    \"description\": \"three-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock330\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕓\",\n    \"description\": \"four o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock4\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕟\",\n    \"description\": \"four-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock430\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕔\",\n    \"description\": \"five o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock5\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕠\",\n    \"description\": \"five-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock530\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕕\",\n    \"description\": \"six o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock6\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕡\",\n    \"description\": \"six-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock630\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕖\",\n    \"description\": \"seven o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock7\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕢\",\n    \"description\": \"seven-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock730\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕗\",\n    \"description\": \"eight o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock8\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕣\",\n    \"description\": \"eight-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock830\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕘\",\n    \"description\": \"nine o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock9\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕤\",\n    \"description\": \"nine-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock930\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕙\",\n    \"description\": \"ten o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock10\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕥\",\n    \"description\": \"ten-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock1030\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕚\",\n    \"description\": \"eleven o’clock\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock11\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕦\",\n    \"description\": \"eleven-thirty\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"clock1130\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌑\",\n    \"description\": \"new moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"new_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌒\",\n    \"description\": \"waxing crescent moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"waxing_crescent_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌓\",\n    \"description\": \"first quarter moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"first_quarter_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌔\",\n    \"description\": \"waxing gibbous moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"moon\",\n      \"waxing_gibbous_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌕\",\n    \"description\": \"full moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"full_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌖\",\n    \"description\": \"waning gibbous moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"waning_gibbous_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌗\",\n    \"description\": \"last quarter moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"last_quarter_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌘\",\n    \"description\": \"waning crescent moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"waning_crescent_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌙\",\n    \"description\": \"crescent moon\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"crescent_moon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌚\",\n    \"description\": \"new moon face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"new_moon_with_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌛\",\n    \"description\": \"first quarter moon face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"first_quarter_moon_with_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌜\",\n    \"description\": \"last quarter moon face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"last_quarter_moon_with_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌡️\",\n    \"description\": \"thermometer\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"thermometer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☀️\",\n    \"description\": \"sun\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sunny\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌝\",\n    \"description\": \"full moon face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"full_moon_with_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌞\",\n    \"description\": \"sun with face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sun_with_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪐\",\n    \"description\": \"ringed planet\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ringed_planet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⭐\",\n    \"description\": \"star\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"star\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌟\",\n    \"description\": \"glowing star\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"star2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌠\",\n    \"description\": \"shooting star\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"stars\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌌\",\n    \"description\": \"milky way\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"milky_way\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☁️\",\n    \"description\": \"cloud\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cloud\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛅\",\n    \"description\": \"sun behind cloud\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"partly_sunny\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛈️\",\n    \"description\": \"cloud with lightning and rain\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cloud_with_lightning_and_rain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌤️\",\n    \"description\": \"sun behind small cloud\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sun_behind_small_cloud\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌥️\",\n    \"description\": \"sun behind large cloud\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sun_behind_large_cloud\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌦️\",\n    \"description\": \"sun behind rain cloud\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"sun_behind_rain_cloud\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌧️\",\n    \"description\": \"cloud with rain\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cloud_with_rain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌨️\",\n    \"description\": \"cloud with snow\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cloud_with_snow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌩️\",\n    \"description\": \"cloud with lightning\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cloud_with_lightning\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌪️\",\n    \"description\": \"tornado\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"tornado\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌫️\",\n    \"description\": \"fog\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"fog\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌬️\",\n    \"description\": \"wind face\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"wind_face\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌀\",\n    \"description\": \"cyclone\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"cyclone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌈\",\n    \"description\": \"rainbow\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"rainbow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌂\",\n    \"description\": \"closed umbrella\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"closed_umbrella\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☂️\",\n    \"description\": \"umbrella\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"open_umbrella\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☔\",\n    \"description\": \"umbrella with rain drops\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"umbrella\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛱️\",\n    \"description\": \"umbrella on ground\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"parasol_on_ground\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚡\",\n    \"description\": \"high voltage\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"zap\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❄️\",\n    \"description\": \"snowflake\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"snowflake\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☃️\",\n    \"description\": \"snowman\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"snowman_with_snow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛄\",\n    \"description\": \"snowman without snow\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"snowman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☄️\",\n    \"description\": \"comet\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"comet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔥\",\n    \"description\": \"fire\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"fire\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💧\",\n    \"description\": \"droplet\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"droplet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🌊\",\n    \"description\": \"water wave\",\n    \"category\": \"Travel & Places\",\n    \"aliases\": [\n      \"ocean\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎃\",\n    \"description\": \"jack-o-lantern\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"jack_o_lantern\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎄\",\n    \"description\": \"Christmas tree\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"christmas_tree\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎆\",\n    \"description\": \"fireworks\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"fireworks\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎇\",\n    \"description\": \"sparkler\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"sparkler\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧨\",\n    \"description\": \"firecracker\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"firecracker\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✨\",\n    \"description\": \"sparkles\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"sparkles\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎈\",\n    \"description\": \"balloon\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"balloon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎉\",\n    \"description\": \"party popper\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"tada\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎊\",\n    \"description\": \"confetti ball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"confetti_ball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎋\",\n    \"description\": \"tanabata tree\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"tanabata_tree\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎍\",\n    \"description\": \"pine decoration\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"bamboo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎎\",\n    \"description\": \"Japanese dolls\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"dolls\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎏\",\n    \"description\": \"carp streamer\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"flags\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎐\",\n    \"description\": \"wind chime\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"wind_chime\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎑\",\n    \"description\": \"moon viewing ceremony\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"rice_scene\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧧\",\n    \"description\": \"red envelope\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"red_envelope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎀\",\n    \"description\": \"ribbon\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ribbon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎁\",\n    \"description\": \"wrapped gift\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"gift\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎗️\",\n    \"description\": \"reminder ribbon\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"reminder_ribbon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎟️\",\n    \"description\": \"admission tickets\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"tickets\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎫\",\n    \"description\": \"ticket\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ticket\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎖️\",\n    \"description\": \"military medal\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"medal_military\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏆\",\n    \"description\": \"trophy\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"trophy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏅\",\n    \"description\": \"sports medal\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"medal_sports\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥇\",\n    \"description\": \"1st place medal\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"1st_place_medal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥈\",\n    \"description\": \"2nd place medal\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"2nd_place_medal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥉\",\n    \"description\": \"3rd place medal\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"3rd_place_medal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚽\",\n    \"description\": \"soccer ball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"soccer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚾\",\n    \"description\": \"baseball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"baseball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥎\",\n    \"description\": \"softball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"softball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏀\",\n    \"description\": \"basketball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"basketball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏐\",\n    \"description\": \"volleyball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"volleyball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏈\",\n    \"description\": \"american football\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"football\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏉\",\n    \"description\": \"rugby football\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"rugby_football\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎾\",\n    \"description\": \"tennis\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"tennis\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥏\",\n    \"description\": \"flying disc\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"flying_disc\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎳\",\n    \"description\": \"bowling\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"bowling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏏\",\n    \"description\": \"cricket game\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"cricket_game\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏑\",\n    \"description\": \"field hockey\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"field_hockey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏒\",\n    \"description\": \"ice hockey\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ice_hockey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥍\",\n    \"description\": \"lacrosse\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"lacrosse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏓\",\n    \"description\": \"ping pong\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ping_pong\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏸\",\n    \"description\": \"badminton\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"badminton\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥊\",\n    \"description\": \"boxing glove\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"boxing_glove\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥋\",\n    \"description\": \"martial arts uniform\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"martial_arts_uniform\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥅\",\n    \"description\": \"goal net\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"goal_net\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛳\",\n    \"description\": \"flag in hole\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"golf\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛸️\",\n    \"description\": \"ice skate\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ice_skate\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎣\",\n    \"description\": \"fishing pole\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"fishing_pole_and_fish\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🤿\",\n    \"description\": \"diving mask\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"diving_mask\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎽\",\n    \"description\": \"running shirt\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"running_shirt_with_sash\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎿\",\n    \"description\": \"skis\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"ski\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛷\",\n    \"description\": \"sled\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"sled\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥌\",\n    \"description\": \"curling stone\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"curling_stone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎯\",\n    \"description\": \"direct hit\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"dart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪀\",\n    \"description\": \"yo-yo\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"yo_yo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪁\",\n    \"description\": \"kite\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"kite\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎱\",\n    \"description\": \"pool 8 ball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"8ball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔮\",\n    \"description\": \"crystal ball\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"crystal_ball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧿\",\n    \"description\": \"nazar amulet\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"nazar_amulet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎮\",\n    \"description\": \"video game\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"video_game\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕹️\",\n    \"description\": \"joystick\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"joystick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎰\",\n    \"description\": \"slot machine\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"slot_machine\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎲\",\n    \"description\": \"game die\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"game_die\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧩\",\n    \"description\": \"puzzle piece\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"jigsaw\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧸\",\n    \"description\": \"teddy bear\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"teddy_bear\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪅\",\n    \"description\": \"piñata\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"pinata\"\n    ],\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"♠️\",\n    \"description\": \"spade suit\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"spades\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♥️\",\n    \"description\": \"heart suit\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"hearts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♦️\",\n    \"description\": \"diamond suit\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"diamonds\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♣️\",\n    \"description\": \"club suit\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"clubs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♟️\",\n    \"description\": \"chess pawn\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"chess_pawn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🃏\",\n    \"description\": \"joker\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"black_joker\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🀄\",\n    \"description\": \"mahjong red dragon\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"mahjong\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎴\",\n    \"description\": \"flower playing cards\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"flower_playing_cards\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎭\",\n    \"description\": \"performing arts\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"performing_arts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖼️\",\n    \"description\": \"framed picture\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"framed_picture\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎨\",\n    \"description\": \"artist palette\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"art\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧵\",\n    \"description\": \"thread\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"thread\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧶\",\n    \"description\": \"yarn\",\n    \"category\": \"Activities\",\n    \"aliases\": [\n      \"yarn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👓\",\n    \"description\": \"glasses\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"eyeglasses\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕶️\",\n    \"description\": \"sunglasses\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dark_sunglasses\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥽\",\n    \"description\": \"goggles\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"goggles\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥼\",\n    \"description\": \"lab coat\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"lab_coat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦺\",\n    \"description\": \"safety vest\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"safety_vest\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👔\",\n    \"description\": \"necktie\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"necktie\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👕\",\n    \"description\": \"t-shirt\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shirt\",\n      \"tshirt\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👖\",\n    \"description\": \"jeans\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"jeans\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧣\",\n    \"description\": \"scarf\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"scarf\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧤\",\n    \"description\": \"gloves\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"gloves\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧥\",\n    \"description\": \"coat\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"coat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧦\",\n    \"description\": \"socks\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"socks\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👗\",\n    \"description\": \"dress\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dress\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👘\",\n    \"description\": \"kimono\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"kimono\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥻\",\n    \"description\": \"sari\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"sari\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩱\",\n    \"description\": \"one-piece swimsuit\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"one_piece_swimsuit\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩲\",\n    \"description\": \"briefs\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"swim_brief\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩳\",\n    \"description\": \"shorts\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shorts\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👙\",\n    \"description\": \"bikini\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bikini\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👚\",\n    \"description\": \"woman’s clothes\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"womans_clothes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👛\",\n    \"description\": \"purse\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"purse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👜\",\n    \"description\": \"handbag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"handbag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👝\",\n    \"description\": \"clutch bag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pouch\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛍️\",\n    \"description\": \"shopping bags\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shopping\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎒\",\n    \"description\": \"backpack\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"school_satchel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👞\",\n    \"description\": \"man’s shoe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mans_shoe\",\n      \"shoe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👟\",\n    \"description\": \"running shoe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"athletic_shoe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥾\",\n    \"description\": \"hiking boot\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"hiking_boot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥿\",\n    \"description\": \"flat shoe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"flat_shoe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👠\",\n    \"description\": \"high-heeled shoe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"high_heel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👡\",\n    \"description\": \"woman’s sandal\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"sandal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩰\",\n    \"description\": \"ballet shoes\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"ballet_shoes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👢\",\n    \"description\": \"woman’s boot\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"boot\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👑\",\n    \"description\": \"crown\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"crown\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"👒\",\n    \"description\": \"woman’s hat\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"womans_hat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎩\",\n    \"description\": \"top hat\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"tophat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎓\",\n    \"description\": \"graduation cap\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mortar_board\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧢\",\n    \"description\": \"billed cap\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"billed_cap\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛑️\",\n    \"description\": \"rescue worker’s helmet\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"rescue_worker_helmet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📿\",\n    \"description\": \"prayer beads\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"prayer_beads\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💄\",\n    \"description\": \"lipstick\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"lipstick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💍\",\n    \"description\": \"ring\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"ring\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💎\",\n    \"description\": \"gem stone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"gem\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔇\",\n    \"description\": \"muted speaker\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mute\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔈\",\n    \"description\": \"speaker low volume\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"speaker\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔉\",\n    \"description\": \"speaker medium volume\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"sound\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔊\",\n    \"description\": \"speaker high volume\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"loud_sound\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📢\",\n    \"description\": \"loudspeaker\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"loudspeaker\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📣\",\n    \"description\": \"megaphone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mega\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📯\",\n    \"description\": \"postal horn\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"postal_horn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔔\",\n    \"description\": \"bell\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bell\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔕\",\n    \"description\": \"bell with slash\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"no_bell\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎼\",\n    \"description\": \"musical score\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"musical_score\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎵\",\n    \"description\": \"musical note\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"musical_note\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎶\",\n    \"description\": \"musical notes\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"notes\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎙️\",\n    \"description\": \"studio microphone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"studio_microphone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎚️\",\n    \"description\": \"level slider\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"level_slider\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎛️\",\n    \"description\": \"control knobs\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"control_knobs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎤\",\n    \"description\": \"microphone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"microphone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎧\",\n    \"description\": \"headphone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"headphones\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📻\",\n    \"description\": \"radio\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"radio\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎷\",\n    \"description\": \"saxophone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"saxophone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎸\",\n    \"description\": \"guitar\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"guitar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎹\",\n    \"description\": \"musical keyboard\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"musical_keyboard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎺\",\n    \"description\": \"trumpet\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"trumpet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎻\",\n    \"description\": \"violin\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"violin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪕\",\n    \"description\": \"banjo\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"banjo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🥁\",\n    \"description\": \"drum\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"drum\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪘\",\n    \"description\": \"long drum\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"long_drum\"\n    ],\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"📱\",\n    \"description\": \"mobile phone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"iphone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📲\",\n    \"description\": \"mobile phone with arrow\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"calling\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☎️\",\n    \"description\": \"telephone\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"phone\",\n      \"telephone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📞\",\n    \"description\": \"telephone receiver\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"telephone_receiver\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📟\",\n    \"description\": \"pager\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pager\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📠\",\n    \"description\": \"fax machine\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"fax\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔋\",\n    \"description\": \"battery\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"battery\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔌\",\n    \"description\": \"electric plug\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"electric_plug\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💻\",\n    \"description\": \"laptop\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"computer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖥️\",\n    \"description\": \"desktop computer\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"desktop_computer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖨️\",\n    \"description\": \"printer\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"printer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⌨️\",\n    \"description\": \"keyboard\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"keyboard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖱️\",\n    \"description\": \"computer mouse\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"computer_mouse\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖲️\",\n    \"description\": \"trackball\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"trackball\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💽\",\n    \"description\": \"computer disk\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"minidisc\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💾\",\n    \"description\": \"floppy disk\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"floppy_disk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💿\",\n    \"description\": \"optical disk\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"cd\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📀\",\n    \"description\": \"dvd\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dvd\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧮\",\n    \"description\": \"abacus\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"abacus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎥\",\n    \"description\": \"movie camera\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"movie_camera\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎞️\",\n    \"description\": \"film frames\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"film_strip\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📽️\",\n    \"description\": \"film projector\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"film_projector\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎬\",\n    \"description\": \"clapper board\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"clapper\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📺\",\n    \"description\": \"television\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"tv\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📷\",\n    \"description\": \"camera\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"camera\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📸\",\n    \"description\": \"camera with flash\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"camera_flash\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📹\",\n    \"description\": \"video camera\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"video_camera\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📼\",\n    \"description\": \"videocassette\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"vhs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔍\",\n    \"description\": \"magnifying glass tilted left\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔎\",\n    \"description\": \"magnifying glass tilted right\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mag_right\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕯️\",\n    \"description\": \"candle\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"candle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💡\",\n    \"description\": \"light bulb\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bulb\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔦\",\n    \"description\": \"flashlight\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"flashlight\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏮\",\n    \"description\": \"red paper lantern\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"izakaya_lantern\",\n      \"lantern\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪔\",\n    \"description\": \"diya lamp\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"diya_lamp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📔\",\n    \"description\": \"notebook with decorative cover\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"notebook_with_decorative_cover\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📕\",\n    \"description\": \"closed book\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"closed_book\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📖\",\n    \"description\": \"open book\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"book\",\n      \"open_book\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📗\",\n    \"description\": \"green book\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"green_book\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📘\",\n    \"description\": \"blue book\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"blue_book\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📙\",\n    \"description\": \"orange book\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"orange_book\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📚\",\n    \"description\": \"books\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"books\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📓\",\n    \"description\": \"notebook\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"notebook\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📒\",\n    \"description\": \"ledger\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"ledger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📃\",\n    \"description\": \"page with curl\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"page_with_curl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📜\",\n    \"description\": \"scroll\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"scroll\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📄\",\n    \"description\": \"page facing up\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"page_facing_up\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📰\",\n    \"description\": \"newspaper\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"newspaper\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗞️\",\n    \"description\": \"rolled-up newspaper\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"newspaper_roll\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📑\",\n    \"description\": \"bookmark tabs\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bookmark_tabs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔖\",\n    \"description\": \"bookmark\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bookmark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏷️\",\n    \"description\": \"label\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"label\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💰\",\n    \"description\": \"money bag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"moneybag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💴\",\n    \"description\": \"yen banknote\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"yen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💵\",\n    \"description\": \"dollar banknote\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dollar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💶\",\n    \"description\": \"euro banknote\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"euro\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💷\",\n    \"description\": \"pound banknote\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pound\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💸\",\n    \"description\": \"money with wings\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"money_with_wings\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💳\",\n    \"description\": \"credit card\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"credit_card\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧾\",\n    \"description\": \"receipt\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"receipt\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💹\",\n    \"description\": \"chart increasing with yen\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"chart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✉️\",\n    \"description\": \"envelope\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"envelope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📧\",\n    \"description\": \"e-mail\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"email\",\n      \"e-mail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📨\",\n    \"description\": \"incoming envelope\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"incoming_envelope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📩\",\n    \"description\": \"envelope with arrow\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"envelope_with_arrow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📤\",\n    \"description\": \"outbox tray\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"outbox_tray\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📥\",\n    \"description\": \"inbox tray\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"inbox_tray\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📦\",\n    \"description\": \"package\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"package\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📫\",\n    \"description\": \"closed mailbox with raised flag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mailbox\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📪\",\n    \"description\": \"closed mailbox with lowered flag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mailbox_closed\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📬\",\n    \"description\": \"open mailbox with raised flag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mailbox_with_mail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📭\",\n    \"description\": \"open mailbox with lowered flag\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"mailbox_with_no_mail\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📮\",\n    \"description\": \"postbox\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"postbox\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗳️\",\n    \"description\": \"ballot box with ballot\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"ballot_box\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✏️\",\n    \"description\": \"pencil\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pencil2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✒️\",\n    \"description\": \"black nib\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"black_nib\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖋️\",\n    \"description\": \"fountain pen\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"fountain_pen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖊️\",\n    \"description\": \"pen\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖌️\",\n    \"description\": \"paintbrush\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"paintbrush\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖍️\",\n    \"description\": \"crayon\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"crayon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📝\",\n    \"description\": \"memo\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"memo\",\n      \"pencil\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💼\",\n    \"description\": \"briefcase\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"briefcase\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📁\",\n    \"description\": \"file folder\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"file_folder\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📂\",\n    \"description\": \"open file folder\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"open_file_folder\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗂️\",\n    \"description\": \"card index dividers\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"card_index_dividers\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📅\",\n    \"description\": \"calendar\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"date\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📆\",\n    \"description\": \"tear-off calendar\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"calendar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗒️\",\n    \"description\": \"spiral notepad\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"spiral_notepad\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗓️\",\n    \"description\": \"spiral calendar\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"spiral_calendar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📇\",\n    \"description\": \"card index\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"card_index\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📈\",\n    \"description\": \"chart increasing\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"chart_with_upwards_trend\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📉\",\n    \"description\": \"chart decreasing\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"chart_with_downwards_trend\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📊\",\n    \"description\": \"bar chart\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bar_chart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📋\",\n    \"description\": \"clipboard\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"clipboard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📌\",\n    \"description\": \"pushpin\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pushpin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📍\",\n    \"description\": \"round pushpin\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"round_pushpin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📎\",\n    \"description\": \"paperclip\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"paperclip\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🖇️\",\n    \"description\": \"linked paperclips\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"paperclips\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📏\",\n    \"description\": \"straight ruler\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"straight_ruler\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📐\",\n    \"description\": \"triangular ruler\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"triangular_ruler\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✂️\",\n    \"description\": \"scissors\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"scissors\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗃️\",\n    \"description\": \"card file box\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"card_file_box\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗄️\",\n    \"description\": \"file cabinet\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"file_cabinet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗑️\",\n    \"description\": \"wastebasket\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"wastebasket\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔒\",\n    \"description\": \"locked\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"lock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔓\",\n    \"description\": \"unlocked\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"unlock\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔏\",\n    \"description\": \"locked with pen\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"lock_with_ink_pen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔐\",\n    \"description\": \"locked with key\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"closed_lock_with_key\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔑\",\n    \"description\": \"key\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"key\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗝️\",\n    \"description\": \"old key\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"old_key\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔨\",\n    \"description\": \"hammer\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"hammer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪓\",\n    \"description\": \"axe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"axe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛏️\",\n    \"description\": \"pick\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚒️\",\n    \"description\": \"hammer and pick\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"hammer_and_pick\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛠️\",\n    \"description\": \"hammer and wrench\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"hammer_and_wrench\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗡️\",\n    \"description\": \"dagger\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dagger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚔️\",\n    \"description\": \"crossed swords\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"crossed_swords\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔫\",\n    \"description\": \"pistol\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"gun\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏹\",\n    \"description\": \"bow and arrow\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bow_and_arrow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛡️\",\n    \"description\": \"shield\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shield\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔧\",\n    \"description\": \"wrench\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"wrench\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔩\",\n    \"description\": \"nut and bolt\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"nut_and_bolt\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚙️\",\n    \"description\": \"gear\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"gear\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗜️\",\n    \"description\": \"clamp\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"clamp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚖️\",\n    \"description\": \"balance scale\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"balance_scale\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🦯\",\n    \"description\": \"white cane\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"probing_cane\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔗\",\n    \"description\": \"link\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"link\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛓️\",\n    \"description\": \"chains\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"chains\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧰\",\n    \"description\": \"toolbox\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"toolbox\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧲\",\n    \"description\": \"magnet\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"magnet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚗️\",\n    \"description\": \"alembic\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"alembic\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧪\",\n    \"description\": \"test tube\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"test_tube\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧫\",\n    \"description\": \"petri dish\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"petri_dish\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧬\",\n    \"description\": \"dna\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"dna\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔬\",\n    \"description\": \"microscope\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"microscope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔭\",\n    \"description\": \"telescope\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"telescope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📡\",\n    \"description\": \"satellite antenna\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"satellite\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💉\",\n    \"description\": \"syringe\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"syringe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩸\",\n    \"description\": \"drop of blood\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"drop_of_blood\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💊\",\n    \"description\": \"pill\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"pill\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩹\",\n    \"description\": \"adhesive bandage\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"adhesive_bandage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🩺\",\n    \"description\": \"stethoscope\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"stethoscope\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚪\",\n    \"description\": \"door\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"door\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛏️\",\n    \"description\": \"bed\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bed\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛋️\",\n    \"description\": \"couch and lamp\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"couch_and_lamp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪑\",\n    \"description\": \"chair\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"chair\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚽\",\n    \"description\": \"toilet\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"toilet\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚿\",\n    \"description\": \"shower\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shower\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛁\",\n    \"description\": \"bathtub\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"bathtub\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🪒\",\n    \"description\": \"razor\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"razor\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧴\",\n    \"description\": \"lotion bottle\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"lotion_bottle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧷\",\n    \"description\": \"safety pin\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"safety_pin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧹\",\n    \"description\": \"broom\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"broom\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧺\",\n    \"description\": \"basket\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"basket\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧻\",\n    \"description\": \"roll of paper\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"roll_of_paper\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧼\",\n    \"description\": \"soap\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"soap\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧽\",\n    \"description\": \"sponge\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"sponge\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🧯\",\n    \"description\": \"fire extinguisher\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"fire_extinguisher\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛒\",\n    \"description\": \"shopping cart\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"shopping_cart\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚬\",\n    \"description\": \"cigarette\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"smoking\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚰️\",\n    \"description\": \"coffin\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"coffin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚱️\",\n    \"description\": \"funeral urn\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"funeral_urn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🗿\",\n    \"description\": \"moai\",\n    \"category\": \"Objects\",\n    \"aliases\": [\n      \"moyai\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏧\",\n    \"description\": \"ATM sign\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"atm\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚮\",\n    \"description\": \"litter in bin sign\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"put_litter_in_its_place\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚰\",\n    \"description\": \"potable water\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"potable_water\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♿\",\n    \"description\": \"wheelchair symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"wheelchair\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚹\",\n    \"description\": \"men’s room\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"mens\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚺\",\n    \"description\": \"women’s room\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"womens\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚻\",\n    \"description\": \"restroom\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"restroom\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚼\",\n    \"description\": \"baby symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"baby_symbol\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚾\",\n    \"description\": \"water closet\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"wc\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛂\",\n    \"description\": \"passport control\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"passport_control\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛃\",\n    \"description\": \"customs\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"customs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛄\",\n    \"description\": \"baggage claim\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"baggage_claim\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛅\",\n    \"description\": \"left luggage\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"left_luggage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚠️\",\n    \"description\": \"warning\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"warning\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚸\",\n    \"description\": \"children crossing\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"children_crossing\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛔\",\n    \"description\": \"no entry\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_entry\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚫\",\n    \"description\": \"prohibited\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_entry_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚳\",\n    \"description\": \"no bicycles\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_bicycles\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚭\",\n    \"description\": \"no smoking\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_smoking\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚯\",\n    \"description\": \"no littering\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"do_not_litter\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚱\",\n    \"description\": \"non-potable water\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"non-potable_water\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚷\",\n    \"description\": \"no pedestrians\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_pedestrians\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📵\",\n    \"description\": \"no mobile phones\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"no_mobile_phones\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔞\",\n    \"description\": \"no one under eighteen\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"underage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☢️\",\n    \"description\": \"radioactive\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"radioactive\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☣️\",\n    \"description\": \"biohazard\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"biohazard\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⬆️\",\n    \"description\": \"up arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_up\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↗️\",\n    \"description\": \"up-right arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_upper_right\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➡️\",\n    \"description\": \"right arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_right\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↘️\",\n    \"description\": \"down-right arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_lower_right\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⬇️\",\n    \"description\": \"down arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_down\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↙️\",\n    \"description\": \"down-left arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_lower_left\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⬅️\",\n    \"description\": \"left arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_left\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↖️\",\n    \"description\": \"up-left arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_upper_left\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↕️\",\n    \"description\": \"up-down arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_up_down\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↔️\",\n    \"description\": \"left-right arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"left_right_arrow\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↩️\",\n    \"description\": \"right arrow curving left\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"leftwards_arrow_with_hook\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"↪️\",\n    \"description\": \"left arrow curving right\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_right_hook\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⤴️\",\n    \"description\": \"right arrow curving up\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_heading_up\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⤵️\",\n    \"description\": \"right arrow curving down\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_heading_down\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔃\",\n    \"description\": \"clockwise vertical arrows\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrows_clockwise\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔄\",\n    \"description\": \"counterclockwise arrows button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrows_counterclockwise\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔙\",\n    \"description\": \"BACK arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"back\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔚\",\n    \"description\": \"END arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"end\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔛\",\n    \"description\": \"ON! arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"on\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔜\",\n    \"description\": \"SOON arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"soon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔝\",\n    \"description\": \"TOP arrow\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"top\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🛐\",\n    \"description\": \"place of worship\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"place_of_worship\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚛️\",\n    \"description\": \"atom symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"atom_symbol\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕉️\",\n    \"description\": \"om\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"om\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✡️\",\n    \"description\": \"star of David\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"star_of_david\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☸️\",\n    \"description\": \"wheel of dharma\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"wheel_of_dharma\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☯️\",\n    \"description\": \"yin yang\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"yin_yang\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✝️\",\n    \"description\": \"latin cross\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"latin_cross\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☦️\",\n    \"description\": \"orthodox cross\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"orthodox_cross\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☪️\",\n    \"description\": \"star and crescent\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"star_and_crescent\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☮️\",\n    \"description\": \"peace symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"peace_symbol\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🕎\",\n    \"description\": \"menorah\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"menorah\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔯\",\n    \"description\": \"dotted six-pointed star\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"six_pointed_star\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♈\",\n    \"description\": \"Aries\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"aries\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♉\",\n    \"description\": \"Taurus\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"taurus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♊\",\n    \"description\": \"Gemini\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"gemini\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♋\",\n    \"description\": \"Cancer\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"cancer\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♌\",\n    \"description\": \"Leo\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"leo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♍\",\n    \"description\": \"Virgo\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"virgo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♎\",\n    \"description\": \"Libra\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"libra\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♏\",\n    \"description\": \"Scorpio\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"scorpius\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♐\",\n    \"description\": \"Sagittarius\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"sagittarius\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♑\",\n    \"description\": \"Capricorn\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"capricorn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♒\",\n    \"description\": \"Aquarius\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"aquarius\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♓\",\n    \"description\": \"Pisces\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"pisces\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⛎\",\n    \"description\": \"Ophiuchus\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ophiuchus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔀\",\n    \"description\": \"shuffle tracks button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"twisted_rightwards_arrows\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔁\",\n    \"description\": \"repeat button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"repeat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔂\",\n    \"description\": \"repeat single button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"repeat_one\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"▶️\",\n    \"description\": \"play button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_forward\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏩\",\n    \"description\": \"fast-forward button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"fast_forward\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏭️\",\n    \"description\": \"next track button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"next_track_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏯️\",\n    \"description\": \"play or pause button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"play_or_pause_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"◀️\",\n    \"description\": \"reverse button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_backward\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏪\",\n    \"description\": \"fast reverse button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"rewind\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏮️\",\n    \"description\": \"last track button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"previous_track_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔼\",\n    \"description\": \"upwards button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_up_small\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏫\",\n    \"description\": \"fast up button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_double_up\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔽\",\n    \"description\": \"downwards button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_down_small\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏬\",\n    \"description\": \"fast down button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"arrow_double_down\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏸️\",\n    \"description\": \"pause button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"pause_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏹️\",\n    \"description\": \"stop button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"stop_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏺️\",\n    \"description\": \"record button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"record_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⏏️\",\n    \"description\": \"eject button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"eject_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎦\",\n    \"description\": \"cinema\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"cinema\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔅\",\n    \"description\": \"dim button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"low_brightness\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔆\",\n    \"description\": \"bright button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"high_brightness\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📶\",\n    \"description\": \"antenna bars\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"signal_strength\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📳\",\n    \"description\": \"vibration mode\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"vibration_mode\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📴\",\n    \"description\": \"mobile phone off\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"mobile_phone_off\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♀️\",\n    \"description\": \"female sign\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"female_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♂️\",\n    \"description\": \"male sign\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"male_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚧️\",\n    \"description\": \"transgender symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"transgender_symbol\"\n    ],\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"✖️\",\n    \"description\": \"multiply\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_multiplication_x\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➕\",\n    \"description\": \"plus\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_plus_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➖\",\n    \"description\": \"minus\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_minus_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➗\",\n    \"description\": \"divide\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_division_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♾️\",\n    \"description\": \"infinity\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"infinity\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"‼️\",\n    \"description\": \"double exclamation mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"bangbang\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⁉️\",\n    \"description\": \"exclamation question mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"interrobang\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❓\",\n    \"description\": \"question mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"question\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❔\",\n    \"description\": \"white question mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"grey_question\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❕\",\n    \"description\": \"white exclamation mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"grey_exclamation\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❗\",\n    \"description\": \"exclamation mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"exclamation\",\n      \"heavy_exclamation_mark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"〰️\",\n    \"description\": \"wavy dash\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"wavy_dash\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💱\",\n    \"description\": \"currency exchange\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"currency_exchange\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💲\",\n    \"description\": \"heavy dollar sign\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_dollar_sign\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚕️\",\n    \"description\": \"medical symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"medical_symbol\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"♻️\",\n    \"description\": \"recycling symbol\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"recycle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚜️\",\n    \"description\": \"fleur-de-lis\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"fleur_de_lis\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔱\",\n    \"description\": \"trident emblem\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"trident\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"📛\",\n    \"description\": \"name badge\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"name_badge\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔰\",\n    \"description\": \"Japanese symbol for beginner\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"beginner\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⭕\",\n    \"description\": \"hollow red circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"o\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✅\",\n    \"description\": \"check mark button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_check_mark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"☑️\",\n    \"description\": \"check box with check\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ballot_box_with_check\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✔️\",\n    \"description\": \"check mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"heavy_check_mark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❌\",\n    \"description\": \"cross mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"x\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❎\",\n    \"description\": \"cross mark button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"negative_squared_cross_mark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➰\",\n    \"description\": \"curly loop\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"curly_loop\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"➿\",\n    \"description\": \"double curly loop\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"loop\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"〽️\",\n    \"description\": \"part alternation mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"part_alternation_mark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✳️\",\n    \"description\": \"eight-spoked asterisk\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"eight_spoked_asterisk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"✴️\",\n    \"description\": \"eight-pointed star\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"eight_pointed_black_star\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"❇️\",\n    \"description\": \"sparkle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"sparkle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"©️\",\n    \"description\": \"copyright\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"copyright\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"®️\",\n    \"description\": \"registered\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"registered\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"™️\",\n    \"description\": \"trade mark\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"tm\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"#️⃣\",\n    \"description\": \"keycap: #\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"hash\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"*️⃣\",\n    \"description\": \"keycap: *\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"asterisk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"0️⃣\",\n    \"description\": \"keycap: 0\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"zero\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"1️⃣\",\n    \"description\": \"keycap: 1\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"one\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"2️⃣\",\n    \"description\": \"keycap: 2\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"two\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"3️⃣\",\n    \"description\": \"keycap: 3\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"three\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"4️⃣\",\n    \"description\": \"keycap: 4\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"four\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"5️⃣\",\n    \"description\": \"keycap: 5\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"five\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"6️⃣\",\n    \"description\": \"keycap: 6\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"six\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"7️⃣\",\n    \"description\": \"keycap: 7\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"seven\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"8️⃣\",\n    \"description\": \"keycap: 8\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"eight\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"9️⃣\",\n    \"description\": \"keycap: 9\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"nine\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔟\",\n    \"description\": \"keycap: 10\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"keycap_ten\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔠\",\n    \"description\": \"input latin uppercase\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"capital_abcd\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔡\",\n    \"description\": \"input latin lowercase\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"abcd\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔢\",\n    \"description\": \"input numbers\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"1234\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔣\",\n    \"description\": \"input symbols\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"symbols\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔤\",\n    \"description\": \"input latin letters\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"abc\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🅰️\",\n    \"description\": \"A button (blood type)\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"a\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆎\",\n    \"description\": \"AB button (blood type)\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ab\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🅱️\",\n    \"description\": \"B button (blood type)\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"b\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆑\",\n    \"description\": \"CL button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"cl\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆒\",\n    \"description\": \"COOL button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"cool\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆓\",\n    \"description\": \"FREE button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"free\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"ℹ️\",\n    \"description\": \"information\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"information_source\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆔\",\n    \"description\": \"ID button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"id\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"Ⓜ️\",\n    \"description\": \"circled M\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"m\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆕\",\n    \"description\": \"NEW button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"new\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆖\",\n    \"description\": \"NG button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ng\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🅾️\",\n    \"description\": \"O button (blood type)\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"o2\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆗\",\n    \"description\": \"OK button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ok\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🅿️\",\n    \"description\": \"P button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"parking\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆘\",\n    \"description\": \"SOS button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"sos\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆙\",\n    \"description\": \"UP! button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"up\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🆚\",\n    \"description\": \"VS button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"vs\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈁\",\n    \"description\": \"Japanese “here” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"koko\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈂️\",\n    \"description\": \"Japanese “service charge” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"sa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈷️\",\n    \"description\": \"Japanese “monthly amount” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u6708\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈶\",\n    \"description\": \"Japanese “not free of charge” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u6709\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈯\",\n    \"description\": \"Japanese “reserved” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u6307\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🉐\",\n    \"description\": \"Japanese “bargain” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"ideograph_advantage\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈹\",\n    \"description\": \"Japanese “discount” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u5272\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈚\",\n    \"description\": \"Japanese “free of charge” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u7121\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈲\",\n    \"description\": \"Japanese “prohibited” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u7981\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🉑\",\n    \"description\": \"Japanese “acceptable” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"accept\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈸\",\n    \"description\": \"Japanese “application” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u7533\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈴\",\n    \"description\": \"Japanese “passing grade” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u5408\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈳\",\n    \"description\": \"Japanese “vacancy” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u7a7a\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"㊗️\",\n    \"description\": \"Japanese “congratulations” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"congratulations\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"㊙️\",\n    \"description\": \"Japanese “secret” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"secret\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈺\",\n    \"description\": \"Japanese “open for business” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u55b6\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🈵\",\n    \"description\": \"Japanese “no vacancy” button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"u6e80\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔴\",\n    \"description\": \"red circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"red_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟠\",\n    \"description\": \"orange circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"orange_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟡\",\n    \"description\": \"yellow circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"yellow_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟢\",\n    \"description\": \"green circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"green_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔵\",\n    \"description\": \"blue circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"large_blue_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟣\",\n    \"description\": \"purple circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"purple_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟤\",\n    \"description\": \"brown circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"brown_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚫\",\n    \"description\": \"black circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⚪\",\n    \"description\": \"white circle\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_circle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟥\",\n    \"description\": \"red square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"red_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟧\",\n    \"description\": \"orange square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"orange_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟨\",\n    \"description\": \"yellow square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"yellow_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟩\",\n    \"description\": \"green square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"green_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟦\",\n    \"description\": \"blue square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"blue_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟪\",\n    \"description\": \"purple square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"purple_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🟫\",\n    \"description\": \"brown square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"brown_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⬛\",\n    \"description\": \"black large square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_large_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"⬜\",\n    \"description\": \"white large square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_large_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"◼️\",\n    \"description\": \"black medium square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_medium_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"◻️\",\n    \"description\": \"white medium square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_medium_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"◾\",\n    \"description\": \"black medium-small square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_medium_small_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"◽\",\n    \"description\": \"white medium-small square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_medium_small_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"▪️\",\n    \"description\": \"black small square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_small_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"▫️\",\n    \"description\": \"white small square\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_small_square\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔶\",\n    \"description\": \"large orange diamond\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"large_orange_diamond\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔷\",\n    \"description\": \"large blue diamond\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"large_blue_diamond\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔸\",\n    \"description\": \"small orange diamond\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"small_orange_diamond\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔹\",\n    \"description\": \"small blue diamond\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"small_blue_diamond\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔺\",\n    \"description\": \"red triangle pointed up\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"small_red_triangle\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔻\",\n    \"description\": \"red triangle pointed down\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"small_red_triangle_down\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"💠\",\n    \"description\": \"diamond with a dot\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"diamond_shape_with_a_dot_inside\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔘\",\n    \"description\": \"radio button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"radio_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔳\",\n    \"description\": \"white square button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"white_square_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🔲\",\n    \"description\": \"black square button\",\n    \"category\": \"Symbols\",\n    \"aliases\": [\n      \"black_square_button\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏁\",\n    \"description\": \"chequered flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"checkered_flag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🚩\",\n    \"description\": \"triangular flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"triangular_flag_on_post\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🎌\",\n    \"description\": \"crossed flags\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"crossed_flags\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏴\",\n    \"description\": \"black flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"black_flag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏳️\",\n    \"description\": \"white flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"white_flag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏳️‍🌈\",\n    \"description\": \"rainbow flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"rainbow_flag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏳️‍⚧️\",\n    \"description\": \"transgender flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"transgender_flag\"\n    ],\n    \"hasMarkdownRepresentation\": false\n  },\n  {\n    \"emojiRaw\": \"🏴‍☠️\",\n    \"description\": \"pirate flag\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"pirate_flag\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇨\",\n    \"description\": \"flag: Ascension Island\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ascension_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇩\",\n    \"description\": \"flag: Andorra\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"andorra\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇪\",\n    \"description\": \"flag: United Arab Emirates\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"united_arab_emirates\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇫\",\n    \"description\": \"flag: Afghanistan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"afghanistan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇬\",\n    \"description\": \"flag: Antigua & Barbuda\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"antigua_barbuda\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇮\",\n    \"description\": \"flag: Anguilla\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"anguilla\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇱\",\n    \"description\": \"flag: Albania\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"albania\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇲\",\n    \"description\": \"flag: Armenia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"armenia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇴\",\n    \"description\": \"flag: Angola\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"angola\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇶\",\n    \"description\": \"flag: Antarctica\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"antarctica\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇷\",\n    \"description\": \"flag: Argentina\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"argentina\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇸\",\n    \"description\": \"flag: American Samoa\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"american_samoa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇹\",\n    \"description\": \"flag: Austria\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"austria\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇺\",\n    \"description\": \"flag: Australia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"australia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇼\",\n    \"description\": \"flag: Aruba\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"aruba\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇽\",\n    \"description\": \"flag: Åland Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"aland_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇦🇿\",\n    \"description\": \"flag: Azerbaijan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"azerbaijan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇦\",\n    \"description\": \"flag: Bosnia & Herzegovina\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bosnia_herzegovina\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇧\",\n    \"description\": \"flag: Barbados\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"barbados\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇩\",\n    \"description\": \"flag: Bangladesh\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bangladesh\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇪\",\n    \"description\": \"flag: Belgium\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"belgium\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇫\",\n    \"description\": \"flag: Burkina Faso\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"burkina_faso\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇬\",\n    \"description\": \"flag: Bulgaria\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bulgaria\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇭\",\n    \"description\": \"flag: Bahrain\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bahrain\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇮\",\n    \"description\": \"flag: Burundi\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"burundi\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇯\",\n    \"description\": \"flag: Benin\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"benin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇱\",\n    \"description\": \"flag: St. Barthélemy\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_barthelemy\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇲\",\n    \"description\": \"flag: Bermuda\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bermuda\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇳\",\n    \"description\": \"flag: Brunei\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"brunei\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇴\",\n    \"description\": \"flag: Bolivia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bolivia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇶\",\n    \"description\": \"flag: Caribbean Netherlands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"caribbean_netherlands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇷\",\n    \"description\": \"flag: Brazil\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"brazil\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇸\",\n    \"description\": \"flag: Bahamas\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bahamas\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇹\",\n    \"description\": \"flag: Bhutan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bhutan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇻\",\n    \"description\": \"flag: Bouvet Island\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"bouvet_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇼\",\n    \"description\": \"flag: Botswana\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"botswana\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇾\",\n    \"description\": \"flag: Belarus\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"belarus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇧🇿\",\n    \"description\": \"flag: Belize\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"belize\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇦\",\n    \"description\": \"flag: Canada\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"canada\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇨\",\n    \"description\": \"flag: Cocos (Keeling) Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cocos_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇩\",\n    \"description\": \"flag: Congo - Kinshasa\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"congo_kinshasa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇫\",\n    \"description\": \"flag: Central African Republic\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"central_african_republic\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇬\",\n    \"description\": \"flag: Congo - Brazzaville\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"congo_brazzaville\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇭\",\n    \"description\": \"flag: Switzerland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"switzerland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇮\",\n    \"description\": \"flag: Côte d’Ivoire\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cote_divoire\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇰\",\n    \"description\": \"flag: Cook Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cook_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇱\",\n    \"description\": \"flag: Chile\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"chile\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇲\",\n    \"description\": \"flag: Cameroon\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cameroon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇳\",\n    \"description\": \"flag: China\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cn\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇴\",\n    \"description\": \"flag: Colombia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"colombia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇵\",\n    \"description\": \"flag: Clipperton Island\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"clipperton_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇷\",\n    \"description\": \"flag: Costa Rica\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"costa_rica\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇺\",\n    \"description\": \"flag: Cuba\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cuba\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇻\",\n    \"description\": \"flag: Cape Verde\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cape_verde\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇼\",\n    \"description\": \"flag: Curaçao\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"curacao\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇽\",\n    \"description\": \"flag: Christmas Island\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"christmas_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇾\",\n    \"description\": \"flag: Cyprus\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cyprus\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇨🇿\",\n    \"description\": \"flag: Czechia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"czech_republic\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇪\",\n    \"description\": \"flag: Germany\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"de\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇬\",\n    \"description\": \"flag: Diego Garcia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"diego_garcia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇯\",\n    \"description\": \"flag: Djibouti\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"djibouti\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇰\",\n    \"description\": \"flag: Denmark\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"denmark\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇲\",\n    \"description\": \"flag: Dominica\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"dominica\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇴\",\n    \"description\": \"flag: Dominican Republic\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"dominican_republic\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇩🇿\",\n    \"description\": \"flag: Algeria\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"algeria\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇦\",\n    \"description\": \"flag: Ceuta & Melilla\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ceuta_melilla\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇨\",\n    \"description\": \"flag: Ecuador\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ecuador\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇪\",\n    \"description\": \"flag: Estonia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"estonia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇬\",\n    \"description\": \"flag: Egypt\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"egypt\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇭\",\n    \"description\": \"flag: Western Sahara\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"western_sahara\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇷\",\n    \"description\": \"flag: Eritrea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"eritrea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇸\",\n    \"description\": \"flag: Spain\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"es\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇹\",\n    \"description\": \"flag: Ethiopia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ethiopia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇪🇺\",\n    \"description\": \"flag: European Union\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"eu\",\n      \"european_union\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇮\",\n    \"description\": \"flag: Finland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"finland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇯\",\n    \"description\": \"flag: Fiji\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"fiji\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇰\",\n    \"description\": \"flag: Falkland Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"falkland_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇲\",\n    \"description\": \"flag: Micronesia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"micronesia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇴\",\n    \"description\": \"flag: Faroe Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"faroe_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇫🇷\",\n    \"description\": \"flag: France\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"fr\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇦\",\n    \"description\": \"flag: Gabon\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"gabon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇧\",\n    \"description\": \"flag: United Kingdom\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"gb\",\n      \"uk\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇩\",\n    \"description\": \"flag: Grenada\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"grenada\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇪\",\n    \"description\": \"flag: Georgia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"georgia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇫\",\n    \"description\": \"flag: French Guiana\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"french_guiana\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇬\",\n    \"description\": \"flag: Guernsey\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guernsey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇭\",\n    \"description\": \"flag: Ghana\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ghana\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇮\",\n    \"description\": \"flag: Gibraltar\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"gibraltar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇱\",\n    \"description\": \"flag: Greenland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"greenland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇲\",\n    \"description\": \"flag: Gambia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"gambia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇳\",\n    \"description\": \"flag: Guinea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guinea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇵\",\n    \"description\": \"flag: Guadeloupe\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guadeloupe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇶\",\n    \"description\": \"flag: Equatorial Guinea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"equatorial_guinea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇷\",\n    \"description\": \"flag: Greece\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"greece\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇸\",\n    \"description\": \"flag: South Georgia & South Sandwich Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"south_georgia_south_sandwich_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇹\",\n    \"description\": \"flag: Guatemala\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guatemala\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇺\",\n    \"description\": \"flag: Guam\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guam\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇼\",\n    \"description\": \"flag: Guinea-Bissau\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guinea_bissau\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇬🇾\",\n    \"description\": \"flag: Guyana\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"guyana\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇰\",\n    \"description\": \"flag: Hong Kong SAR China\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"hong_kong\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇲\",\n    \"description\": \"flag: Heard & McDonald Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"heard_mcdonald_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇳\",\n    \"description\": \"flag: Honduras\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"honduras\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇷\",\n    \"description\": \"flag: Croatia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"croatia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇹\",\n    \"description\": \"flag: Haiti\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"haiti\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇭🇺\",\n    \"description\": \"flag: Hungary\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"hungary\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇨\",\n    \"description\": \"flag: Canary Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"canary_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇩\",\n    \"description\": \"flag: Indonesia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"indonesia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇪\",\n    \"description\": \"flag: Ireland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ireland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇱\",\n    \"description\": \"flag: Israel\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"israel\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇲\",\n    \"description\": \"flag: Isle of Man\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"isle_of_man\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇳\",\n    \"description\": \"flag: India\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"india\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇴\",\n    \"description\": \"flag: British Indian Ocean Territory\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"british_indian_ocean_territory\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇶\",\n    \"description\": \"flag: Iraq\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"iraq\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇷\",\n    \"description\": \"flag: Iran\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"iran\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇸\",\n    \"description\": \"flag: Iceland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"iceland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇮🇹\",\n    \"description\": \"flag: Italy\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"it\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇯🇪\",\n    \"description\": \"flag: Jersey\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"jersey\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇯🇲\",\n    \"description\": \"flag: Jamaica\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"jamaica\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇯🇴\",\n    \"description\": \"flag: Jordan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"jordan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇯🇵\",\n    \"description\": \"flag: Japan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"jp\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇪\",\n    \"description\": \"flag: Kenya\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kenya\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇬\",\n    \"description\": \"flag: Kyrgyzstan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kyrgyzstan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇭\",\n    \"description\": \"flag: Cambodia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cambodia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇮\",\n    \"description\": \"flag: Kiribati\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kiribati\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇲\",\n    \"description\": \"flag: Comoros\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"comoros\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇳\",\n    \"description\": \"flag: St. Kitts & Nevis\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_kitts_nevis\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇵\",\n    \"description\": \"flag: North Korea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"north_korea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇷\",\n    \"description\": \"flag: South Korea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kr\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇼\",\n    \"description\": \"flag: Kuwait\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kuwait\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇾\",\n    \"description\": \"flag: Cayman Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"cayman_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇰🇿\",\n    \"description\": \"flag: Kazakhstan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kazakhstan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇦\",\n    \"description\": \"flag: Laos\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"laos\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇧\",\n    \"description\": \"flag: Lebanon\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"lebanon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇨\",\n    \"description\": \"flag: St. Lucia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_lucia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇮\",\n    \"description\": \"flag: Liechtenstein\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"liechtenstein\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇰\",\n    \"description\": \"flag: Sri Lanka\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sri_lanka\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇷\",\n    \"description\": \"flag: Liberia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"liberia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇸\",\n    \"description\": \"flag: Lesotho\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"lesotho\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇹\",\n    \"description\": \"flag: Lithuania\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"lithuania\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇺\",\n    \"description\": \"flag: Luxembourg\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"luxembourg\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇻\",\n    \"description\": \"flag: Latvia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"latvia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇱🇾\",\n    \"description\": \"flag: Libya\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"libya\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇦\",\n    \"description\": \"flag: Morocco\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"morocco\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇨\",\n    \"description\": \"flag: Monaco\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"monaco\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇩\",\n    \"description\": \"flag: Moldova\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"moldova\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇪\",\n    \"description\": \"flag: Montenegro\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"montenegro\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇫\",\n    \"description\": \"flag: St. Martin\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_martin\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇬\",\n    \"description\": \"flag: Madagascar\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"madagascar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇭\",\n    \"description\": \"flag: Marshall Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"marshall_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇰\",\n    \"description\": \"flag: North Macedonia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"macedonia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇱\",\n    \"description\": \"flag: Mali\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mali\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇲\",\n    \"description\": \"flag: Myanmar (Burma)\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"myanmar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇳\",\n    \"description\": \"flag: Mongolia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mongolia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇴\",\n    \"description\": \"flag: Macao SAR China\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"macau\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇵\",\n    \"description\": \"flag: Northern Mariana Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"northern_mariana_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇶\",\n    \"description\": \"flag: Martinique\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"martinique\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇷\",\n    \"description\": \"flag: Mauritania\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mauritania\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇸\",\n    \"description\": \"flag: Montserrat\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"montserrat\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇹\",\n    \"description\": \"flag: Malta\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"malta\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇺\",\n    \"description\": \"flag: Mauritius\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mauritius\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇻\",\n    \"description\": \"flag: Maldives\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"maldives\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇼\",\n    \"description\": \"flag: Malawi\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"malawi\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇽\",\n    \"description\": \"flag: Mexico\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mexico\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇾\",\n    \"description\": \"flag: Malaysia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"malaysia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇲🇿\",\n    \"description\": \"flag: Mozambique\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mozambique\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇦\",\n    \"description\": \"flag: Namibia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"namibia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇨\",\n    \"description\": \"flag: New Caledonia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"new_caledonia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇪\",\n    \"description\": \"flag: Niger\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"niger\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇫\",\n    \"description\": \"flag: Norfolk Island\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"norfolk_island\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇬\",\n    \"description\": \"flag: Nigeria\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"nigeria\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇮\",\n    \"description\": \"flag: Nicaragua\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"nicaragua\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇱\",\n    \"description\": \"flag: Netherlands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"netherlands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇴\",\n    \"description\": \"flag: Norway\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"norway\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇵\",\n    \"description\": \"flag: Nepal\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"nepal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇷\",\n    \"description\": \"flag: Nauru\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"nauru\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇺\",\n    \"description\": \"flag: Niue\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"niue\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇳🇿\",\n    \"description\": \"flag: New Zealand\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"new_zealand\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇴🇲\",\n    \"description\": \"flag: Oman\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"oman\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇦\",\n    \"description\": \"flag: Panama\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"panama\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇪\",\n    \"description\": \"flag: Peru\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"peru\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇫\",\n    \"description\": \"flag: French Polynesia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"french_polynesia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇬\",\n    \"description\": \"flag: Papua New Guinea\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"papua_new_guinea\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇭\",\n    \"description\": \"flag: Philippines\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"philippines\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇰\",\n    \"description\": \"flag: Pakistan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"pakistan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇱\",\n    \"description\": \"flag: Poland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"poland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇲\",\n    \"description\": \"flag: St. Pierre & Miquelon\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_pierre_miquelon\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇳\",\n    \"description\": \"flag: Pitcairn Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"pitcairn_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇷\",\n    \"description\": \"flag: Puerto Rico\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"puerto_rico\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇸\",\n    \"description\": \"flag: Palestinian Territories\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"palestinian_territories\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇹\",\n    \"description\": \"flag: Portugal\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"portugal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇼\",\n    \"description\": \"flag: Palau\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"palau\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇵🇾\",\n    \"description\": \"flag: Paraguay\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"paraguay\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇶🇦\",\n    \"description\": \"flag: Qatar\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"qatar\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇷🇪\",\n    \"description\": \"flag: Réunion\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"reunion\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇷🇴\",\n    \"description\": \"flag: Romania\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"romania\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇷🇸\",\n    \"description\": \"flag: Serbia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"serbia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇷🇺\",\n    \"description\": \"flag: Russia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ru\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇷🇼\",\n    \"description\": \"flag: Rwanda\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"rwanda\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇦\",\n    \"description\": \"flag: Saudi Arabia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"saudi_arabia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇧\",\n    \"description\": \"flag: Solomon Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"solomon_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇨\",\n    \"description\": \"flag: Seychelles\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"seychelles\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇩\",\n    \"description\": \"flag: Sudan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sudan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇪\",\n    \"description\": \"flag: Sweden\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sweden\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇬\",\n    \"description\": \"flag: Singapore\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"singapore\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇭\",\n    \"description\": \"flag: St. Helena\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_helena\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇮\",\n    \"description\": \"flag: Slovenia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"slovenia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇯\",\n    \"description\": \"flag: Svalbard & Jan Mayen\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"svalbard_jan_mayen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇰\",\n    \"description\": \"flag: Slovakia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"slovakia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇱\",\n    \"description\": \"flag: Sierra Leone\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sierra_leone\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇲\",\n    \"description\": \"flag: San Marino\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"san_marino\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇳\",\n    \"description\": \"flag: Senegal\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"senegal\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇴\",\n    \"description\": \"flag: Somalia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"somalia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇷\",\n    \"description\": \"flag: Suriname\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"suriname\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇸\",\n    \"description\": \"flag: South Sudan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"south_sudan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇹\",\n    \"description\": \"flag: São Tomé & Príncipe\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sao_tome_principe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇻\",\n    \"description\": \"flag: El Salvador\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"el_salvador\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇽\",\n    \"description\": \"flag: Sint Maarten\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"sint_maarten\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇾\",\n    \"description\": \"flag: Syria\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"syria\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇸🇿\",\n    \"description\": \"flag: Eswatini\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"swaziland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇦\",\n    \"description\": \"flag: Tristan da Cunha\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tristan_da_cunha\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇨\",\n    \"description\": \"flag: Turks & Caicos Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"turks_caicos_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇩\",\n    \"description\": \"flag: Chad\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"chad\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇫\",\n    \"description\": \"flag: French Southern Territories\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"french_southern_territories\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇬\",\n    \"description\": \"flag: Togo\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"togo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇭\",\n    \"description\": \"flag: Thailand\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"thailand\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇯\",\n    \"description\": \"flag: Tajikistan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tajikistan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇰\",\n    \"description\": \"flag: Tokelau\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tokelau\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇱\",\n    \"description\": \"flag: Timor-Leste\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"timor_leste\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇲\",\n    \"description\": \"flag: Turkmenistan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"turkmenistan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇳\",\n    \"description\": \"flag: Tunisia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tunisia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇴\",\n    \"description\": \"flag: Tonga\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tonga\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇷\",\n    \"description\": \"flag: Turkey\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tr\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇹\",\n    \"description\": \"flag: Trinidad & Tobago\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"trinidad_tobago\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇻\",\n    \"description\": \"flag: Tuvalu\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tuvalu\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇼\",\n    \"description\": \"flag: Taiwan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"taiwan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇹🇿\",\n    \"description\": \"flag: Tanzania\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"tanzania\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇦\",\n    \"description\": \"flag: Ukraine\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"ukraine\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇬\",\n    \"description\": \"flag: Uganda\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"uganda\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇲\",\n    \"description\": \"flag: U.S. Outlying Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"us_outlying_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇳\",\n    \"description\": \"flag: United Nations\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"united_nations\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇸\",\n    \"description\": \"flag: United States\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"us\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇾\",\n    \"description\": \"flag: Uruguay\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"uruguay\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇺🇿\",\n    \"description\": \"flag: Uzbekistan\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"uzbekistan\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇦\",\n    \"description\": \"flag: Vatican City\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"vatican_city\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇨\",\n    \"description\": \"flag: St. Vincent & Grenadines\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"st_vincent_grenadines\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇪\",\n    \"description\": \"flag: Venezuela\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"venezuela\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇬\",\n    \"description\": \"flag: British Virgin Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"british_virgin_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇮\",\n    \"description\": \"flag: U.S. Virgin Islands\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"us_virgin_islands\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇳\",\n    \"description\": \"flag: Vietnam\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"vietnam\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇻🇺\",\n    \"description\": \"flag: Vanuatu\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"vanuatu\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇼🇫\",\n    \"description\": \"flag: Wallis & Futuna\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"wallis_futuna\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇼🇸\",\n    \"description\": \"flag: Samoa\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"samoa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇽🇰\",\n    \"description\": \"flag: Kosovo\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"kosovo\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇾🇪\",\n    \"description\": \"flag: Yemen\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"yemen\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇾🇹\",\n    \"description\": \"flag: Mayotte\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"mayotte\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇿🇦\",\n    \"description\": \"flag: South Africa\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"south_africa\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇿🇲\",\n    \"description\": \"flag: Zambia\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"zambia\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🇿🇼\",\n    \"description\": \"flag: Zimbabwe\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"zimbabwe\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏴󠁧󠁢󠁥󠁮󠁧󠁿\",\n    \"description\": \"flag: England\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"england\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏴󠁧󠁢󠁳󠁣󠁴󠁿\",\n    \"description\": \"flag: Scotland\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"scotland\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  },\n  {\n    \"emojiRaw\": \"🏴󠁧󠁢󠁷󠁬󠁳󠁿\",\n    \"description\": \"flag: Wales\",\n    \"category\": \"Flags\",\n    \"aliases\": [\n      \"wales\"\n    ],\n    \"hasMarkdownRepresentation\": true\n  }\n];\n\nexport default emjois;\n","/*\n * emoji.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocOutput, PandocToken, PandocTokenType, ProsemirrorWriter, PandocExtensions } from '../../api/pandoc';\nimport { pandocAttrReadAST } from '../../api/pandoc_attr';\nimport { fragmentText } from '../../api/fragment';\n\nimport { FixupContext } from '../../api/fixup';\nimport { MarkTransaction } from '../../api/transaction';\nimport { mergedTextNodes } from '../../api/text';\nimport {\n  emojis,\n  emojiFromAlias,\n  emojiFromChar,\n  emojiForAllSkinTones,\n  Emoji,\n  emojiWithSkinTonePreference,\n  kEmojiAttr,\n  kEmojiContent,\n} from '../../api/emoji';\nimport { emojiCompletionHandler, emojiSkintonePreferenceCompletionHandler } from './emoji-completion';\nimport { getMarkAttrs } from '../../api/mark';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { ui } = context;\n\n  return {\n    marks: [\n      {\n        name: 'emoji',\n        noSpelling: true,\n        spec: {\n          inclusive: false,\n          noInputRules: true,\n          attrs: {\n            emojihint: {},\n            prompt: { default: true },\n          },\n          parseDOM: [\n            {\n              tag: \"span[class*='emoji']\",\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                return {\n                  emojihint: el.getAttribute('data-emojihint'),\n                  prompt: el.getAttribute('data-emojiprompt') || false,\n                };\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            return [\n              'span',\n              {\n                class: 'emoji pm-emoji-font',\n                title: ':' + mark.attrs.emojihint + ':',\n                'data-emojihint': mark.attrs.emojihint,\n                'data-emojiprompt': mark.attrs.prompt,\n              },\n            ];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Span,\n              match: (tok: PandocToken) => {\n                const attrs = pandocAttrReadAST(tok, kEmojiAttr);\n                return attrs.keyvalue.length > 0 && attrs.keyvalue[0][0] === 'data-emoji';\n              },\n              handler: (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => {\n                const attrs = pandocAttrReadAST(tok, kEmojiAttr);\n                const emojihint = attrs.keyvalue[0][1];\n                const emojiMark = schema.marks.emoji.create({ emojihint });\n                writer.openMark(emojiMark);\n                const emojiChar = tok.c[kEmojiContent][0].c;\n                writer.writeText(emojiChar);\n                writer.closeMark(emojiMark);\n              },\n            },\n          ],\n          writer: {\n            priority: 2,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              // look for a matching emoji\n              const char = fragmentText(parent);\n              const emoji = emojiFromChar(char);\n              if (emoji) {\n                output.writeToken(PandocTokenType.Span, () => {\n                  // resolve which alias to use\n                  let alias = emoji.aliases[0];\n                  if (emoji.aliases.length > 1) {\n                    if (emoji.aliases.includes(mark.attrs.emojihint)) {\n                      alias = mark.attrs.emojihint;\n                    }\n                  }\n                  output.writeAttr('', ['emoji'], [['data-emoji', alias]]);\n                  output.writeArray(() => {\n                    output.writeText(emoji.emojiRaw);\n                  });\n                });\n              } else {\n                output.writeInlines(parent);\n              }\n            },\n          },\n        },\n      },\n    ],\n\n    inputRules: () => {\n      return [\n        new InputRule(/(^|[^`]):(\\w+):$/, (state: EditorState, match: string[], start: number, end: number) => {\n          const emojiName = match[2];\n          const emoji = emojiFromAlias(emojiName.toLowerCase());\n          if (emoji) {\n            const emojiWithSkinTone = emojiWithSkinTonePreference(emoji, ui.prefs.emojiSkinTone());\n            const schema = state.schema;\n            const tr = state.tr;\n            tr.delete(start + match[1].length, end);\n            tr.replaceSelectionWith(nodeForEmoji(schema, emojiWithSkinTone, emojiName), false);\n            return tr;\n          } else {\n            return null;\n          }\n        }),\n      ];\n    },\n\n    completionHandlers: () => [emojiCompletionHandler(ui), emojiSkintonePreferenceCompletionHandler(ui)],\n\n    fixups: (schema: Schema) => {\n      return [\n        (tr: Transaction, fixupContext: FixupContext) => {\n          // only apply on save and load\n          if (![FixupContext.Save, FixupContext.Load].includes(fixupContext)) {\n            return tr;\n          }\n\n          // create mark transation wrapper\n          const markTr = new MarkTransaction(tr);\n\n          const textNodes = mergedTextNodes(\n            markTr.doc,\n            (_node: ProsemirrorNode, _pos: number, parentNode: ProsemirrorNode) =>\n              parentNode.type.allowsMarkType(schema.marks.emoji),\n          );\n\n          textNodes.forEach(textNode => {\n            // Since emoji can be composed of multiple characters (including\n            // other emoji), we always need to prefer the longest match when inserting\n            // a mark for any given starting position.\n\n            // Find the possible emoji at each position in this text node\n            const possibleMarks = new Map<number, Array<{ to: number; emoji: Emoji }>>();\n            for (const emoji of emojis(ui.prefs.emojiSkinTone())) {\n              emojiForAllSkinTones(emoji).forEach(skinToneEmoji => {\n                let charLoc = textNode.text.indexOf(skinToneEmoji.emoji);\n                while (charLoc !== -1) {\n                  const from = textNode.pos + charLoc;\n                  const to = from + skinToneEmoji.emoji.length;\n                  possibleMarks.set(from, (possibleMarks.get(from) || []).concat({ to, emoji: skinToneEmoji }));\n                  charLoc = textNode.text.indexOf(skinToneEmoji.emoji, charLoc + 1);\n                }\n              });\n            }\n\n            // For each position that has emoji, use the longest emoji match as the\n            // emoji to be marked.\n            possibleMarks.forEach((possibleEmojis, markFrom) => {\n              const orderedEmojis = possibleEmojis.sort((a, b) => b.to - a.to);\n              const to = orderedEmojis[0].to;\n              const emoji = orderedEmojis[0].emoji;\n\n              // remove any existing mark (preserving attribues if we do )\n              let existingAttrs: { [key: string]: any } | null = null;\n              if (markTr.doc.rangeHasMark(markFrom, to, schema.marks.emoji)) {\n                existingAttrs = getMarkAttrs(markTr.doc, { from: markFrom, to }, schema.marks.emoji);\n                markTr.removeMark(markFrom, to, schema.marks.emoji);\n              }\n\n              // create a new mark\n              const mark = schema.marks.emoji.create({\n                emojihint: emoji.aliases[0],\n                ...existingAttrs,\n              });\n\n              // on load we want to cover the entire span\n              if (fixupContext === FixupContext.Load) {\n                markTr.addMark(markFrom, to, mark);\n                // on save we just want the raw emjoi character(s)\n              } else if (fixupContext === FixupContext.Save) {\n                markTr.addMark(markFrom, markFrom + emoji.emoji.length, mark);\n              }\n            });\n          });\n\n          return tr;\n        },\n      ];\n    },\n  };\n};\n\nexport function nodeForEmoji(schema: Schema, emoji: Emoji, hint: string, prompt?: boolean): ProsemirrorNode {\n  const mark = schema.marks.emoji.create({ emojihint: hint, prompt });\n  return schema.text(emoji.emoji, [mark]);\n}\n\nexport default extension;\n","/*\n * emoji-completion.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\n\nimport { CompletionHandler, CompletionResult, CompletionHeaderProps } from '../../api/completion';\nimport { emojis, Emoji, SkinTone, emojiFromChar, emojiForAllSkinTones } from '../../api/emoji';\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { nodeForEmoji } from './emoji';\n\nimport './emoji-completion.css';\n\nexport function emojiCompletionHandler(ui: EditorUI): CompletionHandler<Emoji> {\n  return {\n    id: '95A133E1-968B-4D96-8849-4A325FF02C11',\n\n    completions: emojiCompletions(ui),\n\n    replacement(schema: Schema, emoji: Emoji | null): string | ProsemirrorNode | null {\n      if (emoji) {\n        return nodeForEmoji(schema, emoji, emoji.aliases[0]);\n      } else {\n        return null;\n      }\n    },\n\n    view: {\n      component: EmojiView,\n      key: emoji => emoji.emoji,\n      width: 200,\n      hideNoResults: true,\n    },\n  };\n}\n\nconst kMaxEmojiCompletions = 20;\nconst kEmojiCompletionRegEx = /(^|[^`\\:]):(\\w{2,})$/;\n\nfunction emojiCompletions(ui: EditorUI) {\n  return (text: string, context: EditorState | Transaction): CompletionResult<Emoji> | null => {\n    // look for requisite text sequence\n    const match = text.match(kEmojiCompletionRegEx);\n    if (match) {\n      // determine insert position and prefix to search for\n      const prefix = match[2].toLowerCase();\n      const pos = context.selection.head - prefix.length - 1; // -1 for the leading :\n\n      // scan for completions that match the prefix (truncate as necessary)\n      const completions: Emoji[] = [];\n      for (const emoji of emojis(ui.prefs.emojiSkinTone())) {\n        const alias = emoji.aliases.find(a => a.startsWith(prefix));\n        if (alias) {\n          completions.push({\n            ...emoji,\n            aliases: [alias],\n          });\n        }\n        if (completions.length >= kMaxEmojiCompletions) {\n          break;\n        }\n      }\n\n      // return result\n      return {\n        pos,\n        token: prefix,\n        completions: () => Promise.resolve(completions),\n      };\n\n      // no match\n    } else {\n      return null;\n    }\n  };\n}\n\nconst EmojiView: React.FC<Emoji> = emoji => {\n  return (\n    <div className={'pm-completion-list-item-text pm-emoji-font'}>\n      {emoji.emoji}&nbsp;:{emoji.aliases[0]}:\n    </div>\n  );\n};\n\nexport function emojiSkintonePreferenceCompletionHandler(ui: EditorUI): CompletionHandler<Emoji> {\n  return {\n    id: '15E92D42-8006-40F4-8FFD-6526F6A8A7FD',\n\n    completions: emojiSkintonePreferenceCompletions(ui),\n\n    replacement(schema: Schema, emoji: Emoji | null): string | ProsemirrorNode | null {\n      if (emoji) {\n        // Save this preference and use it in the future\n        ui.prefs.setEmojiSkinTone(emoji.skinTone);\n\n        // Emit the emoji of the correct skin tone\n        return nodeForEmoji(schema, emoji, emoji.aliases[0]);\n      } else {\n        // The user didn't select a skintoned emoji (e.g. pressed 'ESC'), so\n        // just store Default and use that in the future\n        ui.prefs.setEmojiSkinTone(SkinTone.Default);\n\n        return null;\n      }\n    },\n\n    view: {\n      header: () => ({\n        component: EmojiSkintonePreferenceHeaderView,\n        height: kHeaderHeight,\n      }),\n      component: EmojiSkintonePreferenceView,\n      key: pref => pref.skinTone,\n      width: kCellWidth,\n      height: kCellWidth,\n      horizontal: true,\n      horizontalItemWidths: [55],\n    },\n  };\n}\n\nconst kCellWidth = 40;\nconst kHeaderHeight = 20;\n\nfunction emojiSkintonePreferenceCompletions(ui: EditorUI) {\n  return (text: string, context: EditorState | Transaction): CompletionResult<Emoji> | null => {\n    // The user has set a preference for skin tone\n    if (ui.prefs.emojiSkinTone() !== SkinTone.None) {\n      return null;\n    }\n\n    const range = getMarkRange(context.doc.resolve(context.selection.head - 1), context.doc.type.schema.marks.emoji);\n    if (!range) {\n      return null;\n    }\n\n    const emojiText = context.doc.textBetween(range.from, range.to);\n\n    // If an attribute to suppress the prompt was explicitly set, don't prompt\n    // the user for a skin tone\n    const emojiAttrs = getMarkAttrs(context.doc, range, context.doc.type.schema.marks.emoji);\n    if (!emojiAttrs.prompt) {\n      return null;\n    }\n    const emoji = emojiFromChar(emojiText);\n\n    // If this is an emoji that doesn't support skin tones just return\n    if (!emoji?.supportsSkinTone) {\n      return null;\n    }\n\n    return {\n      pos: range.from,\n      token: emojiText,\n      completions: () => Promise.resolve(emojiForAllSkinTones(emoji)),\n    };\n  };\n}\n\nconst EmojiSkintonePreferenceHeaderView: React.FC<CompletionHeaderProps> = props => {\n  return (\n    <div className={'pm-completion-emoji-cell-header pm-light-text-color'}>\n      {props.ui.context.translateText('Choose preferred skin tone:')}\n    </div>\n  );\n};\n\n// use outline to apply border as a separator\nconst EmojiSkintonePreferenceView: React.FC<Emoji> = emoji => {\n  return <div className=\"pm-completion-list-item-text pm-completion-emoji-cell\">{emoji.emoji}</div>;\n};\n","/*\n * insert_symbol-emoji-skintone.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { TextButton } from '../../api/widgets/button';\n\nimport { SkinTone, emojiFromAlias, emojiWithSkinTonePreference, emojiForAllSkinTones, Emoji } from '../../api/emoji';\nimport { SymbolPreferencesProps } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-emoji-skintone.css';\n\nexport const SymbolEmojiPreferencesPanel = React.forwardRef<any, SymbolPreferencesProps>((props, ref) => {\n  // The currently selected skin tone\n  const [selectedSkinTone, setSelectedSkinTone] = React.useState<SkinTone>(props.prefs.emojiSkinTone());\n\n  // Shows and hides the selection UI\n  const [selectSkinTone, setSelectSkinTone] = React.useState<boolean>(false);\n\n  const previewEmoji = React.useMemo(() => {\n    const emojiRaw = emojiFromAlias('hand');\n    return emojiWithSkinTonePreference(emojiRaw!, selectedSkinTone);\n  }, [selectedSkinTone]);\n\n  const previewEmojiWithSkinTones = React.useMemo(() => {\n    return emojiForAllSkinTones(previewEmoji);\n  }, [previewEmoji]);\n\n  // If the user navigates or changes the symbol, close the picker\n  React.useEffect(() => {\n    setSelectSkinTone(false);\n  }, [props.selectedSymbolIndex]);\n\n  // Support navigation within the panel\n  const handleKeyDown = (event: React.KeyboardEvent) => {\n    switch (event.key) {\n      case 'ArrowRight':\n        if (selectSkinTone) {\n          setSelectedSkinTone(nextSkinTone());\n        }\n        break;\n\n      case 'ArrowLeft':\n        if (selectSkinTone) {\n          setSelectedSkinTone(previousSkinTone());\n        }\n        break;\n\n      case 'Enter':\n      case ' ':\n        commitSkinTonePreference(selectedSkinTone);\n        setSelectSkinTone(!selectSkinTone);\n        event.preventDefault();\n        break;\n    }\n  };\n\n  const handleClick = (skinTone: SkinTone) => {\n    return (event: React.MouseEvent<HTMLElement>) => {\n      commitSkinTonePreference(skinTone);\n      setSelectSkinTone(false);\n    };\n  };\n\n  const handleButtonClick = () => {\n    setSelectSkinTone(true);\n  };\n\n  function nextSkinTone(): SkinTone {\n    const index = getCurrentSkinToneIndex();\n    if (index + 1 < previewEmojiWithSkinTones.length) {\n      return previewEmojiWithSkinTones[index + 1].skinTone;\n    }\n    return selectedSkinTone;\n  }\n\n  function previousSkinTone(): SkinTone {\n    const index = getCurrentSkinToneIndex();\n    if (index - 1 >= 0) {\n      return previewEmojiWithSkinTones[index - 1].skinTone;\n    }\n    return selectedSkinTone;\n  }\n\n  function getCurrentSkinToneIndex(): number {\n    const index = previewEmojiWithSkinTones.findIndex(emoji => emoji.skinTone === selectedSkinTone);\n    return Math.max(Math.min(index, previewEmojiWithSkinTones.length), 0);\n  }\n\n  function skinToneSelectedClass(emoji: Emoji): string {\n    if (\n      selectedSkinTone === emoji.skinTone ||\n      (selectedSkinTone === SkinTone.None && emoji.skinTone === SkinTone.Default)\n    ) {\n      return 'pm-emoji-skintone-picker-item-selected pm-input-button';\n    }\n    return '';\n  }\n\n  function commitSkinTonePreference(skinTone: SkinTone) {\n    setSelectedSkinTone(skinTone);\n    props.prefs.setEmojiSkinTone(skinTone);\n    props.onPreferencesChanged();\n  }\n\n  const skinTonePicker = () => {\n    return (\n      <div>\n        <div className=\"pm-emoji-skintone-picker pm-input-button\">\n          {previewEmojiWithSkinTones.map(emoji => {\n            return (\n              <div\n                key={emoji.emoji}\n                className={`pm-emoji-skintone-picker-item ${skinToneSelectedClass(emoji)}`}\n                onClick={handleClick(emoji.skinTone)}\n              >\n                {emoji.emoji}\n              </div>\n            );\n          })}\n        </div>\n        <div className=\"pm-emoji-skintone-picker-label pm-light-text-color\">\n          {props.context.translateText('Preferred skin tone')}\n        </div>\n      </div>\n    );\n  };\n\n  const currentSkinToneButton = () => {\n    return (\n      <TextButton\n        classes={['pm-emoji-skintone-picker-button', 'pm-light-text-color']}\n        title={\n          selectedSkinTone === SkinTone.None\n            ? props.context.translateText(`${previewEmoji.emoji} Skin tone`)\n            : previewEmoji.emoji\n        }\n        onClick={handleButtonClick}\n        tabIndex={-1}\n      />\n    );\n  };\n\n  return (\n    <div className=\"pm-emoji-skintone-picker-container pm-emoji-font\" onKeyDown={handleKeyDown} tabIndex={0} ref={ref}>\n      {selectSkinTone ? skinTonePicker() : currentSkinToneButton()}\n    </div>\n  );\n});\n","/*\n * insert_special_characters.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorCommandId, InsertCharacterCommand } from '../../api/command';\n\nconst extension = {\n  commands: () => {\n    return [\n      new InsertCharacterCommand(EditorCommandId.EmDash, '—', []),\n      new InsertCharacterCommand(EditorCommandId.EnDash, '–', []),\n      new InsertCharacterCommand(EditorCommandId.HardLineBreak, '\\n', ['Shift-Enter']),\n    ];\n  },\n};\n\nexport default extension;\n","/*\n * nbsp.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { EditorCommandId, InsertCharacterCommand } from '../api/command';\nimport { forChangedNodes } from '../api/transaction';\nimport { mergedTextNodes } from '../api/text';\n\nconst kNbsp = '\\u00A0';\nconst kNbspRegEx = /\\xA0/g;\n\nconst extension = {\n  commands: () => {\n    return [new InsertCharacterCommand(EditorCommandId.NonBreakingSpace, kNbsp, ['Ctrl-Space', 'Ctrl-Shift-Space'])];\n  },\n\n  plugins: () => {\n    return [nonBreakingSpacePastePlugin(), nonBreakingSpaceHighlightPlugin()];\n  },\n};\n\nconst pastePluginKey = new PluginKey('nbsp-paste');\n\nfunction nonBreakingSpacePastePlugin() {\n  return new Plugin({\n    key: pastePluginKey,\n    props: {\n      transformPastedHTML: (html: string) => {\n        // strips spans that contain a single non-breaking space (chrome/webkit seem to\n        // do this for spaces surrounding marked html)\n        return html.replace(/<span> <\\/span>/g, ' ');\n      },\n    },\n  });\n}\n\nconst highlightPluginKey = new PluginKey('nbsp-highlight');\n\nfunction nonBreakingSpaceHighlightPlugin() {\n  return new Plugin<DecorationSet>({\n    key: highlightPluginKey,\n    state: {\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return DecorationSet.create(instance.doc, highlightNode(instance.doc));\n      },\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        // map\n        set = set.map(tr.mapping, tr.doc);\n\n        // find new\n        if (tr.docChanged) {\n          const decorations: Decoration[] = [];\n          forChangedNodes(\n            oldState,\n            newState,\n            node => node.isTextblock && node.textContent.includes(kNbsp),\n            (node, pos) => {\n              decorations.push(...highlightNode(node, pos + 1));\n            },\n          );\n          set = set.add(tr.doc, decorations);\n        }\n\n        // return the set\n        return set;\n      },\n    },\n    props: {\n      decorations(state: EditorState) {\n        return highlightPluginKey.getState(state);\n      },\n    },\n  });\n}\n\nfunction highlightNode(node: ProsemirrorNode, nodePos = 0) {\n  const decorations: Decoration[] = [];\n  const textNodes = mergedTextNodes(node);\n  textNodes.forEach(textNode => {\n    const text = textNode.text;\n    let m;\n    kNbspRegEx.lastIndex = 0;\n    // tslint:disable-next-line no-conditional-assignment\n    while ((m = kNbspRegEx.exec(text))) {\n      if (m[0] === '') {\n        break;\n      }\n      const from = nodePos + textNode.pos + m.index;\n      const to = nodePos + textNode.pos + m.index + m[0].length;\n      const classes = ['pm-nbsp', 'pm-invisible-text-color'];\n      decorations.push(Decoration.inline(from, to, { class: classes.join(' ') }));\n    }\n    kNbspRegEx.lastIndex = 0;\n  });\n  return decorations;\n}\n\nexport default extension;\n","/*\n * remove_section.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { Transaction, EditorState, Selection, Plugin, PluginKey } from 'prosemirror-state';\nimport { ReplaceStep, ReplaceAroundStep } from 'prosemirror-transform';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { isList } from '../api/list';\nimport { transactionsDocChanged } from '../api/transaction';\n\nconst extension: Extension = {\n\n  plugins: (schema: Schema) => {\n    return [\n      new Plugin({\n        key: new PluginKey('remove-section'),\n        appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n          \n          // skip for selection-only changes\n          if (!transactionsDocChanged(transactions)) {\n            return;\n          }\n\n          if (isSectionRemoval(transactions, oldState)) {\n\n            // if we had selected the entire contents of a div then prosemirror will remove\n            // the div entirely -- we actually want to leave an empty div in place\n            const fullySelectedDiv = fullySelectedDivSection(oldState); \n            if (fullySelectedDiv) {\n              const tr = newState.tr;\n              tr.replaceSelectionWith(\n                schema.nodes.div.create(fullySelectedDiv.node.attrs,\n                                        schema.nodes.paragraph.create()));\n              return tr;\n            }\n      \n      \n            // if we are left with an empty selection in an empty heading block this may\n            // have been the removal of a section (more than 1 textBlock). in that case\n            // remove the empty heading node\n            else if (isEmptyHeadingSelection(newState.selection)) {\n              const tr = newState.tr;\n              const $head = tr.selection.$head;\n              const start = $head.start();\n              const end = start + 2;\n              tr.deleteRange(start, end);\n              return tr;\n            }\n          }\n\n\n        }\n      })\n    ];\n  },\n};\n\n\nfunction isSectionRemoval(transactions: Transaction[], oldState: EditorState) {\n  // was this the removal of a section?\n  let isRemoval = false;\n  if (transactions.length === 1 && transactions[0].steps.length === 1) {\n    // see if this is a delete step\n    let isDeleteStep = false;\n    const step = transactions[0].steps[0];\n    if (step instanceof ReplaceStep) {\n      isDeleteStep = (step as any).slice.content.size === 0;\n    } else if (step instanceof ReplaceAroundStep) {\n      const { gapFrom, gapTo } = step as any;\n      isDeleteStep = gapFrom === gapTo;\n    }\n\n    // if it's a delete step then see if we removed multiple text blocks\n    let numBlocks = 0;\n    const { from, to } = step as any;\n    oldState.doc.nodesBetween(from, to, node => {\n      if (isRemoval) {\n        return false;\n      }\n      if (isList(node)) {\n        isRemoval = true;\n        return false;\n      } else if (node.isTextblock) {\n        if (numBlocks++ >= 1) {\n          isRemoval = true;\n          return false;\n        }\n      }\n    });\n  }\n\n  return isRemoval;\n}\n\n\nfunction fullySelectedDivSection(state: EditorState) {\n\n  if (!state.selection.empty && state.schema.nodes.div) {\n\n    const div = findParentNodeOfType(state.schema.nodes.div)(state.selection);\n    if (div) {\n     \n      // calculate the inner selection of the div (accounting for container position offsets)\n      let divSelFrom = div.start + 1; // offset to get to beginning first block text\n      let divSelTo = div.pos + div.node.nodeSize - 2; // offset to end of last block text\n     \n      // if the div's first child is a list we need to push in 2 more\n      if (isList(div.node.firstChild)) {\n        divSelFrom += 2;\n      }\n      // if the div's last child is a list we need to push in 2 more\n      if (isList(div.node.lastChild)) {\n        divSelTo -=2;\n      }\n\n      // does the selection span the entire div?\n      if (state.selection.from === divSelFrom && state.selection.to === divSelTo) {\n        return div;\n      } else {\n        return false;\n      }\n    }\n  }\n\n  return false;\n}\n\n\nfunction isEmptyHeadingSelection(selection: Selection) {\n  const parent = selection.$head.parent;\n  const schema = parent.type.schema;\n  return selection.empty && parent.type === schema.nodes.heading && parent.content.size === 0;\n}\n\n\nexport default extension;\n","/*\n * strikeout.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'strikeout',\n      spec: {\n        group: 'formatting',\n        parseDOM: [\n          { tag: 'del' },\n          { tag: 's' },\n          {\n            style: 'text-decoration',\n            getAttrs: (value: string | Node) => (value as string) === 'line-through' && null,\n          },\n        ],\n        toDOM() {\n          return ['del'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Strikeout,\n            mark: 'strikeout',\n          },\n        ],\n        writer: {\n          priority: 6,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Strikeout, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Strikeout, [], schema.marks.strikeout)];\n  },\n\n  inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n    return [delimiterMarkInputRule('~~', schema.marks.strikeout, filter, '`', true)];\n  },\n};\n\nexport default extensionIfEnabled(extension, 'strikeout');\n","/*\n * superscript.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'superscript',\n      spec: {\n        group: 'formatting',\n        parseDOM: [{ tag: 'sup' }],\n        toDOM() {\n          return ['sup'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Superscript,\n            mark: 'superscript',\n          },\n        ],\n        writer: {\n          priority: 15,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Superscript, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Superscript, [], schema.marks.superscript)];\n  },\n\n  inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n    return [delimiterMarkInputRule('\\\\^', schema.marks.superscript, filter, '`', true)];\n  },\n};\n\nexport default extensionIfEnabled(extension, 'superscript');\n","/*\n * subscript.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'subscript',\n      spec: {\n        group: 'formatting',\n        parseDOM: [{ tag: 'sub' }],\n        toDOM() {\n          return ['sub'];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Subscript,\n            mark: 'subscript',\n          },\n        ],\n        writer: {\n          priority: 15,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Subscript, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Subscript, [], schema.marks.subscript)];\n  },\n\n  inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n    return [delimiterMarkInputRule('\\\\~', schema.marks.subscript, filter, '`\\\\~-', true)];\n  },\n};\n\nexport default extensionIfEnabled(extension, 'subscript');\n","/*\n * smallcaps.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './smallcaps-styles.css';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'smallcaps',\n      spec: {\n        group: 'formatting',\n        parseDOM: [\n          { tag: \"span[class*='smallcaps']\" },\n          { style: 'font-variant', getAttrs: (value: string | Node) => (value as string) === 'small-caps' && null },\n        ],\n        toDOM() {\n          return ['span', { class: 'smallcaps' }];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.SmallCaps,\n            mark: 'smallcaps',\n          },\n        ],\n        writer: {\n          priority: 8,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.SmallCaps, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Smallcaps, [], schema.marks.smallcaps)];\n  },\n};\n\nexport default extensionIfEnabled(extension, ['bracketed_spans', 'native_spans']);\n","/*\n * underline.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './underline-styles.css';\n\nconst extension: Extension = {\n  marks: [\n    {\n      name: 'underline',\n      spec: {\n        parseDOM: [\n          { tag: \"span[class*='underline']\" },\n          { tag: \"span[class*='ul']\" },\n          { tag: \"u\" },\n          { tag: \"ins\" }\n        ],\n        toDOM() {\n          return ['span', { class: 'underline' }];\n        },\n      },\n      pandoc: {\n        readers: [\n          {\n            token: PandocTokenType.Underline,\n            mark: 'underline',\n          },\n        ],\n        writer: {\n          priority: 7,\n          write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n            output.writeMark(PandocTokenType.Underline, parent);\n          },\n        },\n      },\n    },\n  ],\n\n  commands: (schema: Schema) => {\n    return [new MarkCommand(EditorCommandId.Underline, [], schema.marks.underline)];\n  },\n};\n\nexport default extensionIfEnabled(extension, ['bracketed_spans', 'native_spans']);\n","/*\n * raw_inline.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, MarkType } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { PandocOutput, PandocToken, PandocTokenType } from '../../api/pandoc';\nimport { getMarkRange, markIsActive, getMarkAttrs } from '../../api/mark';\nimport { EditorUI } from '../../api/ui';\nimport { RawFormatProps } from '../../api/ui-dialogs';\nimport { canInsertNode } from '../../api/node';\nimport { fragmentText } from '../../api/fragment';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport const kRawInlineFormat = 0;\nexport const kRawInlineContent = 1;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, pandocCapabilities, ui } = context;\n\n  // always enabled so that extensions can make use of preprocessors + raw_attribute\n  // to hoist content out of pandoc for further processing by our token handlers.\n  // that means that users can always use the raw attribute in their markdown even\n  // if the editing format doesn't support it (in which case it will just get echoed\n  // back to the markdown just the way it was written).\n\n  // return the extension\n  return {\n    marks: [\n      {\n        name: 'raw_inline',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          inclusive: false,\n          excludes: 'formatting',\n          attrs: {\n            format: {},\n          },\n          parseDOM: [\n            {\n              tag: \"span[class*='raw-inline']\",\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                return {\n                  format: el.getAttribute('data-format'),\n                };\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            const attr: any = {\n              class: 'raw-inline pm-fixedwidth-font pm-markup-text-color',\n              'data-format': mark.attrs.format,\n            };\n            return ['span', attr];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.RawInline,\n              mark: 'raw_inline',\n              getAttrs: (tok: PandocToken) => {\n                return {\n                  format: tok.c[kRawInlineFormat],\n                };\n              },\n              getText: (tok: PandocToken) => {\n                return tok.c[kRawInlineContent];\n              },\n            },\n          ],\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              // get raw content\n              const raw = fragmentText(parent);\n\n              // write it\n              output.writeToken(PandocTokenType.RawInline, () => {\n                output.write(mark.attrs.format);\n                output.write(raw);\n              });\n            },\n          },\n        },\n      },\n    ],\n\n    // insert command\n    commands: (_schema: Schema) => {\n      if (pandocExtensions.raw_attribute) {\n        return [new RawInlineCommand(EditorCommandId.RawInline, '', ui, pandocCapabilities.output_formats)];\n      } else {\n        return [];\n      }\n    },\n  };\n};\n\n// base class for inline commands that auto-insert content\nexport class RawInlineInsertCommand extends ProsemirrorCommand {\n  private markType: MarkType;\n  constructor(id: EditorCommandId, keymap: readonly string[], markType: MarkType, insert: (tr: Transaction) => void) {\n    super(id, keymap, (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n      // if we aren't active then make sure we can insert a text node here\n      if (!this.isActive(state) && !canInsertNode(state, markType.schema.nodes.text)) {\n        return false;\n      }\n\n      // ensure we can apply this mark here\n      if (!toggleMarkType(this.markType)(state)) {\n        return false;\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n\n        if (this.isActive(state)) {\n          const range = getMarkRange(state.selection.$head, this.markType);\n          if (range) {\n            tr.removeMark(range.from, range.to, this.markType);\n          }\n        } else if (!tr.selection.empty) {\n          const mark = markType.create();\n          tr.addMark(tr.selection.from, tr.selection.to, mark);\n        } else {\n          insert(tr);\n        }\n\n        dispatch(tr);\n      }\n\n      return true;\n    });\n    this.markType = markType;\n  }\n\n  public isActive(state: EditorState) {\n    return markIsActive(state, this.markType);\n  }\n}\n\n// generic raw inline command (opens dialog that allows picking from among formats)\nexport class RawInlineCommand extends ProsemirrorCommand {\n  constructor(id: EditorCommandId, defaultFormat: string, ui: EditorUI, outputFormats: string[]) {\n    super(\n      id,\n      [],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        const schema = state.schema;\n\n        if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.raw_inline)(state)) {\n          return false;\n        }\n\n        async function asyncInlineRaw() {\n          if (dispatch) {\n            // check if mark is active\n            const isActive = markIsActive(state, schema.marks.raw_inline);\n\n            // get the range of the mark\n            let range = { from: state.selection.from, to: state.selection.to };\n            if (isActive) {\n              range = getMarkRange(state.selection.$from, schema.marks.raw_inline) as { from: number; to: number };\n            }\n\n            // get raw attributes if we have them\n            let raw: RawFormatProps = { content: '', format: defaultFormat };\n            raw.content = state.doc.textBetween(range.from, range.to);\n            if (isActive) {\n              raw = {\n                ...raw,\n                ...getMarkAttrs(state.doc, state.selection, schema.marks.raw_inline),\n              };\n            }\n\n            const result = await ui.dialogs.editRawInline(raw, outputFormats);\n            if (result) {\n              const tr = state.tr;\n              tr.removeMark(range.from, range.to, schema.marks.raw_inline);\n              if (result.action === 'edit') {\n                const mark = schema.marks.raw_inline.create({ format: result.raw.format });\n                const node = schema.text(result.raw.content, [mark]);\n                // if we are editing a selection then replace it, otherwise insert\n                if (raw.content) {\n                  tr.replaceRangeWith(range.from, range.to, node);\n                } else {\n                  tr.replaceSelectionWith(node, false);\n                }\n              }\n              dispatch(tr);\n            }\n\n            if (view) {\n              view.focus();\n            }\n          }\n        }\n        asyncInlineRaw();\n\n        return true;\n      },\n      {\n        name: ui.context.translateText('Raw Inline...'),\n        description: ui.context.translateText('Raw inline content'),\n        group: OmniInsertGroup.Content,\n        priority: 0,\n        image: () =>\n          ui.prefs.darkMode() ? ui.images.omni_insert?.raw_inline_dark! : ui.images.omni_insert?.raw_inline!,\n      },\n    );\n  }\n}\n\nexport default extension;\n","/*\n * raw_tex.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Mark, Fragment, Schema } from 'prosemirror-model';\nimport { DecorationSet } from 'prosemirror-view';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { InputRule, inputRules } from 'prosemirror-inputrules';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocToken, PandocTokenType, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { kTexFormat } from '../../api/raw';\nimport { markHighlightPlugin, markHighlightDecorations } from '../../api/mark-highlight';\nimport { MarkTransaction } from '../../api/transaction';\nimport { markIsActive, splitInvalidatedMarks } from '../../api/mark';\nimport { EditorCommandId, toggleMarkType } from '../../api/command';\nimport { texLength } from '../../api/tex';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { kRawInlineFormat, kRawInlineContent, RawInlineInsertCommand } from './raw_inline';\n\nconst kTexPlaceholder = 'tex';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions } = context;\n\n  if (!pandocExtensions.raw_tex) {\n    return null;\n  }\n\n  return {\n    marks: [\n      {\n        name: 'raw_tex',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          inclusive: true,\n          excludes: 'formatting',\n          attrs: {},\n          parseDOM: [\n            {\n              tag: \"span[class*='raw-tex']\",\n            },\n          ],\n          toDOM(_mark: Mark) {\n            const attr: any = {\n              class: 'raw-tex pm-fixedwidth-font',\n            };\n            return ['span', attr];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.RawInline,\n              mark: 'raw_tex',\n              match: (tok: PandocToken) => {\n                const format = tok.c[kRawInlineFormat];\n                return format === kTexFormat;\n              },\n              getText: (tok: PandocToken) => {\n                return tok.c[kRawInlineContent];\n              },\n            },\n          ],\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              output.writeRawMarkdown(parent);\n            },\n          },\n        },\n      },\n    ],\n\n    // insert command\n    commands: (schema: Schema) => {\n      return [new InsertInlineLatexCommand(schema)];\n    },\n\n    appendMarkTransaction: (schema: Schema) => {\n      return [\n        {\n          name: 'remove-raw-tex-marks',\n          filter: node => node.isTextblock && node.type.allowsMarkType(schema.marks.raw_tex),\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            splitInvalidatedMarks(tr, node, pos, texLength, schema.marks.raw_tex);\n          },\n        },\n      ];\n    },\n\n    inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n      return [texInputRule(schema, filter)];\n    },\n\n    // plugin to add highlighting decorations\n    plugins: (schema: Schema) => {\n      // plugins to return\n      const plugins: Plugin[] = [];\n\n      // latex equation highlighting\n      plugins.push(latexHighlightingPlugin(schema));\n\n      // latex brace matching\n      const braces = new Map([\n        ['{', '}'],\n        ['[', ']'],\n      ]);\n      plugins.push(\n        inputRules({\n          rules: [\n            new InputRule(/(^|[^^\\\\])([{[])$/, (state: EditorState, match: string[], start: number, end: number) => {\n              if (markIsActive(state, schema.marks.raw_tex)) {\n                const tr = state.tr;\n                tr.insertText(match[2] + braces.get(match[2]));\n                setTextSelection(start + match[1].length + 1)(tr);\n                return tr;\n              } else {\n                return null;\n              }\n            }),\n          ],\n        }),\n      );\n\n      // return\n      return plugins;\n    },\n  };\n};\n\nfunction texInputRule(schema: Schema, filter: MarkInputRuleFilter) {\n  return new InputRule(/(^| )\\\\$/, (state: EditorState, match: string[], start: number, end: number) => {\n    const rawTexMark = schema.marks.raw_tex;\n\n    if (state.selection.empty && toggleMarkType(rawTexMark)(state)) {\n      // if there is no tex ahead of us or we don't pass the fitler (b/c marks that don't allow\n      // input rules are active) then bail\n      const $head = state.selection.$head;\n      const texText = '\\\\' + $head.parent.textContent.slice($head.parentOffset);\n      if (!texText.startsWith('\\\\ ')) {\n        const texMatchLength = texLength(texText);\n        if (texMatchLength === 0 || !filter(state, state.selection.from, state.selection.from + texMatchLength)) {\n          return null;\n        }\n      }\n\n      // create transaction\n      const tr = state.tr;\n\n      // insert tex backslash\n      const mark = schema.marks.raw_tex.create();\n      tr.addStoredMark(mark);\n      tr.insertText('\\\\');\n\n      // extend the mark to cover any valid tex that immediately follows the \\\n      const { parent, parentOffset } = tr.selection.$head;\n      const text = parent.textContent.slice(parentOffset - 1);\n      if (text.length > 0) {\n        const length = texLength(text);\n        if (length > 1) {\n          const startTex = tr.selection.from - 1;\n          tr.addMark(startTex, startTex + length, mark);\n          return tr;\n        }\n      }\n\n      // insert placeholder if it's a standalone \\\n      if (text === '\\\\' || text.startsWith('\\\\ ')) {\n        tr.insertText(kTexPlaceholder);\n        setTexSelectionAfterInsert(tr);\n        return tr;\n      }\n    }\n\n    // didn't find a valid context for a tex comand\n    return null;\n  });\n}\n\nclass InsertInlineLatexCommand extends RawInlineInsertCommand {\n  constructor(schema: Schema) {\n    super(EditorCommandId.TexInline, [], schema.marks.raw_tex, (tr: Transaction) => {\n      const mark = schema.marks.raw_tex.create();\n      const tex = '\\\\' + kTexPlaceholder;\n      const node = schema.text(tex, [mark]);\n      tr.replaceSelectionWith(node, false);\n      setTexSelectionAfterInsert(tr);\n    });\n  }\n}\n\nfunction setTexSelectionAfterInsert(tr: Transaction) {\n  tr.setSelection(\n    new TextSelection(tr.doc.resolve(tr.selection.from - kTexPlaceholder.length), tr.doc.resolve(tr.selection.from)),\n  );\n}\n\nconst key = new PluginKey<DecorationSet>('latex-highlight');\n\nexport function latexHighlightingPlugin(schema: Schema) {\n  const kLightTextClass = 'pm-light-text-color';\n  return markHighlightPlugin(key, schema.marks.raw_tex, (text, _attrs, markRange) => {\n    const kIdClass = 'pm-markup-text-color';\n    let decorations = markHighlightDecorations(markRange, text, /\\\\[A-Za-z]+/g, kIdClass);\n    decorations = decorations.concat(markHighlightDecorations(markRange, text, /[{}[\\]]/g, kLightTextClass));\n    return decorations;\n  });\n}\n\nexport default extension;\n","/*\n * mark-highlight.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey, Plugin, EditorState, Transaction } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Node as ProsemirrorNode, MarkType } from 'prosemirror-model';\nimport { findChildrenByMark } from 'prosemirror-utils';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\n\nimport { getMarkRange, getMarkAttrs } from './mark';\nimport { forChangedNodes } from './transaction';\n\nexport type MarkHighligher = (\n  text: string,\n  attrs: { [key: string]: any },\n  range: { from: number; to: number },\n) => Decoration[];\n\nexport function markHighlightDecorations(\n  markRange: { from: number; to: number },\n  text: string,\n  re: RegExp,\n  className: string,\n) {\n  const decorations: Decoration[] = [];\n  re.lastIndex = 0;\n  let match = re.exec(text);\n  while (match) {\n    decorations.push(\n      Decoration.inline(markRange.from + match.index, markRange.from + re.lastIndex, { class: className }),\n    );\n    match = re.exec(text);\n  }\n  re.lastIndex = 0;\n  return decorations;\n}\n\nexport function markHighlightPlugin(key: PluginKey<DecorationSet>, markType: MarkType, highlighter: MarkHighligher) {\n  function decorationsForDoc(doc: ProsemirrorNode) {\n    let decorations: Decoration[] = [];\n    findChildrenByMark(doc, markType, true).forEach(markedNode => {\n      decorations = decorations.concat(markDecorations(doc, markType, markedNode.pos, highlighter));\n    });\n    return DecorationSet.create(doc, decorations);\n  }\n\n  return new Plugin<DecorationSet>({\n    key,\n    state: {\n      // initialize by highlighting the entire document\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return decorationsForDoc(instance.doc);\n      },\n\n      // whenever an edit affecting this mark type occurs then update the decorations\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        // ignore selection changes\n        if (!tr.docChanged) {\n          return set.map(tr.mapping, tr.doc);\n        }\n\n        // if one of the steps added or removed a mark of our type then rescan the doc.\n        if (\n          tr.steps.some(\n            step =>\n              (step instanceof AddMarkStep && (step as any).mark.type === markType) ||\n              (step instanceof RemoveMarkStep && (step as any).mark.type === markType),\n          )\n        ) {\n          // rehighlight entire doc\n          return decorationsForDoc(newState.doc);\n\n          // incremental rehighlighting based on presence of mark in changed regions\n        } else {\n          // adjust decoration positions to changes made by the transaction (decorations that apply\n          // to removed chunks of content will be removed by this)\n          set = set.map(tr.mapping, tr.doc);\n\n          // function to rehighlight parent of specified pos\n          const rehighlightParent = (pos: number) => {\n            const resolvedPos = tr.doc.resolve(pos);\n            const parent = resolvedPos.node();\n            const from = resolvedPos.start();\n            const marks = findChildrenByMark(parent, markType);\n            marks.forEach(mark => {\n              const markRange = getMarkRange(tr.doc.resolve(from + mark.pos), markType) as { from: number; to: number };\n              const removeDecorations = set.find(markRange.from, markRange.to);\n              set = set.remove(removeDecorations);\n              const addDecorations = markDecorations(tr.doc, markType, markRange.from, highlighter);\n              set = set.add(tr.doc, addDecorations);\n            });\n          };\n\n          // rehighlight nodes that changed and have our mark type\n          forChangedNodes(\n            oldState,\n            newState,\n            node => node.type.allowsMarkType(markType),\n            (node, pos) => {\n              if (newState.doc.rangeHasMark(pos, pos + node.nodeSize, markType)) {\n                rehighlightParent(pos);\n              }\n            },\n          );\n\n          return set;\n        }\n      },\n    },\n    props: {\n      decorations(state: EditorState) {\n        return key.getState(state);\n      },\n    },\n  });\n}\n\nfunction markDecorations(doc: ProsemirrorNode, markType: MarkType, pos: number, highlighter: MarkHighligher) {\n  const markRange = getMarkRange(doc.resolve(pos), markType);\n  if (markRange) {\n    const attrs = getMarkAttrs(doc, markRange, markType);\n    const text = doc.textBetween(markRange.from, markRange.to);\n    return highlighter(text, attrs, markRange);\n  } else {\n    return [];\n  }\n}\n","/*\n * tex.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Get the length of valid tex content for the passed text. return values include:\n//  -1: Invalid tex content (starts with \\ but doesn't close braces/brackets properly)\n//   0: Not tex content\n//  >1: Length of valid tex string\nexport function texLength(text: string) {\n  let braceLevel = 0;\n  let bracketLevel = 0;\n\n  let i;\n  for (i = 0; i < text.length; i++) {\n    // next character\n    const ch = text[i];\n\n    // must start with \\{ltr}\n    if (i === 0 && ch !== '\\\\') {\n      return 0;\n    }\n    if (i === 1 && !isLetter(ch)) {\n      return 0;\n    }\n\n    // only letters, backslashes, and open brace/bracket allowed (unless we are in braces or brackets)\n    const inBraces = braceLevel >= 1;\n    const inBrackets = bracketLevel >= 1;\n    if (i > 0 && !isLetter(ch) && ch !== '\\\\' && ch !== '{' && ch !== '[' && !inBraces && !inBrackets) {\n      return i;\n    }\n\n    // manage brace and bracket levels\n    if (ch === '{') {\n      braceLevel++;\n    } else if (ch === '}') {\n      braceLevel--;\n    } else if (ch === '[') {\n      bracketLevel++;\n    } else if (ch === ']') {\n      bracketLevel--;\n    }\n  }\n\n  if (braceLevel === 0 && bracketLevel === 0) {\n    return i;\n  } else {\n    return -1; // invalid tex\n  }\n}\n\nexport function isSingleLineTex(tex: string) {\n  return tex.trimRight().split('\\n').length === 1;\n}\n\nconst LetterRegex = /[A-Za-z]/;\nfunction isLetter(ch: string) {\n  return LetterRegex.test(ch);\n}\n","/*\n * raw_html.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Schema, Fragment } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocTokenType, PandocToken, ProsemirrorWriter, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { isRawHTMLFormat } from '../../api/raw';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { kRawInlineFormat, kRawInlineContent } from './raw_inline';\nimport { toggleMarkType } from '../../api/command';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions } = context;\n  return {\n    marks: [\n      {\n        name: 'raw_html',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          inclusive: false,\n          excludes: 'formatting',\n          parseDOM: [\n            {\n              tag: \"span[class*='raw-html']\",\n              getAttrs(dom: Node | string) {\n                return {};\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            const attr: any = {\n              class: 'raw-html pm-fixedwidth-font pm-markup-text-color',\n            };\n            return ['span', attr];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.RawInline,\n              match: (tok: PandocToken) => {\n                const format = tok.c[kRawInlineFormat];\n                return isRawHTMLFormat(format);\n              },\n              handler: (schema: Schema) => {\n                return (writer: ProsemirrorWriter, tok: PandocToken) => {\n                  const html = tok.c[kRawInlineContent];\n                  if (writer.hasInlineHTMLWriter(html)) {\n                    writer.writeInlineHTML(html);\n                  } else {\n                    writeInlneHTML(schema, html, writer);\n                  }\n                };\n              },\n            },\n          ],\n\n          inlineHTMLReader: (schema: Schema, html: string, writer?: ProsemirrorWriter) => {\n            // read single tags as inline html\n            const isSingleTag = tagStartLoc(html, html.length - 2) === 0;\n            if (isSingleTag && writer) {\n              writeInlneHTML(schema, html, writer);\n            }\n            return isSingleTag;\n          },\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              output.writeRawMarkdown(parent);\n            },\n          },\n        },\n      },\n    ],\n\n    // input rules\n    inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n      if (pandocExtensions.raw_html) {\n        return [rawHtmlInputRule(schema, filter)];\n      } else {\n        return [];\n      }\n    },\n  };\n};\n\nfunction writeInlneHTML(schema: Schema, html: string, writer: ProsemirrorWriter) {\n  const mark = schema.marks.raw_html.create();\n  writer.openMark(mark);\n  writer.writeText(html);\n  writer.closeMark(mark);\n}\n\nexport function rawHtmlInputRule(schema: Schema, filter: MarkInputRuleFilter) {\n  return new InputRule(/>$/, (state: EditorState, match: string[], start: number, end: number) => {\n    const rawhtmlMark = state.schema.marks.raw_html;\n\n    // ensure we pass all conditions for html input\n    if (state.selection.empty && toggleMarkType(rawhtmlMark)(state) && filter(state, start, end)) {\n      // get tag info\n      const { parent, parentOffset } = state.selection.$head;\n      const text = parent.textContent;\n      const endLoc = parentOffset - 1;\n      const tag = tagInfo(text, endLoc);\n      if (tag) {\n        // create transaction\n        const tr = state.tr;\n\n        // insert >\n        tr.insertText('>');\n\n        // add mark\n        start = tr.selection.from - (tag.end - tag.start + 1);\n        tr.addMark(start, end + 1, rawhtmlMark.create());\n        tr.removeStoredMark(rawhtmlMark);\n\n        // if it wasn't an end tag and it isn't a void tag then also\n        // insert an end tag (and leave the cursor in the middle)\n        if (!tag.close && !tag.void) {\n          const endTag = schema.text(`</${tag.name}>`);\n          tr.replaceSelectionWith(endTag, false);\n          setTextSelection(tr.selection.from - endTag.textContent.length)(tr);\n          tr.addMark(tr.selection.from, tr.selection.from + endTag.textContent.length, rawhtmlMark.create());\n          tr.removeStoredMark(rawhtmlMark);\n        }\n\n        // return transaction\n        return tr;\n      }\n    }\n\n    return null;\n  });\n}\n\nfunction tagInfo(text: string, endLoc: number) {\n  const startLoc = tagStartLoc(text, endLoc);\n  if (startLoc !== -1) {\n    // don't match if preceding character is a backtick\n    // (user is attempting to write an html tag in code)\n    if (text.charAt(startLoc - 1) === '`') {\n      return null;\n    }\n    const tagText = text.substring(startLoc, endLoc + 1);\n    const match = tagText.match(/<(\\/?)(\\w+)/);\n    if (match) {\n      const name = match[2];\n      if (isHTMLTag(name)) {\n        return {\n          name: match[2],\n          close: match[1].length > 0,\n          void: isVoidTag(name),\n          start: startLoc,\n          end: endLoc + 1,\n        };\n      }\n    }\n  }\n  return null;\n}\n\nfunction tagStartLoc(text: string, endLoc: number) {\n  let inSingleQuote = false;\n  let inDoubleQuote = false;\n  let i;\n  for (i = endLoc; i >= 0; i--) {\n    // next character\n    const ch = text[i];\n\n    // invalid if we see another > when not in quotes\n    if (ch === '>' && !inSingleQuote && !inDoubleQuote) {\n      return -1;\n    }\n\n    // > terminate on < if we aren't in quotes\n    if (ch === '<' && !inSingleQuote && !inDoubleQuote) {\n      return i;\n    }\n\n    // handle single quote\n    if (ch === \"'\") {\n      if (inSingleQuote) {\n        inSingleQuote = false;\n      } else if (!inDoubleQuote) {\n        inSingleQuote = true;\n      }\n\n      // handle double quote\n    } else if (ch === '\"') {\n      if (inDoubleQuote) {\n        inDoubleQuote = false;\n      } else if (!inSingleQuote) {\n        inDoubleQuote = true;\n      }\n    }\n  }\n\n  return -1;\n}\n\nfunction isHTMLTag(tag: string) {\n  return [\n    // structural\n    'a',\n    'article',\n    'aside',\n    'body',\n    'br',\n    'details',\n    'div',\n    'h1',\n    'h2',\n    'h3',\n    'h4',\n    'h5',\n    'h6',\n    'head',\n    'header',\n    'hgroup',\n    'hr',\n    'html',\n    'footer',\n    'nav',\n    'p',\n    'section',\n    'span',\n    'summary',\n\n    // metadata\n    'base',\n    'basefont',\n    'link',\n    'meta',\n    'style',\n    'title',\n\n    // form\n    'button',\n    'datalist',\n    'fieldset',\n    'form',\n    'input',\n    'keygen',\n    'label',\n    'legend',\n    'meter',\n    'optgroup',\n    'option',\n    'select',\n    'textarea',\n\n    // formatting\n    'abbr',\n    'acronym',\n    'address',\n    'b',\n    'bdi',\n    'bdo',\n    'big',\n    'blockquote',\n    'center',\n    'cite',\n    'code',\n    'del',\n    'dfn',\n    'em',\n    'font',\n    'i',\n    'ins',\n    'kbd',\n    'mark',\n    'output',\n    'pre',\n    'progress',\n    'q',\n    'rp',\n    'rt',\n    'ruby',\n    's',\n    'samp',\n    'small',\n    'strike',\n    'strong',\n    'sub',\n    'sup',\n    'tt',\n    'u',\n    'var',\n    'wbr',\n\n    // list\n    'dd',\n    'dir',\n    'dl',\n    'dt',\n    'li',\n    'ol',\n    'menu',\n    'ul',\n\n    // table\n    'caption',\n    'col',\n    'colgroup',\n    'table',\n    'tbody',\n    'td',\n    'tfoot',\n    'thead',\n    'th',\n    'tr',\n\n    // scripting\n    'script',\n    'noscript',\n\n    // embedded content\n    'applet',\n    'area',\n    'audio',\n    'canvas',\n    'embed',\n    'figcaption',\n    'figure',\n    'frame',\n    'frameset',\n    'iframe',\n    'img',\n    'map',\n    'noframes',\n    'object',\n    'param',\n    'source',\n    'time',\n    'video',\n  ].includes(tag.toLowerCase());\n}\n\nfunction isVoidTag(tag: string) {\n  return [\n    'area',\n    'base',\n    'br',\n    'col',\n    'command',\n    'embed',\n    'hr',\n    'img',\n    'input',\n    'keygen',\n    'link',\n    'meta',\n    'param',\n    'source',\n    'track',\n    'wbr',\n  ].includes(tag.toLowerCase());\n}\n\nexport default extension;\n","/*\n * math.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Mark, Fragment, Slice } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { InputRule } from 'prosemirror-inputrules';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocTokenType, PandocToken, PandocOutput } from '../../api/pandoc';\nimport { BaseKey } from '../../api/basekeys';\nimport { markIsActive, getMarkAttrs } from '../../api/mark';\nimport { kCodeText } from '../../api/code';\nimport { kMathContent, kMathType, delimiterForType, MathType } from '../../api/math';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { InsertInlineMathCommand, InsertDisplayMathCommand, insertMath } from './math-commands';\nimport { mathAppendMarkTransaction } from './math-transaction';\nimport { mathHighlightPlugin } from './math-highlight';\nimport { MathPopupPlugin } from './math-popup';\nimport { mathViewPlugins } from './math-view';\n\nimport './math-styles.css';\nimport { kPasteTransaction } from '../../api/transaction';\n\nconst kInlineMathPattern = '\\\\$[^ ].*?[^\\\\ ]?\\\\$';\nconst kInlineMathRegex = new RegExp(kInlineMathPattern);\n\nconst kSingleLineDisplayMathPattern = '\\\\$\\\\$[^\\n]*?\\\\$\\\\$';\nconst kSingleLineDisplayMathRegex = new RegExp(kSingleLineDisplayMathPattern);\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, ui, format, math, events } = context;\n\n  if (!pandocExtensions.tex_math_dollars) {\n    return null;\n  }\n\n  // special blogdown handling for markdown renderers that don't support math\n  const blogdownMathInCode = format.rmdExtensions.blogdownMathInCode;\n  const singleLineDisplayMath = blogdownMathInCode;\n\n  return {\n    marks: [\n      {\n        name: 'math',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          attrs: {\n            type: {},\n          },\n          inclusive: false,\n          excludes: 'formatting',\n          parseDOM: [\n            {\n              tag: \"span[class*='math']\",\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                return {\n                  type: el.getAttribute('data-type'),\n                };\n              },\n              preserveWhitespace: 'full',\n            },\n          ],\n\n          toDOM(mark: Mark) {\n            return [\n              'span',\n              {\n                class: 'math pm-fixedwidth-font pm-light-text-color',\n                'data-type': mark.attrs.type,\n                spellcheck: 'false',\n              },\n            ];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Math,\n              mark: 'math',\n              getAttrs: (tok: PandocToken) => {\n                return {\n                  type: tok.c[kMathType].t,\n                };\n              },\n              getText: (tok: PandocToken) => {\n                const delimter = delimiterForType(tok.c[kMathType].t);\n                return delimter + tok.c[kMathContent] + delimter;\n              },\n            },\n            // extract math from backtick code for blogdown\n            ...(blogdownMathInCode\n              ? [\n                  {\n                    token: PandocTokenType.Code,\n                    mark: 'math',\n                    match: (tok: PandocToken) => {\n                      const text = tok.c[kCodeText];\n                      return kSingleLineDisplayMathRegex.test(text) || kInlineMathRegex.test(text);\n                    },\n                    getAttrs: (tok: PandocToken) => {\n                      const text = tok.c[kCodeText];\n                      return {\n                        type: kSingleLineDisplayMathRegex.test(text) ? MathType.Display : MathType.Inline,\n                      };\n                    },\n                    getText: (tok: PandocToken) => {\n                      return tok.c[kCodeText];\n                    },\n                  },\n                ]\n              : []),\n          ],\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              // collect math content\n              let mathText = '';\n              parent.forEach((node: ProsemirrorNode) => (mathText = mathText + node.textContent));\n\n              // if this is blogdownMathInCode just write the content in a code mark\n              if (blogdownMathInCode) {\n                output.writeToken(PandocTokenType.Code, () => {\n                  output.writeAttr();\n                  output.write(mathText);\n                });\n              } else {\n                // check for delimeter (if it's gone then write this w/o them math mark)\n                const delimiter = delimiterForType(mark.attrs.type);\n                if (mathText.startsWith(delimiter) && mathText.endsWith(delimiter)) {\n                  // remove delimiter\n                  mathText = mathText.substr(delimiter.length, mathText.length - 2 * delimiter.length);\n\n                  // trim inline math\n                  if (mark.attrs.type === MathType.Inline) {\n                    mathText = mathText.trim();\n                  }\n\n                  // if it's just whitespace then it's not actually math (we allow this state\n                  // in the editor because it's the natural starting place for new equations)\n                  if (mathText.length === 0) {\n                    output.writeText(delimiter + mathText + delimiter);\n                  } else {\n                    output.writeToken(PandocTokenType.Math, () => {\n                      // write type\n                      output.writeToken(\n                        mark.attrs.type === MathType.Inline ? PandocTokenType.InlineMath : PandocTokenType.DisplayMath,\n                      );\n                      output.write(mathText);\n                    });\n                  }\n                } else {\n                  // user removed the delimiter so write the content literally. when it round trips\n                  // back into editor it will no longer be parsed by pandoc as math\n                  output.writeRawMarkdown(mathText);\n                }\n              }\n            },\n          },\n        },\n      },\n    ],\n\n    baseKeys: (_schema: Schema) => {\n      if (!singleLineDisplayMath) {\n        return [{ key: BaseKey.Enter, command: displayMathNewline() }];\n      } else {\n        return [];\n      }\n    },\n\n    inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n      const kInlineMathInputRulePattern = '\\\\$[^ ][^\\\\$]*?[^\\\\ ]?\\\\$';\n      return [\n        // inline math\n        new InputRule(\n          new RegExp('(^|[^`])' + kInlineMathInputRulePattern + '$'),\n          (state: EditorState, match: string[], start: number, end: number) => {\n            if (!markIsActive(state, schema.marks.math) && filter(state, start, end)) {\n              const tr = state.tr;\n              tr.insertText('$');\n              const mark = schema.marks.math.create({ type: MathType.Inline });\n              tr.addMark(start + match[1].length, end + 1, mark);\n              return tr;\n            } else {\n              return null;\n            }\n          },\n        ),\n        new InputRule(/(?:^|[^`])\\$$/, (state: EditorState, match: string[], start: number, end: number) => {\n          if (!markIsActive(state, schema.marks.math)) {\n            const { parent, parentOffset } = state.selection.$head;\n            const text = '$' + parent.textContent.slice(parentOffset);\n            if (text.length > 0) {\n              const length = mathLength(text);\n              if (length > 1) {\n                if (filter(state, start, start + length)) {\n                  const tr = state.tr;\n                  tr.insertText('$');\n                  const startMath = tr.selection.from - 1;\n                  const mark = schema.marks.math.create({ type: MathType.Inline });\n                  tr.addMark(startMath, startMath + length, mark);\n                  return tr;\n                }\n              }\n            }\n          }\n          return null;\n        }),\n        // display math\n        new InputRule(/^\\$\\$$/, (state: EditorState, match: string[], start: number, end: number) => {\n          if (filter(state, start, end)) {\n            const tr = state.tr;\n            tr.delete(start, end);\n            insertMath(tr.selection, MathType.Display, !singleLineDisplayMath, tr);\n            return tr;\n          } else {\n            return null;\n          }\n        }),\n      ];\n    },\n\n    commands: (_schema: Schema) => {\n      return [new InsertInlineMathCommand(ui), new InsertDisplayMathCommand(ui, !singleLineDisplayMath)];\n    },\n\n    appendMarkTransaction: (_schema: Schema) => {\n      return [mathAppendMarkTransaction()];\n    },\n\n    plugins: (schema: Schema) => {\n      const plugins = [\n        new Plugin({\n          key: new PluginKey('math'),\n          props: {\n            // paste plain text into math blocks\n            handlePaste: handlePasteIntoMath(),\n          },\n        }),\n        mathHighlightPlugin(schema),\n      ];\n      if (math) {\n        plugins.push(new MathPopupPlugin(ui, math, events, false));\n        plugins.push(...mathViewPlugins(schema, ui, math));\n      }\n      return plugins;\n    },\n  };\n};\n\nfunction mathLength(text: string) {\n  const match = text.match(kInlineMathRegex);\n  if (match) {\n    return match[0].length;\n  } else {\n    return 0;\n  }\n}\n\nfunction handlePasteIntoMath() {\n  return (view: EditorView, _event: Event, slice: Slice) => {\n    const schema = view.state.schema;\n    if (markIsActive(view.state, schema.marks.math)) {\n      const tr = view.state.tr;\n      tr.setMeta(kPasteTransaction, true);\n      tr.setMeta('uiEvent', 'paste');\n      let math = '';\n      slice.content.forEach((node: ProsemirrorNode) => (math = math + node.textContent));\n      tr.replaceSelectionWith(schema.text(math));\n      view.dispatch(tr);\n      return true;\n    } else {\n      return false;\n    }\n  };\n}\n\n// enable insertion of newlines\nfunction displayMathNewline() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // display math mark must be active\n\n    if (!displayMathIsActive(state)) {\n      return false;\n    }\n\n    // insert a newline\n    if (dispatch) {\n      const tr = state.tr;\n      tr.insertText('\\n');\n      dispatch(tr);\n    }\n    return true;\n  };\n}\n\nfunction displayMathIsActive(state: EditorState) {\n  const schema = state.schema;\n  return (\n    markIsActive(state, schema.marks.math) &&\n    getMarkAttrs(state.doc, state.selection, schema.marks.math).type === MathType.Display\n  );\n}\n\nexport default extension;\n","/*\n * math-commands.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { setTextSelection, findParentNodeOfType } from 'prosemirror-utils';\n\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsert, OmniInsertGroup } from '../../api/omni_insert';\nimport { MathType, delimiterForType } from '../../api/math';\n\nexport class InsertInlineMathCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI) {\n    super(EditorCommandId.InlineMath, [], insertMathCommand(MathType.Inline, false), inlineMathOmniInsert(ui));\n  }\n}\n\nexport class InsertDisplayMathCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI, allowNewline: boolean) {\n    super(\n      EditorCommandId.DisplayMath,\n      [],\n      insertMathCommand(MathType.Display, allowNewline),\n      displayMathOmniInsert(ui),\n    );\n  }\n}\n\nfunction insertMathCommand(type: MathType, allowNewline: boolean) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // enable/disable command\n    const schema = state.schema;\n    if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.math)(state)) {\n      return false;\n    }\n\n    if (dispatch) {\n      const tr = state.tr;\n      insertMath(state.selection, type, allowNewline, tr);\n      dispatch(tr);\n    }\n    return true;\n  };\n}\n\nfunction inlineMathOmniInsert(ui: EditorUI): OmniInsert {\n  return {\n    name: ui.context.translateText('Inline Math'),\n    keywords: [ui.context.translateText('equation')],\n    description: ui.context.translateText('Math within a line or paragraph'),\n    group: OmniInsertGroup.Math,\n    priority: 2,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.math_inline_dark! : ui.images.omni_insert?.math_inline!),\n  };\n}\n\nfunction displayMathOmniInsert(ui: EditorUI): OmniInsert {\n  return {\n    name: ui.context.translateText('Display Math'),\n    keywords: [ui.context.translateText('equation')],\n    description: ui.context.translateText('Math set apart from the main text'),\n    group: OmniInsertGroup.Math,\n    priority: 1,\n    image: () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.math_display_dark! : ui.images.omni_insert?.math_display!,\n  };\n}\n\nexport function insertMath(selection: Selection, type: MathType, allowNewline: boolean, tr: Transaction) {\n  // include a newline for display math in an empty paragraph\n  const schema = tr.doc.type.schema;\n  let content = '';\n  if (type === MathType.Display) {\n    const para = findParentNodeOfType(schema.nodes.paragraph)(selection);\n    if (allowNewline && para && !para.node.textContent.length) {\n      content = '\\n\\n';\n    }\n  }\n  const delim = delimiterForType(type);\n  const mathText = schema.text(delim + content + delim);\n  tr.replaceSelectionWith(mathText, false);\n  const mathMark = schema.marks.math.create({ type });\n  const from = tr.selection.head - content.length - delim.length * 2;\n  const to = from + delim.length * 2 + content.length;\n  tr.addMark(from, to, mathMark);\n  const pos = tr.mapping.map(selection.head) - delim.length - (content ? 1 : 0);\n  return setTextSelection(pos)(tr).scrollIntoView();\n}\n","/*\n * math-transaction.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildrenByMark } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { AppendMarkTransactionHandler, MarkTransaction } from '../../api/transaction';\nimport { delimiterForType, MathType } from '../../api/math';\nimport { selectionIsWithinRange } from '../../api/selection';\n\nexport function mathAppendMarkTransaction(): AppendMarkTransactionHandler {\n  return {\n    name: 'math-marks',\n\n    filter: node => node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.math),\n\n    append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n      // find all math blocks and convert them to text if they no longer conform\n      const schema = node.type.schema;\n      const maths = findChildrenByMark(node, schema.marks.math, true);\n      for (const math of maths) {\n        const from = pos + 1 + math.pos;\n        const mathRange = getMarkRange(tr.doc.resolve(from), schema.marks.math);\n        if (mathRange) {\n          const mathAttr = getMarkAttrs(tr.doc, mathRange, schema.marks.math);\n          if (mathAttr.type === MathType.Inline) {\n            const mathDelim = delimiterForType(mathAttr.type);\n            const mathText = tr.doc.textBetween(mathRange.from, mathRange.to);\n            const charAfter = tr.doc.textBetween(mathRange.to, mathRange.to + 1);\n            const noDelims = !mathText.startsWith(mathDelim) || !mathText.endsWith(mathDelim);\n            const selectionIsWithin = selectionIsWithinRange(tr.selection, mathRange);\n            const spaceAtLeft =\n              !selectionIsWithin && mathAttr.type === MathType.Inline && mathText.startsWith(mathDelim + ' ');\n            const spaceAtRight =\n              !selectionIsWithin && mathAttr.type === MathType.Inline && mathText.endsWith(' ' + mathDelim);\n            const numberAfter = mathAttr.type === MathType.Inline && /\\d/.test(charAfter);\n            if (noDelims || spaceAtLeft || spaceAtRight || numberAfter) {\n              tr.removeMark(mathRange.from, mathRange.to, schema.marks.math);\n              tr.removeStoredMark(schema.marks.math);\n            }\n          }\n        }\n      }\n    },\n  };\n}\n","/*\n * math-highlight.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\n\nimport { markHighlightPlugin } from '../../api/mark-highlight';\nimport { delimiterForType } from '../../api/math';\n\nconst key = new PluginKey<DecorationSet>('math-highlight');\n\nexport function mathHighlightPlugin(schema: Schema) {\n  return markHighlightPlugin(key, schema.marks.math, (_text, attrs, markRange) => {\n    const kDelimClass = 'pm-markup-text-color';\n    const delim = delimiterForType(attrs.type);\n    if (markRange.to - markRange.from === delim.length * 2) {\n      return [Decoration.inline(markRange.from, markRange.to, { class: kDelimClass })];\n    } else {\n      return [\n        Decoration.inline(markRange.from, markRange.from + delim.length, { class: kDelimClass }),\n        Decoration.inline(markRange.to - delim.length, markRange.to, { class: kDelimClass }),\n      ];\n    }\n  });\n}\n","/*\n * math-preview.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { ResolvedPos } from 'prosemirror-model';\n\nimport debounce from 'lodash.debounce';\nimport zenscroll from 'zenscroll';\n\nimport { EditorUI } from '../../api/ui';\nimport { getMarkRange } from '../../api/mark';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent, ResizeEvent } from '../../api/event-types';\nimport { applyStyles } from '../../api/css';\nimport { editingRootNodeClosestToPos, editingRootNode } from '../../api/node';\nimport { createPopup } from '../../api/widgets/widgets';\nimport { EditorMath } from '../../api/math';\n\nconst kMathPopupVerticalOffset = 10;\nconst kMathPopupInputDebuounceMs = 250;\n\nconst key = new PluginKey('math-preview');\n\nexport class MathPopupPlugin extends Plugin {\n  private readonly ui: EditorUI;\n  private readonly math: EditorMath;\n\n  private view: EditorView | null = null;\n\n  private popup: HTMLElement | null = null;\n  private lastRenderedMath: string | null = null;\n\n  private readonly updatePopupTimer: number;\n\n  private scrollUnsubscribe: VoidFunction;\n  private resizeUnsubscribe: VoidFunction;\n\n  constructor(ui: EditorUI, math: EditorMath, events: EditorEvents, onHover: boolean) {\n    super({\n      key,\n      view: () => {\n        return {\n          update: debounce(\n            (view: EditorView) => {\n              this.view = view;\n              this.updatePopup();\n            },\n            kMathPopupInputDebuounceMs,\n            { leading: true, trailing: true },\n          ),\n          destroy: () => {\n            clearInterval(this.updatePopupTimer);\n            this.scrollUnsubscribe();\n            this.resizeUnsubscribe();\n            this.closePopup();\n          },\n        };\n      },\n      props: {\n        handleDOMEvents: {\n          ...(onHover\n            ? {\n                mousemove: debounce((view: EditorView, event: Event) => {\n                  const ev = event as MouseEvent;\n                  const pos = view.posAtCoords({ top: ev.clientY, left: ev.clientX });\n                  if (pos && pos.inside !== -1) {\n                    this.updatePopup(view.state.doc.resolve(pos.pos));\n                  }\n                  return false;\n                }, kMathPopupInputDebuounceMs),\n              }\n            : {}),\n        },\n      },\n    });\n\n    // save reference to ui and math\n    this.ui = ui;\n    this.math = math;\n\n    // update popup for resize, scrolling, as well as every 100ms to cover reflowing\n    // of the document as a result of latex math being shown/hidden (will effectively\n    // be a no-op if the math text and  document layout / scroll position hasn't changed)\n    this.updatePopup = this.updatePopup.bind(this);\n    this.updatePopupTimer = setInterval(this.updatePopup, 100);\n    this.scrollUnsubscribe = events.subscribe(ScrollEvent, () => this.updatePopup());\n    this.resizeUnsubscribe = events.subscribe(ResizeEvent, () => this.updatePopup());\n  }\n\n  private updatePopup($mousePos?: ResolvedPos) {\n    // bail if we don't have a view\n    if (!this.view) {\n      return;\n    }\n\n    // capture state, etc.\n    const state = this.view.state;\n    const schema = state.schema;\n\n    // determine math range\n    let range: false | { from: number; to: number } = false;\n\n    // if a $pos was passed (e.g. for a mouse hover) then check that first\n    if ($mousePos) {\n      range = getMarkRange($mousePos, schema.marks.math);\n    }\n\n    // if that didn't work try the selection\n    if (!range) {\n      range = getMarkRange(state.selection.$from, schema.marks.math);\n    }\n\n    // bail if we don't have a target\n    if (!range) {\n      this.closePopup();\n      return;\n    }\n\n    // bail if the user has this disabled\n    if (!this.ui.prefs.equationPreview()) {\n      this.closePopup();\n      return;\n    }\n\n    // get the math text. bail if it's empty\n    const inlineMath = state.doc.textBetween(range.from, range.to);\n    if (inlineMath.match(/^\\${1,2}\\s*\\${1,2}$/)) {\n      this.closePopup();\n      return;\n    }\n\n    // get the position for the range\n    const styles = popupPositionStyles(this.view, range);\n\n    // if the popup already exists just move it\n    if (this.popup) {\n      applyStyles(this.popup, [], styles);\n    } else {\n      this.popup = createPopup(this.view, ['pm-math-preview'], undefined, {\n        ...styles,\n        visibility: 'hidden',\n      });\n      this.view.dom.parentNode?.appendChild(this.popup);\n    }\n\n    // typeset the math if we haven't already\n    if (inlineMath !== this.lastRenderedMath && this.popup) {\n      this.math.typeset!(this.popup, inlineMath, true).then(error => {\n        if (!error) {\n          this.popup!.style.visibility = 'visible';\n          this.lastRenderedMath = inlineMath;\n          // autoscroll for non-mouse triggers\n          if (!$mousePos && range) {\n            this.autoscollPopup(range);\n          }\n        }\n      });\n    }\n  }\n\n  private closePopup() {\n    this.lastRenderedMath = null;\n    if (this.popup) {\n      this.popup.remove();\n      this.popup = null;\n    }\n  }\n\n  private autoscollPopup(mathRange: { from: number; to: number }) {\n    const editingRoot = editingRootNode(this.view!.state.selection);\n    if (editingRoot) {\n      const editorEl = this.view!.nodeDOM(editingRoot.pos) as HTMLElement;\n      const editorBox = editorEl.getBoundingClientRect();\n      const popupBox = this.popup!.getBoundingClientRect();\n      if (popupBox.top + popupBox.height + kMathPopupVerticalOffset > editorBox.bottom) {\n        const mathBottom = this.view!.coordsAtPos(mathRange.to);\n        const mathScrollBottom = editorEl.scrollTop + mathBottom.bottom;\n        const mathPopupScrollBottom = mathScrollBottom + kMathPopupVerticalOffset + popupBox.height;\n        const scrollTop = mathPopupScrollBottom + kMathPopupVerticalOffset - editorBox.top - editorBox.height;\n        const scroller = zenscroll.createScroller(editorEl);\n        scroller.toY(scrollTop, 100);\n      }\n    }\n  }\n}\n\nfunction popupPositionStyles(view: EditorView, range: { from: number; to: number }) {\n  // get coordinates for editor view (use to offset)\n  const editorBox = (view.dom.parentNode! as HTMLElement).getBoundingClientRect();\n\n  // +1 to ensure beginning of line doesn't resolve as line before\n  // (will subtract it back out below)\n  const rangeStartCoords = view.coordsAtPos(range.from + 1);\n  const rangeEndCoords = view.coordsAtPos(range.to);\n\n  // default positions\n  const top = Math.round(rangeEndCoords.bottom - editorBox.top) + kMathPopupVerticalOffset + 'px';\n  let left = `calc(${Math.round(rangeStartCoords.left - editorBox.left)}px - 1ch)`;\n\n  // if it flow across two lines then position at far left of editing root\n  // (we give it the 5 pixels of wiggle room so that detection still works\n  // when a mathjax preview is shown in place of math text)\n  if (Math.abs(rangeStartCoords.bottom - rangeEndCoords.bottom) > 5) {\n    const editingRoot = editingRootNodeClosestToPos(view.state.doc.resolve(range.from));\n    if (editingRoot) {\n      const editingEl = view.nodeDOM(editingRoot.pos) as HTMLElement;\n      if (editingEl) {\n        const editingElStyle = window.getComputedStyle(editingEl);\n        left = `calc(${editingEl.getBoundingClientRect().left}px + ${editingElStyle.paddingLeft} - 1ch - 2px)`;\n      }\n    }\n  }\n\n  // return position\n  return { top, left };\n}\n","/*\n * math-viewts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { DecorationSet, EditorView, Decoration } from 'prosemirror-view';\nimport { keymap } from 'prosemirror-keymap';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\n\nimport { findChildrenByMark, setTextSelection } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\n\nimport { EditorMath, MathType } from '../../api/math';\nimport { EditorUI } from '../../api/ui';\nimport { kSetMarkdownTransaction } from '../../api/transaction';\n\n// NOTE: rendered equations don't curently show selection background color when part\n// of a larger selection (in spite of a few failed attempts to get this to work)\n// it would be nice to figure out how to do this\n\nexport function mathViewPlugins(schema: Schema, ui: EditorUI, math: EditorMath): Plugin[] {\n  return [\n    mathViewPlugin(schema, ui, math),\n    keymap({\n      ArrowUp: verticalArrowHandler('up'),\n      ArrowDown: verticalArrowHandler('down'),\n    }),\n  ];\n}\n\nfunction mathViewPlugin(schema: Schema, ui: EditorUI, math: EditorMath) {\n  const key = new PluginKey<DecorationSet>('math-view');\n\n  function decorationsForDoc(state: EditorState) {\n    const decorations: Decoration[] = [];\n    findChildrenByMark(state.doc, schema.marks.math, true).forEach(markedNode => {\n      // get mark range and attributes\n      const range = getMarkRange(state.doc.resolve(markedNode.pos), schema.marks.math) as { from: number; to: number };\n      const attrs = getMarkAttrs(state.doc, range, schema.marks.math);\n\n      // if the selection isn't in the mark, then show the preview\n      if (state.selection.from < range.from || state.selection.from > range.to) {\n        // get the math text\n        const mathText = state.doc.textBetween(range.from, range.to);\n\n        // hide the code\n        decorations.push(Decoration.inline(range.from, range.to, { style: 'display: none;' }));\n\n        // show a math preview\n        decorations.push(\n          Decoration.widget(\n            range.from,\n            (view: EditorView, getPos: () => number) => {\n              const mathjaxDiv = window.document.createElement('div');\n              mathjaxDiv.classList.add('pm-math-mathjax');\n              // text selection 'within' code for clicks on the preview image\n              mathjaxDiv.onclick = () => {\n                const tr = view.state.tr;\n                let pos = getPos();\n                if (attrs.type === MathType.Display) {\n                  // set position to first non $, non whitespace character\n                  const match = mathText.match(/^[$\\s]+/);\n                  if (match) {\n                    pos += match[0].length;\n                  }\n                } else {\n                  // set position to the middle of the equation\n                  pos = pos + mathText.length / 2;\n                }\n                setTextSelection(pos)(tr);\n                view.dispatch(tr);\n                view.focus();\n              };\n              math.typeset(mathjaxDiv, mathText, ui.context.isActiveTab());\n              return mathjaxDiv;\n            },\n            { key: mathText },\n          ),\n        );\n      }\n    });\n\n    return DecorationSet.create(state.doc, decorations);\n  }\n\n  return new Plugin<DecorationSet>({\n    key,\n\n    state: {\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return decorationsForDoc(instance);\n      },\n\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        // replacing the entire editor triggers decorations\n        if (tr.getMeta(kSetMarkdownTransaction)) {\n          return decorationsForDoc(newState);\n\n          // if one of the steps added or removed a mark of our type then rescan the doc.\n        } else if (\n          tr.steps.some(\n            step =>\n              (step instanceof AddMarkStep && (step as any).mark.type === schema.marks.math) ||\n              (step instanceof RemoveMarkStep && (step as any).mark.type === schema.marks.math),\n          )\n        ) {\n          return decorationsForDoc(newState);\n\n          // if the previous or current state is in or at the border of a math mark, then rescan\n        } else if (\n          oldState.doc.rangeHasMark(oldState.selection.from - 2, oldState.selection.from + 1, schema.marks.math) ||\n          getMarkRange(newState.selection.$from, schema.marks.math)\n        ) {\n          return decorationsForDoc(newState);\n\n          // incremental scanning based on presence of mark in changed regions\n        } else {\n          // adjust decoration positions to changes made by the transaction (decorations that apply\n          // to removed chunks of content will be removed by this)\n          return set.map(tr.mapping, tr.doc);\n        }\n      },\n    },\n\n    appendTransaction: (_transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n      // not currently in math\n      if (!getMarkRange(newState.selection.$from, schema.marks.math) && newState.selection.from > 0) {\n        // did we end up just to the right of math? if so check for navigation from a distance\n        // (would imply an up/down arrow)\n        const prevMathRange = getMarkRange(newState.doc.resolve(newState.selection.from - 1), schema.marks.math);\n        if (prevMathRange) {\n          // if the selection came from afar then treat it as an actual selection\n          const delta = oldState.selection.from - newState.selection.from;\n          if (Math.abs(delta) > 3) {\n            const tr = newState.tr;\n            const mathText = newState.doc.textBetween(prevMathRange.from, prevMathRange.to);\n            const attrs = getMarkAttrs(newState.doc, prevMathRange, schema.marks.math);\n            if (attrs.type === MathType.Inline) {\n              setTextSelection(prevMathRange.from + mathText.length / 2)(tr);\n            }\n            return tr;\n          }\n        }\n      }\n\n      return null;\n    },\n\n    props: {\n      decorations(state: EditorState) {\n        return key.getState(state);\n      },\n    },\n  });\n}\n\nfunction verticalArrowHandler(dir: 'up' | 'down') {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    if (!view) {\n      return false;\n    }\n\n    const schema = state.schema;\n\n    // see if we need to provide up/down for inline math (it doesn't work by default, likely because\n    // of the display: none decorator). This implementation just moves the selection before or\n    // after the mark (better than the cursor doing nothing which is what we saw w/o this) however\n    // it would be cool if we could fully emulate up/down\n    const range = getMarkRange(state.selection.$head, schema.marks.math);\n    if (range) {\n      const attrs = getMarkAttrs(state.doc, range, schema.marks.math);\n      if (attrs.type === MathType.Inline) {\n        if (dispatch) {\n          const side = dir === 'up' ? -1 : 1;\n          const $head = state.selection.$head;\n          const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n          const tr = state.tr;\n          tr.setSelection(nextPos);\n          dispatch(tr);\n        }\n        return true;\n      }\n    }\n\n    if (view.endOfTextblock(dir)) {\n      const side = dir === 'up' ? -1 : 1;\n      const $head = state.selection.$head;\n      const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n      if (\n        nextPos.$head &&\n        nextPos.$head.parent.childCount === 1 &&\n        schema.marks.math.isInSet(nextPos.$head.parent.firstChild!.marks)\n      ) {\n        if (dispatch) {\n          const mathText = nextPos.$head.parent.textContent;\n          const match = mathText.match(/^[$\\s]+/);\n          if (match) {\n            const tr = state.tr;\n            const mathPos = nextPos.$head.start($head.depth);\n            setTextSelection(mathPos + match[0].length)(tr);\n            dispatch(tr);\n          }\n        }\n        return true;\n      }\n    }\n    return false;\n  };\n}\n","/*\n * cite.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Schema, Fragment, Node as ProsemirrorNode, Slice, ResolvedPos } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState, Transaction, Plugin, PluginKey, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport uniqby from 'lodash.uniqby';\n\nimport { FocusEvent } from '../../api/event-types';\nimport { PandocTokenType, PandocToken, PandocOutput, ProsemirrorWriter, PandocServer } from '../../api/pandoc';\nimport { fragmentText } from '../../api/fragment';\nimport { markIsActive, splitInvalidatedMarks, getMarkRange, detectAndApplyMarks } from '../../api/mark';\nimport { MarkTransaction, kPasteTransaction } from '../../api/transaction';\nimport { BibliographyManager, BibliographyFile, BibliographySource } from '../../api/bibliography/bibliography';\nimport { EditorUI } from '../../api/ui';\nimport { joinPaths, getExtension } from '../../api/path';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { InsertCiteProps, kAlertTypeError, kAlertTypeWarning } from '../../api/ui-dialogs';\nimport { CSL, sanitizeForCiteproc } from '../../api/csl';\nimport { suggestCiteId, formatForPreview } from '../../api/cite';\nimport { performCompletionReplacement } from '../../api/completion';\nimport { ensureBibliographyFileForDoc } from '../../api/bibliography/bibliography-provider_local';\n\nimport { citationCompletionHandler } from './cite-completion';\nimport { citeHighlightPlugin } from './cite-highlight';\nimport { citationDoiCompletionHandler } from './cite-completion_doi';\nimport { doiFromSlice } from './cite-doi';\nimport { citePopupPlugin } from './cite-popup';\nimport { InsertCitationCommand } from './cite-commands';\nimport { setTextSelection } from 'prosemirror-utils';\nimport { AddMarkStep } from 'prosemirror-transform';\n\nconst kCiteCitationsIndex = 0;\n\n\n// Follow the pandoc rules for citations\n// Each citation must have a key, composed of ‘@’ + the citation identifier from the database, \n// and may optionally have a prefix, a locator, and a suffix. The citation key must begin with a letter, \n// digit, or _, and may contain alphanumerics (UNICODE), _, and internal punctuation characters (:.#$%&-+?<>~/).\n// In addition, we don't permit the citation to include a . or ? character (which are allowed in the cite identifier)\n// This is only because when writing in text citations, it will be common to follow a citation with \n// punctuation, and we should be smart enough to filter that punctuation out of the citation itself.\nconst kCiteIdPrefixPattern = '-?@';\nconst kCiteIdCharsPattern = '[^@;\\\\[\\\\]\\\\s\\\\!\\\\,]*';\nconst kCiteIdBasePattern = `${kCiteIdPrefixPattern}${kCiteIdCharsPattern}`;\n\n// Completions examine all the text inside the citation mark, so they need to only be interested\n// in a citeId that terminates at the cursor (at the end of the text)\nconst kCompletionCiteIdRegEx = new RegExp(`(${kCiteIdPrefixPattern})(${kCiteIdCharsPattern})$`);\n\n// Note that since Cite Ids can appear inline as in-text representations or can appear inside of brackets \n// in a Note style. Consequently, this is used in various places to identify them interchangeably (e.g. we use)\n// this to identify a citeId inline in text, but also to identify a citedId in a bracketed citation.\nconst kCiteId = new RegExp(`^${kCiteIdBasePattern}`);\n\n// Plain In Text: @foo2019 (this is intentionally a duplicate of the above)\n// just to make the meaning more clear (this is used to detect an in text citation)\nconst kInTextCiteRegex = new RegExp(`${kCiteIdBasePattern}$`);\n\n// Note Style: [@foo2019]\nconst kBeginCitePattern = `(.* ${kCiteIdPrefixPattern}|${kCiteIdPrefixPattern})`;\nconst kNoteCiteRegex = new RegExp(`\\\\[${kBeginCitePattern}${kCiteIdCharsPattern}.*\\\\]`);\n\n// In Text with Suffix: @foo2019 [p 35]\nconst kInTextCiteWithSuffixPattern = `${kCiteIdPrefixPattern}${kCiteIdCharsPattern}.*?\\\\[.*?\\\\]`;\nconst kInTextCiteWithSuffixRegEx = new RegExp(`^${kInTextCiteWithSuffixPattern}$`);\n\nenum CitationMode {\n  NormalCitation = 'NormalCitation',\n  AuthorInText = 'AuthorInText',\n  SuppressAuthor = 'SuppressAuthor',\n}\n\ninterface Citation {\n  citationHash: number;\n  citationId: string;\n  citationMode: {\n    t: CitationMode;\n  };\n  citationNoteNum: number;\n  citationPrefix: PandocToken[];\n  citationSuffix: PandocToken[];\n}\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, ui } = context;\n\n  // prime bibliography on initial focus\n  const bibliographyManager = new BibliographyManager(context.server.pandoc, context.server.zotero);\n  const focusUnsubscribe = context.events.subscribe(FocusEvent, doc => {\n    bibliographyManager.prime(ui, doc!);\n    focusUnsubscribe();\n  });\n\n  if (!pandocExtensions.citations) {\n    return null;\n  }\n\n  return {\n    marks: [\n      {\n        name: 'cite_id',\n        noSpelling: true,\n        spec: {\n          attrs: {},\n          inclusive: true,\n          parseDOM: [\n            {\n              tag: \"span[class*='cite-id']\",\n            },\n          ],\n          toDOM(mark: Mark) {\n            return ['span', { class: 'cite-id pm-link-text-color pm-fixedwidth-font' }];\n          },\n        },\n        pandoc: {\n          readers: [],\n          writer: {\n            priority: 13,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              const idText = fragmentText(parent);\n              // only write as a citation id (i.e. don't escape @) if it is still\n              // a valid citation id. note that this in principle is also taken care\n              // of by the application of splitInvalidatedMarks below (as the\n              // mark would have been broken by this if it wasn't valid). this\n              // code predates that, and we leave it in for good measure in case that\n              // code is removed or changes in another unexpected way.\n              if (idText.match(kInTextCiteRegex)) {\n                const prefixMatch = idText.match(/^-?@/);\n                if (prefixMatch) {\n                  output.writeRawMarkdown(prefixMatch.input!);\n                  output.writeInlines(parent.cut(prefixMatch.input!.length));\n                } else {\n                  output.writeInlines(parent);\n                }\n              } else {\n                output.writeInlines(parent);\n              }\n            },\n          },\n        },\n      },\n      {\n        name: 'cite',\n        spec: {\n          attrs: {},\n          inclusive: false,\n          parseDOM: [\n            {\n              tag: \"span[class*='cite']\",\n            },\n          ],\n          toDOM(mark: Mark) {\n            return { '0': 'span', '1': { class: 'cite' } };\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Cite,\n              handler: readPandocCite,\n            },\n          ],\n\n          writer: {\n            priority: 14,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n\n              // extract parentText for inspection\n              const parentText = fragmentText(parent);\n\n              // if it's just a cite id then write it straight up\n              if (fragmentText(parent).match(kInTextCiteRegex)) {\n\n                output.writeInlines(parent);\n\n              } else {\n\n                // divide out delimiters from body\n                const openCite = parent.cut(0, 1);\n                const cite = parent.cut(1, parent.size - 1);\n                const closeCite = parent.cut(parent.size - 1, parent.size);\n\n                // check for fully enclosed in brackets\n                if (\n                  fragmentText(openCite) === '[' &&\n                  fragmentText(closeCite) === ']' &&\n                  fragmentText(cite).match(kInTextCiteRegex)\n                ) {\n                  output.writeRawMarkdown('[');\n                  output.writeInlines(cite);\n                  output.writeRawMarkdown(']');\n                \n                \n                // if it starts with a valid cite id prefix and ends with a close\n                // bracket then it might be an in-text citation with a suffix\n                } else if (parentText.match(kInTextCiteWithSuffixRegEx)) {\n\n                  // find the position of the begin bracket that matches the end bracket\n                  let beginBracketPos = -1;\n                  let bracketLevel = 0;\n                  for (let i = parentText.length - 2; i >= 0; i--) {\n                    const char = parentText.charAt(i);\n                    if (char === ']') {\n                      bracketLevel++;\n                    } else if (char === '[') {\n                      if (bracketLevel > 0) {\n                        bracketLevel--;\n                      } else {\n                        beginBracketPos = i;\n                        break;\n                      }\n                    }\n                  }\n\n                  // if we found one then cut as approrpriate\n                  if (beginBracketPos) {\n                    output.writeInlines(parent.cut(0, beginBracketPos));\n                    output.writeRawMarkdown('[');\n                    output.writeInlines(parent.cut(beginBracketPos + 1, parentText.length - 1));\n                    output.writeRawMarkdown(']');\n\n                  } else {\n                    output.writeInlines(parent);\n                  }\n                } else {\n                  output.writeInlines(parent);\n                }\n              }\n            },\n          },\n        },\n      },\n    ],\n\n    commands: (_schema: Schema) => {\n      return [new InsertCitationCommand(ui, context.events, bibliographyManager, context.server)];\n    },\n\n    appendTransaction: (schema: Schema) => {\n      return [{\n        name: 'cite-id-join',\n        append: (tr: Transaction) => {\n          const range = getMarkRange(tr.doc.resolve(tr.selection.head-1), schema.marks.cite_id);\n          if (range) {\n            const text = tr.doc.textBetween(range.from, tr.selection.$head.after());\n            const citeIdLen = citeIdLength(text);\n            const markLength = range.to - range.from;\n            if (citeIdLen > markLength) {\n              tr.addMark(range.from, range.from + citeIdLen, schema.marks.cite_id.create());\n            }\n          }\n          return tr;\n        },\n      }];\n    },\n\n    appendMarkTransaction: (schema: Schema) => {\n\n      const kFindInTextCiteRegex = new RegExp(kCiteIdBasePattern, 'g');\n      const kFindInTextCiteWithSuffixRegex = new RegExp(kInTextCiteWithSuffixPattern, 'g');\n      const kFindFullCiteRegex = new RegExp(kNoteCiteRegex.source, 'g');\n      \n      return [\n        {\n          // 'break' cite marks if they are no longer valid. note that this will still preserve\n          // the mark up to the length that it is valid. \n          name: 'cite-marks',\n          filter: (node: ProsemirrorNode, transactions: Transaction[]) =>  {\n\n            // if the transaction added any cite id marks then we need to lay off\n            // (mostly so that input rules can be reversed)\n            if (transactions.some(trans => trans.steps.some(step => {\n              if (step instanceof AddMarkStep) {\n                return (step as any).mark.type === schema.marks.cite_id;\n              }\n            }))) {\n              return false;\n\n            /// otherwise proceed if this node is a textblock that allows cites\n            } else {\n          \n              return node.isTextblock && node.type.allowsMarkType(schema.marks.cite);\n            }\n          },\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            splitInvalidatedMarks(tr, node, pos, citeLength, schema.marks.cite, (from: number, to: number) => {\n              tr.removeMark(from, to, schema.marks.cite);\n            });\n            // match all valid forms of mark\n            if (node.textContent.indexOf('@') !== -1) {\n              [kFindInTextCiteRegex, kFindFullCiteRegex, kFindInTextCiteWithSuffixRegex].forEach(re => {\n                detectAndApplyMarks(\n                  tr,\n                  tr.doc.nodeAt(pos)!,\n                  pos,\n                  re,\n                  schema.marks.cite,\n                  () => ({}),\n                  (from: number, to: number) => {\n                    return tr.doc.rangeHasMark(from, to, schema.marks.cite_id);\n                  }\n                );\n              });\n            }\n           \n            \n          },\n        },\n        {\n          // 'break' cite_id marks if they are no longer valid. note that this will still preserve\n          // the mark up to the length that it is valid (so e.g. if a space is inserted within a\n          // cite_id this will keep the mark on the part before the space and remove it from the\n          // part after the space)\n          name: 'remove-cite-id-marks',\n          filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(schema.marks.cite_id),\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            splitInvalidatedMarks(tr, node, pos, citeIdLength, schema.marks.cite_id);\n          },\n        },\n      ];\n    },\n\n    inputRules: (schema: Schema) => {\n      return [\n        citeIdInputRule(schema),\n        citeIdDashInputRule(schema),\n      ];\n    },\n\n    completionHandlers: () => [\n      citationDoiCompletionHandler(context.ui, bibliographyManager, context.server),\n      citationCompletionHandler(context.ui, context.events, bibliographyManager, context.server.pandoc),\n    ],\n\n    plugins: (schema: Schema) => {\n      return [\n        new Plugin({\n          key: new PluginKey('paste_cite_doi'),\n          props: {\n            handlePaste: handlePaste(ui, bibliographyManager, context.server.pandoc),\n          },\n        }),\n        citeHighlightPlugin(schema),\n        citePopupPlugin(schema, ui, bibliographyManager, context.server.pandoc),\n      ];\n    },\n  };\n};\n\nfunction handlePaste(ui: EditorUI, bibManager: BibliographyManager, server: PandocServer) {\n  return (view: EditorView, _event: Event, slice: Slice) => {\n    const schema = view.state.schema;\n    if (markIsActive(view.state, schema.marks.cite_id)) {\n      // This is a DOI\n      const parsedDOI = doiFromSlice(view.state, slice);\n      if (parsedDOI) {\n        // Insert the DOI text as a placeholder\n        const tr = view.state.tr;\n        tr.setMeta(kPasteTransaction, true);\n        tr.setMeta('uiEvent', 'paste');\n\n        const doiText = schema.text(parsedDOI.token);\n        tr.replaceSelectionWith(doiText, true);\n        view.dispatch(tr);\n\n        // First check the local bibliography- if we already have this DOI\n        // we can just paste the DOI\n        const source = bibManager.findDoiInLocalBibliography(parsedDOI.token);\n        if (!source && bibManager.allowsWrites()) {\n          insertCitation(view, parsedDOI.token, bibManager, parsedDOI.pos, ui, server);\n        } \n        return true;\n      } else {\n        // This is just content, accept any text and try pasting that\n        let text = '';\n        slice.content.forEach((node: ProsemirrorNode) => (text = text + node.textContent));\n        if (text.length > 0) {\n          const tr = view.state.tr;\n          tr.setMeta(kPasteTransaction, true);\n          tr.setMeta('uiEvent', 'paste');\n          tr.replaceSelectionWith(schema.text(text));\n          view.dispatch(tr);\n          return true;\n        } else {\n          // There wasn't any text, just allow the paste to be handled by anyone else\n          return false;\n        }\n      }\n    } else {\n      // We aren't in a citation so let someone else handle the paste\n      return false;\n    }\n  };\n}\n\n\n// create a cite_id within a citation when the @ sign is typed\nfunction citeIdInputRule(schema: Schema) {\n  return new InputRule(/@$/, (state: EditorState, match: string[], start: number, end: number) => {\n    if (!markIsActive(state, schema.marks.cite_id)) {\n      const { parent, parentOffset } = state.selection.$head;\n      const text = match[0] + parent.textContent.slice(parentOffset);\n      const textBefore = parent.textContent.slice(0, parentOffset);\n      \n      // reject unless the right prefix is there\n      if (textBefore.length && !textBefore.match(/[\\xA0 \\t\\-\\[]$/)) {\n        return null;\n      }\n\n      // get cite id length\n      const citeIdLen = citeIdLength(text);\n\n      // insert the @\n      const tr = state.tr;\n      tr.insertText(match[0]); \n\n      // insert a pairing end bracket if we started with [\n      if (citeIdLen === 1 && textBefore.match(/\\[-?$/) && text[1] !== ']') {\n        tr.insertText(']');\n        setTextSelection(tr.selection.head - 1)(tr);\n      }\n     \n      if (citeIdLen) {\n        // offset mark for incidence of '-' prefix\n        const offset = textBefore.endsWith('-') ? 1 : 0;\n        const citeStart = start - offset;\n        const citeEnd = citeStart + citeIdLen + offset ;\n        tr.addMark(citeStart, citeEnd, schema.marks.cite_id.create());\n      }\n\n      return tr;\n    } \n    return null;\n  });\n}\n\n\nfunction citeIdDashInputRule(schema: Schema) {\n  return new InputRule(new RegExp(`-$`), (state: EditorState, match: string[], start: number, end: number) => {\n    if (state.doc.rangeHasMark(start + 1, end + 2, schema.marks.cite_id)) {\n      const tr = state.tr;\n      tr.insertText(match[0]);\n      tr.addMark(start, start + 1, schema.marks.cite_id.create());\n      return tr;\n    }\n    return null;\n  });\n}\n\n\n// read pandoc citation, creating requisite cite and cite_id marks as we go\nfunction readPandocCite(schema: Schema) {\n  return (writer: ProsemirrorWriter, tok: PandocToken) => {\n    \n    // create and open the mark\n    const citeMark = schema.marks.cite.create();\n    writer.openMark(citeMark);\n\n    // helper to write a citation\n    const writeCitation = (citation: Citation) => {\n      // prefix\n      writer.writeTokens(citation.citationPrefix);\n      if (citation.citationPrefix.length) {\n        writer.writeText(' ');\n      }\n\n      // id\n      const suppress = citation.citationMode.t === CitationMode.SuppressAuthor ? '-' : '';\n      const citeIdMark = schema.marks.cite_id.create();\n      writer.openMark(citeIdMark);\n      writer.writeText(suppress + '@' + citation.citationId);\n      writer.closeMark(citeIdMark);\n\n      // suffix\n      const inTextSuffix = citation.citationMode.t === CitationMode.AuthorInText && citation.citationSuffix.length;\n      if (inTextSuffix) {\n        writer.writeText(' [');\n      }\n      writer.writeTokens(citation.citationSuffix);\n      if (inTextSuffix) {\n        writer.writeText(']');\n      }\n    };\n\n    // get all of the citations\n    const citations: Citation[] = tok.c[kCiteCitationsIndex];\n\n    // look for a single in-text citation\n    if (citations.length === 1 && citations[0].citationMode.t === CitationMode.AuthorInText) {\n      writeCitation(citations[0]);\n    // non-in text and/or multiple citations\n    } else {\n      writer.writeText('[');\n      citations.forEach((citation: Citation, index: number) => {\n        // add delimiter\n        if (index !== 0) {\n          writer.writeText('; ');\n        }\n        writeCitation(citation);\n      });\n      writer.writeText(']');\n    }\n\n    writer.closeMark(citeMark);\n  };\n}\n\nconst kCitationIdRegex = new RegExp(`(^\\\\[| )(${kCiteIdBasePattern})`, 'g');\n\nfunction encloseInCiteMark(tr: Transaction, start: number, end: number) {\n  const schema = tr.doc.type.schema;\n  const mark = schema.marks.cite.create();\n\n  tr.addMark(start, end, mark);\n\n  // look for valid citation ids inside and mark them\n  const citeText = tr.doc.textBetween(start, end);\n\n  kCitationIdRegex.lastIndex = 0;\n  let match = kCitationIdRegex.exec(citeText);\n  while (match !== null) {\n    const pos = start + match.index + match[1].length;\n    const idMark = schema.marks.cite_id.create();\n\n    tr.addMark(pos, pos + match[2].length, idMark);\n    match = kCitationIdRegex.exec(citeText);\n  }\n  kCitationIdRegex.lastIndex = 0;\n  return tr;\n}\n\nfunction citeLength(text: string) {\n  if (text.match(kNoteCiteRegex) ||\n      text.match(kInTextCiteRegex) ||\n      text.match(kInTextCiteWithSuffixRegEx)) {\n    return text.length;\n  } else {\n    return 0;\n  }\n}\n\n// up to how many characters of the passed text constitute a valid cite_id in the editor\n// (note that the editor tolerates citations ids with just an '@')\nfunction citeIdLength(text: string) {\n  const match = text.match(kCiteId);\n  if (match) {\n    return match[0].length;\n  } else {\n    return 0;\n  }\n}\n\nexport interface ParsedCitation {\n  token: string;\n  pos: number;\n  offset: number;\n}\n\nexport function parseCitation(context: EditorState | Transaction): ParsedCitation | null {\n  // return completions only if we are inside a cite_id . This way\n  // if the user dismisses the cite_id (e.g. decides to type @ as literal string)\n  // we won't offer completions\n  const markType = context.doc.type.schema.marks.cite_id;\n  const range = getMarkRange(context.doc.resolve(context.selection.head - 1), markType);\n  if (range) {\n    // examine text up to the cursor\n    const citeText = context.doc.textBetween(range.from, context.selection.head);\n\n    // make sure there is no text directly ahead (except bracket, space, semicolon)\n    const nextChar = context.doc.textBetween(context.selection.head, context.selection.head + 1);\n    if (!nextChar || [';', ' ', ']'].includes(nextChar) ) {\n      // look for a cite id that terminates at the cursor (including spaces/text after the id,\n      // but before any semicolon delimiter)\n      const match = citeText.match(kCompletionCiteIdRegEx);\n      if (match) {\n        const token = match[2];\n        const pos = range.from + match.index! + match[1].length;\n        return { token, pos, offset: -match[1].length };\n      }\n    }   \n  }\n  return null;\n}\n\n// Replaces the current selection with a resolved citation id\nexport async function insertCitation(\n  view: EditorView,\n  doi: string,\n  bibManager: BibliographyManager,\n  pos: number,\n  ui: EditorUI,\n  server: PandocServer,\n  csl?: CSL,\n  provider?: string,\n) {\n  // ensure the bib manager is loaded before proceeding\n  await bibManager.load(ui, view.state.doc);\n\n  // We try not call this function if the entry for this DOI is already in the bibliography,\n  // but it can happen. So we need to check here if it is already in the bibliography and\n  // if it is, deal with it appropriately.\n  const existingEntry = bibManager.findDoiInLocalBibliography(doi);\n  if (existingEntry) {\n    // Now that we have loaded the bibliography, there is an entry\n    // Just write it. Not an ideal experience, but something that\n    // should happen only in unusual experiences\n    const tr = view.state.tr;\n\n    // This could be called by paste handler, so stop completions\n    performCiteCompletionReplacement(tr, tr.mapping.map(pos), existingEntry.id);\n    view.dispatch(tr);\n  } else {\n    // There isn't an entry in the existing bibliography\n    // Show the user UI to and ultimately create an entry in the biblography\n    // (even creating a bibliography if necessary)\n\n    // Read bibliographies out of the document and pass those alone\n    const existingIds = bibManager.localSources().map(source => source.id);\n\n    const citeProps: InsertCiteProps = {\n      doi,\n      existingIds,\n      bibliographyFiles: bibManager\n        .writableBibliographyFiles(view.state.doc, ui)\n        .map(writableFile => writableFile.displayPath),\n      provider,\n      csl,\n      citeUI: csl\n        ? {\n            suggestedId: csl.id || suggestCiteId(existingIds, csl),\n            previewFields: formatForPreview(csl),\n          }\n        : undefined,\n    };\n\n    const result = await ui.dialogs.insertCite(citeProps);\n    if (result && result.id.length) {\n      if (!result?.csl.title) {\n        await ui.dialogs.alert(\n          ui.context.translateText(\n            \"This citation can't be added to the bibliography because it is missing required fields.\",\n          ),\n          ui.context.translateText('Invalid Citation'),\n          kAlertTypeError,\n        );\n      } else {\n        // Figure out whether this is a project or document level bibliography\n        const writableBiblios = bibManager.writableBibliographyFiles(view.state.doc, ui);\n\n        // Sort out the bibliography file into which we should write the entry\n        const thisWritableBiblio = writableBiblios.find(writable => writable.displayPath === result.bibliographyFile);\n        const project = thisWritableBiblio?.isProject || false;\n        const writableBiblioPath = thisWritableBiblio\n          ? thisWritableBiblio.fullPath\n          : joinPaths(ui.context.getDefaultResourceDir(), result.bibliographyFile);\n        const bibliographyFile: BibliographyFile = {\n          displayPath: result.bibliographyFile,\n          fullPath: writableBiblioPath,\n          isProject: project,\n          writable: true,\n        };\n\n        // Create the source that holds the id, provider, etc...\n        const source: BibliographySource = {\n          ...result.csl,\n          id: result.id,\n          providerKey: provider || '',\n        };\n\n        // Start the transaction\n        const tr = view.state.tr;\n\n        // Write the source to the bibliography if needed\n        const writeCiteId = await ensureSourcesInBibliography(\n          tr,\n          [source],\n          bibliographyFile,\n          bibManager,\n          view,\n          ui,\n          server,\n        );\n\n        if (writeCiteId) {\n          // Write the citeId\n          const schema = view.state.schema;\n          const idText = schema.text(source.id, [schema.marks.cite_id.create()]);\n          performCiteCompletionReplacement(tr, tr.mapping.map(pos), idText);\n        }\n\n        // Dispath the transaction\n        view.dispatch(tr);\n      }\n    }\n    view.focus();\n  }\n}\n\n// Ensures that the sources are in the specified bibliography file\n// and ensures that the bibliography file is properly referenced (either)\n// as a project bibliography or inline in the document YAML\nexport async function ensureSourcesInBibliography(\n  tr: Transaction,\n  sources: BibliographySource[],\n  bibliographyFile: BibliographyFile,\n  bibManager: BibliographyManager,\n  view: EditorView,\n  ui: EditorUI,\n  server: PandocServer,\n): Promise<boolean> {\n  // Write entry to a bibliography file if it isn't already present\n  await bibManager.load(ui, view.state.doc);\n\n  // See if there is a warning for the selected provider. If there is, we may need to surface\n  // that to the user. If there is no provider specified, no need to care about warnings.\n  const providers = uniqby(sources, (source: BibliographySource) => source.providerKey).map(\n    source => source.providerKey,\n  );\n\n  // Find any providers that have warnings\n  const providersWithWarnings = providers.filter(prov => bibManager.warningForProvider(prov));\n\n  // Is this a bibtex bibliography?\n  const bibliographyFileExtension = getExtension(bibliographyFile.fullPath);\n  const isBibTexBibliography = bibliographyFileExtension === 'bib' || bibliographyFileExtension === 'bibtex';\n\n  // If there is a warning message and we're exporting to BibTeX, show the warning\n  // message to the user and confirm that they'd like to proceed. This would ideally\n  // know more about the warning type and not have this filter here (e.g. it would just\n  // always show the warning)\n  let proceedWithInsert = true;\n  if (providersWithWarnings.length > 0 && ui.prefs.zoteroUseBetterBibtex() && isBibTexBibliography) {\n    const results = await Promise.all<boolean>(\n      providersWithWarnings.map(async withWarning => {\n        const warning = bibManager.warningForProvider(withWarning);\n        if (warning) {\n          return await ui.dialogs.yesNoMessage(\n            warning,\n            'Warning',\n            kAlertTypeWarning,\n            ui.context.translateText('Insert Citation Anyway'),\n            ui.context.translateText('Cancel'),\n          );\n        } else {\n          return true;\n        }\n      }),\n    );\n    proceedWithInsert = results.every(result => result);\n  }\n\n  if (proceedWithInsert) {\n    await Promise.all(\n      sources.map(async (source, i) => {\n        if (source.id) {\n          // Crossref sometimes provides invalid json for some entries. Sanitize it for citeproc\n          const cslToWrite = sanitizeForCiteproc(source);\n\n          if (!bibManager.findIdInLocalBibliography(source.id)) {\n            const sourceAsBibTex = isBibTexBibliography\n              ? await bibManager.generateBibTeX(ui, source.id, cslToWrite, source.providerKey)\n              : undefined;\n            await server.addToBibliography(\n              bibliographyFile.fullPath,\n              bibliographyFile.isProject,\n              source.id,\n              JSON.stringify([cslToWrite]),\n              sourceAsBibTex || '',\n            );\n          }\n\n          if (!bibliographyFile.isProject) {\n            ensureBibliographyFileForDoc(tr, bibliographyFile.displayPath, ui);\n          }\n        }\n      }),\n    );\n  }\n  return proceedWithInsert;\n}\n\nexport function performCiteCompletionReplacement(tr: Transaction, pos: number, replacement: ProsemirrorNode | string) {\n  // perform replacement\n  performCompletionReplacement(tr, pos, replacement);\n\n  // find the range of the cite and fixup marks\n  const range = getMarkRange(tr.selection.$head, tr.doc.type.schema.marks.cite);\n  if (range) {\n    encloseInCiteMark(tr, range.from, range.to);\n  }\n}\n\nexport default extension;\n","/*\n * bibliography.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport Fuse from 'fuse.js';\nimport { PandocServer } from '../pandoc';\n\nimport { EditorUI } from '../ui';\nimport { ParsedYaml, parseYamlNodes } from '../yaml';\nimport { CSL } from '../csl';\nimport { ZoteroServer } from '../zotero';\nimport { BibliographyDataProviderLocal, kLocalBiliographyProviderKey } from './bibliography-provider_local';\nimport { BibliographyDataProviderZotero } from './bibliography-provider_zotero';\nimport { toBibLaTeX, toBibTeX } from './bibDB';\nimport { joinPaths } from '../path';\n\nexport interface BibliographyFile {\n  displayPath: string;\n  fullPath: string;\n  isProject: boolean;\n  writable: boolean;\n}\n\nexport function bibliographyFileForPath(path: string, ui: EditorUI): BibliographyFile {\n  return {\n    displayPath: path,\n    fullPath: joinPaths(ui.context.getDefaultResourceDir(), path),\n    isProject: false,\n    writable: true,\n  };\n}\n\nexport interface BibliographyType {\n  extension: string;\n  displayName: string;\n  default: boolean;\n}\n\n// The types of bibliography files and the default value\nexport function bibliographyTypes(ui: EditorUI): BibliographyType[] {\n  const defaultBiblioType = ui.prefs.bibliographyDefaultType();\n  return [\n    {\n      displayName: ui.context.translateText('BibTeX'),\n      extension: 'bib',\n      default: defaultBiblioType === 'bib',\n    },\n    {\n      displayName: ui.context.translateText('CSL-YAML'),\n      extension: 'yaml',\n      default: defaultBiblioType === 'yaml',\n    },\n    {\n      displayName: ui.context.translateText('CSL-JSON'),\n      extension: 'json',\n      default: defaultBiblioType === 'json',\n    },\n  ];\n}\n\nexport interface BibliographyDataProvider {\n  key: string;\n  name: string;\n  requiresWritable: boolean;\n\n  isEnabled(): boolean;\n  load(\n    docPath: string | null,\n    resourcePath: string,\n    yamlBlocks: ParsedYaml[],\n    refreshCollectionData?: boolean,\n  ): Promise<boolean>;\n  collections(): BibliographyCollection[];\n  items(): BibliographySourceWithCollections[];\n  itemsForCollection(collectionKey: string): BibliographySourceWithCollections[];\n  bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[];\n  generateBibTeX(ui: EditorUI, id: string, csl: CSL): Promise<string | undefined>;\n  warningMessage(): string | undefined;\n}\n\nexport interface BibliographyCollection {\n  name: string;\n  key: string;\n  provider: string;\n  parentKey?: string;\n}\n\nexport interface Bibliography {\n  sources: CSL[];\n  project_biblios: string[];\n}\n\n// The individual bibliographic source\nexport interface BibliographySource extends CSL {\n  id: string;\n  providerKey: string;\n}\n\nexport interface BibliographySourceWithCollections extends BibliographySource {\n  collectionKeys: string[];\n}\n\n// The fields and weights that will indexed and searched\n// when searching bibliographic sources\nconst kFields: Fuse.FuseOptionKeyObject[] = [\n  { name: 'id', weight: 30 },\n  { name: 'author.family', weight: 15 },\n  { name: 'author.literal', weight: 15 },\n  { name: 'issued', weight: 15 },\n  { name: 'title', weight: 15 },\n  { name: 'author.given', weight: 10 },\n  { name: 'providerKey', weight: 0.01 },\n  { name: 'collectionKeys', weight: 0.01 },\n];\n\nconst kSearchOptions = {\n  isCaseSensitive: false,\n  shouldSort: true,\n  includeMatches: false,\n  includeScore: false,\n  keys: kFields,\n};\n\nexport class BibliographyManager {\n  private providers: BibliographyDataProvider[];\n  private sources?: BibliographySourceWithCollections[];\n  private writable?: boolean;\n  private searchIndex?: Fuse<BibliographySourceWithCollections, Fuse.IFuseOptions<BibliographySourceWithCollections>>;\n\n  public constructor(server: PandocServer, zoteroServer: ZoteroServer) {\n    this.providers = [new BibliographyDataProviderLocal(server), new BibliographyDataProviderZotero(zoteroServer)];\n  }\n\n  public async prime(ui: EditorUI, doc: ProsemirrorNode) {\n    // Load the bibliography\n    await this.load(ui, doc, true);\n  }\n\n  public async load(ui: EditorUI, doc: ProsemirrorNode, refreshCollectionData?: boolean): Promise<void> {\n    // read the Yaml blocks from the document\n    const parsedYamlNodes = parseYamlNodes(doc);\n\n    // Currently edited doc\n    const docPath = ui.context.getDocumentPath();\n\n    // Load each provider\n    const providersNeedUpdate = await Promise.all(\n      this.providers.map(provider =>\n        provider.load(docPath, ui.context.getDefaultResourceDir(), parsedYamlNodes, refreshCollectionData),\n      ),\n    );\n\n    // Once loaded, see if any of the providers required an index update\n    const needsIndexUpdate = providersNeedUpdate.reduce((prev, curr) => prev || curr);\n\n    // Update the index if anything requires that we do so\n    if (needsIndexUpdate) {\n      // Get the entries\n      const providersEntries = this.providers.map(provider => provider.items());\n\n      // These are in arbitrary order, so sort them alphabetically\n      const idSort = (a: BibliographySource, b: BibliographySource) => {\n        return a.id.localeCompare(b.id);\n      };\n      this.sources = ([] as BibliographySourceWithCollections[]).concat(...providersEntries).sort(idSort);\n\n      this.searchIndex = this.getFuse(this.sources);\n    }\n\n    // Is this a writable bibliography\n    this.writable = this.isWritable(doc, ui);\n  }\n\n  public hasSources() {\n    return this.allSources().length > 0;\n  }\n\n  public allSources(): BibliographySourceWithCollections[] {\n    if (this.sources && this.allowsWrites()) {\n      return this.sources;\n    } else {\n      return this.sources?.filter(source => source.providerKey === kLocalBiliographyProviderKey) || [];\n    }\n    return [];\n  }\n\n  public sourcesForProvider(providerKey: string): BibliographySourceWithCollections[] {\n    return this.allSources().filter(item => item.providerKey === providerKey);\n  }\n\n  public sourcesForProviderCollection(provider: string, collectionKey: string): BibliographySourceWithCollections[] {\n    return this.sourcesForProvider(provider).filter(item => item.collectionKeys.includes(collectionKey));\n  }\n\n  public localSources(): BibliographySourceWithCollections[] {\n    return this.allSources().filter(source => source.providerKey === kLocalBiliographyProviderKey);\n  }\n\n  public allowsWrites(): boolean {\n    return this.writable || false;\n  }\n\n  private isWritable(doc: ProsemirrorNode, ui: EditorUI): boolean {\n    const bibliographyFiles = this.bibliographyFiles(doc, ui);\n    if (bibliographyFiles.length === 0) {\n      // Since there are no bibliographies, we can permit writing a fresh one\n      return true;\n    }\n    return bibliographyFiles.filter(bibFile => bibFile.writable).length > 0;\n  }\n\n  public writableBibliographyFiles(doc: ProsemirrorNode, ui: EditorUI) {\n    return this.bibliographyFiles(doc, ui).filter(bibFile => bibFile.writable);\n  }\n\n  public bibliographyFiles(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n    const bibliographyPaths = this.providers.map(provider => provider.bibliographyPaths(doc, ui));\n    return ([] as BibliographyFile[]).concat(...bibliographyPaths);\n  }\n\n  public localProviders(): BibliographyDataProvider[] {\n    if (this.allowsWrites()) {\n      return this.providers;\n    } else {\n      return this.providers.filter(provider => provider.requiresWritable === false);\n    }\n  }\n\n  public providerName(providerKey: string): string | undefined {\n    const dataProvider = this.providers.find(prov => prov.key === providerKey);\n    return dataProvider?.name;\n  }\n\n  // Allows providers to generate bibTeX, if needed. This is useful in contexts\n  // like Zotero where a user may be using the Better Bibtex plugin which can generate\n  // superior BibTeX using things like stable citekeys with custom rules, and more.\n  //\n  // If the provider doesn't provide BibTeX, we can generate it ourselves\n  public async generateBibTeX(ui: EditorUI, id: string, csl: CSL, provider?: string): Promise<string | undefined> {\n    const dataProvider = this.providers.find(prov => prov.key === provider);\n    if (dataProvider) {\n      const dataProviderBibTeX = dataProvider.generateBibTeX(ui, id, csl);\n      if (dataProviderBibTeX) {\n        return dataProviderBibTeX;\n      }\n    }\n    return Promise.resolve(toBibTeX(id, csl));\n  }\n\n  public warning(): string | undefined {\n    const warningProvider = this.providers.find(provider => provider.warningMessage());\n    if (warningProvider) {\n      return warningProvider.warningMessage();\n    }\n  }\n\n  public warningForProvider(providerKey?: string): string | undefined {\n    if (providerKey) {\n      const warningProvider = this.providers.find(prov => prov.key === providerKey);\n      if (warningProvider) {\n        return warningProvider.warningMessage();\n      }\n    }\n  }\n\n  public findDoiInLocalBibliography(doi: string): BibliographySourceWithCollections | undefined {\n    // NOTE: This will only search sources that have already been loaded.\n    // Please be sure to use load() before calling this or\n    // accept the risk that this will not properly search for a DOI if the\n    // bibliography hasn't already been loaded.\n    return this.localSources().find(source => source.DOI === doi);\n  }\n\n  public findIdInLocalBibliography(id: string): BibliographySourceWithCollections | undefined {\n    // NOTE: This will only search sources that have already been loaded.\n    // Please be sure to use load() before calling this or\n    // accept the risk that this will not properly search for a DOI if the\n    // bibliography hasn't already been loaded.\n\n    return this.localSources().find(source => source.id === id);\n  }\n\n  // A general purpose search interface for filtered searching\n  public search(query?: string, providerKey?: string, collectionKey?: string): BibliographySourceWithCollections[] {\n    const limit = 100;\n    if (query && query.length > 0) {\n      // These are ordered by search score, so leave as is\n      if (providerKey && collectionKey) {\n        return this.searchProviderCollection(query, limit, providerKey, collectionKey);\n      } else if (providerKey) {\n        return this.searchProvider(query, limit, providerKey);\n      } else {\n        return this.searchAllSources(query, limit);\n      }\n    } else {\n      if (providerKey && collectionKey) {\n        return this.sourcesForProviderCollection(providerKey, collectionKey);\n      } else if (providerKey) {\n        return this.sourcesForProvider(providerKey);\n      } else {\n        return this.allSources();\n      }\n    }\n  }\n\n  public searchAllSources(query: string, limit: number): BibliographySourceWithCollections[] {\n    return this.searchSources(query, limit, this.allSources());\n  }\n\n  public searchSources(\n    query: string,\n    limit: number,\n    sources: BibliographySourceWithCollections[],\n  ): BibliographySourceWithCollections[] {\n    // NOTE: This will only search sources that have already been loaded.\n    // Please be sure to use load() before calling this or\n    // accept the risk that this will not properly search for a source if the\n    // bibliography hasn't already been loaded.\n    if (sources && this.searchIndex) {\n      // NOTE: Search performance can really drop off for long strings\n      // Test cases start at 20ms to search for a single character\n      // grow to 270ms to search for 20 character string\n      // grow to 1060ms to search for 40 character string\n      const searchResults = this.searchIndex.search(query, { ...kSearchOptions, limit });\n      const items = searchResults.map((result: { item: any }) => result.item);\n\n      // Filter out any non local items if this isn't a writable bibliography\n      const filteredItems = this.allowsWrites()\n        ? items\n        : items.filter(item => item.provider === kLocalBiliographyProviderKey);\n      return filteredItems;\n    } else {\n      return [];\n    }\n  }\n\n  // Search only a specific provider\n  public searchProvider(query: string, limit: number, providerKey: string): BibliographySourceWithCollections[] {\n    const orFields = kFields.map(field => {\n      return {\n        [field.name]: query,\n      };\n    });\n    const q = {\n      $and: [\n        { providerKey },\n        {\n          $or: orFields,\n        },\n      ],\n    };\n\n    if (this.searchIndex) {\n      const searchResults = this.searchIndex.search(q, { limit });\n      return searchResults.map((result: { item: any }) => result.item);\n    } else {\n      return [];\n    }\n  }\n\n  // Search a specific provider and collection\n  public searchProviderCollection(\n    query: string,\n    limit: number,\n    providerKey: string,\n    collectionKey: string,\n  ): BibliographySourceWithCollections[] {\n    const orFields = kFields.map(field => {\n      return {\n        [field.name]: query,\n      };\n    });\n    const q = {\n      $and: [\n        {\n          providerKey,\n        },\n        {\n          collectionKeys: collectionKey,\n        },\n        {\n          $or: orFields,\n        },\n      ],\n    };\n\n    if (this.searchIndex) {\n      const searchResults = this.searchIndex.search(q, { limit });\n      return searchResults.map((result: { item: any }) => result.item);\n    } else {\n      return [];\n    }\n  }\n\n  private getFuse(bibSources: BibliographySourceWithCollections[]) {\n    // build search index\n    const options = {\n      ...kSearchOptions,\n      keys: kFields.map(field => field.name),\n    };\n    const index = Fuse.createIndex<BibliographySourceWithCollections>(options.keys, bibSources);\n    return new Fuse(bibSources, options, index);\n  }\n}\n","/*\n * bibliography-provider_local.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\n\nimport { PandocServer } from '../pandoc';\n\nimport { expandPaths, getExtension, joinPaths } from '../path';\nimport { EditorUI } from '../ui';\n\nimport {\n  BibliographyDataProvider,\n  Bibliography,\n  BibliographyFile,\n  BibliographyCollection,\n  BibliographySourceWithCollections,\n} from './bibliography';\nimport { ParsedYaml, parseYamlNodes, valueFromYamlText } from '../yaml';\nimport { toBibLaTeX, toBibTeX } from './bibDB';\nimport { CSL } from '../csl';\n\nexport interface BibliographyResult {\n  etag: string;\n  bibliography: Bibliography;\n}\nexport const kLocalBiliographyProviderKey = 'E06068FE-45DA-4D88-ABDA-0DF290624950';\n\nexport class BibliographyDataProviderLocal implements BibliographyDataProvider {\n  private etag: string;\n  private bibliography?: Bibliography;\n  private readonly server: PandocServer;\n\n  public constructor(server: PandocServer) {\n    this.server = server;\n    this.etag = '';\n  }\n  public name: string = 'Bibliography';\n  public key: string = kLocalBiliographyProviderKey;\n  public requiresWritable: boolean = false;\n\n  // Always enabled;\n  public isEnabled(): boolean {\n    return true;\n  }\n\n  public prime(): Promise<any> {\n    return Promise.resolve();\n  }\n\n  public async load(docPath: string | null, resourcePath: string, yamlBlocks: ParsedYaml[]): Promise<boolean> {\n    // Gather the biblography files from the document\n    const bibliographiesRelative = bibliographyFilesFromDoc(yamlBlocks);\n    const bibliographiesAbsolute = expandPaths(resourcePath, bibliographiesRelative || []);\n\n    // Gather the reference block\n    const refBlock = referenceBlockFromYaml(yamlBlocks);\n\n    let updateIndex = false;\n    if (docPath || bibliographiesAbsolute.length > 0 || refBlock) {\n      // get the bibliography\n      try {\n        const result = await this.server.getBibliography(docPath, bibliographiesAbsolute, refBlock, this.etag);\n\n        // Read bibliography data from files (via server)\n        if (!this.bibliography || result.etag !== this.etag) {\n          this.bibliography = result.bibliography;\n          updateIndex = true;\n        }\n\n        // record the etag for future queries\n        this.etag = result.etag;\n      } catch (e) {\n        // ignore error\n      }\n    }\n    return updateIndex;\n  }\n\n  public collections(): BibliographyCollection[] {\n    return [];\n\n    // NOTE: If we can make the 'itemsForCollections' call work, we can begin emitting the various\n    // bibliography files here. Right now, the server generates the CSL for all the bibligraphy runs\n    // in a single call, meaning that the items lose context of which bibliography file that they\n    // come from.\n    /*\n    if (!this.bibliography || !this.bibliography.sources) {\n      return [];\n    }\n\n    if (this.projectBiblios().length > 0) {\n      return this.projectBiblios().map(biblio => ({ name: biblio, key: biblio }));\n    }\n\n    const bibliographies = bibliographyFilesFromDocument(doc, ui);\n    return bibliographies ? bibliographies.map(biblio => ({ name: biblio, key: biblio })) : [];\n    */\n  }\n\n  public items(): BibliographySourceWithCollections[] {\n    if (!this.bibliography || !this.bibliography.sources) {\n      return [];\n    }\n\n    return this.bibliography.sources.map(source => ({\n      ...source,\n      id: source.id!, // Local CSL always has an id\n      providerKey: this.key,\n      collectionKeys: [],\n    }));\n  }\n\n  public itemsForCollection(collectionKey: string): BibliographySourceWithCollections[] {\n    // NOTE: IF we add support, need to filter by biblio file\n    return [];\n  }\n\n  public projectBiblios(): string[] {\n    return this.bibliography?.project_biblios || [];\n  }\n\n  public generateBibTeX(_ui: EditorUI, id: string, csl: CSL): Promise<string | undefined> {\n    return Promise.resolve(toBibTeX(id, csl));\n  }\n\n  public warningMessage(): string | undefined {\n    return undefined;\n  }\n\n  public bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n    const kPermissableFileExtensions = ['bibtex', 'bib', 'yaml', 'yml', 'json'];\n    if (this.bibliography?.project_biblios && this.bibliography.project_biblios.length > 0) {\n      return this.bibliography?.project_biblios.map(projectBiblio => {\n        return {\n          displayPath: projectBiblio,\n          fullPath: projectBiblio,\n          isProject: true,\n          writable: kPermissableFileExtensions.includes(getExtension(projectBiblio)),\n        };\n      });\n    }\n    return (\n      bibliographyFilesFromDocument(doc, ui)?.map(path => {\n        return {\n          displayPath: path,\n          fullPath: joinPaths(ui.context.getDefaultResourceDir(), path),\n          isProject: false,\n          writable: kPermissableFileExtensions.includes(getExtension(path)),\n        };\n      }) || []\n    );\n  }\n}\n\nfunction bibliographyFilesFromDocument(doc: ProsemirrorNode, ui: EditorUI): string[] | undefined {\n  // Gather the files from the document\n  return bibliographyFilesFromDoc(parseYamlNodes(doc));\n}\n\nfunction bibliographyFilesFromDoc(parsedYamls: ParsedYaml[]): string[] | undefined {\n  // Read the values of any yaml blocks that include bibliography headers\n  // filter out blocks that don't include such headers\n  const bibliographyValues = parsedYamls\n    .map(parsedYaml => {\n      return valueFromYamlText('bibliography', parsedYaml.yamlCode);\n    })\n    .filter(val => val !== null);\n\n  if (bibliographyValues.length > 0) {\n    // Pandoc will use the last biblography node when generating a bibliography.\n    // So replicate this and use the last biblography node that we find\n    const bibliographyFiles = bibliographyValues[bibliographyValues.length - 1];\n    if (\n      Array.isArray(bibliographyFiles) &&\n      bibliographyFiles.every(bibliographyFile => typeof bibliographyFile === 'string')\n    ) {\n      return bibliographyFiles;\n    } else {\n      // A single bibliography\n      return [bibliographyFiles];\n    }\n  }\n  return undefined;\n}\n\nfunction referenceBlockFromYaml(parsedYamls: ParsedYaml[]): string {\n  const refBlockParsedYamls = parsedYamls.filter(\n    parsedYaml => parsedYaml.yaml !== null && typeof parsedYaml.yaml === 'object' && parsedYaml.yaml.references,\n  );\n\n  // Pandoc will use the last references node when generating a bibliography.\n  // So replicate this and use the last biblography node that we find\n  if (refBlockParsedYamls.length > 0) {\n    const lastReferenceParsedYaml = refBlockParsedYamls[refBlockParsedYamls.length - 1];\n    if (lastReferenceParsedYaml) {\n      return `---\\n${lastReferenceParsedYaml.yamlCode}\\n---\\n`;\n    }\n  }\n\n  return '';\n}\n\nconst kSpaceOrColonRegex = /[\\s:]/;\nfunction bibliographyLine(bibliographyFile: string): string {\n  const sketchyCharMatch = bibliographyFile.match(kSpaceOrColonRegex);\n  if (sketchyCharMatch) {\n    return `bibliography: \"${bibliographyFile}\"`;\n  } else {\n    return `bibliography: ${bibliographyFile}`;\n  }\n}\n\nexport function ensureBibliographyFileForDoc(tr: Transaction, bibliographyFile: string, ui: EditorUI) {\n  // read the Yaml blocks from the document\n  const parsedYamlNodes = parseYamlNodes(tr.doc);\n\n  // Gather the biblography files from the document\n  const bibliographiesRelative = bibliographyFilesFromDoc(parsedYamlNodes);\n  if (bibliographiesRelative && bibliographiesRelative.length > 0) {\n    // The user selected bibliography is already in the document OR\n    // There is a bibliography entry, but it doesn't include the user\n    // selected bibliography. In either case, we're not going to write\n    // a bibliography entry to any YAML node.\n    return bibliographiesRelative.includes(bibliographyFile);\n  } else {\n    // There aren't any bibliographies declared for this document yet either because\n    // there are no yaml metadata blocks or the yaml metadata blocks that exist omit\n    // the bibliography property\n    if (parsedYamlNodes.length === 0) {\n      // There aren't any yaml nodes in this document, need to create one\n      const biblioNode = createBiblographyYamlNode(tr.doc.type.schema, bibliographyFile);\n      tr.insert(1, biblioNode);\n    } else {\n      // We found at least one node in the document, add to the first node that we found\n      const firstBlock = parsedYamlNodes[0];\n      const updatedNode = addBibliographyToYamlNode(tr.doc.type.schema, bibliographyFile, firstBlock);\n      tr.replaceRangeWith(firstBlock.node.pos, firstBlock.node.pos + firstBlock.node.node.nodeSize, updatedNode);\n    }\n    return true;\n  }\n}\n\nfunction addBibliographyToYamlNode(schema: Schema, bibliographyFile: string, parsedYaml: ParsedYaml) {\n  // Add this to the first node\n  const yamlCode = parsedYaml.yamlCode;\n  const yamlWithBib = `---\\n${yamlCode}\\n${bibliographyLine(bibliographyFile)}\\n---`;\n  const yamlText = schema.text(yamlWithBib);\n  return schema.nodes.yaml_metadata.create({}, yamlText);\n}\n\nfunction createBiblographyYamlNode(schema: Schema, bibliographyFile: string) {\n  const yamlText = schema.text(`---\\n${bibliographyLine(bibliographyFile)}\\n---`);\n  return schema.nodes.yaml_metadata.create({}, yamlText);\n}\n","/*\n * path.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function expandPaths(rootPath: string, paths: string[]): string[] {\n  return paths.map(path => joinPaths(rootPath, path));\n}\n\nexport function joinPaths(root: string, path: string) {\n  const mergedPath = `${root}/${path}`;\n\n  // Clean out duplicate paths\n  return mergedPath.replace(/\\/\\//g, '/');\n}\n\nexport function getExtension(path: string) {\n  // Get the file out of the path\n  const fileName = path.split(/[\\\\/]/).pop();\n  if (fileName) {\n    const lastDot = fileName.lastIndexOf('.');\n    if (lastDot > 0) {\n      return fileName.slice(lastDot + 1);\n    }\n  }\n  return '';\n}\n\nexport function changeExtension(path: string, extension: string) {\n  const lastDot = path.lastIndexOf('.');\n  const pathNoExtension = path.substr(0, lastDot + 1);\n  return pathNoExtension + extension;\n}\n","/*\n * BibDB.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport {\n  BibFieldTypes,\n  NameDictObject,\n  NodeArray,\n  RangeArray,\n  BibField,\n  BibLatexExporter,\n  BibTypes,\n  BibType,\n} from 'biblatex-csl-converter';\n\nimport { Mark, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { CSL, CSLDate, cslDateToEDTFDate, CSLName } from '../csl';\nimport { cslTextToProsemirrorNode } from '../csl-text';\nimport { bibDbToBibTeX } from '../bibtex/bibtex';\n\nexport type BibDB = Record<string, EntryObject>;\n\nexport interface EntryObject {\n  csl_type?: string;\n  bib_type: string;\n  entry_key: string;\n  fields: Record<string, any>;\n  incomplete?: boolean;\n  unexpected_fields?: Record<string, any>;\n  unknown_fields?: Record<string, any>;\n}\n\n// This is our wrapper of a typescript BibLaTeX exporter\n// https://github.com/fiduswriter/biblatex-csl-converter\n\n// Traditional Form Looks Like:\n// author = {{Abbas}, {Osma Ahmed} and {Ibrahim}, {Issa Ghada} and {Ismail}, {Abdel-Gawad Eman}}\n//\n// Non traditional form looks like:\n// author = {given={Osma Ahmed}, family={Abbas} and given={Issa Ghada}, family={Ibrahim} and given={Abdel-Gawad Eman}, family={Ismail}}\nconst kUseTraditionalNameForm = false;\n\n// Generates bibLaTeX for a given CSL object / id\nexport function toBibLaTeX(id: string, csl: CSL): string | undefined {\n  // A BibDB is basically a map of key / EntryObject[] that is\n  // used by the exporter to generate BibLaTeX\n  const bibDB = cslToBibDB(id, csl);\n  if (bibDB) {\n    // Use the exported to parse the bibDB and generate bibLaTeX\n    const exporter: BibLatexExporter = new BibLatexExporter(bibDB, false, {\n      traditionalNames: kUseTraditionalNameForm,\n    });\n    const sourceAsBibLaTeX = exporter.parse();\n\n    // Indent any , new lines\n    return sourceAsBibLaTeX.replace(/,\\n/g, ',\\n\\t');\n  }\n  return undefined;\n}\n\nexport function toBibTeX(id: string, csl: CSL): string | undefined {\n  // A BibDB is basically a map of key / EntryObject[] that is\n  // used by the exporter to generate BibLaTeX\n  const bibDB = cslToBibDB(id, csl);\n  if (bibDB) {\n    // Use the exported to parse the bibDB and generate bibLaTeX\n    const sourceAsBibTeX = bibDbToBibTeX(bibDB);\n\n    // Indent any , new lines\n    return sourceAsBibTeX;\n  }\n  return undefined;\n}\n\n// Converts a single CSL item to a bibDB containing\n// a single EntryObject representing that CSL item\nfunction cslToBibDB(id: string, csl: CSL): BibDB | undefined {\n  const bibType = bibTypeForCSL(csl.type);\n  const bibObject: EntryObject = {\n    bib_type: bibType[0],\n    csl_type: bibType[1].csl,\n    entry_key: id,\n    fields: {},\n  };\n\n  const enumerableCSL = csl as any;\n  sortedKeys(csl).forEach(key => {\n    const value: any = enumerableCSL[key];\n\n    const bibFieldDatas = bibFieldForValue(key, csl.type);\n\n    bibFieldDatas?.forEach(bibFieldData => {\n      if (bibFieldData) {\n        const bibFieldKey = bibFieldData[0];\n        const bibField = bibFieldData[1];\n        const type = bibField.type;\n        let nodeValue: any;\n        switch (type) {\n          case 'f_date':\n            // f_date = // EDTF 1.0 level 0/1 compliant string. (2000-12-31)\n            const cslDate = value as CSLDate;\n            if (cslDate) {\n              const edtfDate = cslDateToEDTFDate(cslDate);\n              if (edtfDate) {\n                nodeValue = edtfDate;\n              }\n            }\n            break;\n          case 'f_integer':\n          case 'f_literal':\n          case 'f_long_literal':\n          case 'f_title':\n            // f_integer, f_literal, f_long_literal, f_title = [nodeValue]\n            // l_literal = [nodeValue]\n            if (value && value.length > 0) {\n              nodeValue = textNodes(value);\n            }\n            break;\n          case 'l_literal':\n            // l_literal = [NodeArray]\n            if (value && value.length > 0) {\n              nodeValue = [textNodes(value)];\n            }\n            break;\n          case 'f_key':\n            // f_key: string | NodeArray (string points to another key\n            // name in BibObject whose value is used for this key)\n            if (bibField.options) {\n              const options = bibField.options as any;\n              Object.keys(options).find(optionKey => {\n                const optionValue: any = options[optionKey];\n                if (optionValue.csl === value) {\n                  nodeValue = optionKey;\n                  return true;\n                }\n              });\n\n              if (!nodeValue) {\n                nodeValue = textNodes(value);\n              }\n            }\n\n            break;\n          case 'l_key':\n            // l_key, list of [string | NodeArray]\n            if (bibField.options) {\n              const options = bibField.options as any;\n              Object.keys(options).find(optionKey => {\n                const optionValue: any = options[optionKey];\n                if (optionValue.csl === value) {\n                  nodeValue = [optionKey];\n                  return true;\n                }\n              });\n\n              if (!nodeValue && value && value.length > 0) {\n                nodeValue = textNodes(value);\n              }\n            }\n            break;\n          case 'l_range':\n            // l_range Array<RangeArray>\n            const valueStr = value as string;\n            const parts = valueStr.split('-');\n            const range = rangeArray(parts);\n            if (range) {\n              nodeValue = [range];\n            }\n            break;\n          case 'f_uri':\n          case 'f_verbatim':\n            // f_uri, f_verbatim: string\n            nodeValue = value;\n            break;\n          case 'l_name':\n            // l_name Array<NameDictObject>\n            const names = value as CSLName[];\n            nodeValue = names.map(name => {\n              const nameDict: NameDictObject = {\n                family: name.family ? textNodes(name.family) : undefined,\n                given: name.given ? textNodes(name.given) : undefined,\n                literal: name.literal ? textNodes(name.literal) : undefined,\n              };\n              return nameDict;\n            });\n\n            break;\n          case 'l_tag':\n            // l_tag: string[]\n            nodeValue = [value];\n            break;\n        }\n\n        if (nodeValue) {\n          if (shouldIncludeField(bibFieldKey, bibType[1])) {\n            bibObject.fields[bibFieldKey] = nodeValue;\n          }\n        }\n      }\n    });\n  });\n\n  const bibDB: BibDB = {\n    item: bibObject,\n  };\n  return bibDB;\n}\n\n// For a given type, we filter out any fields that aren't required,\n// eitheror, or optional.\nfunction shouldIncludeField(bibDBFieldName: string, bibType: BibType) {\n  return (\n    bibType.required.includes(bibDBFieldName) ||\n    bibType.optional.includes(bibDBFieldName) ||\n    bibType.eitheror.includes(bibDBFieldName)\n  );\n}\n\n// Returns text nodes for a given CSL string. This implements\n// support for the basic CSL marks that are outlined here:\n// https://citeproc-js.readthedocs.io/en/latest/csl-json/markup.html#html-like-formatting-tags\nfunction textNodes(str: string): NodeArray {\n  const pmNode = cslTextToProsemirrorNode(str);\n  if (pmNode) {\n    const nodes: NodeArray = [];\n    pmNode.forEach((node: ProsemirrorNode) => {\n      nodes.push({\n        type: 'text',\n        text: node.textContent,\n        marks: node.marks.map((mark: Mark) => ({ type: mark.type.name })),\n      });\n    });\n    return nodes;\n  } else {\n    return [\n      {\n        type: 'text',\n        text: str,\n        marks: [],\n        attrs: {},\n      },\n    ];\n  }\n}\n\n// Useful for things like page ranges\nfunction rangeArray(parts: string[]): RangeArray | undefined {\n  if (parts.length === 1) {\n    return [textNodes(parts[0])];\n  } else if (parts.length === 2) {\n    return [textNodes(parts[0]), textNodes(parts[1])];\n  }\n}\n\n// Returns the bibDB type for a given CSL type.\nfunction bibTypeForCSL(cslType: string): [string, BibType] {\n  const key = Object.keys(BibTypes).find(bibTypeKey => {\n    const bibType = BibTypes[bibTypeKey];\n    if (bibType.csl === cslType) {\n      return bibTypeKey;\n    }\n  });\n\n  if (key) {\n    const bibType = BibTypes[key];\n    return [key, bibType];\n  } else {\n    const bibType = BibTypes.misc;\n    return ['misc', bibType];\n  }\n}\n\nfunction bibFieldForValue(cslKey: string, cslType: string): Array<[string, BibField]> | undefined {\n  // Special case the following fields:\n  // article-journal issue\n  // patent number\n  // * collection-number\n  // See https://discourse.citationstyles.org/t/issue-number-and-bibtex/1072\n  // https://github.com/fiduswriter/biblatex-csl-converter/blob/35d152935eba253ebadd00e285fb13c5828f167f/src/const.js#L561\n  if (\n    (cslType === 'article-journal' && cslKey === 'issue') ||\n    (cslType === 'patent' && cslKey === 'number') ||\n    cslKey === 'collection-number'\n  ) {\n    const bibField = {\n      type: 'f_literal',\n      biblatex: 'number',\n      csl: cslKey,\n    };\n    return [['number', bibField]];\n  }\n\n  // Find the key that corresponds to this CSL key\n  const keys = Object.keys(BibFieldTypes).filter(bibFieldKey => {\n    const bibField = BibFieldTypes[bibFieldKey];\n    const cslFieldName = bibField.csl;\n    if (cslFieldName && cslFieldName === cslKey) {\n      return bibField;\n    }\n  });\n\n  // Get the field and return\n  if (keys) {\n    return keys.map(key => {\n      const bibField = BibFieldTypes[key];\n      return [key, bibField];\n    });\n  }\n}\n\nfunction sortedKeys(csl: CSL) {\n  let pos = 1;\n  const keySortOrder: { [id: string]: number } = {};\n  keySortOrder.title = pos++;\n\n  keySortOrder.author = pos++;\n  keySortOrder.editor = pos++;\n  keySortOrder.director = pos++;\n  keySortOrder.illustrator = pos++;\n  keySortOrder['collection-editor'] = pos++;\n  keySortOrder.translator = pos++;\n\n  keySortOrder.doi = pos++;\n\n  keySortOrder.issued = pos++;\n  keySortOrder['event-date'] = pos++;\n\n  keySortOrder['container-title'] = pos++;\n  keySortOrder['collection-title'] = pos++;\n\n  keySortOrder.url = pos++;\n\n  keySortOrder.page = pos++;\n  keySortOrder.publisher = pos++;\n\n  const enumerableCSL = csl as any;\n  const keys = Object.keys(enumerableCSL);\n  const sorted = keys.sort((a, b) => {\n    const aOrder = keySortOrder[a.toLowerCase()];\n    const bOrder = keySortOrder[b.toLowerCase()];\n    if (aOrder && bOrder) {\n      return aOrder - bOrder;\n    } else if (aOrder !== undefined) {\n      return -1;\n    } else if (bOrder !== undefined) {\n      return 1;\n    }\n    return a.localeCompare(b);\n  });\n  return sorted;\n}\n","/*\n * csl.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { parseYamlNodes } from './yaml';\nimport { crossRefTypeToCSLType } from './crossref';\nimport { EditorUI } from './ui';\nimport { EditorUIImages } from './ui-images';\n\nexport interface CSL {\n  // The id. This is technically required, but some providers (like crossref) don't provide\n  // one\n  id?: string;\n\n  // Enumeration, one of the type ids from https://api.crossref.org/v1/types\n  type: string;\n\n  // An item key that may be used to identify this item\n  key?: string;\n\n  // Name of work's publisher\n  publisher?: string;\n\n  // Title\n  title?: string;\n\n  // DOI of the work\n  DOI?: string;\n\n  // URL form of the work's DOI\n  URL?: string;\n\n  // Array of Contributors\n  author?: CSLName[];\n\n  // Earliest of published-print and published-online\n  issued?: CSLDate;\n\n  // Full titles of the containing work (usually a book or journal)\n  'container-title'?: string;\n\n  // Short titles of the containing work (usually a book or journal)\n  'short-container-title'?: string;\n\n  // Issue number of an article's journal\n  issue?: string;\n\n  // Volume number of an article's journal\n  volume?: string;\n\n  // Pages numbers of an article within its journal\n  page?: string;\n\n  // These properties are often not included in CSL entries and are here\n  // primarily because they may need to be sanitized\n  ISSN?: string;\n  ISBN?: string;\n  'original-title'?: string;\n  'short-title'?: string;\n  subtitle?: string;\n  subject?: string;\n  archive?: string;\n  license?: [];\n}\n\nexport interface CSLName {\n  family: string;\n  given: string;\n  literal?: string;\n}\n\nexport interface CSLDate {\n  'date-parts'?: Array<[number, number?, number?]>;\n  raw?: string;\n}\n\n// Crossref sends some items back with invalid data types in the CSL JSON\n// This appears to tend to happen the most frequently with fields that CrossRef\n// stores as Arrays which are not properly flatted to strings as Pandoc cite-proc expects.\n// This will flatten any of these fields to the first element of the array\nexport function sanitizeForCiteproc(csl: CSL): CSL {\n  // This field list was create speculatively, so may contain fields that do not require\n  // sanitization (or may omit fields that require it).\n  const sanitizeProperties = [\n    'ISSN',\n    'ISBN',\n    'title',\n    'subject',\n    'archive',\n    'original-title',\n    'short-title',\n    'subtitle',\n    'container-title',\n    'short-container-title',\n    'license'\n  ];\n  const cslAny: { [key: string]: any } = {\n    ...csl,\n  };\n  const keys = Object.keys(cslAny);\n  keys\n    .filter(key => sanitizeProperties.includes(key))\n    .forEach(property => {\n      const value = cslAny[property];\n      if (value && Array.isArray(value)) {\n        if (value.length > 0) {\n          cslAny[property] = value[0];\n        } else {\n          cslAny[property] = undefined;\n        }\n      }\n      return cslAny;\n    });\n\n  // Strip any raw date representations\n  if (cslAny.issued?.raw) {\n    delete cslAny.issued.raw;\n  }\n\n  // Pubmed and others may included license information (including date ranges and more)\n  // which will not be properly parsed by Pandoc (when writing to the bibiliography). Remove\n  if (cslAny.license) {\n    delete cslAny.license;\n  }\n\n  // pandoc-citeproc performance is extremely poor with large abstracts. As a result, purge this property\n  delete cslAny.abstract;\n  delete cslAny.id;\n\n  // Ensure only valid CSL types make it through\n  cslAny.type = ensureValidCSLType(cslAny.type);\n\n  return cslAny as CSL;\n}\n\n// Crossref and other sources may allow invalid types to leak through\n// (for example, this DOI 10.5962/bhl.title.5326 is of a monograph)\n// and the type will leak through as monograph. This function will verify\n// that the type is a CSL type and if it not, do its best to map the type\n// to a valid CSL type\nexport function ensureValidCSLType(type: string): string {\n  if (Object.values(cslTypes).includes(type)) {\n    // This is a valid type\n    return type;\n  } else {\n    return crossRefTypeToCSLType(type);\n  }\n}\n\nexport function cslFromDoc(doc: ProsemirrorNode): string | undefined {\n  // read the Yaml blocks from the document\n  const parsedYamlNodes = parseYamlNodes(doc);\n\n  const cslParsedYamls = parsedYamlNodes.filter(\n    parsedYaml => parsedYaml.yaml !== null && typeof parsedYaml.yaml === 'object' && parsedYaml.yaml.csl,\n  );\n\n  // Look through any yaml nodes to see whether any contain csl information\n  if (cslParsedYamls.length > 0) {\n    // Pandoc uses the last csl block (whether or not it shares a yaml block with the\n    // bibliographies element that pandoc will ultimately use) so just pick the last csl\n    // block.\n    const cslParsedYaml = cslParsedYamls[cslParsedYamls.length - 1];\n    const cslFile = cslParsedYaml.yaml.csl;\n    return cslFile;\n  }\n  return undefined;\n}\n\n// Converts a csl date to an EDTF date.\n// See https://www.loc.gov/standards/datetime/\n// Currently omits time component so this isn't truly level 0\nexport function cslDateToEDTFDate(date: CSLDate) {\n  if (date['date-parts']) {\n    const paddedParts = date['date-parts'][0].map(part => {\n      const partStr = part?.toString();\n      if (partStr?.length === 1) {\n        return `0${partStr}`;\n      }\n      return partStr;\n    });\n    return paddedParts.join('-');\n  }\n}\n\nexport function imageForType(images: EditorUIImages, type: string): [string?, string?] {\n  switch (type) {\n    case cslTypes.article:\n    case cslTypes.articleJournal:\n    case cslTypes.articleMagazine:\n    case cslTypes.articleNewspaper:\n    case cslTypes.paperConference:\n    case cslTypes.review:\n    case cslTypes.reviewBook:\n      return [images.citations?.article, images.citations?.article_dark];\n    case cslTypes.bill:\n    case cslTypes.legislation:\n    case cslTypes.legalCase:\n    case cslTypes.treaty:\n      return [images.citations?.legal, images.citations?.legal_dark];\n    case cslTypes.book:\n    case cslTypes.chapter:\n    case cslTypes.manuscript:\n    case cslTypes.thesis:\n      return [images.citations?.book, images.citations?.book_dark];\n    case cslTypes.broadcast:\n      return [images.citations?.broadcast, images.citations?.broadcast_dark];\n    case cslTypes.dataset:\n      return [images.citations?.data, images.citations?.data_dark];\n    case cslTypes.entry:\n    case cslTypes.entryDictionary:\n    case cslTypes.entryEncylopedia:\n      return [images.citations?.entry, images.citations?.entry_dark];\n    case cslTypes.figure:\n    case cslTypes.graphic:\n      return [images.citations?.image, images.citations?.image_dark];\n    case cslTypes.map:\n      return [images.citations?.map, images.citations?.map_dark];\n    case cslTypes.motionPicture:\n      return [images.citations?.movie, images.citations?.movie_dark];\n    case cslTypes.musicalScore:\n    case cslTypes.song:\n      return [images.citations?.song, images.citations?.song_dark];\n    case cslTypes.post:\n    case cslTypes.postWeblog:\n    case cslTypes.webpage:\n      return [images.citations?.web, images.citations?.web_dark];\n    case cslTypes.paperConference:\n    case cslTypes.interview:\n    case cslTypes.pamphlet:\n    case cslTypes.personalCommunication:\n    case cslTypes.report:\n    case cslTypes.speech:\n    default:\n      return [images.citations?.other, images.citations?.other_dark];\n  }\n}\n\nexport const cslTypes = {\n  article: 'article',\n  articleMagazine: 'article-magazine',\n  articleNewspaper: 'article-newspaper',\n  articleJournal: 'article-journal',\n  bill: 'bill',\n  book: 'book',\n  broadcast: 'broadcast',\n  chapter: 'chapter',\n  dataset: 'dataset',\n  entry: 'entry',\n  entryDictionary: 'entry-dictionary',\n  entryEncylopedia: 'entry-encyclopedia',\n  figure: 'figure',\n  graphic: 'graphic',\n  interview: 'interview',\n  legislation: 'legislation',\n  legalCase: 'legal_case',\n  manuscript: 'manuscript',\n  map: 'map',\n  motionPicture: 'motion_picture',\n  musicalScore: 'musical_score',\n  pamphlet: 'pamphlet',\n  paperConference: 'paper-conference',\n  patent: 'patent',\n  post: 'post',\n  postWeblog: 'post-weblog',\n  personalCommunication: 'personal_communication',\n  report: 'report',\n  review: 'review',\n  reviewBook: 'review-book',\n  song: 'song',\n  speech: 'speech',\n  thesis: 'thesis',\n  treaty: 'treaty',\n  webpage: 'webpage',\n};\n","/*\n * crossref.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUI } from './ui';\nimport { cslTypes } from './csl';\n\n// https://github.com/CrossRef/rest-api-doc\nexport interface CrossrefServer {\n  works: (query: string) => Promise<CrossrefMessage<CrossrefWork>>;\n}\n\nexport const kCrossrefItemsPerPage = 'items-per-page';\nexport const kCrossrefStartIndex = 'start-index';\nexport const kCrossrefSearchTerms = 'search-terms';\nexport const kCrossrefTotalResults = 'total-results';\n\nexport interface CrossrefMessage<T> {\n  items: T[];\n  [kCrossrefItemsPerPage]: number;\n  query: {\n    [kCrossrefStartIndex]: number;\n    [kCrossrefSearchTerms]: string;\n  };\n  [kCrossrefTotalResults]: number;\n}\n\n// https://github.com/Crossref/rest-api-doc/blob/master/api_format.md#work\nexport interface CrossrefWork {\n  // Name of work's publisher\n  publisher: string;\n\n  // Work titles, including translated titles\n  title?: string[];\n\n  // DOI of the work\n  DOI: string;\n\n  // URL form of the work's DOI\n  URL: string;\n\n  // Enumeration, one of the type ids from https://api.crossref.org/v1/types\n  type: string;\n\n  // Array of Contributors\n  author: CrossrefContributor[];\n\n  // Earliest of published-print and published-online\n  issued: CrossrefDate;\n\n  // Full titles of the containing work (usually a book or journal)\n  'container-title'?: string;\n\n  // Short titles of the containing work (usually a book or journal)\n  'short-container-title'?: string;\n\n  // Issue number of an article's journal\n  issue: string;\n\n  // Volume number of an article's journal\n  volume: string;\n\n  // Pages numbers of an article within its journal\n  page: string;\n}\n\nexport interface CrossrefContributor {\n  family: string;\n  given?: string;\n}\n\n/* (Partial Date) Contains an ordered array of year, month, day of month. Only year is required. \nNote that the field contains a nested array, e.g. [ [ 2006, 5, 19 ] ] to conform \nto citeproc JSON dates */\nexport interface CrossrefDate {\n  'date-parts': Array<[number, number?, number?]>;\n}\n\nexport function imageForCrossrefType(ui: EditorUI, type: string): [string?, string?] {\n  switch (type) {\n    case crossRefTypes.monograph:\n    case crossRefTypes.report:\n    case crossRefTypes.journalArticle:\n    case crossRefTypes.journalVolume:\n    case crossRefTypes.journal:\n    case crossRefTypes.journalIssue:\n    case crossRefTypes.proceedingsArticle:\n    case crossRefTypes.dissertation:\n    case crossRefTypes.reportSeries:\n      return [ui.images.citations?.article, ui.images.citations?.article_dark];\n    case crossRefTypes.bookSection:\n    case crossRefTypes.bookPart:\n    case crossRefTypes.bookSeries:\n    case crossRefTypes.editedBook:\n    case crossRefTypes.bookChapter:\n    case crossRefTypes.book:\n    case crossRefTypes.bookSet:\n    case crossRefTypes.bookTrack:\n    case crossRefTypes.referenceBook:\n      return [ui.images.citations?.book, ui.images.citations?.book_dark];\n    case crossRefTypes.dataset:\n      return [ui.images.citations?.data, ui.images.citations?.data_dark];\n    case crossRefTypes.referenceEntry:\n      return [ui.images.citations?.entry, ui.images.citations?.entry_dark];\n    case crossRefTypes.postedContent:\n      return [ui.images.citations?.web, ui.images.citations?.web_dark];\n    case crossRefTypes.other:\n    case crossRefTypes.standard:\n    case crossRefTypes.standardSeries:\n    case crossRefTypes.peerReview:\n    case crossRefTypes.component:\n    case crossRefTypes.proceedingsSeries:\n    case crossRefTypes.proceedings:\n    default:\n      return [ui.images.citations?.other, ui.images.citations?.other_dark];\n  }\n}\n\nexport function prettyType(ui: EditorUI, type: string): string {\n  switch (type) {\n    case crossRefTypes.monograph:\n      return ui.context.translateText('Monograph');\n    case crossRefTypes.report:\n      return ui.context.translateText('Report');\n    case crossRefTypes.journalArticle:\n      return ui.context.translateText('Journal');\n    case crossRefTypes.journalVolume:\n      return ui.context.translateText('Journal Volume');\n    case crossRefTypes.journal:\n      return ui.context.translateText('Journal');\n    case crossRefTypes.journalIssue:\n      return ui.context.translateText('Journal Issue');\n    case crossRefTypes.proceedingsArticle:\n    case crossRefTypes.proceedingsSeries:\n    case crossRefTypes.proceedings:\n      return ui.context.translateText('Proceedings');\n    case crossRefTypes.dissertation:\n      return ui.context.translateText('Dissertation');\n    case crossRefTypes.reportSeries:\n      return ui.context.translateText('Series');\n    case crossRefTypes.bookSection:\n      return ui.context.translateText('Book Section');\n    case crossRefTypes.bookPart:\n      return ui.context.translateText('Book Part');\n    case crossRefTypes.bookSeries:\n      return ui.context.translateText('Book Series');\n    case crossRefTypes.bookChapter:\n      return ui.context.translateText('Book Chapter');\n    case crossRefTypes.editedBook:\n    case crossRefTypes.bookSet:\n    case crossRefTypes.bookTrack:\n    case crossRefTypes.referenceBook:\n      return ui.context.translateText('Book');\n    case crossRefTypes.dataset:\n      return ui.context.translateText('Dataset');\n    case crossRefTypes.referenceEntry:\n      return ui.context.translateText('Entry');\n    case crossRefTypes.postedContent:\n      return ui.context.translateText('Content');\n    case crossRefTypes.other:\n    case crossRefTypes.standard:\n    case crossRefTypes.standardSeries:\n    case crossRefTypes.peerReview:\n    case crossRefTypes.component:\n      return ui.context.translateText('Other');\n    default:\n      return type;\n  }\n}\n\nexport function crossRefTypeToCSLType(type: string): string {\n  // This isn't a valid type, try to map it to a valid type\n  switch (type) {\n    case crossRefTypes.bookSection:\n    case crossRefTypes.bookChapter:\n    case crossRefTypes.bookPart:\n      return cslTypes.chapter;\n    case crossRefTypes.book:\n    case crossRefTypes.bookSet:\n    case crossRefTypes.bookTrack:\n    case crossRefTypes.referenceBook:\n    case crossRefTypes.bookSeries:\n    case crossRefTypes.editedBook:\n      return cslTypes.book;\n    case crossRefTypes.report:\n      return cslTypes.report;\n    case crossRefTypes.peerReview:\n      return cslTypes.review;\n    case crossRefTypes.journalArticle:\n    case crossRefTypes.journalVolume:\n    case crossRefTypes.journal:\n    case crossRefTypes.journalIssue:\n      return cslTypes.articleJournal;\n    case crossRefTypes.referenceEntry:\n      return cslTypes.entry;\n    case crossRefTypes.monograph:\n    case crossRefTypes.proceedingsArticle:\n    case crossRefTypes.component:\n    case crossRefTypes.other:\n      return cslTypes.article;\n    case crossRefTypes.proceedings:\n    case crossRefTypes.proceedingsSeries:\n      return cslTypes.paperConference;\n    case crossRefTypes.reportSeries:\n      return cslTypes.report;\n    case crossRefTypes.standard:\n    case crossRefTypes.standardSeries:\n      return cslTypes.patent;\n    case crossRefTypes.postedContent:\n      return cslTypes.webpage;\n    case crossRefTypes.dissertation:\n      return cslTypes.thesis;\n    case crossRefTypes.dataset:\n      return cslTypes.dataset;\n    default:\n      return cslTypes.article;\n  }\n}\n\nexport const crossRefTypes = {\n  bookSection: 'book-section',\n  monograph: 'monograph',\n  report: 'report',\n  peerReview: 'peer-review',\n  bookTrack: 'book-track',\n  journalArticle: 'journal-article',\n  bookPart: 'book-part',\n  other: 'other',\n  book: 'book',\n  journalVolume: 'journal-volume',\n  bookSet: 'book-set',\n  referenceEntry: 'reference-entry',\n  proceedingsArticle: 'proceedings-article',\n  journal: 'journal',\n  component: 'component',\n  bookChapter: 'book-chapter',\n  proceedingsSeries: 'proceedings-series',\n  reportSeries: 'report-series',\n  proceedings: 'proceedings',\n  standard: 'standard',\n  referenceBook: 'reference-book',\n  postedContent: 'posted-content',\n  journalIssue: 'journal-issue',\n  dissertation: 'dissertation',\n  dataset: 'dataset',\n  bookSeries: 'book-series',\n  editedBook: 'edited-book',\n  standardSeries: 'standard-series',\n};\n","import { Schema, NodeSpec, MarkSpec, DOMParser, Node as ProsemirrorNode } from 'prosemirror-model';\n\nconst kCslDOMParser = cslDOMParser();\n\nexport function cslTextToProsemirrorNode(text: string): ProsemirrorNode | null {\n  const domParser = new window.DOMParser();\n  const doc = domParser.parseFromString(text, 'text/html');\n  if (doc) {\n    const pmNode = kCslDOMParser.parse(doc.body, { preserveWhitespace: 'full' });\n    return pmNode;\n  } else {\n    return null;\n  }\n}\n\nexport function cslDOMParser(): DOMParser {\n  return DOMParser.fromSchema(cslSchema());\n}\n\nfunction cslSchema() {\n  const nodes: { [name: string]: NodeSpec } = {\n    doc: {\n      content: 'inline*',\n    },\n    text: {\n      group: 'inline',\n      toDOM(node: ProsemirrorNode): any {\n        return node.text;\n      },\n    },\n  };\n  const marks: { [name: string]: MarkSpec } = {};\n  marks.strong = tagSpec('b');\n  marks.em = tagSpec('i');\n  marks.sup = tagSpec('sup');\n  marks.sub = tagSpec('sub');\n  marks.smallcaps = spanSpec('smallcaps');\n  marks.nocase = spanSpec('nocase');\n\n  // return schema\n  return new Schema({\n    nodes,\n    marks,\n  });\n}\n\nfunction tagSpec(tag: string): MarkSpec {\n  return {\n    parseDOM: [{ tag }],\n    toDOM() {\n      return [tag];\n    },\n  };\n}\n\nfunction spanSpec(clz: string): MarkSpec {\n  return {\n    parseDOM: [{ tag: `span[class*='${clz}']` }],\n    toDOM() {\n      return ['span', { class: clz }];\n    },\n  };\n}\n","/*\n * bibtex.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeArray, RangeArray, NameDictObject, TextNodeObject } from 'biblatex-csl-converter';\nimport { FieldMap } from './fields';\nimport { typeMapping } from './types';\nimport { FormattingTags } from './formatting';\nimport characters from './characters';\nimport { BibDB, EntryObject } from '../bibliography/bibDB';\n\nexport interface Config {\n  traditionalNames?: boolean;\n  exportUnexpectedFields?: boolean;\n}\n\nexport interface Entry {\n  type: string;\n  key: string;\n  values?: { [key: string]: string };\n}\n\ninterface Warning {\n  type: string;\n  variable: string;\n}\n\nexport function bibDbToBibTeX(bibDB: BibDB, config: Config = {}) {\n  // Keys of items to export\n  const keysToExport = Object.keys(bibDB);\n\n  // The final entries\n  const bibtexEntries: Entry[] = [];\n\n  // Go through each item and compose the entry and\n  // append all the fields with BibTeX specific formatting\n  keysToExport?.forEach(key => {\n    const entryObject: EntryObject = bibDB[key];\n\n    const cslType = entryObject.csl_type;\n    const bibTexType = cslType ? typeMapping(cslType).bibtex : entryObject.bib_type;\n\n    const bibtexEntry: Entry = {\n      type: bibTexType,\n      key: entryObject.entry_key,\n    };\n\n    // The formatted output fields for this entry\n    const outputFields: { [key: string]: string } = {};\n\n    // All the fields for this entry\n    const fieldsForExport: Record<string, any> = entryObject.fields;\n    Object.keys(fieldsForExport).forEach(fieldKey => {\n      // Lookup the field information in the mapping\n      // (maps CSL fields names to their peer BibTeX types)\n      const fieldType = FieldMap[fieldKey];\n\n      // This is a well understood field type\n      if (fieldType) {\n        const type = fieldType.type;\n\n        // Read the type (either as raw value or passing the type to look it up)\n        const typeReader = fieldType.bibtex;\n        const bibtexKey = typeof typeReader === 'string' ? typeReader : typeReader(bibTexType);\n        const bibtexValue = fieldsForExport[fieldKey];\n\n        switch (type) {\n          case 'f_date':\n            // Output the raw date value\n            outputFields[bibtexKey] = bibtexValue;\n\n            // Also output the year and month, if possible\n            // The value being parsed is a EDTF 1.0 level 0/1 compliant string. (2000-12-31)\n            const parts: string[] = bibtexValue.split('-');\n            if (parts.length > 0) {\n              outputFields.year = parts[0];\n              if (parts.length > 1) {\n                outputFields.month = parts[1];\n              }\n            }\n\n            break;\n          case 'f_integer':\n            outputFields[bibtexKey] = formatText(bibtexValue);\n            break;\n          case 'f_key':\n            outputFields[bibtexKey] = formatKey(bibtexValue, bibtexKey);\n            break;\n          case 'f_literal':\n          case 'f_long_literal':\n            outputFields[bibtexKey] = formatText(bibtexValue);\n            break;\n          case 'l_range':\n            outputFields[bibtexKey] = formatRange(bibtexValue);\n            break;\n          case 'f_title':\n            outputFields[bibtexKey] = formatText(bibtexValue);\n            break;\n          case 'f_uri':\n          case 'f_verbatim':\n            // Strip any braces from verbatims\n            outputFields[bibtexKey] = bibtexValue.replace(/{|}/g, '');\n            break;\n          case 'l_key':\n            outputFields[bibtexKey] = escapeNonAscii(\n              bibtexValue.map((k: string) => formatKey(k, bibtexKey)).join(' and '),\n            );\n            break;\n          case 'l_literal':\n            outputFields[bibtexKey] = bibtexValue.map((text: NodeArray) => formatText(text)).join(' and ');\n            break;\n          case 'l_name':\n            outputFields[bibtexKey] = formatNames(bibtexValue);\n            break;\n          case 'l_tag':\n            outputFields[bibtexKey] = escapeNonAscii(bibtexValue.join(', '));\n            break;\n          default:\n            // This is a field type that we don't understand, skip it\n            break;\n        }\n      }\n    });\n\n    bibtexEntry.values = outputFields;\n    bibtexEntries.push(bibtexEntry);\n  });\n  return toBibtex(bibtexEntries);\n}\n\n// Writes BibTex\nconst toBibtex = (entries: Entry[]): string => {\n  const length = entries.length;\n  let bibTexStr = '';\n  for (let i = 0; i < length; i++) {\n    // The entry we're writing\n    const entry = entries[i];\n\n    // Write the key and open the entry\n    bibTexStr = bibTexStr + `@${entry.type}{${entry.key}`;\n\n    // The fields for this item\n    if (entry.values && Object.keys(entry.values).length > 0) {\n      sortedKeys(entry.values).forEach(key => {\n        if (entry.values) {\n          const rawValue = entry.values[key];\n          const value = `{${rawValue}}`;\n\n          // Strip empty braces\n          // TODO: If we support variables, we may need to clean this\n          // const cleanedValue = value.replace(/\\{\\} # /g, '').replace(/# \\{\\}/g, '');\n          bibTexStr = bibTexStr + `,\\n\\t${key} = ${value}`;\n        }\n      });\n    } else {\n      // There are no values, we need to minimally place a ',' at the end of the id\n      // If we omit this, pandoc cannot parse the bibliography\n      bibTexStr = bibTexStr + \",\";\n    }\n\n    // Close the entry\n    bibTexStr = bibTexStr + '\\n}';\n  }\n  return bibTexStr;\n};\n\nconst sortedKeys = (fields: { [key: string]: string }) => {\n  let pos = 1;\n  const keySortOrder: { [id: string]: number } = {};\n  keySortOrder.title = pos++;\n  keySortOrder.author = pos++;\n  keySortOrder.editor = pos++;\n  keySortOrder.year = pos++;\n  keySortOrder.month = pos++;\n  keySortOrder.date = pos++;\n  keySortOrder.journal = pos++;\n  keySortOrder.booktitle = pos++;\n  keySortOrder.publisher = pos++;\n  keySortOrder.howpublished = pos++;\n  keySortOrder.pages = pos++;\n  keySortOrder.series = pos++;\n  keySortOrder.volume = pos++;\n  keySortOrder.chapter = pos++;\n  keySortOrder.number = pos++;\n  keySortOrder.edition = pos++;\n  keySortOrder.issue = pos++;\n  keySortOrder.doi = pos++;\n  keySortOrder.url = pos++;\n  keySortOrder.abstract = pos++;\n  keySortOrder.note = pos++;\n\n  const keys = Object.keys(fields);\n  const sorted = keys.sort((a, b) => {\n    const aOrder = keySortOrder[a.toLowerCase()];\n    const bOrder = keySortOrder[b.toLowerCase()];\n    if (aOrder && bOrder) {\n      return aOrder - bOrder;\n    } else if (aOrder !== undefined) {\n      return -1;\n    } else if (bOrder !== undefined) {\n      return 1;\n    }\n    return a.localeCompare(b);\n  });\n  return sorted;\n};\n\n// Converts any non asciii characters to their LaTeX representations\nconst escapeNonAscii = (value: string): string => {\n  let result = '';\n\n  // Split the string in a way that will maintain unicode characters\n  const chars = Array.from(value);\n  chars.forEach(c => {\n    const char = c.codePointAt(0);\n    // Look for a LaTeX replace in the character mapping\n    if (char) {\n      const characterMap = characters[char];\n      if (characterMap) {\n        // Found one, emit the LaTeX\n        // Use the braces to group the expression, unless the character replacement explicitly\n        // doesn't want to be grouped\n        result = result + (characterMap.ungrouped ? characterMap.latex : `{${characterMap.latex}}`);\n      } else {\n        // No LaTeX replacement, just emit the character\n        if (char < 255) {\n          result = result + String.fromCodePoint(char);\n        } else {\n          // A unicode character for which we have no valid LaTeX replacement\n          // emit a question mark\n          result = result + '?';\n        }\n      }\n    } else {\n      // A position which has no codepoint. what on earth is this?\n      result = result + '?';\n    }\n  });\n  return result;\n};\n\n// Formats keys\nconst formatKey = (value: string | NodeArray, fieldKey: string) => {\n  if (typeof value === 'string') {\n    const fieldType = FieldMap[fieldKey];\n    // If the field is an array, we can just emit the value\n    // Otherwise, we should treat options as a keyed object and lookup\n    // the bibtex value for this value\n    if (Array.isArray(fieldType.options)) {\n      return escapeNonAscii(value);\n    } else if (fieldType.options) {\n      return escapeNonAscii(fieldType.options[value].bibtex);\n    } else {\n      return escapeNonAscii(value);\n    }\n  } else {\n    return formatText(value);\n  }\n};\n\n// Formats text\nconst formatText = (nodes: NodeArray): string => {\n  let formattedText = '';\n  let lastNodeMarks: string[] = [];\n\n  // This empty node at the end will cause us to go through the loop\n  // after the last 'real' node and close out any open marks.\n  const textNodes = nodes.concat({ type: 'text', text: '' });\n\n  textNodes.forEach(node => {\n    /*\n    // TODO: Do we need to deal with this (and if so, we need to re-add that escape routine)\n    if (node.type === 'variable') {\n      // This is an undefined variable\n      // This should usually not happen, as CSL doesn't know what to\n      // do with these. We'll put them into an unsupported tag.\n      latex += `} # ${node.attrs.variable} # {`\n      this.warnings.push({\n        type: 'undefined_variable',\n        variable: node.attrs.variable\n      })\n      return\n    }\n    */\n\n    const thisNodeMarks: string[] = [];\n    if (node.marks) {\n      // Figure out the new marks for this node\n      // TODO: Do we need to re-enable math mode for these low level sup/sub nodes?\n      // let mathEnabled = false;\n      node.marks.forEach(mark => {\n        // We need to activate mathmode for the lowest level sub/sup node.\n        // Don't activate math mode for the lowest level node\n        /*\n        if ((mark.type === 'sup' || mark.type === 'sub') && !mathEnabled) {\n          thisNodeMarks.push('math');\n          thisNodeMarks.push(mark.type);\n          mathEnabled = true;\n        } else \n        */\n\n        if (mark.type === 'nocase') {\n          // No case should be the outer mark\n          thisNodeMarks.unshift(mark.type);\n        } else {\n          // regular old mark\n          thisNodeMarks.push(mark.type);\n        }\n      });\n    }\n\n    // Close any marks that aren't still open in this node\n    let closing = false;\n    const closeTags: string[] = [];\n    lastNodeMarks.forEach((mark, index) => {\n      if (mark !== thisNodeMarks[index]) {\n        closing = true;\n      }\n      if (closing) {\n        const closeTag =\n          lastNodeMarks[0] !== 'nocase' && FormattingTags[mark].open[0] === '\\\\'\n            ? `${FormattingTags[mark].close}}`\n            : FormattingTags[mark].close;\n        closeTags.push(closeTag);\n      }\n    });\n\n    // Emit the close tags for the previous (last to first)\n    closeTags.reverse();\n    formattedText = formattedText + closeTags.join('');\n\n    // Emit the open tags\n    let opening = false;\n    let doNotEscape = false;\n    thisNodeMarks.forEach((mark, index) => {\n      if (mark !== lastNodeMarks[index]) {\n        opening = true;\n      }\n      if (opening) {\n        // If not in a nocase, we can add protective brace\n        if (thisNodeMarks[0] !== 'nocase' && FormattingTags[mark].open[0] === '\\\\') {\n          formattedText = formattedText + '{';\n        }\n        formattedText = formattedText + FormattingTags[mark].open;\n        if (FormattingTags[mark].verbatim) {\n          doNotEscape = true;\n        }\n      }\n    });\n\n    const textNode = node as TextNodeObject;\n    if (doNotEscape) {\n      formattedText = formattedText + textNode.text;\n    } else {\n      formattedText = formattedText + escapeNonAscii(textNode.text);\n    }\n    lastNodeMarks = thisNodeMarks;\n  });\n  return formattedText;\n};\n\n// Formats ranges\nconst formatRange = (value: RangeArray[]): string => {\n  // The correct symbol for a range of numbers is an en-dash, which in LaTeX is usually input as --.\n  return value.map(range => range.map(text => formatText(text)).join('--')).join(',');\n};\n\n// Formats author values\nconst formatNames = (names: NameDictObject[]): string => {\n  const formattedNames: string[] = [];\n  names.forEach(name => {\n    if (name.literal) {\n      // Use the literal\n      const literal = formatText(name.literal);\n      if (literal.length) {\n        formattedNames.push(`{${literal}}`);\n      }\n    } else {\n      // Compose the name\n      // http://www.texfaq.org/FAQ-manyauthor\n      const family = name.family ? formatText(name.family) : '';\n      const given = name.given ? formatText(name.given) : '';\n      const suffix = name.suffix ? formatText(name.suffix) : false;\n      const prefix = name.prefix ? formatText(name.prefix) : false;\n\n      if (suffix && prefix) {\n        formattedNames.push(`{${prefix} ${family}}, {${suffix}}, {${given}}`);\n      } else if (suffix) {\n        formattedNames.push(`{${family}}, {${suffix}}, {${given}}`);\n      } else if (prefix) {\n        formattedNames.push(`{${prefix} ${family}}, {${given}}`);\n      } else {\n        formattedNames.push(`{${family}}, {${given}}`);\n      }\n    }\n  });\n  return formattedNames.join(' and ');\n};\n","/*\n * fields.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { lanagugeMappings } from './language';\n\nexport interface Field {\n  type: string;\n  bibtex: ((bibTexType: string) => string) | string;\n  csl: string | undefined;\n  options?: string[] | { [key: string]: { bibtex: string } } | undefined;\n}\n\n// CSL Field (variable) definitions from\n// https://docs.citationstyles.org/en/stable/specification.html#appendix-iv-variables\n\n// TODO: bibtex: string | (type: string) => string\n//\n\nexport const FieldMap: { [key: string]: Field } = {\n  abstract: {\n    type: 'f_long_literal',\n    bibtex: 'abstract',\n    csl: 'abstract',\n  },\n  author: {\n    type: 'l_name',\n    bibtex: 'author',\n    csl: 'author',\n  },\n  bookauthor: {\n    type: 'l_name',\n    bibtex: 'author',\n    csl: 'container-author',\n  },\n  containerTitle: {\n    type: 'f_title',\n    bibtex: (bibTexType: string) => {\n      switch (bibTexType) {\n        case 'conference':\n        case 'inproceedings':\n        case 'incollection':\n          return 'booktitle';\n        default:\n          return 'journal';\n      }\n    },\n    csl: 'container-title',\n  },\n  chapter: {\n    type: 'f_literal',\n    bibtex: 'chapter',\n    csl: 'chapter-number',\n  },\n  date: {\n    type: 'f_date',\n    bibtex: 'date',\n    csl: 'issued',\n  },\n  doi: {\n    type: 'f_verbatim',\n    bibtex: 'doi',\n    csl: 'DOI',\n  },\n  edition: {\n    type: 'f_integer',\n    bibtex: 'edition',\n    csl: 'edition',\n  },\n  editor: {\n    type: 'l_name',\n    bibtex: 'editor',\n    csl: 'editor',\n  },\n  eventdate: {\n    type: 'f_date',\n    bibtex: 'date',\n    csl: 'event-date',\n  },\n  eventtitle: {\n    type: 'f_title',\n    bibtex: 'title',\n    csl: 'event',\n  },\n  howpublished: {\n    type: 'f_literal',\n    bibtex: 'howpublished',\n    csl: 'medium',\n  },\n  issue: {\n    type: 'f_literal',\n    bibtex: 'issue',\n    csl: 'issue',\n  },\n  journaltitle: {\n    type: 'f_literal',\n    bibtex: 'journal',\n    csl: 'container-title',\n  },\n  // Special - not really in CSL or BibTeX\n  langid: {\n    type: 'f_key',\n    bibtex: 'langid',\n    csl: 'language',\n    options: lanagugeMappings,\n  },\n  location: {\n    type: 'l_literal',\n    bibtex: 'address',\n    csl: 'publisher-place',\n  },\n  note: {\n    type: 'f_literal',\n    bibtex: 'note',\n    csl: 'note',\n  },\n  number: {\n    type: 'f_literal',\n    bibtex: 'number',\n    csl: 'collection-number',\n  },\n  pages: {\n    type: 'l_range',\n    bibtex: 'pages',\n    csl: 'page',\n  },\n  publisher: {\n    type: 'l_literal',\n    bibtex: 'publisher',\n    csl: 'publisher',\n  },\n  series: {\n    type: 'f_literal',\n    bibtex: 'series',\n    csl: 'collection-title',\n  },\n  title: {\n    type: 'f_title',\n    bibtex: 'title',\n    csl: 'title',\n  },\n  url: {\n    type: 'f_uri',\n    bibtex: 'url',\n    csl: 'URL',\n  },\n  volume: {\n    type: 'f_literal',\n    bibtex: 'volume',\n    csl: 'volume',\n  },\n};\n","/*\n * language.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Support emitting languages using 'babel' names\n// This isn't strictly supported by pure BibTex\n// but this seems likely to helpful to include\nexport const lanagugeMappings = {\n  acadian: {\n    csl: 'fr-CA',\n    bibtex: 'acadian',\n  },\n  afrikaans: {\n    csl: 'af-ZA',\n    bibtex: 'afrikaans',\n  },\n  arabic: {\n    csl: 'ar',\n    bibtex: 'arabic',\n  },\n  basque: {\n    csl: 'eu',\n    bibtex: 'basque',\n  },\n  bulgarian: {\n    csl: 'bg-BG',\n    bibtex: 'bulgarian',\n  },\n  catalan: {\n    csl: 'ca-AD',\n    bibtex: 'catalan',\n  },\n  chinese: {\n    csl: 'zh-CN',\n    bibtex: 'pinyin',\n  },\n  croatian: {\n    csl: 'hr-HR',\n    bibtex: 'croatian',\n  },\n  czech: {\n    csl: 'cs-CZ',\n    bibtex: 'czech',\n  },\n  danish: {\n    csl: 'da-DK',\n    bibtex: 'danish',\n  },\n  dutch: {\n    csl: 'nl-NL',\n    bibtex: 'dutch',\n  },\n  auenglish: {\n    csl: 'en-GB',\n    bibtex: 'australian',\n  },\n  caenglish: {\n    csl: 'en-US',\n    bibtex: 'canadian',\n  },\n  nzenglish: {\n    csl: 'en-GB',\n    bibtex: 'newzealand',\n  },\n  ukenglish: {\n    csl: 'en-GB',\n    bibtex: 'ukenglish',\n  },\n  usenglish: {\n    csl: 'en-US',\n    bibtex: 'usenglish',\n  },\n  estonian: {\n    csl: 'et-EE',\n    bibtex: 'estonian',\n  },\n  finnish: {\n    csl: 'fi-FI',\n    bibtex: 'finnish',\n  },\n  french: {\n    csl: 'fr-FR',\n    bibtex: 'french',\n  },\n  cafrench: {\n    csl: 'fr-CA',\n    bibtex: 'canadien',\n  },\n  german: {\n    csl: 'de-DE',\n    bibtex: 'ngerman',\n  },\n  atgerman: {\n    csl: 'de-AT',\n    bibtex: 'naustrian',\n  },\n  greek: {\n    csl: 'el-GR',\n    bibtex: 'greek',\n  },\n  hebrew: {\n    csl: 'he-IL',\n    bibtex: 'hebrew',\n  },\n  hungarian: {\n    csl: 'hu-HU',\n    bibtex: 'hungarian',\n  },\n  icelandic: {\n    csl: 'is-IS',\n    bibtex: 'icelandic',\n  },\n  italian: {\n    csl: 'it-IT',\n    bibtex: 'italian',\n  },\n  japanese: {\n    csl: 'ja-JP',\n    bibtex: 'japanese',\n  },\n  latin: {\n    csl: 'la',\n    bibtex: 'latin',\n  },\n  latvian: {\n    csl: 'lv-LV',\n    bibtex: 'latvian',\n  },\n  lithuanian: {\n    csl: 'lt-LT',\n    bibtex: 'lithuanian',\n  },\n  magyar: {\n    csl: 'hu-HU',\n    bibtex: 'magyar',\n  },\n  mongolian: {\n    csl: 'mn-MN',\n    bibtex: 'mongolian',\n  },\n  norwegian: {\n    csl: 'nb-NO',\n    bibtex: 'norsk',\n  },\n  newnorwegian: {\n    csl: 'nn-NO',\n    bibtex: 'nynorsk',\n  },\n  farsi: {\n    csl: 'fa-IR',\n    bibtex: 'farsi',\n  },\n  polish: {\n    csl: 'pl-PL',\n    bibtex: 'polish',\n  },\n  portuguese: {\n    csl: 'pt-PT',\n    bibtex: 'portuguese',\n  },\n  brportuguese: {\n    csl: 'pt-BR',\n    bibtex: 'brazilian',\n  },\n  romanian: {\n    csl: 'ro-RO',\n    bibtex: 'romanian',\n  },\n  russian: {\n    csl: 'ru-RU',\n    bibtex: 'russian',\n  },\n  serbian: {\n    csl: 'sr-RS',\n    bibtex: 'serbian',\n  },\n  cyrillicserbian: {\n    csl: 'sr-RS',\n    bibtex: 'serbianc',\n  },\n  slovak: {\n    csl: 'sk-SK',\n    bibtex: 'slovak',\n  },\n  slovene: {\n    csl: 'sl-SL',\n    bibtex: 'slovene',\n  },\n  spanish: {\n    csl: 'es-ES',\n    bibtex: 'spanish',\n  },\n  swedish: {\n    csl: 'sv-SE',\n    bibtex: 'swedish',\n  },\n  thai: {\n    csl: 'th-TH',\n    bibtex: 'thai',\n  },\n  turkish: {\n    csl: 'tr-TR',\n    bibtex: 'turkish',\n  },\n  ukrainian: {\n    csl: 'uk-UA',\n    bibtex: 'ukrainian',\n  },\n  vietnamese: {\n    csl: 'vi-VN',\n    bibtex: 'vietnamese',\n  },\n};\n","/*\n * types.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { cslTypes } from '../csl';\n\nexport interface Type {\n  bibtex: string;\n  fieldsRequired: string[];\n  fieldsOptional: string[];\n  fieldsEitherOr: string[];\n}\n\n// Maps CSL Types to the equivalent BibTeX types.\n// Mapping derived from:\n// https://github.com/citation-style-language/styles/blob/master/bibtex.csl\nexport function typeMapping(cslType: string): Type {\n  switch (cslType) {\n    case cslTypes.article:\n    case cslTypes.articleJournal:\n    case cslTypes.articleMagazine:\n    case cslTypes.articleNewspaper:\n      return {\n        bibtex: BibTextTypes.article.type,\n        ...BibTextTypes.article.fields,\n      };\n\n    case cslTypes.book:\n      return {\n        bibtex: BibTextTypes.book.type,\n        ...BibTextTypes.book.fields,\n      };\n\n    case cslTypes.chapter:\n      return {\n        bibtex: BibTextTypes.inbook.type,\n        ...BibTextTypes.inbook.fields,\n      };\n\n    case cslTypes.thesis:\n      return {\n        bibtex: BibTextTypes.phdthesis.type,\n        ...BibTextTypes.phdthesis.fields,\n      };\n\n    case cslTypes.manuscript:\n      return {\n        bibtex: BibTextTypes.unpublished.type,\n        ...BibTextTypes.unpublished.fields,\n      };\n\n    case cslTypes.paperConference:\n      return {\n        bibtex: BibTextTypes.inproceedings.type,\n        ...BibTextTypes.inproceedings.fields,\n      };\n\n    case cslTypes.report:\n      return {\n        bibtex: BibTextTypes.techreport.type,\n        ...BibTextTypes.techreport.fields,\n      };\n\n    case cslTypes.bill:\n    case cslTypes.graphic:\n    case cslTypes.legalCase:\n    case cslTypes.legislation:\n    case cslTypes.motionPicture:\n    case cslTypes.report:\n    case cslTypes.song:\n    default:\n      return {\n        bibtex: BibTextTypes.misc.type,\n        ...BibTextTypes.misc.fields,\n      };\n  }\n}\n\n// BibTeX types and their fields\n// See https://www.openoffice.org/bibliographic/bibtex-defs.html\n// (a corrected version of Appendix B.2 of the LATEX book [2], © 1986, by Addison-Wesley.)\nexport const BibTextTypes = {\n  // An article from a journal or magazine.\n  article: {\n    type: 'article',\n    fields: {\n      fieldsRequired: ['author', 'title', 'journal', 'year'],\n      fieldsOptional: ['volume', 'number', 'pages', 'month', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n  // A book with an explicit publisher.\n  book: {\n    type: 'book',\n    fields: {\n      fieldsRequired: ['title', 'publisher', 'year'],\n      fieldsOptional: ['volume', 'number', 'series', 'address', 'edition', 'month', 'note'],\n      fieldsEitherOr: ['author', 'editor'],\n    },\n  },\n\n  // A work that is printed and bound, but without a named publisher or sponsoring institution.\n  booklet: {\n    type: 'booklet',\n    fields: {\n      fieldsRequired: ['title'],\n      fieldsOptional: ['author', 'howpublished', 'address', 'month', 'year', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // The same as inproceedings, included for Scribe compatibility.\n  conference: {\n    type: 'conference',\n    fields: {\n      fieldsRequired: ['author', 'title', 'booktitle', 'year'],\n      fieldsOptional: [\n        'editor',\n        'volume',\n        'number',\n        'series',\n        'pages',\n        'address',\n        'month',\n        'organization',\n        'publisher',\n        'note',\n      ],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // A part of a book, which may be a chapter (or section or whatever) and/or a range of pages.\n  inbook: {\n    type: 'inbook',\n    fields: {\n      fieldsRequired: ['title', 'chapter', 'pages', 'publisher', 'year'],\n      fieldsOptional: ['volume', 'number', 'series', 'type', 'address', 'edition', 'month', 'note'],\n      fieldsEitherOr: ['author', 'editor'],\n    },\n  },\n\n  // A part of a book having its own title.\n  incollection: {\n    type: 'incollection',\n    fields: {\n      fieldsRequired: ['author', 'title', 'booktitle', 'publisher', 'year'],\n      fieldsOptional: [\n        'editor',\n        'volume',\n        'number',\n        'series',\n        'type',\n        'chapter',\n        'pages',\n        'address',\n        'edition',\n        'month',\n        'note',\n      ],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // An article in a conference proceedings.\n  inproceedings: {\n    type: 'inproceedings',\n    fields: {\n      fieldsRequired: ['author', 'title', 'booktitle', 'year'],\n      fieldsOptional: [\n        'editor',\n        'volume',\n        'number',\n        'series',\n        'pages',\n        'address',\n        'month',\n        'organization',\n        'publisher',\n        'note',\n      ],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // Technical documentation\n  manual: {\n    type: 'manual',\n    fields: {\n      fieldsRequired: ['title'],\n      fieldsOptional: ['author', 'organization', 'address', 'edition', 'month', 'year', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // A Master's thesis.\n  mastersthesis: {\n    type: 'mastersthesis',\n    fields: {\n      fieldsRequired: ['author', 'title', 'school', 'year'],\n      fieldsOptional: ['type', 'address', 'month', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // Use this type when nothing else fits.\n  misc: {\n    type: 'misc',\n    fields: {\n      fieldsRequired: [],\n      fieldsOptional: ['author', 'title', 'howpublished', 'month', 'year', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // A PhD thesis.\n  phdthesis: {\n    type: 'phdthesis',\n    fields: {\n      fieldsRequired: ['author', 'title', 'school', 'year'],\n      fieldsOptional: ['type', 'address', 'month', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // The proceedings of a conference.\n  proceedings: {\n    type: 'proceedings',\n    fields: {\n      fieldsRequired: ['title', 'year'],\n      fieldsOptional: ['editor', 'volume', 'number', 'series', 'address', 'month', 'organization', 'publisher', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // A report published by a school or other institution, usually numbered within a series.\n  techreport: {\n    type: 'techreport',\n    fields: {\n      fieldsRequired: ['author', 'title', 'institution', 'year'],\n      fieldsOptional: ['type', 'number', 'address', 'month', 'note'],\n      fieldsEitherOr: [],\n    },\n  },\n\n  // A document having an author and title, but not formally published.\n  unpublished: {\n    type: 'unpublished',\n    fields: {\n      fieldsRequired: ['author', 'title', 'note'],\n      fieldsOptional: ['month', 'year'],\n      fieldsEitherOr: [],\n    },\n  },\n};\n","/*\n * formatting.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface FormattingTag {\n  open: string;\n  close: string;\n  verbatim: boolean;\n}\n\n// Maps formatting tags/marks to the LaTeX replacements\n// When marks are applied to text nodes, these will be emitted in place of those marks\nexport const FormattingTags: { [key: string]: FormattingTag } = {\n  strong: { open: '\\\\textbf{', close: '}', verbatim: false },\n  em: { open: '\\\\emph{', close: '}', verbatim: false },\n  sub: { open: '\\\\textsubscript{', close: '}', verbatim: false },\n  sup: { open: '\\\\textsuperscript{', close: '}', verbatim: false },\n  nocase: { open: '{{', close: '}}', verbatim: false },\n  smallcaps: { open: '\\\\textsc{', close: '}', verbatim: false },\n  enquote: { open: '\\\\enquote{', close: '}', verbatim: false },\n  math: { open: '$', close: '$', verbatim: false },\n  url: { open: '\\\\url{', close: '}', verbatim: true },\n};\n","/*\n * character.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Maps unicode characters to their latex equivalent.\n// Generated from:\n// https://www.w3.org/2003/entities/2007xml/unicode.xml\n// and\n// http://www.w3.org/Math/characters/unicode.xml\n//\n// When both xml files contained entries for a unicode character,\n// the definition provided by entities/2007xml was preferred\nexport interface CharacterMap {\n  id: string;\n  decimal: number;\n  character: string;\n  latex: string;\n  ungrouped?: boolean;\n}\n\nconst characters: { [key: number]: CharacterMap } = {\n  34: { id: 'U00022', decimal: 34, character: '\"', latex: '\"' },\n  35: { id: 'U00023', decimal: 35, character: '#', latex: '\\\\#' },\n  36: { id: 'U00024', decimal: 36, character: '$', latex: '\\\\$' },\n  94: { id: 'U0005e', decimal: 94, character: '^', latex: '\\\\textasciicircum' },\n  95: { id: 'U0005f', decimal: 95, character: '_', latex: '\\\\_' },\n  123: { id: 'U0007b', decimal: 123, character: '{', latex: '\\\\textbraceleft' },\n  125: { id: 'U0007d', decimal: 125, character: '}', latex: '\\\\textbraceright' },\n  256: {\n    id: 'U00100',\n    decimal: 256,\n    character: 'Ā',\n    latex: '\\\\={A}',\n  },\n  257: {\n    id: 'U00101',\n    decimal: 257,\n    character: 'ā',\n    latex: '\\\\={a}',\n  },\n  258: {\n    id: 'U00102',\n    decimal: 258,\n    character: 'Ă',\n    latex: '\\\\u{A}',\n  },\n  259: {\n    id: 'U00103',\n    decimal: 259,\n    character: 'ă',\n    latex: '\\\\u{a}',\n  },\n  260: {\n    id: 'U00104',\n    decimal: 260,\n    character: 'Ą',\n    latex: '\\\\k{A}',\n  },\n  261: {\n    id: 'U00105',\n    decimal: 261,\n    character: 'ą',\n    latex: '\\\\k{a}',\n  },\n  262: {\n    id: 'U00106',\n    decimal: 262,\n    character: 'Ć',\n    latex: \"\\\\'{C}\",\n  },\n  263: {\n    id: 'U00107',\n    decimal: 263,\n    character: 'ć',\n    latex: \"\\\\'{c}\",\n  },\n  264: {\n    id: 'U00108',\n    decimal: 264,\n    character: 'Ĉ',\n    latex: '\\\\^{C}',\n  },\n  265: {\n    id: 'U00109',\n    decimal: 265,\n    character: 'ĉ',\n    latex: '\\\\^{c}',\n  },\n  266: {\n    id: 'U0010A',\n    decimal: 266,\n    character: 'Ċ',\n    latex: '\\\\.{C}',\n  },\n  267: {\n    id: 'U0010B',\n    decimal: 267,\n    character: 'ċ',\n    latex: '\\\\.{c}',\n  },\n  268: {\n    id: 'U0010C',\n    decimal: 268,\n    character: 'Č',\n    latex: '\\\\v{C}',\n  },\n  269: {\n    id: 'U0010D',\n    decimal: 269,\n    character: 'č',\n    latex: '\\\\v{c}',\n  },\n  270: {\n    id: 'U0010E',\n    decimal: 270,\n    character: 'Ď',\n    latex: '\\\\v{D}',\n  },\n  271: {\n    id: 'U0010F',\n    decimal: 271,\n    character: 'ď',\n    latex: '\\\\v{d}',\n  },\n  272: {\n    id: 'U00110',\n    decimal: 272,\n    character: 'Đ',\n    latex: '\\\\DJ',\n  },\n  273: {\n    id: 'U00111',\n    decimal: 273,\n    character: 'đ',\n    latex: '\\\\dj',\n  },\n  274: {\n    id: 'U00112',\n    decimal: 274,\n    character: 'Ē',\n    latex: '\\\\={E}',\n  },\n  275: {\n    id: 'U00113',\n    decimal: 275,\n    character: 'ē',\n    latex: '\\\\={e}',\n  },\n  276: {\n    id: 'U00114',\n    decimal: 276,\n    character: 'Ĕ',\n    latex: '\\\\u{E}',\n  },\n  277: {\n    id: 'U00115',\n    decimal: 277,\n    character: 'ĕ',\n    latex: '\\\\u{e}',\n  },\n  278: {\n    id: 'U00116',\n    decimal: 278,\n    character: 'Ė',\n    latex: '\\\\.{E}',\n  },\n  279: {\n    id: 'U00117',\n    decimal: 279,\n    character: 'ė',\n    latex: '\\\\.{e}',\n  },\n  280: {\n    id: 'U00118',\n    decimal: 280,\n    character: 'Ę',\n    latex: '\\\\k{E}',\n  },\n  281: {\n    id: 'U00119',\n    decimal: 281,\n    character: 'ę',\n    latex: '\\\\k{e}',\n  },\n  282: {\n    id: 'U0011A',\n    decimal: 282,\n    character: 'Ě',\n    latex: '\\\\v{E}',\n  },\n  283: {\n    id: 'U0011B',\n    decimal: 283,\n    character: 'ě',\n    latex: '\\\\v{e}',\n  },\n  284: {\n    id: 'U0011C',\n    decimal: 284,\n    character: 'Ĝ',\n    latex: '\\\\^{G}',\n  },\n  285: {\n    id: 'U0011D',\n    decimal: 285,\n    character: 'ĝ',\n    latex: '\\\\^{g}',\n  },\n  286: {\n    id: 'U0011E',\n    decimal: 286,\n    character: 'Ğ',\n    latex: '\\\\u{G}',\n  },\n  287: {\n    id: 'U0011F',\n    decimal: 287,\n    character: 'ğ',\n    latex: '\\\\u{g}',\n  },\n  288: {\n    id: 'U00120',\n    decimal: 288,\n    character: 'Ġ',\n    latex: '\\\\.{G}',\n  },\n  289: {\n    id: 'U00121',\n    decimal: 289,\n    character: 'ġ',\n    latex: '\\\\.{g}',\n  },\n  290: {\n    id: 'U00122',\n    decimal: 290,\n    character: 'Ģ',\n    latex: '\\\\c{G}',\n  },\n  291: {\n    id: 'U00123',\n    decimal: 291,\n    character: 'ģ',\n    latex: '\\\\c{g}',\n  },\n  292: {\n    id: 'U00124',\n    decimal: 292,\n    character: 'Ĥ',\n    latex: '\\\\^{H}',\n  },\n  293: {\n    id: 'U00125',\n    decimal: 293,\n    character: 'ĥ',\n    latex: '\\\\^{h}',\n  },\n  296: {\n    id: 'U00128',\n    decimal: 296,\n    character: 'Ĩ',\n    latex: '\\\\~{I}',\n  },\n  297: {\n    id: 'U00129',\n    decimal: 297,\n    character: 'ĩ',\n    latex: '\\\\~{\\\\i}',\n  },\n  298: {\n    id: 'U0012A',\n    decimal: 298,\n    character: 'Ī',\n    latex: '\\\\={I}',\n  },\n  299: {\n    id: 'U0012B',\n    decimal: 299,\n    character: 'ī',\n    latex: '\\\\={\\\\i}',\n  },\n  300: {\n    id: 'U0012C',\n    decimal: 300,\n    character: 'Ĭ',\n    latex: '\\\\u{I}',\n  },\n  301: {\n    id: 'U0012D',\n    decimal: 301,\n    character: 'ĭ',\n    latex: '\\\\u{\\\\i}',\n  },\n  302: {\n    id: 'U0012E',\n    decimal: 302,\n    character: 'Į',\n    latex: '\\\\k{I}',\n  },\n  303: {\n    id: 'U0012F',\n    decimal: 303,\n    character: 'į',\n    latex: '\\\\k{i}',\n  },\n  304: {\n    id: 'U00130',\n    decimal: 304,\n    character: 'İ',\n    latex: '\\\\.{I}',\n  },\n  305: {\n    id: 'U00131',\n    decimal: 305,\n    character: 'ı',\n    latex: '\\\\i',\n  },\n  306: {\n    id: 'U00132',\n    decimal: 306,\n    character: 'IJ',\n    latex: 'IJ',\n  },\n  307: {\n    id: 'U00133',\n    decimal: 307,\n    character: 'ij',\n    latex: 'ij',\n  },\n  308: {\n    id: 'U00134',\n    decimal: 308,\n    character: 'Ĵ',\n    latex: '\\\\^{J}',\n  },\n  309: {\n    id: 'U00135',\n    decimal: 309,\n    character: 'ĵ',\n    latex: '\\\\^{\\\\j}',\n  },\n  310: {\n    id: 'U00136',\n    decimal: 310,\n    character: 'Ķ',\n    latex: '\\\\c{K}',\n  },\n  311: {\n    id: 'U00137',\n    decimal: 311,\n    character: 'ķ',\n    latex: '\\\\c{k}',\n  },\n  313: {\n    id: 'U00139',\n    decimal: 313,\n    character: 'Ĺ',\n    latex: \"\\\\'{L}\",\n  },\n  314: {\n    id: 'U0013A',\n    decimal: 314,\n    character: 'ĺ',\n    latex: \"\\\\'{l}\",\n  },\n  315: {\n    id: 'U0013B',\n    decimal: 315,\n    character: 'Ļ',\n    latex: '\\\\c{L}',\n  },\n  316: {\n    id: 'U0013C',\n    decimal: 316,\n    character: 'ļ',\n    latex: '\\\\c{l}',\n  },\n  317: {\n    id: 'U0013D',\n    decimal: 317,\n    character: 'Ľ',\n    latex: '\\\\v{L}',\n  },\n  318: {\n    id: 'U0013E',\n    decimal: 318,\n    character: 'ľ',\n    latex: '\\\\v{l}',\n  },\n  321: {\n    id: 'U00141',\n    decimal: 321,\n    character: 'Ł',\n    latex: '\\\\L',\n  },\n  322: {\n    id: 'U00142',\n    decimal: 322,\n    character: 'ł',\n    latex: '\\\\l',\n  },\n  323: {\n    id: 'U00143',\n    decimal: 323,\n    character: 'Ń',\n    latex: \"\\\\'{N}\",\n  },\n  324: {\n    id: 'U00144',\n    decimal: 324,\n    character: 'ń',\n    latex: \"\\\\'{n}\",\n  },\n  325: {\n    id: 'U00145',\n    decimal: 325,\n    character: 'Ņ',\n    latex: '\\\\c{N}',\n  },\n  326: {\n    id: 'U00146',\n    decimal: 326,\n    character: 'ņ',\n    latex: '\\\\c{n}',\n  },\n  327: {\n    id: 'U00147',\n    decimal: 327,\n    character: 'Ň',\n    latex: '\\\\v{N}',\n  },\n  328: {\n    id: 'U00148',\n    decimal: 328,\n    character: 'ň',\n    latex: '\\\\v{n}',\n  },\n  329: {\n    id: 'U00149',\n    decimal: 329,\n    character: 'ʼn',\n    latex: \"'n\",\n  },\n  330: {\n    id: 'U0014A',\n    decimal: 330,\n    character: 'Ŋ',\n    latex: '\\\\NG',\n  },\n  331: {\n    id: 'U0014B',\n    decimal: 331,\n    character: 'ŋ',\n    latex: '\\\\ng',\n  },\n  332: {\n    id: 'U0014C',\n    decimal: 332,\n    character: 'Ō',\n    latex: '\\\\={O}',\n  },\n  333: {\n    id: 'U0014D',\n    decimal: 333,\n    character: 'ō',\n    latex: '\\\\={o}',\n  },\n  334: {\n    id: 'U0014E',\n    decimal: 334,\n    character: 'Ŏ',\n    latex: '\\\\u{O}',\n  },\n  335: {\n    id: 'U0014F',\n    decimal: 335,\n    character: 'ŏ',\n    latex: '\\\\u{o}',\n  },\n  336: {\n    id: 'U00150',\n    decimal: 336,\n    character: 'Ő',\n    latex: '{\\\\H O}',\n  },\n  337: {\n    id: 'U00151',\n    decimal: 337,\n    character: 'ő',\n    latex: '{\\\\H o}',\n  },\n  338: {\n    id: 'U00152',\n    decimal: 338,\n    character: 'Œ',\n    latex: '\\\\OE',\n  },\n  339: {\n    id: 'U00153',\n    decimal: 339,\n    character: 'œ',\n    latex: '\\\\oe',\n  },\n  340: {\n    id: 'U00154',\n    decimal: 340,\n    character: 'Ŕ',\n    latex: \"\\\\'{R}\",\n  },\n  341: {\n    id: 'U00155',\n    decimal: 341,\n    character: 'ŕ',\n    latex: \"\\\\'{r}\",\n  },\n  342: {\n    id: 'U00156',\n    decimal: 342,\n    character: 'Ŗ',\n    latex: '\\\\c{R}',\n  },\n  343: {\n    id: 'U00157',\n    decimal: 343,\n    character: 'ŗ',\n    latex: '\\\\c{r}',\n  },\n  344: {\n    id: 'U00158',\n    decimal: 344,\n    character: 'Ř',\n    latex: '\\\\v{R}',\n  },\n  345: {\n    id: 'U00159',\n    decimal: 345,\n    character: 'ř',\n    latex: '\\\\v{r}',\n  },\n  346: {\n    id: 'U0015A',\n    decimal: 346,\n    character: 'Ś',\n    latex: \"\\\\'{S}\",\n  },\n  347: {\n    id: 'U0015B',\n    decimal: 347,\n    character: 'ś',\n    latex: \"\\\\'{s}\",\n  },\n  348: {\n    id: 'U0015C',\n    decimal: 348,\n    character: 'Ŝ',\n    latex: '\\\\^{S}',\n  },\n  349: {\n    id: 'U0015D',\n    decimal: 349,\n    character: 'ŝ',\n    latex: '\\\\^{s}',\n  },\n  350: {\n    id: 'U0015E',\n    decimal: 350,\n    character: 'Ş',\n    latex: '\\\\c{S}',\n  },\n  351: {\n    id: 'U0015F',\n    decimal: 351,\n    character: 'ş',\n    latex: '\\\\c{s}',\n  },\n  352: {\n    id: 'U00160',\n    decimal: 352,\n    character: 'Š',\n    latex: '\\\\v{S}',\n  },\n  353: {\n    id: 'U00161',\n    decimal: 353,\n    character: 'š',\n    latex: '\\\\v{s}',\n  },\n  354: {\n    id: 'U00162',\n    decimal: 354,\n    character: 'Ţ',\n    latex: '\\\\c{T}',\n  },\n  355: {\n    id: 'U00163',\n    decimal: 355,\n    character: 'ţ',\n    latex: '\\\\c{t}',\n  },\n  356: {\n    id: 'U00164',\n    decimal: 356,\n    character: 'Ť',\n    latex: '\\\\v{T}',\n  },\n  357: {\n    id: 'U00165',\n    decimal: 357,\n    character: 'ť',\n    latex: '\\\\v{t}',\n  },\n  360: {\n    id: 'U00168',\n    decimal: 360,\n    character: 'Ũ',\n    latex: '\\\\~{U}',\n  },\n  361: {\n    id: 'U00169',\n    decimal: 361,\n    character: 'ũ',\n    latex: '\\\\~{u}',\n  },\n  362: {\n    id: 'U0016A',\n    decimal: 362,\n    character: 'Ū',\n    latex: '\\\\={U}',\n  },\n  363: {\n    id: 'U0016B',\n    decimal: 363,\n    character: 'ū',\n    latex: '\\\\={u}',\n  },\n  364: {\n    id: 'U0016C',\n    decimal: 364,\n    character: 'Ŭ',\n    latex: '\\\\u{U}',\n  },\n  365: {\n    id: 'U0016D',\n    decimal: 365,\n    character: 'ŭ',\n    latex: '\\\\u{u}',\n  },\n  366: {\n    id: 'U0016E',\n    decimal: 366,\n    character: 'Ů',\n    latex: '\\\\r{U}',\n  },\n  367: {\n    id: 'U0016F',\n    decimal: 367,\n    character: 'ů',\n    latex: '\\\\r{u}',\n  },\n  368: {\n    id: 'U00170',\n    decimal: 368,\n    character: 'Ű',\n    latex: '{\\\\H U}',\n  },\n  369: {\n    id: 'U00171',\n    decimal: 369,\n    character: 'ű',\n    latex: '{\\\\H u}',\n  },\n  370: {\n    id: 'U00172',\n    decimal: 370,\n    character: 'Ų',\n    latex: '\\\\k{U}',\n  },\n  371: {\n    id: 'U00173',\n    decimal: 371,\n    character: 'ų',\n    latex: '\\\\k{u}',\n  },\n  372: {\n    id: 'U00174',\n    decimal: 372,\n    character: 'Ŵ',\n    latex: '\\\\^{W}',\n  },\n  373: {\n    id: 'U00175',\n    decimal: 373,\n    character: 'ŵ',\n    latex: '\\\\^{w}',\n  },\n  374: {\n    id: 'U00176',\n    decimal: 374,\n    character: 'Ŷ',\n    latex: '\\\\^{Y}',\n  },\n  375: {\n    id: 'U00177',\n    decimal: 375,\n    character: 'ŷ',\n    latex: '\\\\^{y}',\n  },\n  376: {\n    id: 'U00178',\n    decimal: 376,\n    character: 'Ÿ',\n    latex: '\\\\\"{Y}',\n  },\n  377: {\n    id: 'U00179',\n    decimal: 377,\n    character: 'Ź',\n    latex: \"\\\\'{Z}\",\n  },\n  378: {\n    id: 'U0017A',\n    decimal: 378,\n    character: 'ź',\n    latex: \"\\\\'{z}\",\n  },\n  379: {\n    id: 'U0017B',\n    decimal: 379,\n    character: 'Ż',\n    latex: '\\\\.{Z}',\n  },\n  380: {\n    id: 'U0017C',\n    decimal: 380,\n    character: 'ż',\n    latex: '\\\\.{z}',\n  },\n  381: {\n    id: 'U0017D',\n    decimal: 381,\n    character: 'Ž',\n    latex: '\\\\v{Z}',\n  },\n  382: {\n    id: 'U0017E',\n    decimal: 382,\n    character: 'ž',\n    latex: '\\\\v{z}',\n  },\n  402: {\n    id: 'U00192',\n    decimal: 402,\n    character: 'ƒ',\n    latex: '\\\\textflorin',\n  },\n  501: {\n    id: 'U001F5',\n    decimal: 501,\n    character: 'ǵ',\n    latex: \"\\\\'{g}\",\n  },\n  609: {\n    id: 'U00261',\n    decimal: 609,\n    character: 'ɡ',\n    latex: 'g',\n  },\n  700: {\n    id: 'U002BC',\n    decimal: 700,\n    character: 'ʼ',\n    latex: \"'\",\n  },\n  711: {\n    id: 'U002C7',\n    decimal: 711,\n    character: 'ˇ',\n    latex: '\\\\textasciicaron',\n  },\n  714: {\n    id: 'U002ca',\n    decimal: 714,\n    character: 'ˊ',\n    latex: '\\\\textasciitilde',\n  },\n  728: {\n    id: 'U002D8',\n    decimal: 728,\n    character: '˘',\n    latex: '\\\\textasciibreve',\n  },\n  729: {\n    id: 'U002D9',\n    decimal: 729,\n    character: '˙',\n    latex: '\\\\textperiodcentered',\n  },\n  730: {\n    id: 'U002DA',\n    decimal: 730,\n    character: '˚',\n    latex: '\\\\r{}',\n  },\n  731: {\n    id: 'U002DB',\n    decimal: 731,\n    character: '˛',\n    latex: '\\\\k{}',\n  },\n  732: {\n    id: 'U002DC',\n    decimal: 732,\n    character: '˜',\n    latex: '\\\\texttildelow',\n  },\n  733: {\n    id: 'U002dd',\n    decimal: 733,\n    character: '˝',\n    latex: '\\\\textacutedbl',\n  },\n  768: {\n    id: 'U00300',\n    decimal: 768,\n    character: '̀',\n    latex: '\\\\`',\n    ungrouped: true,\n  },\n  769: {\n    id: 'U00301',\n    decimal: 769,\n    character: '́',\n    latex: \"\\\\'\",\n    ungrouped: true,\n  },\n  770: {\n    id: 'U00302',\n    decimal: 770,\n    character: '̂',\n    latex: '\\\\^',\n    ungrouped: true,\n  },\n  771: {\n    id: 'U00303',\n    decimal: 771,\n    character: '̃',\n    latex: '\\\\~',\n    ungrouped: true,\n  },\n  772: {\n    id: 'U00304',\n    decimal: 772,\n    character: '̄',\n    latex: '\\\\=',\n    ungrouped: true,\n  },\n  774: {\n    id: 'U00306',\n    decimal: 774,\n    character: '̆',\n    latex: '\\\\u',\n    ungrouped: true,\n  },\n  775: {\n    id: 'U00307',\n    decimal: 775,\n    character: '̇',\n    latex: '\\\\.',\n    ungrouped: true,\n  },\n  776: {\n    id: 'U00308',\n    decimal: 776,\n    character: '̈',\n    latex: '\\\\\"',\n    ungrouped: true,\n  },\n  778: {\n    id: 'U0030A',\n    decimal: 778,\n    character: '̊',\n    latex: '\\\\r',\n    ungrouped: true,\n  },\n  780: {\n    id: 'U0030C',\n    decimal: 780,\n    character: '̌',\n    latex: '\\\\v',\n    ungrouped: true,\n  },\n  807: {\n    id: 'U00327',\n    decimal: 807,\n    character: '̧',\n    latex: '\\\\c',\n    ungrouped: true,\n  },\n  808: {\n    id: 'U00328',\n    decimal: 808,\n    character: '̨',\n    latex: '\\\\k',\n    ungrouped: true,\n  },\n  902: {\n    id: 'U00386',\n    decimal: 902,\n    character: 'Ά',\n    latex: \"\\\\'{A}\",\n  },\n  904: {\n    id: 'U00388',\n    decimal: 904,\n    character: 'Έ',\n    latex: \"\\\\'{E}\",\n  },\n  905: {\n    id: 'U00389',\n    decimal: 905,\n    character: 'Ή',\n    latex: \"\\\\'{H}\",\n  },\n  906: {\n    id: 'U0038A',\n    decimal: 906,\n    character: 'Ί',\n    latex: \"\\\\'{}{I}\",\n  },\n  908: {\n    id: 'U0038C',\n    decimal: 908,\n    character: 'Ό',\n    latex: \"\\\\'{}O\",\n  },\n  910: {\n    id: 'U0038E',\n    decimal: 910,\n    character: 'Ύ',\n    latex: \"$\\\\mathrm{'Y}$\",\n  },\n  911: {\n    id: 'U0038F',\n    decimal: 911,\n    character: 'Ώ',\n    latex: \"$\\\\mathrm{'\\\\Omega}$\",\n  },\n  924: {\n    id: 'U0039C',\n    decimal: 924,\n    character: 'Μ',\n    latex: 'M',\n  },\n  925: {\n    id: 'U0039D',\n    decimal: 925,\n    character: 'Ν',\n    latex: 'N',\n  },\n  927: {\n    id: 'U0039F',\n    decimal: 927,\n    character: 'Ο',\n    latex: 'O',\n  },\n  938: {\n    id: 'U003AA',\n    decimal: 938,\n    character: 'Ϊ',\n    latex: '$\\\\mathrm{\\\\ddot{I}}$',\n  },\n  939: {\n    id: 'U003AB',\n    decimal: 939,\n    character: 'Ϋ',\n    latex: '$\\\\mathrm{\\\\ddot{Y}}$',\n  },\n  940: {\n    id: 'U003AC',\n    decimal: 940,\n    character: 'ά',\n    latex: \"\\\\'{$\\\\alpha$}\",\n  },\n  959: {\n    id: 'U003BF',\n    decimal: 959,\n    character: 'ο',\n    latex: 'o',\n  },\n  972: {\n    id: 'U003CC',\n    decimal: 972,\n    character: 'ό',\n    latex: \"\\\\'{o}\",\n  },\n  8194: {\n    id: 'U02002',\n    decimal: 8194,\n    character: ' ',\n    latex: '\\\\hspace{0.6em}',\n  },\n  8195: {\n    id: 'U02003',\n    decimal: 8195,\n    character: ' ',\n    latex: '\\\\hspace{1em}',\n  },\n  8196: {\n    id: 'U02004',\n    decimal: 8196,\n    character: ' ',\n    latex: '\\\\hspace{0.33em}',\n  },\n  8197: {\n    id: 'U02005',\n    decimal: 8197,\n    character: ' ',\n    latex: '\\\\hspace{0.25em}',\n  },\n  8198: {\n    id: 'U02006',\n    decimal: 8198,\n    character: ' ',\n    latex: '\\\\hspace{0.166em}',\n  },\n  8199: {\n    id: 'U02007',\n    decimal: 8199,\n    character: ' ',\n    latex: '\\\\hphantom{0}',\n  },\n  8200: {\n    id: 'U02008',\n    decimal: 8200,\n    character: ' ',\n    latex: '\\\\hphantom{,}',\n  },\n  8201: {\n    id: 'U02009',\n    decimal: 8201,\n    character: ' ',\n    latex: '\\\\hspace{0.167em}',\n  },\n  8204: {\n    id: 'U00200c',\n    decimal: 8204,\n    character: '‌',\n    latex: '\\\\textcompwordmark',\n  },\n  8208: {\n    id: 'U02010',\n    decimal: 8208,\n    character: '‐',\n    latex: '-',\n  },\n  8211: {\n    id: 'U02013',\n    decimal: 8211,\n    character: '–',\n    latex: '\\\\textendash',\n  },\n  8212: {\n    id: 'U02014',\n    decimal: 8212,\n    character: '—',\n    latex: '\\\\textemdash',\n  },\n  8213: {\n    id: 'U02015',\n    decimal: 8213,\n    character: '―',\n    latex: '\\\\rule{1em}{1pt}',\n  },\n  8216: {\n    id: 'U02018',\n    decimal: 8216,\n    character: '‘',\n    latex: '\\\\textquoteleft',\n  },\n  8217: {\n    id: 'U02019',\n    decimal: 8217,\n    character: '’',\n    latex: '\\\\textquoteright',\n  },\n  8218: {\n    id: 'U0201A',\n    decimal: 8218,\n    character: '‚',\n    latex: ',',\n  },\n  8220: {\n    id: 'U0201C',\n    decimal: 8220,\n    character: '“',\n    latex: '\\\\textquotedblleft',\n  },\n  8221: {\n    id: 'U0201D',\n    decimal: 8221,\n    character: '”',\n    latex: '\\\\textquotedblright',\n  },\n  8222: {\n    id: 'U0201E',\n    decimal: 8222,\n    character: '„',\n    latex: ',,',\n  },\n  8224: {\n    id: 'U02020',\n    decimal: 8224,\n    character: '†',\n    latex: '\\\\textdagger',\n  },\n  8225: {\n    id: 'U02021',\n    decimal: 8225,\n    character: '‡',\n    latex: '\\\\textdaggerdbl',\n  },\n  8226: {\n    id: 'U02022',\n    decimal: 8226,\n    character: '•',\n    latex: '\\\\textbullet',\n  },\n  8228: {\n    id: 'U02024',\n    decimal: 8228,\n    character: '․',\n    latex: '.',\n  },\n  8229: {\n    id: 'U02025',\n    decimal: 8229,\n    character: '‥',\n    latex: '..',\n  },\n  8230: {\n    id: 'U02026',\n    decimal: 8230,\n    character: '…',\n    latex: '\\\\ldots',\n  },\n  8240: {\n    id: 'U02030',\n    decimal: 8240,\n    character: '‰',\n    latex: '\\\\textperthousand',\n  },\n  8241: {\n    id: 'U02031',\n    decimal: 8241,\n    character: '‱',\n    latex: '\\\\textpertenthousand',\n  },\n  8242: {\n    id: 'U02032',\n    decimal: 8242,\n    character: '′',\n    latex: \"{'}\",\n  },\n  8243: {\n    id: 'U02033',\n    decimal: 8243,\n    character: '″',\n    latex: \"{''}\",\n  },\n  8244: {\n    id: 'U02034',\n    decimal: 8244,\n    character: '‴',\n    latex: \"{'''}\",\n  },\n  8249: {\n    id: 'U02039',\n    decimal: 8249,\n    character: '‹',\n    latex: '\\\\guilsinglleft',\n  },\n  8250: {\n    id: 'U0203A',\n    decimal: 8250,\n    character: '›',\n    latex: '\\\\guilsinglright',\n  },\n  8279: {\n    id: 'U02057',\n    decimal: 8279,\n    character: '⁗',\n    latex: \"''''\",\n  },\n  8288: {\n    id: 'U02060',\n    decimal: 8288,\n    character: '⁠',\n    latex: '\\\\nolinebreak',\n  },\n  8364: {\n    id: 'U020AC',\n    decimal: 8364,\n    character: '€',\n    latex: '\\\\mbox{\\\\texteuro}',\n  },\n  8450: {\n    id: 'U02102',\n    decimal: 8450,\n    character: 'ℂ',\n    latex: '$\\\\mathbb{C}$',\n  },\n  8460: {\n    id: 'U0210C',\n    decimal: 8460,\n    character: 'ℌ',\n    latex: '$\\\\mathfrak{H}$',\n  },\n  8461: {\n    id: 'U0210D',\n    decimal: 8461,\n    character: 'ℍ',\n    latex: '$\\\\mathbb{H}$',\n  },\n  8465: {\n    id: 'U02111',\n    decimal: 8465,\n    character: 'ℑ',\n    latex: '$\\\\mathfrak{I}$',\n  },\n  8469: {\n    id: 'U02115',\n    decimal: 8469,\n    character: 'ℕ',\n    latex: '$\\\\mathbb{N}$',\n  },\n  8473: {\n    id: 'U02119',\n    decimal: 8473,\n    character: 'ℙ',\n    latex: '$\\\\mathbb{P}$',\n  },\n  8474: {\n    id: 'U0211A',\n    decimal: 8474,\n    character: 'ℚ',\n    latex: '$\\\\mathbb{Q}$',\n  },\n  8476: {\n    id: 'U0211C',\n    decimal: 8476,\n    character: 'ℜ',\n    latex: '$\\\\mathfrak{R}$',\n  },\n  8477: {\n    id: 'U0211D',\n    decimal: 8477,\n    character: 'ℝ',\n    latex: '$\\\\mathbb{R}$',\n  },\n  8482: {\n    id: 'U02122',\n    decimal: 8482,\n    character: '™',\n    latex: '\\\\texttrademark',\n  },\n  8484: {\n    id: 'U02124',\n    decimal: 8484,\n    character: 'ℤ',\n    latex: '$\\\\mathbb{Z}$',\n  },\n  8488: {\n    id: 'U02128',\n    decimal: 8488,\n    character: 'ℨ',\n    latex: '$\\\\mathfrak{Z}$',\n  },\n  8491: {\n    id: 'U0212B',\n    decimal: 8491,\n    character: 'Å',\n    latex: '\\\\AA',\n  },\n  8493: {\n    id: 'U0212D',\n    decimal: 8493,\n    character: 'ℭ',\n    latex: '$\\\\mathfrak{C}$',\n  },\n  8722: {\n    id: 'U02212',\n    decimal: 8722,\n    character: '−',\n    latex: '-',\n  },\n  8762: {\n    id: 'U0223A',\n    decimal: 8762,\n    character: '∺',\n    latex: '$\\\\mathbin{{:}\\\\!\\\\!{-}\\\\!\\\\!{:}}$',\n  },\n  8788: {\n    id: 'U02254',\n    decimal: 8788,\n    character: '≔',\n    latex: ':=',\n  },\n  8789: {\n    id: 'U02255',\n    decimal: 8789,\n    character: '≕',\n    latex: '=:',\n  },\n  8942: {\n    id: 'U022EE',\n    decimal: 8942,\n    character: '⋮',\n    latex: '\\\\vdots',\n  },\n  8982: {\n    id: 'U02316',\n    decimal: 8982,\n    character: '⌖',\n    latex: '$\\\\mathchar\"2208$',\n  },\n  9251: {\n    id: 'U02423',\n    decimal: 9251,\n    character: '␣',\n    latex: '\\\\textvisiblespace',\n  },\n  9645: {\n    id: 'U025AD',\n    decimal: 9645,\n    character: '▭',\n    latex: '\\\\fbox{~~}',\n  },\n  11005: {\n    id: 'U02AFD-020E5',\n    decimal: 11005,\n    character: '⫽',\n    latex: '{\\\\rlap{\\\\textbackslash}{{/}\\\\!\\\\!{/}}}',\n  },\n  64256: {\n    id: 'U0FB00',\n    decimal: 64256,\n    character: 'ff',\n    latex: 'ff',\n  },\n  64257: {\n    id: 'U0FB01',\n    decimal: 64257,\n    character: 'fi',\n    latex: 'fi',\n  },\n  64258: {\n    id: 'U0FB02',\n    decimal: 64258,\n    character: 'fl',\n    latex: 'fl',\n  },\n  64259: {\n    id: 'U0FB03',\n    decimal: 64259,\n    character: 'ffi',\n    latex: 'ffi',\n  },\n  64260: {\n    id: 'U0FB04',\n    decimal: 64260,\n    character: 'ffl',\n    latex: 'ffl',\n  },\n  119808: {\n    id: 'U1D400',\n    decimal: 119808,\n    character: '퐀',\n    latex: '$\\\\mathbf{A}$',\n  },\n  119809: {\n    id: 'U1D401',\n    decimal: 119809,\n    character: '퐁',\n    latex: '$\\\\mathbf{B}$',\n  },\n  119810: {\n    id: 'U1D402',\n    decimal: 119810,\n    character: '퐂',\n    latex: '$\\\\mathbf{C}$',\n  },\n  119811: {\n    id: 'U1D403',\n    decimal: 119811,\n    character: '퐃',\n    latex: '$\\\\mathbf{D}$',\n  },\n  119812: {\n    id: 'U1D404',\n    decimal: 119812,\n    character: '퐄',\n    latex: '$\\\\mathbf{E}$',\n  },\n  119813: {\n    id: 'U1D405',\n    decimal: 119813,\n    character: '퐅',\n    latex: '{$\\\\mathbf{F}$}',\n  },\n  119814: {\n    id: 'U1D406',\n    decimal: 119814,\n    character: '퐆',\n    latex: '$\\\\mathbf{G}$',\n  },\n  119815: {\n    id: 'U1D407',\n    decimal: 119815,\n    character: '퐇',\n    latex: '$\\\\mathbf{H}$',\n  },\n  119816: {\n    id: 'U1D408',\n    decimal: 119816,\n    character: '퐈',\n    latex: '$\\\\mathbf{I}$',\n  },\n  119817: {\n    id: 'U1D409',\n    decimal: 119817,\n    character: '퐉',\n    latex: '$\\\\mathbf{J}$',\n  },\n  119818: {\n    id: 'U1D40A',\n    decimal: 119818,\n    character: '퐊',\n    latex: '$\\\\mathbf{K}$',\n  },\n  119819: {\n    id: 'U1D40B',\n    decimal: 119819,\n    character: '퐋',\n    latex: '$\\\\mathbf{L}$',\n  },\n  119820: {\n    id: 'U1D40C',\n    decimal: 119820,\n    character: '퐌',\n    latex: '$\\\\mathbf{M}$',\n  },\n  119821: {\n    id: 'U1D40D',\n    decimal: 119821,\n    character: '퐍',\n    latex: '$\\\\mathbf{N}$',\n  },\n  119822: {\n    id: 'U1D40E',\n    decimal: 119822,\n    character: '퐎',\n    latex: '$\\\\mathbf{O}$',\n  },\n  119823: {\n    id: 'U1D40F',\n    decimal: 119823,\n    character: '퐏',\n    latex: '$\\\\mathbf{P}$',\n  },\n  119824: {\n    id: 'U1D410',\n    decimal: 119824,\n    character: '퐐',\n    latex: '$\\\\mathbf{Q}$',\n  },\n  119825: {\n    id: 'U1D411',\n    decimal: 119825,\n    character: '퐑',\n    latex: '$\\\\mathbf{R}$',\n  },\n  119826: {\n    id: 'U1D412',\n    decimal: 119826,\n    character: '퐒',\n    latex: '$\\\\mathbf{S}$',\n  },\n  119827: {\n    id: 'U1D413',\n    decimal: 119827,\n    character: '퐓',\n    latex: '$\\\\mathbf{T}$',\n  },\n  119828: {\n    id: 'U1D414',\n    decimal: 119828,\n    character: '퐔',\n    latex: '$\\\\mathbf{U}$',\n  },\n  119829: {\n    id: 'U1D415',\n    decimal: 119829,\n    character: '퐕',\n    latex: '$\\\\mathbf{V}$',\n  },\n  119830: {\n    id: 'U1D416',\n    decimal: 119830,\n    character: '퐖',\n    latex: '$\\\\mathbf{W}$',\n  },\n  119831: {\n    id: 'U1D417',\n    decimal: 119831,\n    character: '퐗',\n    latex: '$\\\\mathbf{X}$',\n  },\n  119832: {\n    id: 'U1D418',\n    decimal: 119832,\n    character: '퐘',\n    latex: '$\\\\mathbf{Y}$',\n  },\n  119833: {\n    id: 'U1D419',\n    decimal: 119833,\n    character: '퐙',\n    latex: '$\\\\mathbf{Z}$',\n  },\n  119834: {\n    id: 'U1D41A',\n    decimal: 119834,\n    character: '퐚',\n    latex: '$\\\\mathbf{a}$',\n  },\n  119835: {\n    id: 'U1D41B',\n    decimal: 119835,\n    character: '퐛',\n    latex: '$\\\\mathbf{b}$',\n  },\n  119836: {\n    id: 'U1D41C',\n    decimal: 119836,\n    character: '퐜',\n    latex: '$\\\\mathbf{c}$',\n  },\n  119837: {\n    id: 'U1D41D',\n    decimal: 119837,\n    character: '퐝',\n    latex: '$\\\\mathbf{d}$',\n  },\n  119838: {\n    id: 'U1D41E',\n    decimal: 119838,\n    character: '퐞',\n    latex: '$\\\\mathbf{e}$',\n  },\n  119839: {\n    id: 'U1D41F',\n    decimal: 119839,\n    character: '퐟',\n    latex: '{$\\\\mathbf{f}$}',\n  },\n  119840: {\n    id: 'U1D420',\n    decimal: 119840,\n    character: '퐠',\n    latex: '$\\\\mathbf{g}$',\n  },\n  119841: {\n    id: 'U1D421',\n    decimal: 119841,\n    character: '퐡',\n    latex: '$\\\\mathbf{h}$',\n  },\n  119842: {\n    id: 'U1D422',\n    decimal: 119842,\n    character: '퐢',\n    latex: '$\\\\mathbf{i}$',\n  },\n  119843: {\n    id: 'U1D423',\n    decimal: 119843,\n    character: '퐣',\n    latex: '$\\\\mathbf{j}$',\n  },\n  119844: {\n    id: 'U1D424',\n    decimal: 119844,\n    character: '퐤',\n    latex: '$\\\\mathbf{k}$',\n  },\n  119845: {\n    id: 'U1D425',\n    decimal: 119845,\n    character: '퐥',\n    latex: '$\\\\mathbf{l}$',\n  },\n  119846: {\n    id: 'U1D426',\n    decimal: 119846,\n    character: '퐦',\n    latex: '$\\\\mathbf{m}$',\n  },\n  119847: {\n    id: 'U1D427',\n    decimal: 119847,\n    character: '퐧',\n    latex: '$\\\\mathbf{n}$',\n  },\n  119848: {\n    id: 'U1D428',\n    decimal: 119848,\n    character: '퐨',\n    latex: '$\\\\mathbf{o}$',\n  },\n  119849: {\n    id: 'U1D429',\n    decimal: 119849,\n    character: '퐩',\n    latex: '$\\\\mathbf{p}$',\n  },\n  119850: {\n    id: 'U1D42A',\n    decimal: 119850,\n    character: '퐪',\n    latex: '$\\\\mathbf{q}$',\n  },\n  119851: {\n    id: 'U1D42B',\n    decimal: 119851,\n    character: '퐫',\n    latex: '$\\\\mathbf{r}$',\n  },\n  119852: {\n    id: 'U1D42C',\n    decimal: 119852,\n    character: '퐬',\n    latex: '$\\\\mathbf{s}$',\n  },\n  119853: {\n    id: 'U1D42D',\n    decimal: 119853,\n    character: '퐭',\n    latex: '$\\\\mathbf{t}$',\n  },\n  119854: {\n    id: 'U1D42E',\n    decimal: 119854,\n    character: '퐮',\n    latex: '$\\\\mathbf{u}$',\n  },\n  119855: {\n    id: 'U1D42F',\n    decimal: 119855,\n    character: '퐯',\n    latex: '$\\\\mathbf{v}$',\n  },\n  119856: {\n    id: 'U1D430',\n    decimal: 119856,\n    character: '퐰',\n    latex: '$\\\\mathbf{w}$',\n  },\n  119857: {\n    id: 'U1D431',\n    decimal: 119857,\n    character: '퐱',\n    latex: '$\\\\mathbf{x}$',\n  },\n  119858: {\n    id: 'U1D432',\n    decimal: 119858,\n    character: '퐲',\n    latex: '$\\\\mathbf{y}$',\n  },\n  119859: {\n    id: 'U1D433',\n    decimal: 119859,\n    character: '퐳',\n    latex: '$\\\\mathbf{z}$',\n  },\n  120068: {\n    id: 'U1D504',\n    decimal: 120068,\n    character: '프',\n    latex: '$\\\\mathfrak{A}$',\n  },\n  120069: {\n    id: 'U1D505',\n    decimal: 120069,\n    character: '픅',\n    latex: '$\\\\mathfrak{B}$',\n  },\n  120071: {\n    id: 'U1D507',\n    decimal: 120071,\n    character: '픇',\n    latex: '$\\\\mathfrak{D}$',\n  },\n  120072: {\n    id: 'U1D508',\n    decimal: 120072,\n    character: '픈',\n    latex: '$\\\\mathfrak{E}$',\n  },\n  120073: {\n    id: 'U1D509',\n    decimal: 120073,\n    character: '픉',\n    latex: '$\\\\mathfrak{F}$',\n  },\n  120074: {\n    id: 'U1D50A',\n    decimal: 120074,\n    character: '픊',\n    latex: '$\\\\mathfrak{G}$',\n  },\n  120077: {\n    id: 'U1D50D',\n    decimal: 120077,\n    character: '픍',\n    latex: '$\\\\mathfrak{J}$',\n  },\n  120078: {\n    id: 'U1D50E',\n    decimal: 120078,\n    character: '픎',\n    latex: '$\\\\mathfrak{K}$',\n  },\n  120079: {\n    id: 'U1D50F',\n    decimal: 120079,\n    character: '픏',\n    latex: '$\\\\mathfrak{L}$',\n  },\n  120080: {\n    id: 'U1D510',\n    decimal: 120080,\n    character: '픐',\n    latex: '$\\\\mathfrak{M}$',\n  },\n  120081: {\n    id: 'U1D511',\n    decimal: 120081,\n    character: '픑',\n    latex: '$\\\\mathfrak{N}$',\n  },\n  120082: {\n    id: 'U1D512',\n    decimal: 120082,\n    character: '픒',\n    latex: '$\\\\mathfrak{O}$',\n  },\n  120083: {\n    id: 'U1D513',\n    decimal: 120083,\n    character: '픓',\n    latex: '$\\\\mathfrak{P}$',\n  },\n  120084: {\n    id: 'U1D514',\n    decimal: 120084,\n    character: '픔',\n    latex: '$\\\\mathfrak{Q}$',\n  },\n  120086: {\n    id: 'U1D516',\n    decimal: 120086,\n    character: '픖',\n    latex: '$\\\\mathfrak{S}$',\n  },\n  120087: {\n    id: 'U1D517',\n    decimal: 120087,\n    character: '픗',\n    latex: '$\\\\mathfrak{T}$',\n  },\n  120088: {\n    id: 'U1D518',\n    decimal: 120088,\n    character: '픘',\n    latex: '$\\\\mathfrak{U}$',\n  },\n  120089: {\n    id: 'U1D519',\n    decimal: 120089,\n    character: '픙',\n    latex: '$\\\\mathfrak{V}$',\n  },\n  120090: {\n    id: 'U1D51A',\n    decimal: 120090,\n    character: '픚',\n    latex: '$\\\\mathfrak{W}$',\n  },\n  120091: {\n    id: 'U1D51B',\n    decimal: 120091,\n    character: '픛',\n    latex: '$\\\\mathfrak{X}$',\n  },\n  120092: {\n    id: 'U1D51C',\n    decimal: 120092,\n    character: '픜',\n    latex: '$\\\\mathfrak{Y}$',\n  },\n  120094: {\n    id: 'U1D51E',\n    decimal: 120094,\n    character: '픞',\n    latex: '$\\\\mathfrak{a}$',\n  },\n  120095: {\n    id: 'U1D51F',\n    decimal: 120095,\n    character: '픟',\n    latex: '$\\\\mathfrak{b}$',\n  },\n  120096: {\n    id: 'U1D520',\n    decimal: 120096,\n    character: '픠',\n    latex: '$\\\\mathfrak{c}$',\n  },\n  120097: {\n    id: 'U1D521',\n    decimal: 120097,\n    character: '픡',\n    latex: '$\\\\mathfrak{d}$',\n  },\n  120098: {\n    id: 'U1D522',\n    decimal: 120098,\n    character: '픢',\n    latex: '$\\\\mathfrak{e}$',\n  },\n  120099: {\n    id: 'U1D523',\n    decimal: 120099,\n    character: '픣',\n    latex: '$\\\\mathfrak{f}$',\n  },\n  120100: {\n    id: 'U1D524',\n    decimal: 120100,\n    character: '픤',\n    latex: '$\\\\mathfrak{g}$',\n  },\n  120101: {\n    id: 'U1D525',\n    decimal: 120101,\n    character: '픥',\n    latex: '$\\\\mathfrak{h}$',\n  },\n  120102: {\n    id: 'U1D526',\n    decimal: 120102,\n    character: '픦',\n    latex: '$\\\\mathfrak{i}$',\n  },\n  120103: {\n    id: 'U1D527',\n    decimal: 120103,\n    character: '픧',\n    latex: '$\\\\mathfrak{j}$',\n  },\n  120104: {\n    id: 'U1D528',\n    decimal: 120104,\n    character: '픨',\n    latex: '$\\\\mathfrak{k}$',\n  },\n  120105: {\n    id: 'U1D529',\n    decimal: 120105,\n    character: '픩',\n    latex: '$\\\\mathfrak{l}$',\n  },\n  120106: {\n    id: 'U1D52A',\n    decimal: 120106,\n    character: '픪',\n    latex: '$\\\\mathfrak{m}$',\n  },\n  120107: {\n    id: 'U1D52B',\n    decimal: 120107,\n    character: '픫',\n    latex: '$\\\\mathfrak{n}$',\n  },\n  120108: {\n    id: 'U1D52C',\n    decimal: 120108,\n    character: '픬',\n    latex: '$\\\\mathfrak{o}$',\n  },\n  120109: {\n    id: 'U1D52D',\n    decimal: 120109,\n    character: '픭',\n    latex: '$\\\\mathfrak{p}$',\n  },\n  120110: {\n    id: 'U1D52E',\n    decimal: 120110,\n    character: '픮',\n    latex: '$\\\\mathfrak{q}$',\n  },\n  120111: {\n    id: 'U1D52F',\n    decimal: 120111,\n    character: '픯',\n    latex: '$\\\\mathfrak{r}$',\n  },\n  120112: {\n    id: 'U1D530',\n    decimal: 120112,\n    character: '픰',\n    latex: '$\\\\mathfrak{s}$',\n  },\n  120113: {\n    id: 'U1D531',\n    decimal: 120113,\n    character: '픱',\n    latex: '$\\\\mathfrak{t}$',\n  },\n  120114: {\n    id: 'U1D532',\n    decimal: 120114,\n    character: '픲',\n    latex: '$\\\\mathfrak{u}$',\n  },\n  120115: {\n    id: 'U1D533',\n    decimal: 120115,\n    character: '픳',\n    latex: '$\\\\mathfrak{v}$',\n  },\n  120116: {\n    id: 'U1D534',\n    decimal: 120116,\n    character: '픴',\n    latex: '$\\\\mathfrak{w}$',\n  },\n  120117: {\n    id: 'U1D535',\n    decimal: 120117,\n    character: '픵',\n    latex: '$\\\\mathfrak{x}$',\n  },\n  120118: {\n    id: 'U1D536',\n    decimal: 120118,\n    character: '픶',\n    latex: '$\\\\mathfrak{y}$',\n  },\n  120119: {\n    id: 'U1D537',\n    decimal: 120119,\n    character: '픷',\n    latex: '$\\\\mathfrak{z}$',\n  },\n  120120: {\n    id: 'U1D538',\n    decimal: 120120,\n    character: '픸',\n    latex: '$\\\\mathbb{A}$',\n  },\n  120121: {\n    id: 'U1D539',\n    decimal: 120121,\n    character: '픹',\n    latex: '$\\\\mathbb{B}$',\n  },\n  120123: {\n    id: 'U1D53B',\n    decimal: 120123,\n    character: '픻',\n    latex: '$\\\\mathbb{D}$',\n  },\n  120124: {\n    id: 'U1D53C',\n    decimal: 120124,\n    character: '피',\n    latex: '$\\\\mathbb{E}$',\n  },\n  120125: {\n    id: 'U1D53D',\n    decimal: 120125,\n    character: '픽',\n    latex: '$\\\\mathbb{F}$',\n  },\n  120126: {\n    id: 'U1D53E',\n    decimal: 120126,\n    character: '픾',\n    latex: '$\\\\mathbb{G}$',\n  },\n  120128: {\n    id: 'U1D540',\n    decimal: 120128,\n    character: '핀',\n    latex: '$\\\\mathbb{I}$',\n  },\n  120129: {\n    id: 'U1D541',\n    decimal: 120129,\n    character: '핁',\n    latex: '$\\\\mathbb{J}$',\n  },\n  120130: {\n    id: 'U1D542',\n    decimal: 120130,\n    character: '핂',\n    latex: '$\\\\mathbb{K}$',\n  },\n  120131: {\n    id: 'U1D543',\n    decimal: 120131,\n    character: '핃',\n    latex: '$\\\\mathbb{L}$',\n  },\n  120132: {\n    id: 'U1D544',\n    decimal: 120132,\n    character: '필',\n    latex: '$\\\\mathbb{M}$',\n  },\n  120134: {\n    id: 'U1D546',\n    decimal: 120134,\n    character: '핆',\n    latex: '$\\\\mathbb{O}$',\n  },\n  120138: {\n    id: 'U1D54A',\n    decimal: 120138,\n    character: '핊',\n    latex: '$\\\\mathbb{S}$',\n  },\n  120139: {\n    id: 'U1D54B',\n    decimal: 120139,\n    character: '핋',\n    latex: '$\\\\mathbb{T}$',\n  },\n  120140: {\n    id: 'U1D54C',\n    decimal: 120140,\n    character: '핌',\n    latex: '$\\\\mathbb{U}$',\n  },\n  120141: {\n    id: 'U1D54D',\n    decimal: 120141,\n    character: '핍',\n    latex: '$\\\\mathbb{V}$',\n  },\n  120142: {\n    id: 'U1D54E',\n    decimal: 120142,\n    character: '핎',\n    latex: '$\\\\mathbb{W}$',\n  },\n  120143: {\n    id: 'U1D54F',\n    decimal: 120143,\n    character: '핏',\n    latex: '$\\\\mathbb{X}$',\n  },\n  120144: {\n    id: 'U1D550',\n    decimal: 120144,\n    character: '핐',\n    latex: '$\\\\mathbb{Y}$',\n  },\n  120146: {\n    id: 'U1D552',\n    decimal: 120146,\n    character: '핒',\n    latex: '$\\\\mathbb{a}$',\n  },\n  120147: {\n    id: 'U1D553',\n    decimal: 120147,\n    character: '핓',\n    latex: '$\\\\mathbb{b}$',\n  },\n  120148: {\n    id: 'U1D554',\n    decimal: 120148,\n    character: '핔',\n    latex: '$\\\\mathbb{c}$',\n  },\n  120149: {\n    id: 'U1D555',\n    decimal: 120149,\n    character: '핕',\n    latex: '$\\\\mathbb{d}$',\n  },\n  120150: {\n    id: 'U1D556',\n    decimal: 120150,\n    character: '핖',\n    latex: '$\\\\mathbb{e}$',\n  },\n  120151: {\n    id: 'U1D557',\n    decimal: 120151,\n    character: '핗',\n    latex: '$\\\\mathbb{f}$',\n  },\n  120152: {\n    id: 'U1D558',\n    decimal: 120152,\n    character: '하',\n    latex: '$\\\\mathbb{g}$',\n  },\n  120153: {\n    id: 'U1D559',\n    decimal: 120153,\n    character: '학',\n    latex: '$\\\\mathbb{h}$',\n  },\n  120154: {\n    id: 'U1D55A',\n    decimal: 120154,\n    character: '핚',\n    latex: '$\\\\mathbb{i}$',\n  },\n  120155: {\n    id: 'U1D55B',\n    decimal: 120155,\n    character: '핛',\n    latex: '$\\\\mathbb{j}$',\n  },\n  120156: {\n    id: 'U1D55C',\n    decimal: 120156,\n    character: '한',\n    latex: '$\\\\mathbb{k}$',\n  },\n  120157: {\n    id: 'U1D55D',\n    decimal: 120157,\n    character: '핝',\n    latex: '$\\\\mathbb{l}$',\n  },\n  120158: {\n    id: 'U1D55E',\n    decimal: 120158,\n    character: '핞',\n    latex: '$\\\\mathbb{m}$',\n  },\n  120159: {\n    id: 'U1D55F',\n    decimal: 120159,\n    character: '핟',\n    latex: '$\\\\mathbb{n}$',\n  },\n  120160: {\n    id: 'U1D560',\n    decimal: 120160,\n    character: '할',\n    latex: '$\\\\mathbb{o}$',\n  },\n  120161: {\n    id: 'U1D561',\n    decimal: 120161,\n    character: '핡',\n    latex: '$\\\\mathbb{p}$',\n  },\n  120162: {\n    id: 'U1D562',\n    decimal: 120162,\n    character: '핢',\n    latex: '$\\\\mathbb{q}$',\n  },\n  120163: {\n    id: 'U1D563',\n    decimal: 120163,\n    character: '핣',\n    latex: '$\\\\mathbb{r}$',\n  },\n  120164: {\n    id: 'U1D564',\n    decimal: 120164,\n    character: '핤',\n    latex: '$\\\\mathbb{s}$',\n  },\n  120165: {\n    id: 'U1D565',\n    decimal: 120165,\n    character: '핥',\n    latex: '$\\\\mathbb{t}$',\n  },\n  120166: {\n    id: 'U1D566',\n    decimal: 120166,\n    character: '핦',\n    latex: '$\\\\mathbb{u}$',\n  },\n  120167: {\n    id: 'U1D567',\n    decimal: 120167,\n    character: '핧',\n    latex: '$\\\\mathbb{v}$',\n  },\n  120168: {\n    id: 'U1D568',\n    decimal: 120168,\n    character: '함',\n    latex: '$\\\\mathbb{w}$',\n  },\n  120169: {\n    id: 'U1D569',\n    decimal: 120169,\n    character: '합',\n    latex: '$\\\\mathbb{x}$',\n  },\n  120170: {\n    id: 'U1D56A',\n    decimal: 120170,\n    character: '핪',\n    latex: '$\\\\mathbb{y}$',\n  },\n  120171: {\n    id: 'U1D56B',\n    decimal: 120171,\n    character: '핫',\n    latex: '$\\\\mathbb{z}$',\n  },\n  120224: {\n    id: 'U1D5A0',\n    decimal: 120224,\n    character: '햠',\n    latex: '$\\\\mathsf{A}$',\n  },\n  120225: {\n    id: 'U1D5A1',\n    decimal: 120225,\n    character: '햡',\n    latex: '$\\\\mathsf{B}$',\n  },\n  120226: {\n    id: 'U1D5A2',\n    decimal: 120226,\n    character: '햢',\n    latex: '$\\\\mathsf{C}$',\n  },\n  120227: {\n    id: 'U1D5A3',\n    decimal: 120227,\n    character: '햣',\n    latex: '$\\\\mathsf{D}$',\n  },\n  120228: {\n    id: 'U1D5A4',\n    decimal: 120228,\n    character: '햤',\n    latex: '$\\\\mathsf{E}$',\n  },\n  120229: {\n    id: 'U1D5A5',\n    decimal: 120229,\n    character: '향',\n    latex: '$\\\\mathsf{F}$',\n  },\n  120230: {\n    id: 'U1D5A6',\n    decimal: 120230,\n    character: '햦',\n    latex: '$\\\\mathsf{G}$',\n  },\n  120231: {\n    id: 'U1D5A7',\n    decimal: 120231,\n    character: '햧',\n    latex: '$\\\\mathsf{H}$',\n  },\n  120232: {\n    id: 'U1D5A8',\n    decimal: 120232,\n    character: '햨',\n    latex: '$\\\\mathsf{I}$',\n  },\n  120233: {\n    id: 'U1D5A9',\n    decimal: 120233,\n    character: '햩',\n    latex: '$\\\\mathsf{J}$',\n  },\n  120234: {\n    id: 'U1D5AA',\n    decimal: 120234,\n    character: '햪',\n    latex: '$\\\\mathsf{K}$',\n  },\n  120235: {\n    id: 'U1D5AB',\n    decimal: 120235,\n    character: '햫',\n    latex: '$\\\\mathsf{L}$',\n  },\n  120236: {\n    id: 'U1D5AC',\n    decimal: 120236,\n    character: '햬',\n    latex: '$\\\\mathsf{M}$',\n  },\n  120237: {\n    id: 'U1D5AD',\n    decimal: 120237,\n    character: '햭',\n    latex: '$\\\\mathsf{N}$',\n  },\n  120238: {\n    id: 'U1D5AE',\n    decimal: 120238,\n    character: '햮',\n    latex: '$\\\\mathsf{O}$',\n  },\n  120239: {\n    id: 'U1D5AF',\n    decimal: 120239,\n    character: '햯',\n    latex: '$\\\\mathsf{P}$',\n  },\n  120240: {\n    id: 'U1D5B0',\n    decimal: 120240,\n    character: '햰',\n    latex: '$\\\\mathsf{Q}$',\n  },\n  120241: {\n    id: 'U1D5B1',\n    decimal: 120241,\n    character: '햱',\n    latex: '$\\\\mathsf{R}$',\n  },\n  120242: {\n    id: 'U1D5B2',\n    decimal: 120242,\n    character: '햲',\n    latex: '$\\\\mathsf{S}$',\n  },\n  120243: {\n    id: 'U1D5B3',\n    decimal: 120243,\n    character: '햳',\n    latex: '$\\\\mathsf{T}$',\n  },\n  120244: {\n    id: 'U1D5B4',\n    decimal: 120244,\n    character: '햴',\n    latex: '$\\\\mathsf{U}$',\n  },\n  120245: {\n    id: 'U1D5B5',\n    decimal: 120245,\n    character: '햵',\n    latex: '$\\\\mathsf{V}$',\n  },\n  120246: {\n    id: 'U1D5B6',\n    decimal: 120246,\n    character: '햶',\n    latex: '$\\\\mathsf{W}$',\n  },\n  120247: {\n    id: 'U1D5B7',\n    decimal: 120247,\n    character: '햷',\n    latex: '$\\\\mathsf{X}$',\n  },\n  120248: {\n    id: 'U1D5B8',\n    decimal: 120248,\n    character: '햸',\n    latex: '$\\\\mathsf{Y}$',\n  },\n  120249: {\n    id: 'U1D5B9',\n    decimal: 120249,\n    character: '햹',\n    latex: '$\\\\mathsf{Z}$',\n  },\n  120250: {\n    id: 'U1D5BA',\n    decimal: 120250,\n    character: '햺',\n    latex: '$\\\\mathsf{a}$',\n  },\n  120251: {\n    id: 'U1D5BB',\n    decimal: 120251,\n    character: '햻',\n    latex: '$\\\\mathsf{b}$',\n  },\n  120252: {\n    id: 'U1D5BC',\n    decimal: 120252,\n    character: '햼',\n    latex: '$\\\\mathsf{c}$',\n  },\n  120253: {\n    id: 'U1D5BD',\n    decimal: 120253,\n    character: '햽',\n    latex: '$\\\\mathsf{d}$',\n  },\n  120254: {\n    id: 'U1D5BE',\n    decimal: 120254,\n    character: '햾',\n    latex: '$\\\\mathsf{e}$',\n  },\n  120255: {\n    id: 'U1D5BF',\n    decimal: 120255,\n    character: '햿',\n    latex: '$\\\\mathsf{f}$',\n  },\n  120256: {\n    id: 'U1D5C0',\n    decimal: 120256,\n    character: '헀',\n    latex: '$\\\\mathsf{g}$',\n  },\n  120257: {\n    id: 'U1D5C1',\n    decimal: 120257,\n    character: '헁',\n    latex: '$\\\\mathsf{h}$',\n  },\n  120258: {\n    id: 'U1D5C2',\n    decimal: 120258,\n    character: '헂',\n    latex: '$\\\\mathsf{i}$',\n  },\n  120259: {\n    id: 'U1D5C3',\n    decimal: 120259,\n    character: '헃',\n    latex: '$\\\\mathsf{j}$',\n  },\n  120260: {\n    id: 'U1D5C4',\n    decimal: 120260,\n    character: '헄',\n    latex: '$\\\\mathsf{k}$',\n  },\n  120261: {\n    id: 'U1D5C5',\n    decimal: 120261,\n    character: '헅',\n    latex: '$\\\\mathsf{l}$',\n  },\n  120262: {\n    id: 'U1D5C6',\n    decimal: 120262,\n    character: '헆',\n    latex: '$\\\\mathsf{m}$',\n  },\n  120263: {\n    id: 'U1D5C7',\n    decimal: 120263,\n    character: '헇',\n    latex: '$\\\\mathsf{n}$',\n  },\n  120264: {\n    id: 'U1D5C8',\n    decimal: 120264,\n    character: '허',\n    latex: '$\\\\mathsf{o}$',\n  },\n  120265: {\n    id: 'U1D5C9',\n    decimal: 120265,\n    character: '헉',\n    latex: '$\\\\mathsf{p}$',\n  },\n  120266: {\n    id: 'U1D5CA',\n    decimal: 120266,\n    character: '헊',\n    latex: '$\\\\mathsf{q}$',\n  },\n  120267: {\n    id: 'U1D5CB',\n    decimal: 120267,\n    character: '헋',\n    latex: '$\\\\mathsf{r}$',\n  },\n  120268: {\n    id: 'U1D5CC',\n    decimal: 120268,\n    character: '헌',\n    latex: '$\\\\mathsf{s}$',\n  },\n  120269: {\n    id: 'U1D5CD',\n    decimal: 120269,\n    character: '헍',\n    latex: '$\\\\mathsf{t}$',\n  },\n  120270: {\n    id: 'U1D5CE',\n    decimal: 120270,\n    character: '헎',\n    latex: '$\\\\mathsf{u}$',\n  },\n  120271: {\n    id: 'U1D5CF',\n    decimal: 120271,\n    character: '헏',\n    latex: '$\\\\mathsf{v}$',\n  },\n  120272: {\n    id: 'U1D5D0',\n    decimal: 120272,\n    character: '헐',\n    latex: '$\\\\mathsf{w}$',\n  },\n  120273: {\n    id: 'U1D5D1',\n    decimal: 120273,\n    character: '헑',\n    latex: '$\\\\mathsf{x}$',\n  },\n  120274: {\n    id: 'U1D5D2',\n    decimal: 120274,\n    character: '헒',\n    latex: '$\\\\mathsf{y}$',\n  },\n  120275: {\n    id: 'U1D5D3',\n    decimal: 120275,\n    character: '헓',\n    latex: '$\\\\mathsf{z}$',\n  },\n  120432: {\n    id: 'U1D670',\n    decimal: 120432,\n    character: '홰',\n    latex: '$\\\\mathtt{A}$',\n  },\n  120433: {\n    id: 'U1D671',\n    decimal: 120433,\n    character: '홱',\n    latex: '$\\\\mathtt{B}$',\n  },\n  120434: {\n    id: 'U1D672',\n    decimal: 120434,\n    character: '홲',\n    latex: '$\\\\mathtt{C}$',\n  },\n  120435: {\n    id: 'U1D673',\n    decimal: 120435,\n    character: '홳',\n    latex: '$\\\\mathtt{D}$',\n  },\n  120436: {\n    id: 'U1D674',\n    decimal: 120436,\n    character: '홴',\n    latex: '$\\\\mathtt{E}$',\n  },\n  120437: {\n    id: 'U1D675',\n    decimal: 120437,\n    character: '홵',\n    latex: '$\\\\mathtt{F}$',\n  },\n  120438: {\n    id: 'U1D676',\n    decimal: 120438,\n    character: '홶',\n    latex: '$\\\\mathtt{G}$',\n  },\n  120439: {\n    id: 'U1D677',\n    decimal: 120439,\n    character: '홷',\n    latex: '$\\\\mathtt{H}$',\n  },\n  120440: {\n    id: 'U1D678',\n    decimal: 120440,\n    character: '홸',\n    latex: '$\\\\mathtt{I}$',\n  },\n  120441: {\n    id: 'U1D679',\n    decimal: 120441,\n    character: '홹',\n    latex: '$\\\\mathtt{J}$',\n  },\n  120442: {\n    id: 'U1D67A',\n    decimal: 120442,\n    character: '홺',\n    latex: '$\\\\mathtt{K}$',\n  },\n  120443: {\n    id: 'U1D67B',\n    decimal: 120443,\n    character: '홻',\n    latex: '$\\\\mathtt{L}$',\n  },\n  120444: {\n    id: 'U1D67C',\n    decimal: 120444,\n    character: '홼',\n    latex: '$\\\\mathtt{M}$',\n  },\n  120445: {\n    id: 'U1D67D',\n    decimal: 120445,\n    character: '홽',\n    latex: '$\\\\mathtt{N}$',\n  },\n  120446: {\n    id: 'U1D67E',\n    decimal: 120446,\n    character: '홾',\n    latex: '$\\\\mathtt{O}$',\n  },\n  120447: {\n    id: 'U1D67F',\n    decimal: 120447,\n    character: '홿',\n    latex: '$\\\\mathtt{P}$',\n  },\n  120448: {\n    id: 'U1D680',\n    decimal: 120448,\n    character: '횀',\n    latex: '$\\\\mathtt{Q}$',\n  },\n  120449: {\n    id: 'U1D681',\n    decimal: 120449,\n    character: '횁',\n    latex: '$\\\\mathtt{R}$',\n  },\n  120450: {\n    id: 'U1D682',\n    decimal: 120450,\n    character: '횂',\n    latex: '$\\\\mathtt{S}$',\n  },\n  120451: {\n    id: 'U1D683',\n    decimal: 120451,\n    character: '횃',\n    latex: '$\\\\mathtt{T}$',\n  },\n  120452: {\n    id: 'U1D684',\n    decimal: 120452,\n    character: '횄',\n    latex: '$\\\\mathtt{U}$',\n  },\n  120453: {\n    id: 'U1D685',\n    decimal: 120453,\n    character: '횅',\n    latex: '$\\\\mathtt{V}$',\n  },\n  120454: {\n    id: 'U1D686',\n    decimal: 120454,\n    character: '횆',\n    latex: '$\\\\mathtt{W}$',\n  },\n  120455: {\n    id: 'U1D687',\n    decimal: 120455,\n    character: '횇',\n    latex: '$\\\\mathtt{X}$',\n  },\n  120456: {\n    id: 'U1D688',\n    decimal: 120456,\n    character: '횈',\n    latex: '$\\\\mathtt{Y}$',\n  },\n  120457: {\n    id: 'U1D689',\n    decimal: 120457,\n    character: '횉',\n    latex: '$\\\\mathtt{Z}$',\n  },\n  120458: {\n    id: 'U1D68A',\n    decimal: 120458,\n    character: '횊',\n    latex: '$\\\\mathtt{a}$',\n  },\n  120459: {\n    id: 'U1D68B',\n    decimal: 120459,\n    character: '횋',\n    latex: '$\\\\mathtt{b}$',\n  },\n  120460: {\n    id: 'U1D68C',\n    decimal: 120460,\n    character: '회',\n    latex: '$\\\\mathtt{c}$',\n  },\n  120461: {\n    id: 'U1D68D',\n    decimal: 120461,\n    character: '획',\n    latex: '$\\\\mathtt{d}$',\n  },\n  120462: {\n    id: 'U1D68E',\n    decimal: 120462,\n    character: '횎',\n    latex: '$\\\\mathtt{e}$',\n  },\n  120463: {\n    id: 'U1D68F',\n    decimal: 120463,\n    character: '횏',\n    latex: '$\\\\mathtt{f}$',\n  },\n  120464: {\n    id: 'U1D690',\n    decimal: 120464,\n    character: '횐',\n    latex: '$\\\\mathtt{g}$',\n  },\n  120465: {\n    id: 'U1D691',\n    decimal: 120465,\n    character: '횑',\n    latex: '$\\\\mathtt{h}$',\n  },\n  120466: {\n    id: 'U1D692',\n    decimal: 120466,\n    character: '횒',\n    latex: '$\\\\mathtt{i}$',\n  },\n  120467: {\n    id: 'U1D693',\n    decimal: 120467,\n    character: '횓',\n    latex: '$\\\\mathtt{j}$',\n  },\n  120468: {\n    id: 'U1D694',\n    decimal: 120468,\n    character: '횔',\n    latex: '$\\\\mathtt{k}$',\n  },\n  120469: {\n    id: 'U1D695',\n    decimal: 120469,\n    character: '횕',\n    latex: '$\\\\mathtt{l}$',\n  },\n  120470: {\n    id: 'U1D696',\n    decimal: 120470,\n    character: '횖',\n    latex: '$\\\\mathtt{m}$',\n  },\n  120471: {\n    id: 'U1D697',\n    decimal: 120471,\n    character: '횗',\n    latex: '$\\\\mathtt{n}$',\n  },\n  120472: {\n    id: 'U1D698',\n    decimal: 120472,\n    character: '횘',\n    latex: '$\\\\mathtt{o}$',\n  },\n  120473: {\n    id: 'U1D699',\n    decimal: 120473,\n    character: '횙',\n    latex: '$\\\\mathtt{p}$',\n  },\n  120474: {\n    id: 'U1D69A',\n    decimal: 120474,\n    character: '횚',\n    latex: '$\\\\mathtt{q}$',\n  },\n  120475: {\n    id: 'U1D69B',\n    decimal: 120475,\n    character: '횛',\n    latex: '$\\\\mathtt{r}$',\n  },\n  120476: {\n    id: 'U1D69C',\n    decimal: 120476,\n    character: '횜',\n    latex: '$\\\\mathtt{s}$',\n  },\n  120477: {\n    id: 'U1D69D',\n    decimal: 120477,\n    character: '횝',\n    latex: '$\\\\mathtt{t}$',\n  },\n  120478: {\n    id: 'U1D69E',\n    decimal: 120478,\n    character: '횞',\n    latex: '$\\\\mathtt{u}$',\n  },\n  120479: {\n    id: 'U1D69F',\n    decimal: 120479,\n    character: '횟',\n    latex: '$\\\\mathtt{v}$',\n  },\n  120480: {\n    id: 'U1D6A0',\n    decimal: 120480,\n    character: '횠',\n    latex: '$\\\\mathtt{w}$',\n  },\n  120481: {\n    id: 'U1D6A1',\n    decimal: 120481,\n    character: '횡',\n    latex: '$\\\\mathtt{x}$',\n  },\n  120482: {\n    id: 'U1D6A2',\n    decimal: 120482,\n    character: '횢',\n    latex: '$\\\\mathtt{y}$',\n  },\n  120483: {\n    id: 'U1D6A3',\n    decimal: 120483,\n    character: '횣',\n    latex: '$\\\\mathtt{z}$',\n  },\n  120490: {\n    id: 'U1D6AA',\n    decimal: 120490,\n    character: '횪',\n    latex: '$\\\\mathbf{\\\\Gamma}$',\n  },\n  120491: {\n    id: 'U1D6AB',\n    decimal: 120491,\n    character: '횫',\n    latex: '$\\\\mathbf{\\\\Delta}$',\n  },\n  120495: {\n    id: 'U1D6AF',\n    decimal: 120495,\n    character: '횯',\n    latex: '$\\\\mathbf{\\\\Theta}$',\n  },\n  120498: {\n    id: 'U1D6B2',\n    decimal: 120498,\n    character: '횲',\n    latex: '$\\\\mathbf{\\\\Lambda}$',\n  },\n  120499: {\n    id: 'U1D6B3',\n    decimal: 120499,\n    character: '횳',\n    latex: '$\\\\mathbf{M}$',\n  },\n  120500: {\n    id: 'U1D6B4',\n    decimal: 120500,\n    character: '횴',\n    latex: 'N',\n  },\n  120501: {\n    id: 'U1D6B5',\n    decimal: 120501,\n    character: '횵',\n    latex: '$\\\\mathbf{\\\\Xi}$',\n  },\n  120502: {\n    id: 'U1D6B6',\n    decimal: 120502,\n    character: '횶',\n    latex: 'O',\n  },\n  120503: {\n    id: 'U1D6B7',\n    decimal: 120503,\n    character: '횷',\n    latex: '$\\\\mathbf{\\\\Pi}$',\n  },\n  120505: {\n    id: 'U1D6B9',\n    decimal: 120505,\n    character: '횹',\n    latex: '$\\\\mathbf{\\\\vartheta}$',\n  },\n  120506: {\n    id: 'U1D6BA',\n    decimal: 120506,\n    character: '횺',\n    latex: '$\\\\mathbf{\\\\Sigma}$',\n  },\n  120508: {\n    id: 'U1D6BC',\n    decimal: 120508,\n    character: '횼',\n    latex: '$\\\\mathbf{\\\\Upsilon}$',\n  },\n  120509: {\n    id: 'U1D6BD',\n    decimal: 120509,\n    character: '횽',\n    latex: '$\\\\mathbf{\\\\Phi}$',\n  },\n  120511: {\n    id: 'U1D6BF',\n    decimal: 120511,\n    character: '횿',\n    latex: '$\\\\mathbf{\\\\Psi}$',\n  },\n  120512: {\n    id: 'U1D6C0',\n    decimal: 120512,\n    character: '훀',\n    latex: '$\\\\mathbf{\\\\Omega}$',\n  },\n  120513: {\n    id: 'U1D6C1',\n    decimal: 120513,\n    character: '훁',\n    latex: '$\\\\mathbf{\\\\nabla}$',\n  },\n  120514: {\n    id: 'U1D6C2',\n    decimal: 120514,\n    character: '훂',\n    latex: '$\\\\mathbf{\\\\alpha}$',\n  },\n  120515: {\n    id: 'U1D6C3',\n    decimal: 120515,\n    character: '훃',\n    latex: '$\\\\mathbf{\\\\beta}$',\n  },\n  120516: {\n    id: 'U1D6C4',\n    decimal: 120516,\n    character: '후',\n    latex: '$\\\\mathbf{\\\\gamma}$',\n  },\n  120517: {\n    id: 'U1D6C5',\n    decimal: 120517,\n    character: '훅',\n    latex: '$\\\\mathbf{\\\\delta}$',\n  },\n  120518: {\n    id: 'U1D6C6',\n    decimal: 120518,\n    character: '훆',\n    latex: '$\\\\mathbf{\\\\epsilon}$',\n  },\n  120519: {\n    id: 'U1D6C7',\n    decimal: 120519,\n    character: '훇',\n    latex: '$\\\\mathbf{\\\\zeta}$',\n  },\n  120520: {\n    id: 'U1D6C8',\n    decimal: 120520,\n    character: '훈',\n    latex: '$\\\\mathbf{\\\\eta}$',\n  },\n  120521: {\n    id: 'U1D6C9',\n    decimal: 120521,\n    character: '훉',\n    latex: '$\\\\mathbf{\\\\theta}$',\n  },\n  120522: {\n    id: 'U1D6CA',\n    decimal: 120522,\n    character: '훊',\n    latex: '$\\\\mathbf{\\\\iota}$',\n  },\n  120523: {\n    id: 'U1D6CB',\n    decimal: 120523,\n    character: '훋',\n    latex: '$\\\\mathbf{\\\\kappa}$',\n  },\n  120524: {\n    id: 'U1D6CC',\n    decimal: 120524,\n    character: '훌',\n    latex: '$\\\\mathbf{\\\\lambda}$',\n  },\n  120525: {\n    id: 'U1D6CD',\n    decimal: 120525,\n    character: '훍',\n    latex: '$\\\\mathbf{\\\\mu}$',\n  },\n  120526: {\n    id: 'U1D6CE',\n    decimal: 120526,\n    character: '훎',\n    latex: '$\\\\mathbf{\\\\nu}$',\n  },\n  120527: {\n    id: 'U1D6CF',\n    decimal: 120527,\n    character: '훏',\n    latex: '$\\\\mathbf{\\\\xi}$',\n  },\n  120528: {\n    id: 'U1D6D0',\n    decimal: 120528,\n    character: '훐',\n    latex: '$\\\\mathbf{o}$',\n  },\n  120529: {\n    id: 'U1D6D1',\n    decimal: 120529,\n    character: '훑',\n    latex: '$\\\\mathbf{\\\\pi}$',\n  },\n  120530: {\n    id: 'U1D6D2',\n    decimal: 120530,\n    character: '훒',\n    latex: '$\\\\mathbf{\\\\rho}$',\n  },\n  120531: {\n    id: 'U1D6D3',\n    decimal: 120531,\n    character: '훓',\n    latex: '$\\\\mathbf{\\\\varsigma}$',\n  },\n  120532: {\n    id: 'U1D6D4',\n    decimal: 120532,\n    character: '훔',\n    latex: '$\\\\mathbf{\\\\sigma}$',\n  },\n  120533: {\n    id: 'U1D6D5',\n    decimal: 120533,\n    character: '훕',\n    latex: '$\\\\mathbf{\\\\tau}$',\n  },\n  120534: {\n    id: 'U1D6D6',\n    decimal: 120534,\n    character: '훖',\n    latex: '$\\\\mathbf{\\\\upsilon}$',\n  },\n  120535: {\n    id: 'U1D6D7',\n    decimal: 120535,\n    character: '훗',\n    latex: '$\\\\mathbf{\\\\phi}$',\n  },\n  120536: {\n    id: 'U1D6D8',\n    decimal: 120536,\n    character: '훘',\n    latex: '$\\\\mathbf{\\\\chi}$',\n  },\n  120537: {\n    id: 'U1D6D9',\n    decimal: 120537,\n    character: '훙',\n    latex: '$\\\\mathbf{\\\\psi}$',\n  },\n  120538: {\n    id: 'U1D6DA',\n    decimal: 120538,\n    character: '훚',\n    latex: '$\\\\mathbf{\\\\omega}$',\n  },\n  120540: {\n    id: 'U1D6DC',\n    decimal: 120540,\n    character: '훜',\n    latex: '$\\\\mathbf{\\\\varepsilon}$',\n  },\n  120541: {\n    id: 'U1D6DD',\n    decimal: 120541,\n    character: '훝',\n    latex: '$\\\\mathbf{\\\\vartheta}$',\n  },\n  120542: {\n    id: 'U1D6DE',\n    decimal: 120542,\n    character: '훞',\n    latex: '$\\\\mathbf{\\\\varkappa}$',\n  },\n  120543: {\n    id: 'U1D6DF',\n    decimal: 120543,\n    character: '훟',\n    latex: '$\\\\mathbf{\\\\phi}$',\n  },\n  120544: {\n    id: 'U1D6E0',\n    decimal: 120544,\n    character: '훠',\n    latex: '$\\\\mathbf{\\\\varrho}$',\n  },\n  120545: {\n    id: 'U1D6E1',\n    decimal: 120545,\n    character: '훡',\n    latex: '$\\\\mathbf{\\\\varpi}$',\n  },\n  120558: {\n    id: 'U1D6EE',\n    decimal: 120558,\n    character: '훮',\n    latex: 'N',\n  },\n  120560: {\n    id: 'U1D6F0',\n    decimal: 120560,\n    character: '훰',\n    latex: 'O',\n  },\n  120618: {\n    id: 'U1D72A',\n    decimal: 120618,\n    character: '휪',\n    latex: 'O',\n  },\n  120676: {\n    id: 'U1D764',\n    decimal: 120676,\n    character: '흤',\n    latex: 'O',\n  },\n  120734: {\n    id: 'U1D79E',\n    decimal: 120734,\n    character: '힞',\n    latex: 'O',\n  },\n  120782: {\n    id: 'U1D7CE',\n    decimal: 120782,\n    character: 'ퟎ',\n    latex: '$\\\\mathbf{0}$',\n  },\n  120783: {\n    id: 'U1D7CF',\n    decimal: 120783,\n    character: 'ퟏ',\n    latex: '$\\\\mathbf{1}$',\n  },\n  120784: {\n    id: 'U1D7D0',\n    decimal: 120784,\n    character: 'ퟐ',\n    latex: '$\\\\mathbf{2}$',\n  },\n  120785: {\n    id: 'U1D7D1',\n    decimal: 120785,\n    character: 'ퟑ',\n    latex: '$\\\\mathbf{3}$',\n  },\n  120786: {\n    id: 'U1D7D2',\n    decimal: 120786,\n    character: 'ퟒ',\n    latex: '$\\\\mathbf{4}$',\n  },\n  120787: {\n    id: 'U1D7D3',\n    decimal: 120787,\n    character: 'ퟓ',\n    latex: '$\\\\mathbf{5}$',\n  },\n  120788: {\n    id: 'U1D7D4',\n    decimal: 120788,\n    character: 'ퟔ',\n    latex: '$\\\\mathbf{6}$',\n  },\n  120789: {\n    id: 'U1D7D5',\n    decimal: 120789,\n    character: 'ퟕ',\n    latex: '$\\\\mathbf{7}$',\n  },\n  120790: {\n    id: 'U1D7D6',\n    decimal: 120790,\n    character: 'ퟖ',\n    latex: '$\\\\mathbf{8}$',\n  },\n  120791: {\n    id: 'U1D7D7',\n    decimal: 120791,\n    character: 'ퟗ',\n    latex: '$\\\\mathbf{9}$',\n  },\n  120792: {\n    id: 'U1D7D8',\n    decimal: 120792,\n    character: 'ퟘ',\n    latex: '$\\\\mathbb{0}$',\n  },\n  120793: {\n    id: 'U1D7D9',\n    decimal: 120793,\n    character: 'ퟙ',\n    latex: '$\\\\mathbb{1}$',\n  },\n  120794: {\n    id: 'U1D7DA',\n    decimal: 120794,\n    character: 'ퟚ',\n    latex: '$\\\\mathbb{2}$',\n  },\n  120795: {\n    id: 'U1D7DB',\n    decimal: 120795,\n    character: 'ퟛ',\n    latex: '$\\\\mathbb{3}$',\n  },\n  120796: {\n    id: 'U1D7DC',\n    decimal: 120796,\n    character: 'ퟜ',\n    latex: '$\\\\mathbb{4}$',\n  },\n  120797: {\n    id: 'U1D7DD',\n    decimal: 120797,\n    character: 'ퟝ',\n    latex: '$\\\\mathbb{5}$',\n  },\n  120798: {\n    id: 'U1D7DE',\n    decimal: 120798,\n    character: 'ퟞ',\n    latex: '$\\\\mathbb{6}$',\n  },\n  120799: {\n    id: 'U1D7DF',\n    decimal: 120799,\n    character: 'ퟟ',\n    latex: '$\\\\mathbb{7}$',\n  },\n  120800: {\n    id: 'U1D7E0',\n    decimal: 120800,\n    character: 'ퟠ',\n    latex: '$\\\\mathbb{8}$',\n  },\n  120801: {\n    id: 'U1D7E1',\n    decimal: 120801,\n    character: 'ퟡ',\n    latex: '$\\\\mathbb{9}$',\n  },\n  120802: {\n    id: 'U1D7E2',\n    decimal: 120802,\n    character: 'ퟢ',\n    latex: '$\\\\mathsf{0}$',\n  },\n  120803: {\n    id: 'U1D7E3',\n    decimal: 120803,\n    character: 'ퟣ',\n    latex: '$\\\\mathsf{1}$',\n  },\n  120804: {\n    id: 'U1D7E4',\n    decimal: 120804,\n    character: 'ퟤ',\n    latex: '$\\\\mathsf{2}$',\n  },\n  120805: {\n    id: 'U1D7E5',\n    decimal: 120805,\n    character: 'ퟥ',\n    latex: '$\\\\mathsf{3}$',\n  },\n  120806: {\n    id: 'U1D7E6',\n    decimal: 120806,\n    character: 'ퟦ',\n    latex: '$\\\\mathsf{4}$',\n  },\n  120807: {\n    id: 'U1D7E7',\n    decimal: 120807,\n    character: 'ퟧ',\n    latex: '$\\\\mathsf{5}$',\n  },\n  120808: {\n    id: 'U1D7E8',\n    decimal: 120808,\n    character: 'ퟨ',\n    latex: '$\\\\mathsf{6}$',\n  },\n  120809: {\n    id: 'U1D7E9',\n    decimal: 120809,\n    character: 'ퟩ',\n    latex: '$\\\\mathsf{7}$',\n  },\n  120810: {\n    id: 'U1D7EA',\n    decimal: 120810,\n    character: 'ퟪ',\n    latex: '$\\\\mathsf{8}$',\n  },\n  120811: {\n    id: 'U1D7EB',\n    decimal: 120811,\n    character: 'ퟫ',\n    latex: '$\\\\mathsf{9}$',\n  },\n  120822: {\n    id: 'U1D7F6',\n    decimal: 120822,\n    character: 'ퟶ',\n    latex: '$\\\\mathtt{0}$',\n  },\n  120823: {\n    id: 'U1D7F7',\n    decimal: 120823,\n    character: 'ퟷ',\n    latex: '$\\\\mathtt{1}$',\n  },\n  120824: {\n    id: 'U1D7F8',\n    decimal: 120824,\n    character: 'ퟸ',\n    latex: '$\\\\mathtt{2}$',\n  },\n  120825: {\n    id: 'U1D7F9',\n    decimal: 120825,\n    character: 'ퟹ',\n    latex: '$\\\\mathtt{3}$',\n  },\n  120826: {\n    id: 'U1D7FA',\n    decimal: 120826,\n    character: 'ퟺ',\n    latex: '$\\\\mathtt{4}$',\n  },\n  120827: {\n    id: 'U1D7FB',\n    decimal: 120827,\n    character: 'ퟻ',\n    latex: '$\\\\mathtt{5}$',\n  },\n  120828: {\n    id: 'U1D7FC',\n    decimal: 120828,\n    character: '퟼',\n    latex: '$\\\\mathtt{6}$',\n  },\n  120829: {\n    id: 'U1D7FD',\n    decimal: 120829,\n    character: '퟽',\n    latex: '$\\\\mathtt{7}$',\n  },\n  120830: {\n    id: 'U1D7FE',\n    decimal: 120830,\n    character: '퟾',\n    latex: '$\\\\mathtt{8}$',\n  },\n  120831: {\n    id: 'U1D7FF',\n    decimal: 120831,\n    character: '퟿',\n    latex: '$\\\\mathtt{9}$',\n  },\n};\n\nexport default characters;\n","/*\n * bibliography-provider_zotero.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ZoteroCollection, ZoteroServer, kZoteroBibTeXTranslator, ZoteroCollectionSpec, ZoteroCSL } from '../zotero';\n\nimport { ParsedYaml, valueFromYamlText } from '../yaml';\nimport { suggestCiteId } from '../cite';\n\nimport {\n  BibliographyDataProvider,\n  BibliographyFile,\n  BibliographySourceWithCollections,\n  BibliographyCollection,\n} from './bibliography';\nimport { EditorUI } from '../ui';\nimport { CSL } from '../csl';\nimport { toBibTeX } from './bibDB';\n\nexport const kZoteroProviderKey = '2509FBBE-5BB0-44C4-B119-6083A81ED673';\n\nexport class BibliographyDataProviderZotero implements BibliographyDataProvider {\n  private allCollections: ZoteroCollection[] = [];\n  private allCollectionSpecs: BibliographyCollection[] = [];\n  private server: ZoteroServer;\n  private warning: string | undefined;\n  private enabled = true;\n\n  private docPath: string | undefined;\n  private zoteroConfig: boolean | string[] | undefined;\n\n  public constructor(server: ZoteroServer) {\n    this.server = server;\n  }\n\n  public name: string = 'Zotero';\n  public key: string = kZoteroProviderKey;\n  public requiresWritable: boolean = true;\n\n  public async load(\n    docPath: string,\n    _resourcePath: string,\n    yamlBlocks: ParsedYaml[],\n    refreshCollectionData: boolean,\n  ): Promise<boolean> {\n    let hasUpdates = false;\n    this.docPath = docPath;\n    this.zoteroConfig = zoteroConfig(yamlBlocks);\n    if (this.zoteroConfig) {\n      // Enabled\n      this.enabled = true;\n      try {\n        // Don't send the items back through to the server\n        const collectionSpecs = this.allCollections.map(({ items, ...rest }) => rest);\n\n        // If there is a warning, stop using the cache and force a fresh trip\n        // through the whole pipeline to be sure we're trying to clear that warning\n        const useCache = this.warning === undefined || this.warning.length === 0;\n\n        // The collection specified in the document header\n        const collections = Array.isArray(this.zoteroConfig) ? this.zoteroConfig : [];\n\n        const result = await this.server.getCollections(docPath, collections, collectionSpecs || [], useCache);\n        this.warning = result.warning;\n        if (result.status === 'ok') {\n          if (result.message) {\n            const newCollections = (result.message as ZoteroCollection[]).map(collection => {\n              const existingCollection = this.allCollections.find(col => col.name === collection.name);\n              if (useCache && existingCollection && existingCollection.version === collection.version) {\n                collection.items = existingCollection.items;\n              } else {\n                hasUpdates = true;\n              }\n              return collection;\n            });\n            hasUpdates = hasUpdates || newCollections.length !== this.collections.length;\n            this.allCollections = newCollections;\n          }\n        } else {\n          // console.log(result.status);\n        }\n      } catch (err) {\n        // console.log(err);\n      }\n\n      if (refreshCollectionData) {\n        // Lookup the collection specs\n        const specResult = await this.server.getActiveCollectionSpecs(\n          this.docPath || null,\n          Array.isArray(this.zoteroConfig) ? this.zoteroConfig : [],\n        );\n        if (specResult && specResult.status === 'ok') {\n          this.allCollectionSpecs = specResult.message.map((spec: ZoteroCollectionSpec) =>\n            this.toBibliographyCollection(spec),\n          );\n        } else {\n          this.allCollectionSpecs = [];\n        }\n      }\n    } else {\n      // Zotero is disabled, clear any already loaded bibliography\n      if (this.collections.length > 0) {\n        hasUpdates = true;\n      }\n      // Disabled\n      this.enabled = false;\n      this.allCollections = [];\n      this.allCollectionSpecs = [];\n    }\n    return hasUpdates;\n  }\n\n  // Respect enabled;\n  public isEnabled(): boolean {\n    return this.enabled && (this.allCollections.length > 0 || this.allCollectionSpecs.length > 0);\n  }\n\n  public collections(): BibliographyCollection[] {\n    return this.allCollectionSpecs || [];\n  }\n\n  private toBibliographyCollection(zoteroSpec: ZoteroCollectionSpec) {\n    return {\n      name: zoteroSpec.name,\n      key: zoteroSpec.key,\n      parentKey: zoteroSpec.parentKey,\n      provider: kZoteroProviderKey,\n    };\n  }\n\n  public items(): BibliographySourceWithCollections[] {\n    const entryArrays = this.allCollections?.map(collection => this.bibliographySources(collection)) || [];\n    const zoteroEntries = ([] as BibliographySourceWithCollections[]).concat(...entryArrays);\n    return zoteroEntries;\n  }\n\n  public itemsForCollection(collectionKey?: string): BibliographySourceWithCollections[] {\n    if (!collectionKey) {\n      return this.items();\n    }\n\n    return this.items().filter((item: any) => {\n      if (item.collectionKeys) {\n        return item.collectionKeys.includes(collectionKey);\n      }\n      return false;\n    });\n  }\n\n  public bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n    return [];\n  }\n\n  public async generateBibTeX(ui: EditorUI, id: string, csl: CSL): Promise<string | undefined> {\n    if (csl.key && ui.prefs.zoteroUseBetterBibtex()) {\n      const bibTeX = await this.server.betterBibtexExport(\n        [csl.key],\n        kZoteroBibTeXTranslator,\n        parseInt((csl as ZoteroCSL).libraryID, 10),\n      );\n      if (bibTeX) {\n        return Promise.resolve(bibTeX.message);\n      }\n    }\n    return Promise.resolve(toBibTeX(id, csl));\n  }\n\n  public warningMessage(): string | undefined {\n    return this.warning;\n  }\n\n  private bibliographySources(collection: ZoteroCollection): BibliographySourceWithCollections[] {\n    const items = collection.items?.map(item => {\n      return {\n        ...item,\n        id: item.id || suggestCiteId([], item),\n        providerKey: this.key,\n        collectionKeys: item.collectionKeys,\n      };\n    });\n    return items || [];\n  }\n}\n\n// The Zotero header allows the following:\n// zotero: true | false                           Globally enables or disables the zotero integration\n//                                                If true, uses all collections. If false uses none.\n//\n// By default, zotero integration is enabled. Add this header to disable integration\n//\nfunction zoteroConfig(parsedYamls: ParsedYaml[]): boolean | string[] {\n  // Read the values of any yaml blocks that include bibliography headers\n  // filter out blocks that don't include such headers\n  const zoteroValues = parsedYamls\n    .map(parsedYaml => {\n      return valueFromYamlText('zotero', parsedYaml.yamlCode);\n    })\n    .filter(val => val !== null);\n\n  if (zoteroValues.length > 0) {\n    // Pandoc will use the last biblography node when generating a bibliography.\n    // Take the same approach to the Zotero header and use the last node\n    const zoteroConfigValue = zoteroValues[zoteroValues.length - 1];\n    if (typeof zoteroConfigValue === 'boolean') {\n      return zoteroConfigValue;\n    } else if (typeof zoteroConfigValue === 'string') {\n      return [zoteroConfigValue];\n    } else if (Array.isArray(zoteroConfigValue)) {\n      return zoteroConfigValue.map(String);\n    } else {\n      return true;\n    }\n  }\n  return true;\n}\n","/*\n * zotero.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CSL } from './csl';\n\nexport interface ZoteroResult {\n  status:\n    | 'ok' // ok (results in 'message')\n    | 'notfound' // invalid api key\n    | 'nohost' // no internet connectivity\n    | 'error'; // unexpected error (details in 'error')\n  message: any | null;\n  warning: string;\n  error: string;\n}\n\nexport interface ZoteroCollectionSpec {\n  name: string;\n  version: number;\n  key: string;\n  parentKey: string;\n}\n\nexport interface ZoteroCollection extends ZoteroCollectionSpec {\n  items: ZoteroCSL[];\n}\n\nexport interface ZoteroCSL extends CSL {\n  libraryID: string;\n  collectionKeys: string[];\n}\n\n// https://github.com/retorquere/zotero-better-bibtex/blob/master/translators/Better%20BibTeX.json\nexport const kZoteroBibTeXTranslator = 'ca65189f-8815-4afe-8c8b-8c7c15f0edca';\n\nexport interface ZoteroServer {\n  validateWebAPIKey: (key: string) => Promise<boolean>;\n\n  getCollections: (\n    file: string | null,\n    collections: string[],\n    cached: ZoteroCollectionSpec[],\n    useCache: boolean,\n  ) => Promise<ZoteroResult>;\n\n  getLibraryNames: () => Promise<ZoteroResult>;\n\n  getActiveCollectionSpecs: (file: string | null, collections: string[]) => Promise<ZoteroResult>;\n\n  // Return status: nohost w/ warning text if it fails to\n  // communciate w/ Better BibTeX. Otherwise returns\n  // status: ok with exported text in message.\n  betterBibtexExport: (itemKeys: string[], translatorId: string, libraryId: number) => Promise<ZoteroResult>;\n}\n","/*\n * cite-completion.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\nimport uniqby from 'lodash.uniqby';\n\nimport { BibliographyManager, BibliographySource } from '../../api/bibliography/bibliography';\nimport { CompletionHandler, CompletionResult, CompletionHeaderProps } from '../../api/completion';\nimport { hasDOI } from '../../api/doi';\nimport { searchPlaceholderDecoration } from '../../api/placeholder';\nimport { EditorUI } from '../../api/ui';\nimport { CompletionItemView } from '../../api/widgets/completion';\n\nimport { PandocServer } from '../../api/pandoc';\nimport { EditorEvents } from '../../api/events';\n\nimport { BibliographyEntry, entryForSource } from './cite-bibliography_entry';\nimport { parseCitation, insertCitation as insertSingleCitation, performCiteCompletionReplacement } from './cite';\n\nimport './cite-completion.css';\n\nconst kAuthorMaxChars = 28;\nconst kMaxCitationCompletions = 100;\nconst kHeaderHeight = 20;\n\nexport const kCiteCompletionWidth = 400;\nconst kCiteCompletionItemPadding = 10;\n\nexport const kCitationCompleteScope = 'CitationScope';\n\nexport function citationCompletionHandler(\n  ui: EditorUI,\n  events: EditorEvents,\n  bibManager: BibliographyManager,\n  server: PandocServer,\n): CompletionHandler<BibliographyEntry> {\n  return {\n    id: 'AB9D4F8C-DA00-403A-AB4A-05373906FD8C',\n\n    scope: kCitationCompleteScope,\n\n    completions: citationCompletions(ui, bibManager),\n\n    filter: (entries: BibliographyEntry[], _state: EditorState, token: string) => {\n      return filterCitations(token, bibManager, entries, ui);\n    },\n\n    replace(view: EditorView, pos: number, entry: BibliographyEntry | null) {\n      if (entry && bibManager.findIdInLocalBibliography(entry.source.id)) {\n        // It's already in the bibliography, just write the id\n        const tr = view.state.tr;\n        const schema = view.state.schema;\n        const id = schema.text(entry.source.id, [schema.marks.cite_id.create()]);\n        performCiteCompletionReplacement(tr, pos, id);\n        view.dispatch(tr);\n      } else if (entry) {\n        // It isn't in the bibliography, show the insert cite dialog\n        return insertSingleCitation(\n          view,\n          entry.source.DOI || '',\n          bibManager,\n          pos,\n          ui,\n          server,\n          entry.source,\n          bibManager.providerName(entry.source.providerKey),\n        );\n      }\n      return Promise.resolve();\n    },\n\n    replacement(_schema: Schema, entry: BibliographyEntry | null): string | ProsemirrorNode | null {\n      if (entry) {\n        return entry.source.id;\n      } else {\n        return null;\n      }\n    },\n\n    view: {\n      header: () => {\n        if (bibManager.warning()) {\n          return {\n            component: CompletionWarningHeaderView,\n            height: kHeaderHeight,\n            message: bibManager.warning(),\n          };\n        }\n      },\n      component: BibliographySourceView,\n      key: entry => entry.source.id,\n      width: kCiteCompletionWidth,\n      height: 54,\n      maxVisible: 5,\n      hideNoResults: true,\n    },\n  };\n}\n\nfunction filterCitations(token: string, manager: BibliographyManager, entries: BibliographyEntry[], ui: EditorUI) {\n  // Empty query or DOI\n  if (token.trim().length === 0 || hasDOI(token)) {\n    return entries;\n  }\n\n  // Filter an exact match - if its exact match to an entry in the bibliography already, skip completion\n  // Ignore any punctuation at the end of the token\n  const tokenWithoutEndPunctuation = token.match(/.*[^\\,\\!\\?\\.\\:]/);\n  const completionId = tokenWithoutEndPunctuation ? tokenWithoutEndPunctuation[0] : token;\n  if (manager.localSources().find(source => source.id === completionId)) {\n    return [];\n  }\n\n  // Now do the regular search\n  const search = (str: string) => {\n    const results = uniqby(manager.searchAllSources(str, kMaxCitationCompletions), source => source.id).map(entry =>\n      entryForSource(entry, ui),\n    );\n    return uniqby(results, (entry: BibliographyEntry) => entry.source.id);\n  };\n  const searchResults = search(token);\n  return searchResults || [];\n}\n\nfunction citationCompletions(ui: EditorUI, manager: BibliographyManager) {\n  return (_text: string, context: EditorState | Transaction): CompletionResult<BibliographyEntry> | null => {\n\n    const parsed = parseCitation(context);\n    if (parsed) {\n      return {\n        token: parsed.token,\n        pos: parsed.pos,\n        offset: parsed.offset,\n        completions: async (_state: EditorState) => {\n          // function to retreive entries from the bib manager\n          const managerEntries = () => {\n            // Filter duplicate sources\n            const dedupedSources = uniqby(manager.allSources(), (source: BibliographySource) => source.id);\n\n            // Sort by id by default\n            const sortedSources = dedupedSources.sort((a, b) => a.id.localeCompare(b.id));\n            return sortedSources.map(source => entryForSource(source, ui));\n          };\n\n          // if we already have some completions from a previous load, then\n          // return them and kick off a refresh (new results will stream in)\n          if (manager.hasSources()) {\n            // kick off another load which we'll stream in by setting entries\n            let loadedEntries: BibliographyEntry[] | null = null;\n            manager.load(ui, context.doc).then(() => {\n              loadedEntries = managerEntries();\n            });\n\n            // return stream\n            return {\n              items: managerEntries(),\n              stream: () => loadedEntries,\n            };\n\n            // no previous load, just perform the load and return the entries\n          } else {\n            return manager.load(ui, context.doc).then(() => {\n              return managerEntries();\n            });\n          }\n        },\n        decorations:\n          parsed.token.length === 0\n            ? DecorationSet.create(context.doc, [\n                searchPlaceholderDecoration(context.selection.head, ui, ui.context.translateText('or DOI')),\n              ])\n            : undefined,\n      };\n    }\n    return null;\n  };\n}\n\n// The title may contain spans to control case specifically - consequently, we need\n// to render the title as HTML rather than as a string\nexport const BibliographySourceView: React.FC<BibliographyEntry> = entry => {\n  const authorStr = entry.authorsFormatter(entry.source.author, kAuthorMaxChars - entry.source.id.length);\n  const detail = `${authorStr} ${entry.issuedDateFormatter(entry.source.issued)}`;\n  return (\n    <CompletionItemView\n      width={kCiteCompletionWidth - kCiteCompletionItemPadding}\n      image={entry.image}\n      imageAdornment={entry.imageAdornment}\n      title={`@${entry.source.id}`}\n      subTitle={\n        entry.source.title || entry.source['short-title'] || entry.source['container-title'] || entry.source.type\n      }\n      detail={detail}\n      htmlTitle={true}\n    />\n  );\n};\n\nconst CompletionWarningHeaderView: React.FC<CompletionHeaderProps> = props => {\n  return (\n    <div className={'pm-completion-cite-warning pm-pane-border-color'}>\n      {props.ui.context.translateText(props.message || 'An unexpected warning occurred.')}\n    </div>\n  );\n};\n","/*\n * completion.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './completion.css';\n\nexport interface CompletionItemViewProps extends WidgetProps {\n  width: number;\n  image?: string;\n  imageAdornment?: string;\n  title: string;\n  detail?: string;\n  subTitle: string;\n  htmlTitle?: boolean;\n}\n\nexport const CompletionItemView: React.FC<CompletionItemViewProps> = props => {\n  const className = ['pm-completion-item'].concat(props.classes || []).join(' ');\n  const style: React.CSSProperties = {\n    width: props.width + 'px',\n    ...props.style,\n  };\n\n  return (\n    <div className={className} style={style}>\n      <div className={'pm-completion-item-type'}>\n        {props.imageAdornment ? (\n          <img\n            className={'pm-completion-image-adorn pm-block-border-color pm-background-color'}\n            src={props.imageAdornment}\n          />\n        ) : (\n          undefined\n        )}\n        <img className={'pm-completion-item-icon pm-block-border-color'} src={props.image} />\n      </div>\n      <div className={'pm-completion-item-summary'} style={{ width: props.width - 40 - 36 + 'px' }}>\n        <div className={'pm-completion-item-id'}>\n          <div className={'pm-completion-item-primary pm-completion-item-title pm-fixedwidth-font'}>{props.title}</div>\n          <div className={'pm-completion-item-primary pm-completion-item-detail'}>{props.detail}</div>\n        </div>\n        {props.htmlTitle ? (\n          <div className={'pm-completion-item-subTitle'} dangerouslySetInnerHTML={{ __html: props.subTitle || '' }} />\n        ) : (\n          <div className={'pm-completion-item-subTitle'}>{props.subTitle}</div>\n        )}\n      </div>\n    </div>\n  );\n};\n","/*\n * cite-bibliography_entry.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { BibliographySource } from '../../api/bibliography/bibliography';\nimport { EditorUI } from '../../api/ui';\nimport { CSLDate, CSLName, imageForType } from '../../api/csl';\nimport { formatAuthors, formatIssuedDate } from '../../api/cite';\nimport { kZoteroProviderKey } from '../../api/bibliography/bibliography-provider_zotero';\n\n// An entry which includes the source as well\n// additional metadata for displaying a bibliograph item\nexport interface BibliographyEntry {\n  source: BibliographySource;\n  authorsFormatter: (authors?: CSLName[], maxLength?: number) => string;\n  issuedDateFormatter: (issueDate?: CSLDate) => string;\n  image?: string;\n  imageAdornment?: string;\n}\n\nexport function entryForSource(source: BibliographySource, ui: EditorUI, forceLightMode?: boolean): BibliographyEntry {\n  const authorsFormatter = (authors?: CSLName[], maxLength?: number): string => {\n    return formatAuthors(authors, maxLength);\n  };\n\n  // Formatter used for shortening and displaying issue dates.\n  const issuedDateFormatter = (date?: CSLDate): string => {\n    if (date) {\n      return formatIssuedDate(date);\n    }\n    return '';\n  };\n\n  // Map the Bibliography Sources to Entries which include additional\n  // metadat and functions for display\n  return {\n    source,\n    authorsFormatter,\n    issuedDateFormatter,\n    image: imageForType(ui.images, source.type)[ui.prefs.darkMode() && !forceLightMode ? 1 : 0],\n    imageAdornment: source.providerKey === kZoteroProviderKey ? ui.images.citations?.zoteroOverlay : undefined,\n  };\n}\n","/*\n * cite-highlight.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\n\nimport { markHighlightPlugin, markHighlightDecorations } from '../../api/mark-highlight';\n\nconst key = new PluginKey<DecorationSet>('cite-highlight');\n\nexport function citeHighlightPlugin(schema: Schema) {\n  return markHighlightPlugin(key, schema.marks.cite, (text, _attrs, markRange) => {\n    return markHighlightDecorations(markRange, text, /([\\[\\]])/g, 'pm-link-text-color pm-fixedwidth-font');\n  });\n}\n","/*\n * cite-completion_doi.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport {\n  CompletionHandler,\n  CompletionResult,\n  performCompletionReplacement,\n  CompletionContext,\n} from '../../api/completion';\nimport { formatAuthors, formatIssuedDate } from '../../api/cite';\nimport { CSL, imageForType } from '../../api/csl';\nimport { CompletionItemDetailedView } from '../../api/widgets/completion-detailed';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\nimport { EditorServer } from '../../api/server';\nimport { DOIServer } from '../../api/doi';\n\nimport { doiFromEditingContext } from './cite-doi';\nimport { insertCitation } from './cite';\nimport { kCitationCompleteScope } from './cite-completion';\n\nconst kCompletionWidth = 400;\nconst kCompletionItemPadding = 10;\n\nexport function citationDoiCompletionHandler(\n  ui: EditorUI,\n  bibManager: BibliographyManager,\n  server: EditorServer,\n): CompletionHandler<CSLEntry> {\n  return {\n    id: '56DA14DD-6E3A-4481-93A9-938DC00393A5',\n\n    scope: kCitationCompleteScope,\n\n    completions: citationDOICompletions(ui, server.doi, bibManager),\n\n    replace(view: EditorView, pos: number, cslEntry: CSLEntry | null) {\n      if (cslEntry && cslEntry.inBibliography) {\n        // It's already in the bibliography, just write the id\n        const tr = view.state.tr;\n        const schema = view.state.schema;\n        const id = schema.text(cslEntry.id, [schema.marks.cite_id.create()]);\n        performCompletionReplacement(tr, pos, id);\n        view.dispatch(tr);\n      } else if (cslEntry) {\n        // It isn't in the bibliography, show the insert cite dialog\n        return insertCitation(view, cslEntry.csl.DOI || '', bibManager, pos, ui, server.pandoc, cslEntry.csl);\n      }\n      return Promise.resolve();\n    },\n\n    view: {\n      component: CSLSourceView,\n      key: cslEntry => cslEntry.csl.DOI,\n      width: kCompletionWidth,\n      height: 120,\n      maxVisible: 5,\n      hideNoResults: true,\n    },\n  };\n}\n\nconst kPRogressDelay = 350;\n\nfunction citationDOICompletions(ui: EditorUI, server: DOIServer, bibliographyManager: BibliographyManager) {\n  return (_text: string, context: EditorState | Transaction): CompletionResult<CSLEntry> | null => {\n    const parsedDOI = doiFromEditingContext(context);\n    if (parsedDOI) {\n      return {\n        token: parsedDOI.token,\n        pos: parsedDOI.pos,\n        offset: parsedDOI.offset,\n        completions: async (_state: EditorState, completionContext: CompletionContext) => {\n          // If we have a local source that matches this DOI, just show the\n          // completion for the entry\n          await bibliographyManager.load(ui, context.doc);\n          const source = bibliographyManager.findDoiInLocalBibliography(parsedDOI.token);\n          if (source) {\n            return [\n              {\n                id: source.id,\n                csl: source,\n                inBibliography: true,\n                image: imageForType(ui.images, source.type)[ui.prefs.darkMode() ? 1 : 0],\n                formattedAuthor: formatAuthors(source.author, 50),\n                formattedIssueDate: formatIssuedDate(source.issued),\n              },\n            ];\n          } else {\n            return [];\n          }\n        },\n      };\n    }\n    return null;\n  };\n}\n\ninterface CSLEntry {\n  id: string;\n  csl: CSL;\n  inBibliography: boolean;\n  image?: string;\n  formattedAuthor: string;\n  formattedIssueDate: string;\n}\n\nconst CSLSourceView: React.FC<CSLEntry> = cslEntry => {\n  const csl = cslEntry.csl;\n  return (\n    <CompletionItemDetailedView\n      width={kCompletionWidth - kCompletionItemPadding}\n      image={cslEntry.image}\n      heading={csl['short-container-title'] || csl.publisher || ''}\n      title={csl.title || ''}\n      subTitle={`${cslEntry.formattedAuthor} ${cslEntry.formattedIssueDate}` || ''}\n    />\n  );\n};\n","/*\n * completion-detailed.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './completion-detailed.css';\n\nexport interface CompletionItemDetailedViewProps extends WidgetProps {\n  width: number;\n  image?: string;\n  heading: string;\n  title: string;\n  subTitle: string;\n}\n\nexport const CompletionItemDetailedView: React.FC<CompletionItemDetailedViewProps> = props => {\n  const className = ['pm-completion-detailed-item'].concat(props.classes || []).join(' ');\n  const style: React.CSSProperties = {\n    width: props.width + 'px',\n    ...props.style,\n  };\n\n  return (\n    <div className={className} style={style}>\n      <div className={'pm-completion-detailed-item-type'}>\n        <img className={'pm-block-border-color'} src={props.image} />\n      </div>\n      <div className={'pm-completion-item-detailed-summary'}>\n        <div className={'pm-completion-item-detailed-heading'}>{props.heading}</div>\n        <div className={'pm-completion-item-detailed-title'}>{props.title}</div>\n        <div className={'pm-completion-item-detailed-subTitle'}>{props.subTitle}</div>\n      </div>\n    </div>\n  );\n};\n","/*\n * cite-doi.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Slice } from 'prosemirror-model';\n\nimport { findDOI } from '../../api/doi';\n\nimport { parseCitation, ParsedCitation } from './cite';\n\n// Parses the transation or state to determine whether the current position\n// represents a citation containing a DOI\nexport function doiFromEditingContext(context: EditorState | Transaction): ParsedCitation | undefined {\n  \n  const parsedCitation = parseCitation(context);\n  if (parsedCitation) {\n    const doi = findDOI(parsedCitation.token);\n    if (doi) {\n      return parsedCitation;\n    }\n    return undefined;\n  }\n}\n\n// Parses a slice to determine whether the slice contains\n// a single DOI\nexport function doiFromSlice(context: EditorState | Transaction, slice: Slice): ParsedCitation | undefined {\n  const parsedCitation = parseCitation(context);\n  if (parsedCitation) {\n    // Concatenate all the text and search for a DOI\n    let text = '';\n    slice.content.forEach(node => (text = text + node.textContent));\n    if (text.length) {\n      const doi = findDOI(text.trim());\n      if (doi) {\n        return { ...parsedCitation, token: doi };\n      }\n    }\n    return undefined;\n  }\n}\n","/*\n * cite-popup.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { Popup } from '../../api/widgets/popup';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\nimport { PandocServer } from '../../api/pandoc';\n\nimport './cite-popup.css';\nimport { urlForCitation } from '../../api/cite';\nimport { cslFromDoc } from '../../api/csl';\n\nconst kMaxWidth = 400; // also in cite-popup.css\n\nexport function citePopupPlugin(schema: Schema, ui: EditorUI, bibMgr: BibliographyManager, server: PandocServer) {\n  return textPopupDecorationPlugin({\n    key: new PluginKey<DecorationSet>('cite-popup'),\n    markType: schema.marks.cite_id,\n    maxWidth: kMaxWidth,\n    dismissOnEdit: true,\n    makeLinksAccessible: true,\n    createPopup: async (view: EditorView, target: TextPopupTarget, style: React.CSSProperties) => {\n      await bibMgr.load(ui, view.state.doc);\n\n      const csl = cslFromDoc(view.state.doc);\n      const citeId = target.text.replace(/^-@|^@/, '');\n      const source = bibMgr.findIdInLocalBibliography(citeId);\n      if (source) {\n        const previewHtml = await server.citationHTML(\n          ui.context.getDocumentPath(),\n          JSON.stringify([source]),\n          csl || null,\n        );\n        const finalHtml = ensureSafeLinkIsPresent(previewHtml, () => {\n          const url = urlForCitation(source);\n          if (url) {\n            return {\n              text: ui.context.translateText('[Link]'),\n              url,\n            };\n          }\n        });\n\n        return <CitePopup previewHtml={finalHtml} style={style} />;\n      }\n      return null;\n    },\n    specKey: (target: TextPopupTarget) => {\n      return `cite:${target.text}`;\n    },\n  });\n}\n\nconst kCiteHangingIndentClass = 'hanging-indent';\nconst kCiteLinkClassName = 'pm-cite-popup-link';\n\nfunction ensureSafeLinkIsPresent(html: string, getLinkData: () => { text: string; url: string } | undefined) {\n  const parser = new window.DOMParser();\n  const doc = parser.parseFromString(html, 'text/html');\n\n  // remove id, class, and role from main div\n  const rootDiv = doc.body.getElementsByClassName('references');\n  if (rootDiv.length > 0) {\n    const classNames = rootDiv[0].getAttribute('class');\n    const hasHangingIndent = classNames?.match(`(^|\\\\s)${kCiteHangingIndentClass}($|\\\\s)`);\n\n    rootDiv[0].removeAttribute('id');\n    rootDiv[0].removeAttribute('role');\n\n    if (hasHangingIndent && hasHangingIndent.length > 0) {\n      rootDiv[0].setAttribute('class', kCiteHangingIndentClass);\n    } else {\n      rootDiv[0].removeAttribute('class');\n    }\n  }\n\n  const linkElements = doc.body.getElementsByTagName('a');\n  if (linkElements.length === 0) {\n    const linkData = getLinkData();\n\n    // There aren't any links, we should append one\n    // (If links are present, we assume that we shouldn't add another)\n    const paragraphs = doc.body.getElementsByTagName('p');\n    if (paragraphs.length === 1 && linkData) {\n      // The paragraph containing the formatted source\n      const paragraph = paragraphs[0];\n\n      // Create a link to append\n      const linkElement = doc.createElement('a');\n      linkElement.innerText = linkData.text;\n      linkElement.setAttribute('href', linkData.url);\n      linkElement.setAttribute('class', `${kCiteLinkClassName} pm-link-text-color`);\n      setLinkTarget(linkElement);\n\n      // Append the link to the formatted source\n      paragraph.appendChild(linkElement);\n    }\n  } else {\n    // There are links, ensure all of them have appropriate target information\n    // tslint:disable-next-line: prefer-for-of\n    for (let i = 0; i < linkElements.length; i++) {\n      linkElements[i].setAttribute('class', `pm-link-text-color`);\n      setLinkTarget(linkElements[i]);\n    }\n  }\n\n  // Return the HTML omitting CR/LF - CR\n  return doc.body.innerHTML.replace(/\\r?\\n|\\r/g, '');\n}\n\nfunction setLinkTarget(linkElement: HTMLAnchorElement) {\n  linkElement.setAttribute('target', '_blank');\n  linkElement.setAttribute('rel', 'noopener noreferrer');\n}\n\ninterface CitePopupProps extends WidgetProps {\n  previewHtml: string;\n}\n\nconst CitePopup: React.FC<CitePopupProps> = props => {\n  return (\n    <Popup classes={['pm-cite-popup']} style={props.style}>\n      <div className=\"pm-cite-popup-preview\">\n        <div dangerouslySetInnerHTML={{ __html: props.previewHtml || '' }} />\n      </div>\n    </Popup>\n  );\n};\n","/*\n * cite-commands.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { EditorEvents } from '../../api/events';\nimport { EditorServer } from '../../api/server';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\n\nimport { ensureSourcesInBibliography } from './cite';\nimport { showInsertCitationDialog, InsertCitationDialogResult } from '../../behaviors/insert_citation/insert_citation';\nimport { markIsActive, getMarkRange } from '../../api/mark';\n\nexport class InsertCitationCommand extends ProsemirrorCommand {\n  private initialSelectionKey: string | undefined;\n\n  constructor(ui: EditorUI, events: EditorEvents, bibliographyManager: BibliographyManager, server: EditorServer) {\n    super(\n      EditorCommandId.Citation,\n      ['Shift-Mod-F8'],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        // enable/disable command\n        const schema = state.schema;\n        if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.cite)(state)) {\n          return false;\n        }\n\n        if (dispatch && view) {\n          showInsertCitationDialog(\n            ui,\n            state.doc,\n            bibliographyManager,\n            server,\n            async (result: InsertCitationDialogResult) => {\n              if (result) {\n                // Remember the last tree node that was selected\n                this.initialSelectionKey = result.selectionKey;\n\n                // Remember whether the citation is intext for the future\n                ui.prefs.setCitationDefaultInText(result.intextCitationStyle);\n\n                // The citations that we should insert\n                const bibliographySources = result.bibliographySources;\n\n                // The bibliography that we should insert sources into (if needed)\n                const bibliography = result.bibliography;\n\n                // The transaction that will hold all the changes we'll make\n                const tr = state.tr;\n\n                // First, be sure that we add any sources to the bibliography\n                // and that the bibliography is properly configured\n                const writeCiteId = await ensureSourcesInBibliography(\n                  tr,\n                  bibliographySources,\n                  bibliography,\n                  bibliographyManager,\n                  view,\n                  ui,\n                  server.pandoc,\n                );\n\n                if (writeCiteId) {\n                  // The starting location of this transaction\n                  const start = tr.selection.from;\n\n                  // See if we are already inside an active cite mark\n                  const alreadyInCite = markIsActive(tr, schema.marks.cite);\n                  const includeWrapper = !result.intextCitationStyle || result.bibliographySources.length > 1;\n\n                  // Insert the wrapping [] if the user wants that style citation\n                  // Note that if the use is inserting more than one citation, we ignore this and just\n                  // always perform a 'note' style citation insert\n                  // If we're already inside a cite including [], don't bother inserting wrapper\n                  if (!alreadyInCite && includeWrapper) {\n                    const wrapperText = schema.text('[]');\n                    tr.insert(tr.selection.from, wrapperText);\n\n                    // move the selection into the wrapper\n                    setTextSelection(tr.selection.from - 1)(tr);\n                  }\n\n                  // If the previous character is a part of a cite_id, advance to the end of the mark,\n                  // insert a separator, and then proceed\n                  const preCiteIdRange = getMarkRange(tr.doc.resolve(start - 1), schema.marks.cite_id);\n                  if (preCiteIdRange) {\n                    setTextSelection(preCiteIdRange.to)(tr);\n                    const separator = schema.text('; ');\n                    tr.insert(tr.selection.from, separator);\n                  }\n\n                  // insert the CiteId marks and text\n                  bibliographySources.forEach((citation, i) => {\n                    const citeIdMark = schema.marks.cite_id.create();\n                    const citeIdText = schema.text(`@${citation.id}`, [citeIdMark]);\n                    tr.insert(tr.selection.from, citeIdText);\n                    if (bibliographySources.length > 1 && i !== bibliographySources.length - 1) {\n                      tr.insert(tr.selection.from, schema.text('; ', []));\n                    }\n                  });\n\n                  // If the next character is a part of a cite_id, insert a separator (that will appear after the current citeId)\n                  const postCiteIdRange = getMarkRange(tr.doc.resolve(tr.selection.from + 1), schema.marks.cite_id);\n                  if (postCiteIdRange) {\n                    const separator = schema.text('; ');\n                    tr.insert(tr.selection.from, separator);\n                  }\n\n                  // Enclose wrapper in the cite mark (if not already in a cite)\n                  if (!alreadyInCite) {\n                    const endOfWrapper = includeWrapper ? tr.selection.from + 1 : tr.selection.from;\n                    const citeMark = schema.marks.cite.create();\n                    tr.addMark(start, endOfWrapper, citeMark);\n                    setTextSelection(endOfWrapper)(tr);\n                  }\n                }\n\n                // commit the transaction\n                dispatch(tr);\n\n                return Promise.resolve();\n              }\n            },\n            this.initialSelectionKey,\n          );\n        }\n        return true;\n      },\n      {\n        name: ui.context.translateText('Citation...'),\n        description: ui.context.translateText('Reference to a source'),\n        group: OmniInsertGroup.References,\n        priority: 1,\n        image: () => (ui.prefs.darkMode() ? ui.images.omni_insert!.citation_dark! : ui.images.omni_insert!.citation!),\n      },\n      // false\n    );\n  }\n}\n","/*\n * insert_citation_picker.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport {\n  BibliographyFile,\n  BibliographyManager,\n  bibliographyTypes,\n  bibliographyFileForPath,\n  BibliographySource,\n} from '../../api/bibliography/bibliography';\nimport { kInvalidCiteKeyChars } from '../../api/cite';\nimport { changeExtension } from '../../api/path';\nimport { EditorServer } from '../../api/server';\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { TagInput, TagItem } from '../../api/widgets/tag-input';\nimport { NavigationTreeNode, containsChild, NavigationTree } from '../../api/widgets/navigation-tree';\nimport { DialogButtons } from '../../api/widgets/dialog-buttons';\n\nimport {\n  CitationSourcePanelProps,\n  CitationSourcePanelProvider,\n  CitationListEntry,\n  CitationSourceListStatus,\n  BibliographySourceProvider,\n} from './source_panels/insert_citation-source-panel';\nimport { bibliographySourcePanel } from './source_panels/insert_citation-source-panel-bibliography';\nimport { doiSourcePanel } from './source_panels/insert_citation-source-panel-doi';\nimport { crossrefSourcePanel } from './source_panels/insert_citation-source-panel-crossref';\nimport { pubmedSourcePanel } from './source_panels/insert_citation-source-panel-pubmed';\nimport { dataciteSourcePanel } from './source_panels/insert_citation-source-panel-datacite';\nimport { CitationBibliographyPicker } from './insert_citation-bibliography-picker';\n\nimport './insert_citation.css';\nimport debounce from 'lodash.debounce';\nimport { CheckboxInput } from '../../api/widgets/checkbox-input';\n\n// When the dialog has completed, it will return this result\n// If the dialog is canceled no result will be returned\nexport interface InsertCitationDialogResult {\n  bibliographySources: BibliographySource[];\n  bibliography: BibliographyFile;\n  intextCitationStyle: boolean;\n  selectionKey?: string;\n}\n\n// Show the insert citation dialog and returns the\n// items that should be inserted, the bibliography in which to write them\n// and the last selected position in the tree\nexport async function showInsertCitationDialog(\n  ui: EditorUI,\n  doc: ProsemirrorNode,\n  bibliographyManager: BibliographyManager,\n  server: EditorServer,\n  performInsertCitations: (result: InsertCitationDialogResult) => Promise<void>,\n  initiallySelectedNodeKey?: string,\n): Promise<boolean> {\n  // The result that will be returned to the called\n  let result: InsertCitationDialogResult | undefined;\n\n  // Present the dialog\n  const performInsert = await ui.dialogs.htmlDialog(\n    'Insert Citation',\n    'Insert',\n    (\n      containerWidth: number,\n      containerHeight: number,\n      confirm: VoidFunction,\n      cancel: VoidFunction,\n      showProgress: (message: string) => void,\n      hideProgress: VoidFunction,\n    ) => {\n      const kMaxHeight = 650;\n      const kMaxWidth = 900;\n      const kMaxHeightProportion = 0.9;\n      const kdialogPaddingIncludingButtons = 70;\n\n      const windowHeight = containerHeight;\n      const windowWidth = containerWidth;\n\n      const height = Math.min(kMaxHeight, windowHeight * kMaxHeightProportion - kdialogPaddingIncludingButtons);\n      const width = Math.max(Math.min(kMaxWidth, windowWidth * 0.9), 550);\n\n      const container = window.document.createElement('div');\n      container.className = 'pm-default-theme';\n\n      // Provide the providers top the dialog and then refresh the bibliography and reload\n      // the items\n      const providersForBibliography = (writable: boolean) => {\n        return writable\n          ? [\n            bibliographySourcePanel(doc, ui, bibliographyManager),\n            doiSourcePanel(ui, server.doi, bibliographyManager),\n            crossrefSourcePanel(ui, server.crossref, server.doi, bibliographyManager),\n            dataciteSourcePanel(ui, server.datacite, server.doi, bibliographyManager),\n            pubmedSourcePanel(ui, server.pubmed, server.doi, bibliographyManager),\n          ]\n          : [bibliographySourcePanel(doc, ui, bibliographyManager)];\n      };\n\n      // Provide a configuration stream that will update after the bibliography loads\n      let updatedConfiguration: InsertCitationPanelConfiguration | undefined;\n      const configurationStream: InsertCitationPanelConfigurationStream = {\n        current: {\n          providers: providersForBibliography(bibliographyManager.allowsWrites()),\n          bibliographyFiles: bibliographyManager.bibliographyFiles(doc, ui),\n          existingIds: bibliographyManager.localSources().map(source => source.id),\n        },\n        stream: () => {\n          return updatedConfiguration || null;\n        },\n      };\n\n      // Load the bibliography and then update the configuration\n      bibliographyManager.load(ui, doc, true).then(() => {\n        updatedConfiguration = {\n          providers: providersForBibliography(bibliographyManager.allowsWrites()),\n          bibliographyFiles: bibliographyManager.bibliographyFiles(doc, ui),\n          existingIds: bibliographyManager.localSources().map(source => source.id),\n        };\n      });\n\n      // Handles the confirmation by the user\n      const onOk = async (\n        bibliographySourceProviders: BibliographySourceProvider[],\n        bibliography: BibliographyFile,\n        selectedNode: NavigationTreeNode,\n        intextCitationStyle: boolean\n      ) => {\n        // Because some bibliography entries will need to download their CSL (based upon the\n        // DOI), we need to keep the dialog alive so we can use it to show progress. As a result\n        // rather than waiting for the dialog to be dismissed and  using the result, we do the work\n        // here ahead of calling 'confirm'. But confirm also provides the validation message for the\n        // dialog, so we still call 'confirm' even if we know it isn't valid (no citations selected)\n        // so the validation message can be displayed to the user.\n        if (bibliographySourceProviders.length > 0) {\n\n          // Look through the items and see whether any will be slow\n          // If some are slow, show progress\n          const requiresProgress = bibliographySourceProviders.some(\n            sourceProvider => sourceProvider.isSlowGeneratingBibliographySource,\n          );\n          if (requiresProgress) {\n            showProgress(\n              ui.context.translateText(\n                bibliographySourceProviders.length === 1\n                  ? 'Creating bibliography entry...'\n                  : 'Creating bibliography entries...',\n              ),\n            );\n          }\n\n          // Generate bibliography sources for each of the entries\n          const bibliographySources = await Promise.all(\n            bibliographySourceProviders.map(sourceProvider => sourceProvider.toBibliographySource(sourceProvider.id)),\n          );\n          result = {\n            bibliographySources,\n            bibliography,\n            intextCitationStyle,\n            selectionKey: selectedNode.key,\n          };\n\n          // Notify the caller to perform the inseration\n          await performInsertCitations(result);\n\n          // Clear progress\n          if (requiresProgress) {\n            hideProgress();\n          }\n        }\n        // Dismiss the dialog\n        confirm();\n      };\n\n      container.style.width = width + 'px';\n      ReactDOM.render(\n        <InsertCitationPanel\n          height={height}\n          width={width}\n          configuration={configurationStream}\n          initiallySelectedNodeKey={initiallySelectedNodeKey}\n          onOk={onOk}\n          onCancel={cancel}\n          doc={doc}\n          ui={ui}\n        />,\n        container,\n      );\n      return container;\n    },\n    () => {\n      // Focus\n      // dealt with in the React Component itself\n    },\n    () => {\n      // Validation\n      // User has to select a citation, everything else we can use defaults\n      if (!result || result.bibliographySources.length === 0) {\n        return ui.context.translateText('Please select at least one citation to insert.');\n      }\n      return null;\n    },\n  );\n\n  // return the result to the caller\n  if (performInsert && result) {\n    return Promise.resolve(true);\n  } else {\n    return Promise.resolve(false);\n  }\n}\n\ninterface InsertCitationPanelConfiguration {\n  providers: CitationSourcePanelProvider[];\n  bibliographyFiles: BibliographyFile[];\n  existingIds: string[];\n}\n\ninterface InsertCitationPanelConfigurationStream {\n  current: InsertCitationPanelConfiguration;\n  stream: () => InsertCitationPanelConfiguration | null;\n}\n\n// The picker is a full featured UI for finding and selecting citation data\n// to be added to a document.\ninterface InsertCitationPanelProps extends WidgetProps {\n  ui: EditorUI;\n  doc: ProsemirrorNode;\n  height: number;\n  width: number;\n  configuration: InsertCitationPanelConfigurationStream;\n  initiallySelectedNodeKey?: string;\n  onOk: (\n    bibliographySourceProviders: BibliographySourceProvider[],\n    bibliography: BibliographyFile,\n    selectedNode: NavigationTreeNode,\n    intextCitationStyle: boolean\n  ) => void;\n  onCancel: () => void;\n}\n\ninterface InsertCitationPanelState {\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n  selectedIndex: number;\n  searchTerm: string;\n  selectedNode: NavigationTreeNode;\n  status: CitationSourceListStatus;\n  statusMessage: string;\n  existingBibliographyFile: BibliographyFile;\n  createBibliographyFile: BibliographyFile;\n  intextCitationStyle: boolean;\n}\n\ninterface InsertCitationPanelUpdateState {\n  citations?: CitationListEntry[];\n  citationsToAdd?: CitationListEntry[];\n  selectedIndex?: number;\n  searchTerm?: string;\n  selectedNode?: NavigationTreeNode;\n  status?: CitationSourceListStatus;\n  statusMessage?: string;\n  existingBibliographyFile?: BibliographyFile;\n  createBibliographyFile?: BibliographyFile;\n  intextCitationStyle?: boolean;\n}\n\nexport const InsertCitationPanel: React.FC<InsertCitationPanelProps> = props => {\n  // The configuration state of this panel\n  const [insertCitationConfiguration, setInsertCitationConfiguration] = React.useState<\n    InsertCitationPanelConfiguration\n  >(props.configuration.current);\n\n  // The source data for the tree\n  const treeSourceData = insertCitationConfiguration.providers.map(panel => panel.treeNode());\n\n  // The selected provider / panel for the dialog\n  const defaultNode = nodeForKey(treeSourceData, props.initiallySelectedNodeKey);\n  const [selectedPanelProvider, setSelectedPanelProvider] = React.useState<CitationSourcePanelProvider>(\n    panelForNode(insertCitationConfiguration.providers, defaultNode) || insertCitationConfiguration.providers[0],\n  );\n\n  // Holder of the dialog state\n  const [insertCitationPanelState, setInsertCitationPanelState] = React.useState<InsertCitationPanelState>({\n    citations: [],\n    citationsToAdd: [],\n    selectedIndex: -1,\n    searchTerm: '',\n    selectedNode: defaultNode || selectedPanelProvider.treeNode(),\n    status: CitationSourceListStatus.default,\n    statusMessage: selectedPanelProvider.placeHolderMessage || '',\n    existingBibliographyFile: props.configuration.current.bibliographyFiles[0],\n    createBibliographyFile: bibliographyFileForPath(\n      changeExtension(\n        'references.json',\n        props.ui.prefs.bibliographyDefaultType() || bibliographyTypes(props.ui)[0].extension,\n      ),\n      props.ui,\n    ),\n    intextCitationStyle: props.ui.prefs.citationDefaultInText()\n  });\n\n  // Core method to update dialog state\n  const updateState = (updatedState: InsertCitationPanelUpdateState) => {\n    const newState = {\n      ...insertCitationPanelState,\n      ...updatedState,\n    };\n    setInsertCitationPanelState(newState);\n  };\n\n  // The dialog intelligently manages and merges the selected item and the explicitly added items\n  // This is the merged set of citations based upon the explicitly chosen and currently selected citations\n  const displayedCitations = insertCitationPanelState.citations.filter(\n    citation => !insertCitationPanelState.citationsToAdd.includes(citation),\n  );\n  const selectedCitation =\n    insertCitationPanelState.selectedIndex > -1\n      ? displayedCitations[insertCitationPanelState.selectedIndex]\n      : undefined;\n  const mergedCitationsToAdd = mergeCitations(insertCitationPanelState.citationsToAdd, selectedCitation);\n  const existingCitationIds = [\n    ...insertCitationConfiguration.existingIds,\n    ...mergedCitationsToAdd.map(citation => citation.id),\n  ];\n\n  // The initial setting of focus and loading of data for the panel.\n  const panelRef = React.useRef<any>(undefined);\n\n  // When the stream of configuration changes is actually loaded, we need to refresh the search\n  // results to reflect the new configuration. The below refs basically:\n  // 1) Capture the timer itself so only timer is created and it will be properly canceled\n  // 2) Captures the up to date state in the callback that will be used to refresh the search results -\n  //    If we don't refresh it each render, it will capture the state the time it was created\n  const streamTimerId = React.useRef<NodeJS.Timeout>();\n  const refreshSearchCallback = React.useRef<VoidFunction>();\n  React.useEffect(() => {\n    refreshSearchCallback.current = () => {\n      // Once the configurations, refresh the search\n      const defaultResults = selectedPanelProvider.typeAheadSearch(\n        insertCitationPanelState.searchTerm,\n        insertCitationPanelState.selectedNode,\n        existingCitationIds,\n      );\n      if (defaultResults) {\n        updateState({\n          searchTerm: '',\n          citations: defaultResults?.citations || [],\n          status: defaultResults?.status || CitationSourceListStatus.default,\n          statusMessage: defaultResults?.statusMessage || selectedPanelProvider.placeHolderMessage,\n        });\n      }\n    };\n  });\n\n  React.useEffect(() => {\n    // Set initial focus\n    if (panelRef.current) {\n      setTimeout(() => {\n        panelRef.current.focus();\n      }, 200);\n    }\n\n    // Poll the configuration stream for updates\n    // We need to keep the Timeout to clear around as ref so\n    // it survives any renders\n    streamTimerId.current = setInterval(() => {\n      const result = props.configuration.stream();\n      if (result !== null) {\n        if (streamTimerId.current) {\n          clearInterval(streamTimerId.current);\n        }\n\n        setInsertCitationConfiguration(result);\n        const panelProvider = panelForNode(result.providers, insertCitationPanelState.selectedNode);\n        if (panelProvider) {\n          setSelectedPanelProvider(panelProvider);\n        }\n        if (refreshSearchCallback.current) {\n          refreshSearchCallback.current();\n        }\n      }\n    }, 200);\n\n    // Set the default state to initialize the first search\n    const searchResult = selectedPanelProvider.typeAheadSearch(\n      '',\n      insertCitationPanelState.selectedNode,\n      existingCitationIds,\n    );\n    updateState({\n      searchTerm: '',\n      citations: searchResult?.citations || [],\n      status: searchResult?.status || CitationSourceListStatus.default,\n      statusMessage: searchResult?.statusMessage || selectedPanelProvider.placeHolderMessage,\n    });\n  }, []);\n\n  // When the user presses the insert button\n  const onOk = () => {\n    props.onOk(\n      mergedCitationsToAdd,\n      insertCitationPanelState.existingBibliographyFile || insertCitationPanelState.createBibliographyFile,      \n      insertCitationPanelState.selectedNode,\n      insertCitationPanelState.intextCitationStyle\n    );\n  };\n\n  // Style properties\n  const style: React.CSSProperties = {\n    width: props.width + 'px',\n    ...props.style,\n  };\n\n  // Figure out the panel height (the height of the main panel less padding and other elements)\n  const panelHeight = props.height * 0.75;\n\n  // In order to debounce typeahead search, we need to memoize the callback so the same debounce function will be\n  // used even when renders happen. Be sure to pass everything that need to reflect updated state since\n  // otherwise the value will be captured when the callback is memoized.\n  const memoizedTypeaheadSearch = React.useCallback(\n    debounce(\n      (\n        searchTerm: string,\n        panelProvider: CitationSourcePanelProvider,\n        selectedNode: NavigationTreeNode,\n        existingIds: string[],\n      ) => {\n        const searchResult = panelProvider.typeAheadSearch(searchTerm, selectedNode, existingIds);\n        if (searchResult) {\n          updateState({\n            searchTerm,\n            citations: searchResult?.citations,\n            status: searchResult?.status,\n            statusMessage: searchResult?.statusMessage,\n            selectedNode,\n          });\n        }\n      },\n      30,\n    ),\n    [],\n  );\n\n  // The core props that will be passed to whatever the selected panel is\n  // This implements the connection of the panel events and data and the\n  // core dialog state\n  const citationProps: CitationSourcePanelProps = {\n    ui: props.ui,\n    height: panelHeight,\n    citations: displayedCitations,\n    citationsToAdd: mergedCitationsToAdd,\n    searchTerm: insertCitationPanelState.searchTerm,\n    onSearchTermChanged: (term: string) => {\n      updateState({ searchTerm: term });\n      memoizedTypeaheadSearch(term, selectedPanelProvider, insertCitationPanelState.selectedNode, existingCitationIds);\n    },\n    onExecuteSearch: (searchTerm: string) => {\n      searchCanceled.current = false;\n      updateState({\n        searchTerm,\n        status: CitationSourceListStatus.inProgress,\n        statusMessage: selectedPanelProvider.progressMessage,\n      });\n      selectedPanelProvider\n        .search(searchTerm, insertCitationPanelState.selectedNode, existingCitationIds)\n        .then(searchResult => {\n          if (!searchCanceled.current) {\n            updateState({\n              searchTerm,\n              citations: searchResult?.citations,\n              status: searchResult?.status,\n              statusMessage: searchResult?.statusMessage,\n              selectedIndex: -1,\n            });\n          }\n        });\n    },\n    onAddCitation: (citation: CitationListEntry) => {\n      const newCitations = [...insertCitationPanelState.citationsToAdd, citation];\n      updateState({ selectedIndex: -1, citationsToAdd: newCitations });\n    },\n    onRemoveCitation: (citation: CitationListEntry) => {\n      deleteCitation(citation.id);\n    },\n    selectedIndex: insertCitationPanelState.selectedIndex,\n    onSelectedIndexChanged: (index: number) => {\n      updateState({ selectedIndex: index });\n    },\n    onConfirm: onOk,\n    status: insertCitationPanelState.status,\n    statusMessage: insertCitationPanelState.statusMessage,\n    warningMessage: selectedPanelProvider.warningMessage || '',\n    ref: panelRef,\n  };\n\n  // Tracks whether a long running search has been canceled\n  // for example by the user navigating to another section of the dialog\n  const searchCanceled = React.useRef<boolean>(false);\n\n  // This implements the connection of the dialog (non-provider panel) events and data and the\n  // core dialog state\n  const onNodeSelected = (node: NavigationTreeNode) => {\n    const suggestedPanel = panelForNode(insertCitationConfiguration.providers, node);\n    if (suggestedPanel) {\n      searchCanceled.current = true;\n      const searchResult = suggestedPanel.typeAheadSearch('', node, existingCitationIds);\n      updateState({\n        searchTerm: '',\n        citations: searchResult?.citations || [],\n        status: searchResult?.status || CitationSourceListStatus.default,\n        statusMessage: searchResult?.statusMessage || suggestedPanel.placeHolderMessage,\n        selectedNode: node,\n      });\n\n      if (suggestedPanel?.key !== selectedPanelProvider?.key) {\n        setSelectedPanelProvider(suggestedPanel);\n      }\n    }\n  };\n\n  const deleteCitation = (id: string) => {\n    const filteredCitations = insertCitationPanelState.citationsToAdd.filter(source => source.id !== id);\n    updateState({ citationsToAdd: filteredCitations });\n  };\n\n  const onTagDeleted = (tag: TagItem) => {\n    deleteCitation(tag.key);\n  };\n\n  const onTagChanged = (key: string, text: string) => {\n    // Edit any matching entries in the citation basket\n    const targetSource = insertCitationPanelState.citationsToAdd.find(source => source.id === key);\n    if (targetSource) {\n      targetSource.id = text;\n    }\n\n    // Edit the currently selected item\n    if (insertCitationPanelState.selectedIndex > -1) {\n      const currentlySelectedCitation = insertCitationPanelState.citations[insertCitationPanelState.selectedIndex];\n      if (currentlySelectedCitation && currentlySelectedCitation.id === key) {\n        currentlySelectedCitation.id = text;\n      }\n    }\n  };\n\n  const onTagValidate = (key: string, text: string) => {\n    const invalidChars = text.match(kInvalidCiteKeyChars);\n    if (invalidChars) {\n      return props.ui.context.translateText(\n        'The citekey includes invalid characters such as a space or a special character.',\n      );\n    }\n    return null;\n  };\n\n  const onBibliographyFileChanged = (biblographyFile: BibliographyFile) => {\n    updateState({ existingBibliographyFile: biblographyFile });\n  };\n\n  const onCreateBibliographyFileNameChanged = (fileName: string) => {\n    updateState({ createBibliographyFile: bibliographyFileForPath(fileName, props.ui) });\n  };\n\n  const onCitationStyleChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n    updateState({\n      intextCitationStyle: e.target.checked\n    });\n  };\n\n  // Support keyboard shortcuts for dismissing dialog\n  const onKeyPress = (event: React.KeyboardEvent) => {\n    if (event.key === 'Enter') {\n      event.preventDefault();\n      event.stopPropagation();\n      onOk();\n    }\n  };\n\n  // Esc can cause loss of focus so catch it early\n  const onKeyDown = (event: React.KeyboardEvent) => {\n    if (event.key === 'Escape') {\n      event.stopPropagation();\n      props.onCancel();\n    }\n  };\n\n  const totalCitationCount = insertCitationPanelState.citationsToAdd.length + (insertCitationPanelState.selectedIndex > -1 ? 1 : 0);\n  \n\n  // Create the panel that should be displayed for the selected node of the tree\n  const panelToDisplay = selectedPanelProvider\n    ? React.createElement(selectedPanelProvider.panel, citationProps)\n    : undefined;\n  return (\n    <div className=\"pm-cite-panel-container\" style={style} onKeyPress={onKeyPress} onKeyDown={onKeyDown}>\n      <div className=\"pm-cite-panel-cite-selection\">\n        <div className=\"pm-cite-panel-cite-selection-sources pm-block-border-color pm-background-color\">\n          <NavigationTree\n            height={panelHeight}\n            nodes={treeSourceData}\n            selectedNode={insertCitationPanelState.selectedNode}\n            onSelectedNodeChanged={onNodeSelected}\n          />\n        </div>\n        <div className=\"pm-cite-panel-cite-selection-items\">{panelToDisplay}</div>\n      </div>\n      <div className=\"pm-cite-panel-selected-cites pm-block-border-color pm-background-color\">\n        <TagInput\n          tags={mergedCitationsToAdd.map(source => ({\n            key: source.id,\n            displayText: source.id,\n            displayPrefix: '@',\n            isEditable: source.isIdEditable,\n          }))}\n          onTagDeleted={onTagDeleted}\n          onTagChanged={onTagChanged}\n          onTagValidate={onTagValidate}\n          ui={props.ui}\n          placeholder={props.ui.context.translateText('Selected Citation Keys')}\n          maxDisplayCharacters={50}\n        />\n      </div>\n      <div className=\"pm-cite-panel-insert-inputs\">\n        <div className=\"pm-cite-panel-insert-options\">\n        {// Only show the picker if there are either no bibliographies specified, or if there are writable bibliographies\n        insertCitationConfiguration.bibliographyFiles.length === 0 ||\n        insertCitationConfiguration.bibliographyFiles.some(bibFile => bibFile?.writable) ? (\n          <CitationBibliographyPicker\n            bibliographyTypes={bibliographyTypes(props.ui)}\n            createBibliographyFileName={insertCitationPanelState.createBibliographyFile.displayPath}\n            onCreateBibliographyFileNameChanged={onCreateBibliographyFileNameChanged}\n            bibliographyFiles={insertCitationConfiguration.bibliographyFiles}\n            onBiblographyFileChanged={onBibliographyFileChanged}\n            ui={props.ui}\n          />\n        ) : (\n          <div />\n        )}\n                {\n          totalCitationCount <= 1  ? (\n          <div className='pm-cite-panel-checkbox-group'>\n            <CheckboxInput \n              id='intextStyleCheckbox'\n              checked={insertCitationPanelState.intextCitationStyle} \n              className='pm-cite-panel-checkbox' \n              onChange={onCitationStyleChanged}/>\n            <label htmlFor='intextStyleCheckbox' className='pm-cite-panel-checkbox-label'>{props.ui.context.translateText('Use in-text citation')}</label>\n          </div>\n        ) : (\n          <div/>\n        )}\n\n        </div>\n\n        <DialogButtons\n          okLabel={props.ui.context.translateText('Insert')}\n          cancelLabel={props.ui.context.translateText('Cancel')}\n          onOk={onOk}\n          onCancel={props.onCancel}\n        />\n      </div>\n    </div>\n  );\n};\n\n// Finds the panel associated with the selected tree node\nconst panelForNode = (sourcePanels: CitationSourcePanelProvider[], node?: NavigationTreeNode) => {\n  if (node) {\n    const panelItem = sourcePanels.find(panel => {\n      const panelTreeNode = panel.treeNode();\n      return containsChild(node.key, panelTreeNode);\n    });\n    return panelItem;\n  } else {\n    return undefined;\n  }\n};\n\n// Given a key, find the node associated with the key (useful for restoring a selected node from a key)\nconst nodeForKey = (nodes: NavigationTreeNode[], key?: string): NavigationTreeNode | undefined => {\n  if (!key) {\n    return undefined;\n  }\n\n  for (const node of nodes) {\n    if (node.key === key) {\n      return node;\n    }\n    const childNode = nodeForKey(node.children, key);\n    if (childNode) {\n      return childNode;\n    }\n  }\n  return undefined;\n};\n\n// Merge the selected citation into the list that is displayed for add and filter it\n// out of the citation list itself\nconst mergeCitations = (toAdd: CitationListEntry[], selected?: CitationListEntry) => {\n  if (!selected) {\n    return toAdd;\n  } else {\n    if (toAdd.map(citation => citation.id).includes(selected.id)) {\n      return toAdd;\n    } else {\n      return (toAdd || []).concat(selected);\n    }\n  }\n};\n","/*\n * tag-input.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport { EditorUI } from '../ui';\n\nimport './tag-input.css';\nimport { TextInput } from './text';\nimport { kAlertTypeError } from '../ui-dialogs';\n\n// Item representing a tag entry\n// The key remains stable even if the tag is edited\n// The displayPrefix will be displayed to the user, but removed when editing\nexport interface TagItem {\n  key: string;\n  displayText: string;\n  displayPrefix: string;\n  isEditable?: boolean;\n}\n\ninterface TagInputProps extends WidgetProps {\n  tags: TagItem[];\n  onTagDeleted: (tag: TagItem) => void;\n  onTagChanged: (key: string, text: string) => void;\n  onTagValidate?: (key: string, text: string) => string | null;\n  ui: EditorUI;\n  placeholder?: string;\n  maxDisplayCharacters?: number;\n}\n\nexport const TagInput = React.forwardRef<HTMLDivElement, TagInputProps>((props, ref) => {\n  return (\n    <div style={props.style} className=\"pm-tag-input-container\" ref={ref}>\n      {props.tags.length === 0 ? (\n        <div className=\"pm-tag-input-placeholder\">\n          <div className=\"pm-placeholder-text-color\">{props.placeholder}</div>\n        </div>\n      ) : (\n        undefined\n      )}\n      {props.tags.map(tag => (\n        <Tag\n          key={tag.key}\n          tag={tag}\n          onTagDeleted={props.onTagDeleted}\n          onTagChanged={props.onTagChanged}\n          onTagValidate={props.onTagValidate}\n          ui={props.ui}\n          maxDisplayCharacters={props.maxDisplayCharacters}\n        />\n      ))}\n    </div>\n  );\n});\n\ninterface TagProps extends WidgetProps {\n  tag: TagItem;\n  onTagDeleted: (tag: TagItem) => void;\n  onTagChanged: (key: string, text: string) => void;\n  onTagValidate?: (key: string, text: string) => string | null;\n  ui: EditorUI;\n  maxDisplayCharacters?: number;\n}\n\nconst Tag: React.FC<TagProps> = props => {\n  const [editing, setEditing] = React.useState<boolean>(false);\n  const [editingText, setEditingText] = React.useState<string>(props.tag.displayText);\n  const [displayText, setDisplayText] = React.useState<string>(props.tag.displayText);\n\n  const editImage = React.useRef<HTMLImageElement>(null);\n  const showingValidationError = React.useRef<boolean>(false);\n  const restoreFocusAfterCancel = React.useRef<boolean>(false);\n\n  // Anytime we begin editing, focus the text input\n  const editTextInput = React.useRef<HTMLInputElement>(null);\n  React.useLayoutEffect(() => {\n    if (editing) {\n      editTextInput.current?.focus();\n    } else if (restoreFocusAfterCancel.current) {\n      // Focus the edit image\n      editImage.current?.focus();\n      restoreFocusAfterCancel.current = false;\n    }\n  }, [editing]);\n\n  // Click the delete icon\n  const onDeleteClick = (e: React.MouseEvent) => {\n    props.onTagDeleted(props.tag);\n  };\n\n  // Enter or space while delete icon focused\n  const onDeleteKeyPress = (e: React.KeyboardEvent) => {\n    switch (e.key) {\n      case 'Enter':\n      case ' ':\n        e.preventDefault();\n        e.stopPropagation();\n        props.onTagDeleted(props.tag);\n        break;\n    }\n  };\n\n  // Click on the edit icon\n  const onEditClick = (e: React.MouseEvent) => {\n    if (props.tag.isEditable) {\n      setEditing(true);\n    }\n  };\n\n  // Enter or space while edit icon is focused\n  const onEditKeyPress = (e: React.KeyboardEvent) => {\n    switch (e.key) {\n      case 'Enter':\n      case ' ':\n        e.preventDefault();\n        e.stopPropagation();\n        setEditing(true);\n        break;\n    }\n  };\n\n  // Commit edits to the tag\n  const commitTagEdit = () => {\n    // Validate the input\n    if (props.onTagValidate) {\n      const validationMessage = props.onTagValidate(props.tag.key, editingText);\n      if (validationMessage !== null) {\n        showingValidationError.current = true;\n        props.ui.dialogs\n          .alert(\n            props.ui.context.translateText(validationMessage),\n            props.ui.context.translateText('Validation Error'),\n            kAlertTypeError,\n          )\n          .then(() => {\n            editTextInput.current?.focus();\n            showingValidationError.current = false;\n          });\n        return;\n      }\n    }\n\n    // Update the text\n    setDisplayText(editingText);\n\n    // Halt editing\n    setEditing(false);\n\n    // Notify of change\n    props.onTagChanged(props.tag.key, editingText);\n\n    // Focus the edit image\n    editImage.current?.focus();\n  };\n\n  const cancelTagEdit = () => {\n    // Halt editing\n    setEditing(false);\n\n    // Revert editing text\n    setEditingText(displayText);\n\n    // The editing control will lose focus, so we need to focus something else\n    restoreFocusAfterCancel.current = true;\n  };\n\n  // When editing the tag, allow enter to accept the changes\n  const handleEditKeyDown = (e: React.KeyboardEvent) => {\n    switch (e.key) {\n      case 'Enter':\n        // If we're validiating, don't commit.\n        if (showingValidationError.current) {\n          return;\n        }\n        e.preventDefault();\n        e.stopPropagation();\n        commitTagEdit();\n        break;\n      case 'Escape':\n        e.preventDefault();\n        e.stopPropagation();\n        cancelTagEdit();\n        break;\n    }\n  };\n\n  // When editing, clicking away from the tag will accept changes\n  const handleEditBlur = () => {\n    // If we're validiating, don't commit.\n    if (showingValidationError.current) {\n      return;\n    }\n    commitTagEdit();\n  };\n\n  const handleEditChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const edittedText = e.target.value;\n    setEditingText(edittedText);\n  };\n\n  return (\n    <div key={props.tag.displayText} className=\"pm-tag-input-tag pm-block-border-color\">\n      <img\n        src={props.ui.images.widgets?.tag_delete}\n        onClick={onDeleteClick}\n        onKeyPress={onDeleteKeyPress}\n        className=\"pm-tag-input-delete-image\"\n        tabIndex={0}\n      />\n      <div className={`pm-tag-input-text ${props.tag.isEditable ? 'pm-tag-input-text-edittable' : undefined}`}>\n        {!editing ? (\n          <div onClick={onEditClick} className=\"pm-tag-input-text-raw pm-text-color\">\n            {props.tag.displayPrefix}\n            {props.maxDisplayCharacters ? \n              displayText.length > props.maxDisplayCharacters ? displayText.substr(0, props.maxDisplayCharacters - 1) + '…' : displayText: \n              displayText}\n          </div>\n        ) : (\n          <TextInput\n            width={props.maxDisplayCharacters ? \n                 `${Math.min(props.maxDisplayCharacters, editingText.length)}ch` :\n                 `${editingText.length}ch`\n                }\n            ref={editTextInput}\n            className=\"pm-tag-input-text-edit\"\n            value={editingText}\n            onChange={handleEditChange}\n            onKeyDown={handleEditKeyDown}\n            onBlur={handleEditBlur}\n          />\n        )}\n      </div>\n      {props.tag.isEditable ? (\n        <img\n          src={props.ui.images.widgets?.tag_edit}\n          className=\"pm-tag-input-edit-image\"\n          onClick={onEditClick}\n          onKeyPress={onEditKeyPress}\n          tabIndex={0}\n          ref={editImage}\n        />\n      ) : (\n        undefined\n      )}\n    </div>\n  );\n};\n","/*\n * navigation-tree.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { CSSProperties } from 'react';\n\nimport { WidgetProps } from './react';\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\n\nimport './navigation-tree.css';\n\n// Individual nodes and children of the Select Tree\nexport interface NavigationTreeNode {\n  key: string;\n  image?: string;\n  name: string;\n  type: string;\n  children: NavigationTreeNode[];\n  expanded?: boolean;\n}\n\ninterface NavigationTreeProps extends WidgetProps {\n  height: number;\n  nodes: NavigationTreeNode[];\n  selectedNode: NavigationTreeNode;\n  onSelectedNodeChanged: (node: NavigationTreeNode) => void;\n}\n\ninterface NavigationTreeItemProps extends ListChildComponentProps {\n  data: {\n    nodes: NavigationTreeNode[];\n    selectedNode: NavigationTreeNode;\n    onSelectedNodeChanged: (node: NavigationTreeNode) => void;\n    showSelection: boolean;\n    preventFocus: boolean;\n  };\n}\n\n// Indent level for each level\nconst kNavigationTreeIndent = 8;\n\n// Select Tree is a single selection tree that is useful in\n// hierarchical navigation type contexts. It does not support\n// multiple selection and is generally not a well behaved tree\n// like you would use to navigate a hierarchical file system.\nexport const NavigationTree: React.FC<NavigationTreeProps> = props => {\n  const style: CSSProperties = {\n    height: props.height + 'px',\n    ...props.style,\n  };\n\n  // The currently selected node should always be expanded\n  const selectedNode = props.selectedNode;\n\n  // Ensure that all the parents of the selected node are expanded\n  const nodes = props.nodes;\n  const currentNodePath = pathToNode(selectedNode, nodes);\n  currentNodePath.forEach(node => (node.expanded = true));\n  const selNode = nodes.find(n => n.key === selectedNode.key);\n  if (selNode) {\n    selNode.expanded = true;\n  }\n  const vizNodes = visibleNodes(props.nodes, props.selectedNode);\n\n  // Ensure the item is scrolled into view\n  const fixedList = React.useRef<FixedSizeList>(null);\n  React.useEffect(() => {\n    if (props.selectedNode) {\n      vizNodes.find((value, index) => {\n        if (value.key === selectedNode.key) {\n          fixedList.current?.scrollToItem(index);\n          return true;\n        }\n      });\n    }\n  });\n\n  // Process keys to enable keyboard based navigation\n  const processKey = (e: React.KeyboardEvent) => {\n    const selected = props.selectedNode;\n    switch (e.key) {\n      case 'ArrowDown':\n        if (selected) {\n          const next = stepNode(selectedNode, props.nodes, 1);\n          props.onSelectedNodeChanged(next);\n        }\n        break;\n\n      case 'ArrowUp':\n        if (selected) {\n          const previous = stepNode(selectedNode, props.nodes, -1);\n          props.onSelectedNodeChanged(previous);\n        }\n        break;\n\n      case 'PageDown':\n        if (selected) {\n          const next = stepNode(selectedNode, props.nodes, 4);\n          props.onSelectedNodeChanged(next);\n        }\n        break;\n\n      case 'PageUp':\n        if (selected) {\n          const previous = stepNode(selectedNode, props.nodes, -4);\n          props.onSelectedNodeChanged(previous);\n        }\n        break;\n    }\n  };\n\n  return (\n    <div style={style} tabIndex={0} onKeyDown={processKey}>\n      <FixedSizeList\n        className=\"pm-navigation-tree\"\n        height={props.height}\n        width=\"100%\"\n        itemCount={vizNodes.length}\n        itemSize={28}\n        itemData={{\n          nodes: vizNodes,\n          selectedNode: props.selectedNode,\n          onSelectedNodeChanged: props.onSelectedNodeChanged,\n          showSelection: true,\n          preventFocus: true,\n        }}\n        ref={fixedList}\n      >\n        {NavigationTreeItem}\n      </FixedSizeList>\n    </div>\n  );\n};\n\n// Renders each item\nconst NavigationTreeItem = (props: NavigationTreeItemProps) => {\n  const data = props.data;\n  const node: NavigationTreeNode = props.data.nodes[props.index];\n  const path = pathToNode(node, data.nodes);\n  const depth = path.length - 1;\n\n  // Select the tree node\n  const onClick = (e: React.MouseEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    data.onSelectedNodeChanged(node);\n  };\n\n  // Whether this node is selected\n  const selected = data.selectedNode.key === node.key;\n\n  const indentLevel = depth;\n  const indentStyle = {\n    paddingLeft: indentLevel * kNavigationTreeIndent + 'px',\n  };\n\n  const selectedClassName = `${\n    selected ? 'pm-selected-navigation-tree-item' : 'pm-navigation-tree-item'\n  } pm-navigation-tree-node`;\n  return (\n    <div key={node.key} onClick={onClick} style={props.style}>\n      <div className={selectedClassName} style={indentLevel > 0 ? indentStyle : undefined}>\n        {node.image ? (\n          <div className=\"pm-navigation-tree-node-image-div\">\n            <img src={node.image} alt={node.name} className=\"pm-navigation-tree-node-image\" />\n          </div>\n        ) : null}\n        <div className=\"pm-navigation-tree-node-label-div pm-text-color\">{node.name}</div>\n      </div>\n    </div>\n  );\n};\n\n// Indicates whether a given key is the identified node or one of its\n// children\nexport function containsChild(key: string, node: NavigationTreeNode): boolean {\n  if (node.key === key) {\n    return true;\n  }\n\n  for (const childNode of node.children) {\n    const hasChild = containsChild(key, childNode);\n    if (hasChild) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// enumerate the nodes that lead to a selected node\nfunction pathToNode(node: NavigationTreeNode, nodes: NavigationTreeNode[]): NavigationTreeNode[] {\n  const path: NavigationTreeNode[] = [];\n  if (node) {\n    for (const root of nodes) {\n      if (root.key === node.key) {\n        path.push(node);\n        return path;\n      }\n\n      const childPath = pathToNode(node, root.children);\n      if (childPath.length > 0) {\n        path.push(root, ...childPath);\n        return path;\n      }\n    }\n  }\n  return path;\n}\n\n// Creates an ordered flattened list of visible nodes in the\n// tree. Useful for incrementing through visible nodes :)\nfunction visibleNodes(nodes: NavigationTreeNode[], selectedNode: NavigationTreeNode) {\n  const nodeList: NavigationTreeNode[][] = nodes.map(node => {\n    if (node.expanded || node.key === selectedNode.key) {\n      return [node].concat(visibleNodes(node.children, selectedNode));\n    } else {\n      return [node];\n    }\n  });\n  return ([] as NavigationTreeNode[]).concat(...nodeList);\n}\n\n// Get the previous node for the current node\nfunction stepNode(node: NavigationTreeNode, allNodes: NavigationTreeNode[], increment: number): NavigationTreeNode {\n  const nodes = visibleNodes(allNodes, node);\n  const currentIndex = nodes.map(n => n.key).indexOf(node.key);\n  const step = currentIndex + increment;\n  if (step >= 0 && step < nodes.length - 1) {\n    return nodes[step];\n  } else if (step < 0) {\n    return nodes[0];\n  } else {\n    return nodes[nodes.length - 1];\n  }\n}\n","/*\n * dialog-buttons.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { WidgetProps } from './react';\n\nimport { EditorUI } from '../ui';\n\nimport { TextButton } from './button';\nimport React from 'react';\n\nimport './dialog-buttons.css';\n\nexport interface DialogButtonsProps extends WidgetProps {\n  okLabel: string;\n  cancelLabel: string;\n  onOk: () => void;\n  onCancel: () => void;\n}\n\nexport const DialogButtons: React.FC<DialogButtonsProps> = props => {\n  return (\n    <div className=\"pm-dialog-buttons-panel\" style={props.style}>\n      <TextButton\n        title={props.okLabel}\n        classes={['pm-default-theme', 'pm-dialog-buttons-button', 'pm-rstudio-button']}\n        onClick={props.onOk}\n        style={{\n          fontWeight: 600,\n        }}\n      />\n\n      <TextButton\n        title={props.cancelLabel}\n        classes={['pm-default-theme', 'pm-dialog-buttons-button', 'pm-rstudio-button']}\n        onClick={props.onCancel}\n      />\n    </div>\n  );\n};\n","// Panels get a variety of information as properties to permit them to search\n\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { BibliographySource, BibliographyManager } from '../../../api/bibliography/bibliography';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { suggestCiteId, formatIssuedDate, formatAuthors } from '../../../api/cite';\n\n// citations and add them\nexport interface CitationSourcePanelProps extends WidgetProps {\n  ui: EditorUI;\n  height: number;\n\n  searchTerm: string;\n  onSearchTermChanged: (term: string) => void;\n  onExecuteSearch: (term: string) => void;\n\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n\n  onAddCitation: (citation: CitationListEntry) => void;\n  onRemoveCitation: (citation: CitationListEntry) => void;\n  onConfirm: VoidFunction;\n\n  selectedIndex: number;\n  onSelectedIndexChanged: (index: number) => void;\n\n  status: CitationSourceListStatus;\n  statusMessage: string;\n\n  warningMessage: string;\n\n  ref: React.Ref<any>;\n}\n\n// Citation Panels Providers are the core element of ths dialog. Each provider provides\n// the main panel UI as well as the tree to display when the panel is displayed.\nexport interface CitationSourcePanelProvider {\n  key: string;\n  panel: React.FC<CitationSourcePanelProps>;\n  treeNode(): NavigationTreeNode;\n  placeHolderMessage?: string;\n  progressMessage?: string;\n  warningMessage?: string;\n  typeAheadSearch: (\n    term: string,\n    selectedNode: NavigationTreeNode,\n    existingCitationIds: string[],\n  ) => CitationSourcePanelSearchResult | null;\n  search: (\n    term: string,\n    selectedNode: NavigationTreeNode,\n    existingCitationIds: string[],\n  ) => Promise<CitationSourcePanelSearchResult>;\n}\n\nexport interface CitationSourcePanelSearchResult {\n  citations: CitationListEntry[];\n  status: CitationSourceListStatus;\n  statusMessage: string;\n}\n\nexport interface CitationListEntry extends BibliographySourceProvider {\n  id: string;\n  isIdEditable: boolean;\n  image?: string;\n  imageAdornment?: string;\n  type: string;\n  title: string;\n  authors: (width: number) => string;\n  date: string;\n  journal: string | undefined;\n  doi?: string;\n}\n\nexport interface BibliographySourceProvider {\n  id: string;\n  isSlowGeneratingBibliographySource: boolean;\n  toBibliographySource: (id: string) => Promise<BibliographySource>;\n}\n\nexport enum CitationSourceListStatus {\n  default,\n  inProgress,\n  noResults,\n  error,\n}\n\nexport function errorForStatus(ui: EditorUI, status: string, providerName: string) {\n  return status === 'nohost'\n    ? ui.context.translateText(`Unable to search ${providerName}. Please check your network connection and try again.`)\n    : ui.context.translateText(`An error occurred while searching ${providerName}.`);\n}\n\n\nexport function matchExistingSourceCitationListEntry(doi: string, existingIds: string[], ui: EditorUI, bibliographyManager: BibliographyManager) {\n\n  const localSources = bibliographyManager.localSources();\n  const existingSource = localSources.find(source => {\n    if (source.DOI?.toLowerCase() === doi.toLowerCase()) {\n      return source;\n    }\n  });\n  if (existingSource) {\n    return existingSourceToCitationListEntry(existingSource, existingIds, ui);\n  }\n}\n\nfunction existingSourceToCitationListEntry(csl: CSL, existingIds: string[], ui: EditorUI): CitationListEntry {\n  const providerKey = 'pubmed';\n  return {\n    id: csl.id || suggestCiteId(existingIds, csl),\n    isIdEditable: false,\n    title: csl.title || '',\n    doi: csl.DOI,\n    type: '',\n    date: formatIssuedDate(csl.issued) || '',\n    journal: csl[\"container-title\"],\n    authors: (length: number) => {\n      return formatAuthors(csl.author || [], length);\n    },\n    image: imageForType(ui.images, csl.type)[0],\n    toBibliographySource: async (finalId: string) => {\n      // Generate CSL using the DOI\n      return { ...csl, id: finalId, providerKey };\n    },\n    isSlowGeneratingBibliographySource: true,\n  };\n}","/*\n * insert_citation-panel-bibliography.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport uniqby from 'lodash.uniqby';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { EditorUI } from '../../../api/ui';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport {\n  BibliographyManager,\n  BibliographyCollection,\n  BibliographySource,\n} from '../../../api/bibliography/bibliography';\nimport { kZoteroProviderKey } from '../../../api/bibliography/bibliography-provider_zotero';\nimport { kLocalBiliographyProviderKey } from '../../../api/bibliography/bibliography-provider_local';\nimport { formatAuthors, formatIssuedDate, createUniqueCiteId } from '../../../api/cite';\nimport {\n  CitationSourcePanelProvider,\n  CitationSourcePanelProps,\n  CitationListEntry,\n  CitationSourceListStatus,\n} from './insert_citation-source-panel';\nimport { CitationSourceTypeheadSearchPanel } from './insert_citation-source-panel-typeahead-search';\nimport { imageForType } from '../../../api/csl';\n\nimport './insert_citation-source-panel-bibliography.css';\n\nconst kAllLocalSourcesRootNodeType = 'All Local Sources';\n\nexport function bibliographySourcePanel(\n  doc: ProsemirrorNode,\n  ui: EditorUI,\n  bibliographyManager: BibliographyManager,\n): CitationSourcePanelProvider {\n  const providers = bibliographyManager.localProviders();\n  const providerNodes: { [key: string]: NavigationTreeNode } = {};\n\n  // For each of the providers, discover their collections\n  providers\n    .filter(provider => provider.isEnabled())\n    .forEach(provider => {\n      const getFolder = (prov: string, hasParent: boolean) => {\n        return folderImageForProvider(prov, hasParent, ui);\n      };\n\n      // Get the response which could be items or could be a stream\n      const collectionSpecs = provider.collections();\n      // Note the temporary collections\n      providerNodes[provider.key] = {\n        key: provider.key,\n        name: ui.context.translateText(provider.name),\n        type: provider.key,\n        image: rootImageForProvider(provider.key, ui),\n        children: toTree(provider.key, collectionSpecs, getFolder),\n        expanded: true,\n      };\n    });\n\n  return {\n    key: '17373086-77FE-410F-A319-33E314482125',\n    panel: BibligraphySourcePanel,\n    treeNode: () => {\n      return {\n        key: 'My Sources',\n        name: ui.context.translateText('My Sources'),\n        image: ui.images.citations?.local_sources,\n        type: kAllLocalSourcesRootNodeType,\n        children: Object.values(providerNodes),\n        expanded: true,\n      };\n    },\n    warningMessage: bibliographyManager.warning(),\n    typeAheadSearch: (searchTerm: string, selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n      const providerForNode = (node: NavigationTreeNode): string | undefined => {\n        // The node could be the root node, no provider\n        return node.type === kAllLocalSourcesRootNodeType ? undefined : node.type;\n      };\n\n      const collectionKeyForNode = (node: NavigationTreeNode): string | undefined => {\n        // The node could be a provider root or a collection\n        return node.type !== kAllLocalSourcesRootNodeType &&\n          node.key !== kZoteroProviderKey &&\n          node.key !== kLocalBiliographyProviderKey\n          ? node.key\n          : undefined;\n      };\n      const sources = bibliographyManager.search(\n        searchTerm,\n        providerForNode(selectedNode),\n        collectionKeyForNode(selectedNode),\n      );\n      const uniqueSources = uniqby(sources, source => source.id);\n\n      const citations = toCitationListEntries(uniqueSources, existingCitationIds, ui);\n      return {\n        citations,\n        status: citations.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n        statusMessage: citations.length > 0 ? '' : ui.context.translateText('No items'),\n      };\n    },\n    search: (_searchTerm: string, _selectedNode: NavigationTreeNode, _existingCitationIds: string[]) => {\n      return Promise.resolve({\n        citations: [],\n        status: CitationSourceListStatus.default,\n        statusMessage: '',\n      });\n    },\n  };\n}\n\nexport const BibligraphySourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n  (props: CitationSourcePanelProps, ref) => {\n    return (\n      <>\n        {props.warningMessage ? (\n          <div className=\"pm-insert-bibliography-source-panel-warning pm-block-border-color\">\n            {props.warningMessage}\n          </div>\n        ) : (\n          undefined\n        )}\n        <CitationSourceTypeheadSearchPanel\n          height={props.height}\n          citations={props.citations}\n          citationsToAdd={props.citationsToAdd}\n          searchTerm={props.searchTerm}\n          onSearchTermChanged={props.onSearchTermChanged}\n          selectedIndex={props.selectedIndex}\n          onSelectedIndexChanged={props.onSelectedIndexChanged}\n          onAddCitation={props.onAddCitation}\n          onRemoveCitation={props.onRemoveCitation}\n          onConfirm={props.onConfirm}\n          status={props.status}\n          statusMessage={props.statusMessage}\n          ui={props.ui}\n          ref={ref}\n        />\n      </>\n    );\n  },\n);\n\nfunction rootImageForProvider(providerKey: string, ui: EditorUI) {\n  switch (providerKey) {\n    case kZoteroProviderKey:\n      return ui.images.citations?.zotero_root;\n    case kLocalBiliographyProviderKey:\n      return ui.images.citations?.bibligraphy;\n  }\n}\n\nfunction folderImageForProvider(providerKey: string, hasParent: boolean, ui: EditorUI) {\n  switch (providerKey) {\n    case kZoteroProviderKey:\n      if (hasParent) {\n        return ui.images.citations?.zotero_collection;\n      } else {\n        return ui.images.citations?.zotero_library;\n      }\n    case kLocalBiliographyProviderKey:\n      return ui.images.citations?.bibligraphy_folder;\n  }\n}\n\n// Takes a flat data structure of containers and turns it into a hierarchical\n// tree structure for display as TreeNodes.\nfunction toTree(\n  type: string,\n  containers: BibliographyCollection[],\n  folderImage?: (providerKey: string, hasParent: boolean) => string | undefined,\n): NavigationTreeNode[] {\n  const treeMap: { [id: string]: NavigationTreeNode } = {};\n  const rootNodes: NavigationTreeNode[] = [];\n\n  // Sort the folder in alphabetical order at each level of the tree\n  containers\n    .sort((a, b) => {\n      // For Zotero collection, sort the 'My Library to the top always'\n      if (a.provider === kZoteroProviderKey && a.key === '1') {\n        return -1;\n      }\n      return a.name.localeCompare(b.name);\n    })\n    .forEach(container => {\n      // First see if we have an existing node for this item\n      // A node could already be there if we had to insert a 'placeholder'\n      // node to contain the node's children before we encountered the node.\n      const currentNode = treeMap[container.key] || { key: container.key, name: container.name, children: [], type };\n\n      // Always set its name to be sure we fill this in when we encounter it\n      const hasParent = container.parentKey !== undefined && container.parentKey.length > 0;\n      currentNode.name = container.name;\n      currentNode.image = folderImage ? folderImage(container.provider, hasParent) : undefined;\n\n      if (container.parentKey) {\n        let parentNode = treeMap[container.parentKey];\n        if (!parentNode) {\n          // This is a placeholder node - we haven't yet encountered this child's parent\n          // so we insert this to hold the child. Once we encounter the true parent node,\n          // we will fix up the values in this placeholder node.\n          parentNode = { key: container.parentKey, name: '', children: [], type };\n          treeMap[container.parentKey] = parentNode;\n        }\n        parentNode.children?.push(currentNode);\n      } else {\n        rootNodes.push(currentNode);\n      }\n      treeMap[container.key] = currentNode;\n    });\n  return rootNodes;\n}\n\nfunction toCitationListEntries(\n  sources: BibliographySource[],\n  existingCitationIds: string[],\n  ui: EditorUI,\n): CitationListEntry[] {\n  const useBetterBibTex = ui.prefs.zoteroUseBetterBibtex();\n  return sources.map(source => {\n    return {\n      id:\n        source.providerKey === kLocalBiliographyProviderKey || useBetterBibTex\n          ? source.id\n          : createUniqueCiteId(existingCitationIds, source.id),\n      isIdEditable: source.providerKey === kZoteroProviderKey && !useBetterBibTex,\n      type: source.type,\n      title: source.title || '',\n      providerKey: source.providerKey,\n      date: formatIssuedDate(source.issued),\n      journal: '',\n      image: imageForType(ui.images, source.type)[0],\n      imageAdornment: source.providerKey === kZoteroProviderKey ? ui.images.citations?.zoteroOverlay : undefined,\n      authors: (length: number) => {\n        return formatAuthors(source.author, length);\n      },\n      toBibliographySource: (finalId: string) => {\n        return Promise.resolve({ ...source, id: finalId, providerKey: source.providerKey });\n      },\n      isSlowGeneratingBibliographySource: false,\n    };\n  });\n}\n","/*\n * insert_citation-source-panel-typeahead-search.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\nimport { TextInput } from '../../../api/widgets/text';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport './insert_citation-source-panel-typeahead-search.css';\nimport { CitationSourceList } from './insert_citation-source-panel-list';\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\nimport { CitationSourcePanelListItem } from './insert_citation-source-panel-list-item';\n\nexport interface CitationSourceTypeaheadSearchPanelProps extends WidgetProps {\n  height: number;\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n  searchTerm: string;\n  onSearchTermChanged: (searchTerm: string) => void;\n  selectedIndex: number;\n  onSelectedIndexChanged: (index: number) => void;\n  onAddCitation: (citation: CitationListEntry) => void;\n  onRemoveCitation: (citation: CitationListEntry) => void;\n  onConfirm: VoidFunction;\n  status: CitationSourceListStatus;\n  statusMessage: string;\n  ui: EditorUI;\n}\n\n// Height of textbox including border\nconst kTextBoxHeight = 30;\n\nexport const CitationSourceTypeheadSearchPanel = React.forwardRef<\n  HTMLDivElement,\n  CitationSourceTypeaheadSearchPanelProps\n>((props: CitationSourceTypeaheadSearchPanelProps, ref) => {\n  const listContainer = React.useRef<HTMLDivElement>(null);\n\n  // Search the user search terms\n  const searchChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const search = e.target.value;\n    props.onSearchTermChanged(search);\n  };\n\n  // Perform first load tasks\n  const searchBoxRef = React.useRef<HTMLInputElement>(null);\n\n  // If the user arrows down in the search text box, advance to the list of items\n  const handleTextKeyDown = (event: React.KeyboardEvent) => {\n    switch (event.key) {\n      case 'ArrowDown':\n        listContainer.current?.focus();\n        break;\n    }\n  };\n\n  // Used to focus the search box\n  const focusSearch = () => {\n    searchBoxRef.current?.focus();\n  };\n\n  const addCitation = (citation: CitationListEntry) => {\n    // Add the citation and reset selection\n    props.onAddCitation(citation);\n    focusSearch();\n  };\n\n  // On focus, select the search term for overtype\n  const searchBoxFocused = (event: React.FocusEvent<HTMLInputElement>) => {\n    event.target.select();\n  };\n\n  return (\n    <div\n      style={props.style}\n      className=\"pm-insert-citation-panel-search pm-block-border-color pm-background-color\"\n      ref={ref}\n      tabIndex={-1}\n      onFocus={focusSearch}\n    >\n      <div className=\"pm-insert-citation-search-panel-textbox-container\">\n        <TextInput\n          width=\"100%\"\n          iconAdornment={props.ui.images.search}\n          tabIndex={0}\n          className=\"pm-insert-citation-panel-search-textbox pm-block-border-color\"\n          placeholder={props.ui.context.translateText('Search for citation')}\n          onKeyDown={handleTextKeyDown}\n          onChange={searchChanged}\n          onFocus={searchBoxFocused}\n          value={props.searchTerm}\n          ref={searchBoxRef}\n        />\n      </div>\n      <CitationSourceList\n        height={props.height - kTextBoxHeight}\n        citations={props.citations}\n        citationsToAdd={props.citationsToAdd}\n        onConfirm={props.onConfirm}\n        onAddCitation={addCitation}\n        onRemoveCitation={props.onRemoveCitation}\n        selectedIndex={props.selectedIndex}\n        onSelectedIndexChanged={props.onSelectedIndexChanged}\n        focusPrevious={focusSearch}\n        status={props.status}\n        statusMessage={props.statusMessage}\n        itemHeight={64}\n        itemProvider={CitationSourcePanelListItem}\n        ui={props.ui}\n        ref={listContainer}\n      />\n    </div>\n  );\n});\n","/*\n * insert_citation-source-panel-list.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\n\nimport { EditorUI } from '../../../api/ui';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\n\nimport './insert_citation-source-panel-list.css';\n\nexport interface CitationSourcePanelListItemData {\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n  selectedIndex: number;\n  onSelectedIndexChanged: (index: number) => void;\n  onAddCitation: (source: CitationListEntry) => void;\n  onRemoveCitation: (source: CitationListEntry) => void;\n  onConfirm: () => void;\n  ui: EditorUI;\n  showSeparator?: boolean;\n  showSelection?: boolean;\n  preventFocus?: boolean;\n}\n\nexport interface CitationSourceListProps extends WidgetProps {\n  height: number;\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n  selectedIndex: number;\n  onSelectedIndexChanged: (index: number) => void;\n  onAddCitation: (citation: CitationListEntry) => void;\n  onRemoveCitation: (citation: CitationListEntry) => void;\n  onConfirm: VoidFunction;\n  focusPrevious?: () => void;\n\n  itemProvider: (props: ListChildComponentProps) => JSX.Element;\n  itemHeight: number;\n\n  status: CitationSourceListStatus;\n  statusMessage: string;\n  ui: EditorUI;\n}\n\nexport const CitationSourceList = React.forwardRef<HTMLDivElement, CitationSourceListProps>(\n  (props: CitationSourceListProps, ref) => {\n    const fixedList = React.useRef<FixedSizeList>(null);\n\n    // Item height and consequently page height\n    const itemsPerPage = Math.floor(props.height / props.itemHeight);\n\n    // Update selected item index (this will manage bounds)\n    const handleIncrementIndex = (event: React.KeyboardEvent, increment: number, index: number) => {\n      event.stopPropagation();\n      event.preventDefault();\n      if (props.citations && index > -1) {\n        const maxIndex = props.citations.length - 1;\n        const newIndex = Math.min(Math.max(0, index + increment), maxIndex);\n        props.onSelectedIndexChanged(newIndex);\n      }\n    };\n\n    // Toggle the currently selected item as added or removed\n    const handleAddItem = (event: React.KeyboardEvent) => {\n      event.stopPropagation();\n      event.preventDefault();\n      const currentCitation = props.selectedIndex > -1 ? props.citations[props.selectedIndex] : undefined;\n      if (currentCitation) {\n        props.onAddCitation(currentCitation);\n      }\n    };\n\n    const handleListKeyDown = (event: React.KeyboardEvent) => {\n      const currentIndex = props.selectedIndex;\n      switch (event.key) {\n        case 'ArrowUp':\n          if (currentIndex === 0 && props.focusPrevious) {\n            props.focusPrevious();\n          } else {\n            handleIncrementIndex(event, -1, currentIndex);\n          }\n          break;\n\n        case 'ArrowDown':\n          handleIncrementIndex(event, 1, currentIndex);\n          break;\n\n        case 'PageDown':\n          handleIncrementIndex(event, itemsPerPage, currentIndex);\n          break;\n\n        case 'PageUp':\n          handleIncrementIndex(event, -itemsPerPage, currentIndex);\n          break;\n\n        case 'Enter':\n          handleAddItem(event);\n          props.onConfirm();\n          break;\n        case ' ':\n          handleAddItem(event);\n          break;\n      }\n    };\n\n    // Ensure the item is scrolled into view\n    React.useEffect(() => {\n      if (props.selectedIndex > -1) {\n        fixedList.current?.scrollToItem(props.selectedIndex);\n      }\n    });\n\n    // Focus / Blur are used to track whether to show selection highlighting\n    const onFocus = (event: React.FocusEvent<HTMLDivElement>) => {\n      if (props.selectedIndex < 0) {\n        props.onSelectedIndexChanged(0);\n      }\n      event.stopPropagation();\n      event.preventDefault();\n    };\n\n    const onBlur = (event: React.FocusEvent<HTMLDivElement>) => {\n      event.stopPropagation();\n      event.preventDefault();\n    };\n\n    const classes = ['pm-insert-citation-source-panel-list-container'].concat(props.classes || []).join(' ');\n    switch (props.status) {\n      case CitationSourceListStatus.default:\n        if (props.citations.length > 0) {\n          return (\n            <div\n              tabIndex={0}\n              onKeyDown={handleListKeyDown}\n              onFocus={onFocus}\n              onBlur={onBlur}\n              ref={ref}\n              className={classes}\n            >\n              <FixedSizeList\n                className=\"pm-insert-citation-source-panel-list\"\n                height={props.height}\n                width=\"100%\"\n                itemCount={props.citations.length}\n                itemSize={props.itemHeight}\n                itemData={{\n                  selectedIndex: props.selectedIndex,\n                  onSelectedIndexChanged: props.onSelectedIndexChanged,\n                  citations: props.citations,\n                  citationsToAdd: props.citationsToAdd,\n                  onAddCitation: props.onAddCitation,\n                  onRemoveCitation: props.onRemoveCitation,\n                  onConfirm: props.onConfirm,\n                  showSeparator: true,\n                  showSelection: true,\n                  preventFocus: true,\n                  ui: props.ui,\n                }}\n                ref={fixedList}\n              >\n                {props.itemProvider}\n              </FixedSizeList>\n            </div>\n          );\n        } else {\n          return (\n            <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n              <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n            </div>\n          );\n        }\n\n      case CitationSourceListStatus.inProgress:\n        return (\n          <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n            <div className=\"pm-insert-citation-source-panel-list-noresults-text\">\n              <img src={props.ui.images.search_progress} className=\"pm-insert-citation-source-panel-list-progress\" />\n              {props.statusMessage}\n            </div>\n          </div>\n        );\n\n      case CitationSourceListStatus.noResults:\n        return (\n          <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n            <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n          </div>\n        );\n\n      case CitationSourceListStatus.error:\n        return (\n          <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n            <div className=\"pm-insert-citation-source-panel-list-noresults-text\">\n              {props.statusMessage || props.ui.context.translateText('An error occurred.')}\n            </div>\n          </div>\n        );\n\n      case CitationSourceListStatus.default:\n      default:\n        if (props.citations.length > 0) {\n          return (\n            <div\n              tabIndex={0}\n              onKeyDown={handleListKeyDown}\n              onFocus={onFocus}\n              onBlur={onBlur}\n              ref={ref}\n              className={classes}\n            >\n              <FixedSizeList\n                className=\"pm-insert-citation-source-panel-list\"\n                height={props.height}\n                width=\"100%\"\n                itemCount={props.citations.length}\n                itemSize={props.itemHeight}\n                itemData={{\n                  selectedIndex: props.selectedIndex,\n                  onSelectedIndexChanged: props.onSelectedIndexChanged,\n                  citations: props.citations,\n                  citationsToAdd: props.citationsToAdd,\n                  onAddCitation: props.onAddCitation,\n                  onRemoveCitation: props.onRemoveCitation,\n                  onConfirm: props.onConfirm,\n                  showSeparator: true,\n                  showSelection: true,\n                  preventFocus: true,\n                  ui: props.ui,\n                }}\n                ref={fixedList}\n              >\n                {props.itemProvider}\n              </FixedSizeList>\n            </div>\n          );\n        } else {\n          return (\n            <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n              <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n            </div>\n          );\n        }\n    }\n  },\n);\n","/*\n * insert_citation-source-panel-list-item.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { ListChildComponentProps } from 'react-window';\n\nimport { OutlineButton } from '../../../api/widgets/button';\n\nimport { CitationSourcePanelListItemData } from './insert_citation-source-panel-list';\n\nimport './insert_citation-source-panel-list-item.css';\n\nexport const CitationSourcePanelListItem = (props: ListChildComponentProps) => {\n  const citationListData: CitationSourcePanelListItemData = props.data;\n\n  const citationEntry = citationListData.citations[props.index];\n\n  // NOTE: Could consider making this length dynamic to account for item width\n  const maxIdLength = 30;\n  const id =\n    citationEntry.id.length > maxIdLength ? `@${citationEntry.id.substr(0, maxIdLength - 1)}…` : `@${citationEntry.id}`;\n  const authorWidth = Math.max(10, 50 - id.length);\n\n  // Wheher this item is selected\n  const selected = citationListData.showSelection && props.index === citationListData.selectedIndex;\n\n  // Whether this item is already in the list of items to add\n  // If the item is selected, it is always a candidate to be added explicitly to the list\n  const alreadyAdded = citationListData.citationsToAdd.map(src => src.id).includes(citationEntry.id) && !selected;\n\n  const onButtonClick = (event: React.MouseEvent) => {\n    event.stopPropagation();\n    event.preventDefault();\n\n    if (alreadyAdded) {\n      citationListData.onRemoveCitation(citationEntry);\n    } else {\n      citationListData.onAddCitation(citationEntry);\n    }\n  };\n\n  const onItemClick = (e: React.MouseEvent) => {\n    if (e.shiftKey) {\n      citationListData.onAddCitation(citationEntry);\n    } else {\n      citationListData.onSelectedIndexChanged(props.index);\n    }\n  };\n\n  const onDoubleClick = () => {\n    citationListData.onAddCitation(citationEntry);\n    citationListData.onConfirm();\n  };\n\n  return (\n    <div\n      onMouseDown={onItemClick}\n      onDoubleClick={onDoubleClick}\n      className=\"pm-insert-citation-source-panel-item\"\n      style={props.style}\n    >\n      <div className={`pm-insert-citation-source-panel-item-border ${selected ? 'pm-list-item-selected' : ''}`}>\n        <div className=\"pm-insert-citation-source-panel-item-container\">\n          <div className=\"pm-insert-citation-source-panel-item-type\">\n            {citationEntry.imageAdornment ? (\n              <img\n                className=\"pm-insert-citation-source-panel-item-adorn pm-block-border-color pm-background-color\"\n                src={citationEntry.imageAdornment}\n              />\n            ) : (\n              undefined\n            )}\n            <img\n              className=\"pm-insert-citation-source-panel-item-icon pm-block-border-color\"\n              src={citationEntry.image}\n            />\n          </div>\n          <div className=\"pm-insert-citation-source-panel-item-summary\">\n            <div className=\"pm-insert-citation-source-panel-item-id\">\n              <div className=\"pm-insert-citation-source-panel-item-title pm-fixedwidth-font pm-text-color\">{id}</div>\n              <div className=\"pm-insert-citation-source-panel-item-detail pm-text-color\">\n                {citationEntry.authors(authorWidth)} {citationEntry.date}\n              </div>\n            </div>\n            <div className=\"pm-insert-citation-source-panel-item-subtitle-text pm-text-color\">\n              {citationEntry.title}\n            </div>\n          </div>\n          <div className=\"pm-insert-citation-source-panel-item-button\">\n            <OutlineButton\n              tabIndex={citationListData.preventFocus ? -1 : 0}\n              style={{ width: '24px', height: '24px' }}\n              title={alreadyAdded ? '-' : '+'}\n              onClick={onButtonClick}\n            />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n","/*\n * insert_citation-panel-doi.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport { suggestCiteId, formatAuthors, formatIssuedDate } from '../../../api/cite';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\n\nimport {\n  CitationSourcePanelProps,\n  CitationSourcePanelProvider,\n  CitationListEntry,\n  CitationSourceListStatus,\n  errorForStatus,\n  matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\n\nimport './insert_citation-source-panel-doi.css';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nconst kDOIType = 'DOI Search';\n\nexport function doiSourcePanel(\n  ui: EditorUI,\n  server: DOIServer,\n  bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n  return {\n    key: '76561E2A-8FB7-4D4B-B235-9DD8B8270EA1',\n    panel: DOISourcePanel,\n    treeNode: () => {\n      return {\n        key: 'DOI',\n        name: ui.context.translateText('From DOI'),\n        image: ui.images.citations?.doi,\n        type: kDOIType,\n        children: [],\n        expanded: true,\n      };\n    },\n    typeAheadSearch: (_searchTerm: string, _selectedNode: NavigationTreeNode, _existingCitationIds: string[]) => {\n      return null;\n    },\n    progressMessage: ui.context.translateText('Looking up DOI....'),\n    placeHolderMessage: ui.context.translateText('Paste or enter a DOI to find citation data.'),\n    search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n      try {\n        const result = await server.fetchCSL(searchTerm, 1000);\n        if (result.status === 'ok') {\n\n          // Form the entry\n          const doi = searchTerm;\n          const csl = result.message;\n          const citation = matchExistingSourceCitationListEntry(doi, existingCitationIds, ui, bibliographyManager) || toCitationListEntry(csl, existingCitationIds, ui);\n\n          return Promise.resolve({\n            citations: citation ? [citation] : [],\n            status: CitationSourceListStatus.default,\n            statusMessage: '',\n          });\n        } else if (result.status === 'notfound') {\n          return Promise.resolve({\n            citations: [],\n            status: CitationSourceListStatus.noResults,\n            statusMessage: ui.context.translateText('No data for this DOI could be found.'),\n          });\n        } else {\n          return Promise.resolve({\n            citations: [],\n            status: CitationSourceListStatus.error,\n            statusMessage: errorForStatus(ui, result.status, 'for this DOI'),\n          });\n        }\n      } catch (e) {\n        logException(e);\n        return Promise.resolve({\n          citations: [],\n          status: CitationSourceListStatus.error,\n          statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n        });\n      }\n    },\n  };\n}\n\nexport const DOISourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n  (props: CitationSourcePanelProps, ref) => {\n    // When rendered, be sure that the item is selected\n    React.useEffect(() => {\n      if (props.citations.length > 0 && props.selectedIndex !== 0) {\n        props.onSelectedIndexChanged(0);\n      }\n    });\n\n    // Track whether we are mounted to allow a latent search that returns after the\n    // component unmounts to nmot mutate state further\n    return (\n      <CitationSourceLatentSearchPanel\n        height={props.height}\n        citations={props.citations}\n        citationsToAdd={props.citationsToAdd}\n        searchTerm={props.searchTerm}\n        onSearchTermChanged={props.onSearchTermChanged}\n        executeSearch={props.onExecuteSearch}\n        onAddCitation={props.onAddCitation}\n        onRemoveCitation={props.onRemoveCitation}\n        selectedIndex={props.selectedIndex}\n        onSelectedIndexChanged={props.onSelectedIndexChanged}\n        onConfirm={props.onConfirm}\n        searchPlaceholderText={props.ui.context.translateText('Paste a DOI to search')}\n        status={props.status}\n        statusMessage={props.statusMessage}\n        ui={props.ui}\n        ref={ref}\n      />\n    );\n  },\n);\n\nfunction toCitationListEntry(\n  csl: CSL | undefined,\n  existingCitationIds: string[],\n  ui: EditorUI,\n): CitationListEntry | undefined {\n  if (csl) {\n    const suggestedId = suggestCiteId(existingCitationIds, csl);\n    const providerKey = 'doi';\n    return {\n      id: suggestedId,\n      isIdEditable: true,\n      type: csl.type,\n      title: csl.title || csl['short-title'] || csl['original-title'] || '',\n      date: formatIssuedDate(csl.issued),\n      journal: csl['container-title'] || csl['short-container-title'] || csl.publisher,\n      doi: csl.DOI,\n      image: imageForType(ui.images, csl.type)[0],\n      authors: (length: number) => {\n        return formatAuthors(csl.author, length);\n      },\n      toBibliographySource: (finalId: string) => {\n        return Promise.resolve({ ...csl, id: finalId, providerKey });\n      },\n      isSlowGeneratingBibliographySource: false,\n    };\n  }\n  return undefined;\n}\n","/*\n * insert_citation-source-panel-search-latent.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\nimport { TextInput } from '../../../api/widgets/text';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { CitationSourceList } from './insert_citation-source-panel-list';\nimport { TextButton } from '../../../api/widgets/button';\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\n\nimport './insert_citation-source-panel-latent-search.css';\nimport { CitationSourcePanelListItemDetailed } from './insert_citation-source-panel-list-item-detailed';\n\nexport interface CitationSourceLatentSearchPanelProps extends WidgetProps {\n  height: number;\n  citations: CitationListEntry[];\n  citationsToAdd: CitationListEntry[];\n  searchTerm: string;\n  onSearchTermChanged: (searchTerm: string) => void;\n  executeSearch: (searchTerm: string) => void;\n  selectedIndex: number;\n  onSelectedIndexChanged: (index: number) => void;\n  onAddCitation: (citation: CitationListEntry) => void;\n  onRemoveCitation: (citation: CitationListEntry) => void;\n  onConfirm: VoidFunction;\n  ui: EditorUI;\n  searchPlaceholderText?: string;\n  status: CitationSourceListStatus;\n  statusMessage: string;\n}\n\nconst kSearchBoxHeightWithMargin = 38;\n\nexport const CitationSourceLatentSearchPanel = React.forwardRef<HTMLDivElement, CitationSourceLatentSearchPanelProps>(\n  (props, ref) => {\n    const listContainer = React.useRef<HTMLDivElement>(null);\n    const pasted = React.useRef<boolean>(false);\n    const lastSearch = React.useRef<string>('');\n\n    const performSearch = (searchTerm: string) => {\n      props.executeSearch(searchTerm);\n      lastSearch.current = searchTerm;\n      pasted.current = false;\n    };\n\n    // Search the user search terms\n    const searchChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n      const search = e.target.value;\n      if (pasted.current) {\n        performSearch(search);\n      } else {\n        props.onSearchTermChanged(search);\n      }\n    };\n\n    // If the user arrows down in the search text box, advance to the list of items\n    const handleTextKeyDown = (event: React.KeyboardEvent) => {\n      switch (event.key) {\n        case 'ArrowDown':\n          event.preventDefault();\n          event.stopPropagation();\n          listContainer.current?.focus();\n          break;\n        case 'Enter':\n          if (lastSearch.current !== props.searchTerm || props.selectedIndex < 0) {\n            event.preventDefault();\n            event.stopPropagation();\n            performSearch(props.searchTerm);\n          }\n          break;\n      }\n    };\n\n    const handleButtonClick = () => {\n      performSearch(props.searchTerm);\n    };\n\n    const onPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n      pasted.current = true;\n    };\n\n    // Used to focus the search box\n    const searchBoxRef = React.useRef<HTMLInputElement>(null);\n\n    const focusSearch = () => {\n      searchBoxRef.current?.focus();\n    };\n\n    // Allow the search box to gain focus the first time the enclosing\n    // container div receives focus.\n    const initialFocusSet = React.useRef<boolean>(false);\n    const parentFocused = () => {\n      if (!initialFocusSet.current) {\n        focusSearch();\n        initialFocusSet.current = true;\n      }\n    };\n\n    const onAddCitation = (citation: CitationListEntry) => {\n      props.onAddCitation(citation);\n      focusSearch();\n    };\n\n    return (\n      <div\n        style={props.style}\n        className=\"pm-insert-citation-panel-latent-search\"\n        ref={ref}\n        tabIndex={-1}\n        onFocus={parentFocused}\n      >\n        <div className=\"pm-insert-citation-panel-latent-search-textbox-container\">\n          <TextInput\n            value={props.searchTerm}\n            width=\"100%\"\n            iconAdornment={props.ui.images.search}\n            tabIndex={0}\n            className=\"pm-insert-citation-panel-latent-search-textbox pm-block-border-color\"\n            placeholder={props.searchPlaceholderText}\n            onKeyDown={handleTextKeyDown}\n            onChange={searchChanged}\n            onPaste={onPaste}\n            ref={searchBoxRef}\n          />\n\n          <TextButton\n            title={props.ui.context.translateText('Search')}\n            classes={['pm-insert-citation-panel-latent-search-button']}\n            onClick={handleButtonClick}\n            disabled={props.status === CitationSourceListStatus.inProgress}\n          />\n        </div>\n\n        <div className=\"pm-insert-citation-panel-latent-search-list-container\">\n          <CitationSourceList\n            height={props.height - kSearchBoxHeightWithMargin}\n            citations={props.citations}\n            citationsToAdd={props.citationsToAdd}\n            onAddCitation={onAddCitation}\n            onRemoveCitation={props.onRemoveCitation}\n            selectedIndex={props.selectedIndex}\n            onSelectedIndexChanged={props.onSelectedIndexChanged}\n            focusPrevious={focusSearch}\n            onConfirm={props.onConfirm}\n            ui={props.ui}\n            itemHeight={100}\n            itemProvider={CitationSourcePanelListItemDetailed}\n            status={props.status}\n            statusMessage={props.statusMessage}\n            classes={['pm-insert-citation-panel-latent-search-list', 'pm-block-border-color', 'pm-background-color']}\n            ref={listContainer}\n          />\n        </div>\n      </div>\n    );\n  },\n);\n","/*\n * insert_citation-source-panel-list-item.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { ListChildComponentProps } from 'react-window';\n\nimport { OutlineButton } from '../../../api/widgets/button';\n\nimport { CitationSourcePanelListItemData } from './insert_citation-source-panel-list';\n\nimport './insert_citation-source-panel-list-item-detailed.css';\n\nexport const CitationSourcePanelListItemDetailed = (props: ListChildComponentProps) => {\n  const citationListData: CitationSourcePanelListItemData = props.data;\n\n  const citationEntry = citationListData.citations[props.index];\n\n  // Wheher this item is selected\n  const selected = citationListData.showSelection && props.index === citationListData.selectedIndex;\n\n  // Whether this item is already in the list of items to add\n  // If the item is selected, it is always a candidate to be added explicitly to the list\n  const alreadyAdded = citationListData.citationsToAdd.map(src => src.id).includes(citationEntry.id) && !selected;\n\n  const onButtonClick = (event: React.MouseEvent) => {\n    event.stopPropagation();\n    event.preventDefault();\n\n    if (alreadyAdded) {\n      citationListData.onRemoveCitation(citationEntry);\n    } else {\n      citationListData.onAddCitation(citationEntry);\n    }\n  };\n\n  const onItemClick = () => {\n    citationListData.onSelectedIndexChanged(props.index);\n  };\n\n  const onDoubleClick = () => {\n    citationListData.onAddCitation(citationEntry);\n    citationListData.onConfirm();\n  };\n\n  const secondLine = [citationEntry.date, citationEntry.journal].filter(text => text).join(', ');\n  const thirdLine = citationEntry.authors(80);\n\n  return (\n    <div\n      onMouseDown={onItemClick}\n      onDoubleClick={onDoubleClick}\n      className=\"pm-insert-citation-source-panel-item-detailed\"\n      style={props.style}\n    >\n      <div\n        className={`pm-insert-citation-source-panel-item-detailed-border ${selected ? 'pm-list-item-selected' : ''}`}\n      >\n        <div className=\"pm-insert-citation-source-panel-item-detailed-container\">\n          <div className=\"pm-insert-citation-source-panel-item-detailed-type\">\n            {citationEntry.imageAdornment ? (\n              <img\n                className=\"pm-insert-citation-source-panel-item-detailed-adorn pm-block-border-color pm-background-color\"\n                src={citationEntry.imageAdornment}\n              />\n            ) : (\n              undefined\n            )}\n            <img\n              className=\"pm-insert-citation-source-panel-item-detailed-icon pm-block-border-color\"\n              src={citationEntry.image}\n            />\n          </div>\n          <div className=\"pm-insert-citation-source-panel-item-detailed-summary\">\n            <div className=\"pm-insert-citation-source-panel-item-detailed-title pm-fixedwidth-font pm-text-color\">\n              {citationEntry.title}\n            </div>\n            <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">\n              {secondLine}\n            </div>\n            <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">{thirdLine}</div>\n            <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">\n              <a href={`https://doi.org/${citationEntry.doi}`} target=\"_new\">\n                {citationEntry.doi}\n              </a>\n            </div>\n          </div>\n          <div className=\"pm-insert-citation-source-panel-item-detailed-button\">\n            <OutlineButton\n              tabIndex={citationListData.preventFocus ? -1 : 0}\n              style={{ width: '24px', height: '24px' }}\n              title={alreadyAdded ? '-' : '+'}\n              onClick={onButtonClick}\n            />\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n","/*\n * insert_citation-source-panel-crossref.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { suggestCiteId, formatAuthors, formatIssuedDate } from '../../../api/cite';\nimport { CrossrefWork, imageForCrossrefType, CrossrefServer, prettyType } from '../../../api/crossref';\nimport { sanitizeForCiteproc, CSL } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n  CitationSourcePanelProps,\n  CitationSourcePanelProvider,\n  CitationListEntry,\n  CitationSourceListStatus,\n  matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nexport function crossrefSourcePanel(\n  ui: EditorUI,\n  server: CrossrefServer,\n  doiServer: DOIServer,\n  bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n  const kCrossrefType = 'Crossref';\n  return {\n    key: 'E38370AA-78AE-450B-BBE8-878E1C817C04',\n    panel: CrossRefSourcePanel,\n    treeNode: () => {\n      return {\n        key: 'CrossRef',\n        name: ui.context.translateText('Crossref'),\n        image: ui.images.citations?.crossref,\n        type: kCrossrefType,\n        children: [],\n        expanded: true,\n      };\n    },\n    typeAheadSearch: (_searchTerm: string, _selectedNode: NavigationTreeNode, _existingCitationIds: string[]) => {\n      return null;\n    },\n    progressMessage: ui.context.translateText('Searching Crossref....'),\n    placeHolderMessage: ui.context.translateText('Enter search terms to search Crossref'),\n    search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n      try {\n        const works = await server.works(searchTerm);\n        const existingSources = bibliographyManager.localSources();\n\n        const dedupeCitationIds = existingCitationIds;\n        const citationEntries = works.items.map(work => {\n          const citationEntry = matchExistingSourceCitationListEntry(work.DOI, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(work, dedupeCitationIds, ui, doiServer);\n          if (citationEntry) {\n            // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n            dedupeCitationIds.push(citationEntry.id);\n          }\n          return citationEntry;\n        });\n\n        return Promise.resolve({\n          citations: citationEntries,\n          status: citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n          statusMessage:\n            citationEntries.length > 0 ? '' : ui.context.translateText('No results matching these search terms.'),\n        });\n      } catch (e) {\n        logException(e);\n        return Promise.resolve({\n          citations: [],\n          status: CitationSourceListStatus.error,\n          statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n        });\n      }\n    },\n  };\n}\n\nexport const CrossRefSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n  (props: CitationSourcePanelProps, ref) => {\n    return (\n      <CitationSourceLatentSearchPanel\n        height={props.height}\n        citations={props.citations}\n        citationsToAdd={props.citationsToAdd}\n        searchTerm={props.searchTerm}\n        onSearchTermChanged={props.onSearchTermChanged}\n        executeSearch={props.onExecuteSearch}\n        onAddCitation={props.onAddCitation}\n        onRemoveCitation={props.onRemoveCitation}\n        selectedIndex={props.selectedIndex}\n        onSelectedIndexChanged={props.onSelectedIndexChanged}\n        onConfirm={props.onConfirm}\n        searchPlaceholderText={props.ui.context.translateText('Search Crossref for Citations')}\n        status={props.status}\n        statusMessage={props.statusMessage}\n        ui={props.ui}\n        ref={ref}\n      />\n    );\n  },\n);\n\nfunction toCitationListEntry(\n  crossrefWork: CrossrefWork,\n  existingIds: string[],\n  ui: EditorUI,\n  doiServer: DOIServer,\n): CitationListEntry {\n  const coercedCSL = sanitizeForCiteproc((crossrefWork as unknown) as CSL);\n  const id = suggestCiteId(existingIds, coercedCSL);\n  const providerKey = 'crossref';\n  return {\n    id,\n    isIdEditable: true,\n    title: crossrefWorkTitle(crossrefWork, ui),\n    type: prettyType(ui, crossrefWork.type),\n    date: formatIssuedDate(crossrefWork.issued),\n    journal: crossrefWork['container-title'] || crossrefWork['short-container-title'] || crossrefWork.publisher,\n    image: imageForCrossrefType(ui, crossrefWork.type)[0],\n    doi: crossrefWork.DOI,\n    authors: (length: number) => {\n      return formatAuthors(coercedCSL.author, length);\n    },\n    toBibliographySource: async (finalId: string) => {\n      // Generate CSL using the DOI\n      const doiResult = await doiServer.fetchCSL(crossrefWork.DOI, -1);\n\n      const csl = doiResult.message as CSL;\n      return { ...csl, id: finalId, providerKey };\n    },\n    isSlowGeneratingBibliographySource: true,\n  };\n}\n\nfunction crossrefWorkTitle(work: CrossrefWork, ui: EditorUI) {\n  if (work.title) {\n    return work.title[0];\n  } else {\n    return ui.context.translateText('(Untitled)');\n  }\n}\n","/*\n * insert_citation-source-panel-pubmed.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\nimport { createUniqueCiteId } from '../../../api/cite';\nimport { CSL, sanitizeForCiteproc } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { PubMedServer, PubMedDocument, suggestCiteId, imageForType } from '../../../api/pubmed';\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n  CitationSourcePanelProps,\n  CitationSourcePanelProvider,\n  CitationListEntry,\n  CitationSourceListStatus,\n  errorForStatus,\n  matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\n\nexport function pubmedSourcePanel(\n  ui: EditorUI,\n  server: PubMedServer,\n  doiServer: DOIServer,\n  bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n  const kPubmedType = 'Pubmed';\n  return {\n    key: 'EF556233-05B0-4678-8216-38061908463F',\n    panel: PubmedSourcePanel,\n    treeNode: () => {\n      return {\n        key: 'PubMed',\n        name: ui.context.translateText('PubMed'),\n        image: ui.images.citations?.pubmed,\n        type: kPubmedType,\n        children: [],\n        expanded: true,\n      };\n    },\n    typeAheadSearch: (_searchTerm: string, _selectedNode: NavigationTreeNode, _existingCitationIds: string[]) => {\n      return null;\n    },\n    progressMessage: ui.context.translateText('Searching PubMed....'),\n    placeHolderMessage: ui.context.translateText('Enter a PubMed query to search for citations.'),\n    search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n      try {\n        const noResultsMessage = ui.context.translateText('No results matching these search terms.');\n\n        // Do the PubMed Search\n        const pubMedResult = await server.search(searchTerm);\n        switch (pubMedResult.status) {\n          case 'ok':\n            if (pubMedResult.message !== null) {\n              // There is a message\n              // PubMed Results and Existing Ids\n              const docs: PubMedDocument[] = pubMedResult.message;\n              const dedupeCitationIds = existingCitationIds;\n\n              // Create Citation List Entries for these PubMed docs\n              const citationEntries = docs.map(doc => {\n                const citationEntry = matchExistingSourceCitationListEntry(doc.doi, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(doc, dedupeCitationIds, ui, doiServer);\n                if (citationEntry && citationEntry.id) {\n                  // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n                  dedupeCitationIds.push(citationEntry.id);\n                }\n                return citationEntry;\n              });\n\n              // Return the search result\n              return Promise.resolve({\n                citations: citationEntries,\n                status:\n                  citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n                statusMessage: citationEntries.length > 0 ? '' : noResultsMessage,\n              });\n            } else {\n              // No message, no results\n              return Promise.resolve({\n                citations: [],\n                status: CitationSourceListStatus.noResults,\n                statusMessage: noResultsMessage,\n              });\n            }\n\n          default:\n            // Resolve with Error\n            return Promise.resolve({\n              citations: [],\n              status: CitationSourceListStatus.error,\n              statusMessage: ui.context.translateText(errorForStatus(ui, pubMedResult.status, 'PubMed')),\n            });\n        }\n      } catch (e) {\n        logException(e);\n        return Promise.resolve({\n          citations: [],\n          status: CitationSourceListStatus.error,\n          statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n        });\n      }\n    },\n  };\n}\n\nexport const PubmedSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n  (props: CitationSourcePanelProps, ref) => {\n    return (\n      <CitationSourceLatentSearchPanel\n        height={props.height}\n        citations={props.citations}\n        citationsToAdd={props.citationsToAdd}\n        searchTerm={props.searchTerm}\n        onSearchTermChanged={props.onSearchTermChanged}\n        executeSearch={props.onExecuteSearch}\n        onAddCitation={props.onAddCitation}\n        onRemoveCitation={props.onRemoveCitation}\n        selectedIndex={props.selectedIndex}\n        onSelectedIndexChanged={props.onSelectedIndexChanged}\n        onConfirm={props.onConfirm}\n        searchPlaceholderText={props.ui.context.translateText('Search PubMed for Citations')}\n        status={props.status}\n        statusMessage={props.statusMessage}\n        ui={props.ui}\n        ref={ref}\n      />\n    );\n  },\n);\n\nfunction toCitationListEntry(\n  doc: PubMedDocument,\n  existingIds: string[],\n  ui: EditorUI,\n  doiServer: DOIServer,\n): CitationListEntry {\n  const id = createUniqueCiteId(existingIds, suggestCiteId(doc));\n  const providerKey = 'pubmed';\n  return {\n    id,\n    isIdEditable: true,\n    title: doc.title || '',\n    doi: doc.doi,\n    type: '',\n    date: doc.pubDate || '',\n    journal: doc.source,\n    authors: (length: number) => {\n      return formatAuthors(doc.authors || [], length);\n    },\n    image: imageForType(ui, doc.pubTypes)[0],\n    toBibliographySource: async (finalId: string) => {\n      // Generate CSL using the DOI\n      const doiResult = await doiServer.fetchCSL(doc.doi, -1);\n      const csl = doiResult.message as CSL;\n      const sanitizedCSL = sanitizeForCiteproc(csl);\n      return { ...sanitizedCSL, id: finalId, providerKey };\n    },\n    isSlowGeneratingBibliographySource: true,\n  };\n}\n\nfunction formatAuthors(authors: string[], length: number) {\n  return authors.join(',');\n}\n","/*\n * pubmed.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUI } from './ui';\n\nexport interface PubMedResult {\n  status: 'ok' | 'notfound' | 'nohost' | 'error';\n  message: PubMedDocument[] | null;\n  error: string;\n}\n\nexport interface PubMedDocument {\n  doi: string;\n  pubTypes?: string[];\n  authors?: string[];\n  sortFirstAuthor?: string;\n  title?: string;\n  source?: string;\n  volume?: string;\n  issue?: string;\n  pubDate?: string;\n}\n\nexport interface PubMedServer {\n  search: (query: string) => Promise<PubMedResult>;\n}\n\nexport function suggestCiteId(doc: PubMedDocument): string {\n  // Try to get the last name. Prefer the sort first author,\n  // but otherwise just use the first author (if any)\n  let suggestedId = '';\n  if (doc.sortFirstAuthor) {\n    suggestedId = doc.sortFirstAuthor.split(' ')[0];\n  } else if (doc.authors && doc.authors.length > 0) {\n    suggestedId = doc.authors[0].split(' ')[0];\n  }\n\n  // Try to read the year\n  if (doc.pubDate) {\n    suggestedId = suggestedId + doc.pubDate.split(' ')[0];\n  }\n  return suggestedId;\n}\n\nexport function imageForType(ui: EditorUI, pubTypes?: string[]): [string?, string?] {\n  const type = pubTypes && pubTypes.length > 0 ? pubTypes[0] : '';\n  switch (type) {\n    case 'Journal Article':\n    case 'Historical Article':\n    case 'Classical Article':\n    case 'Introductory Journal Article':\n    case 'paper-conference':\n      return [ui.images.citations?.article, ui.images.citations?.article_dark];\n    case 'Legal Case':\n    case 'Legislation':\n      return [ui.images.citations?.legal, ui.images.citations?.legal_dark];\n    case 'Dataset':\n      return [ui.images.citations?.data, ui.images.citations?.data_dark];\n    case 'Video-Audio Media':\n      return [ui.images.citations?.movie, ui.images.citations?.movie_dark];\n    case 'Webcasts':\n      return [ui.images.citations?.web, ui.images.citations?.web_dark];\n    default:\n      return [ui.images.citations?.other, ui.images.citations?.other_dark];\n  }\n}\n","/*\n * insert_citation-source-panel-pubmed.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { createUniqueCiteId } from '../../../api/cite';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { DataCiteServer, DataCiteRecord, suggestCiteId, DataCiteCreator } from '../../../api/datacite';\nimport { DOIServer } from '../../../api/doi';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { logException } from '../../../api/log';\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n  CitationSourcePanelProps,\n  CitationSourcePanelProvider,\n  CitationListEntry,\n  CitationSourceListStatus,\n  errorForStatus,\n  matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nexport function dataciteSourcePanel(\n  ui: EditorUI,\n  server: DataCiteServer,\n  doiServer: DOIServer,\n  bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n  const kDataCiteType = 'Datacite';\n  return {\n    key: '66A6EADB-22AE-4DDD-BCD5-70BC0DEB8FB3',\n    panel: DataCiteSourcePanel,\n    treeNode: () => {\n      return {\n        key: 'DataCite',\n        name: ui.context.translateText('DataCite'),\n        image: ui.images.citations?.datacite,\n        type: kDataCiteType,\n        children: [],\n        expanded: true,\n      };\n    },\n    typeAheadSearch: (_searchTerm: string, _selectedNode: NavigationTreeNode, _existingCitationIds: string[]) => {\n      return null;\n    },\n    progressMessage: ui.context.translateText('Searching DataCite....'),\n    placeHolderMessage: ui.context.translateText('Enter search terms to search DataCite'),\n    search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n      try {\n        const dataciteResult = await server.search(searchTerm);\n        const noResultsMessage = ui.context.translateText('No results matching these search terms.');\n        switch (dataciteResult.status) {\n          case 'ok':\n            if (dataciteResult.message !== null) {\n              const records: DataCiteRecord[] = dataciteResult.message;\n              const dedupeCitationIds = existingCitationIds;\n              const citationEntries = records.map(record => {\n                const citationEntry = matchExistingSourceCitationListEntry(record.doi, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(record, dedupeCitationIds, ui, doiServer);\n                if (citationEntry) {\n                  // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n                  dedupeCitationIds.push(citationEntry.id);\n                }\n                return citationEntry;\n              });\n              return Promise.resolve({\n                citations: citationEntries,\n                status:\n                  citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n                statusMessage: citationEntries.length > 0 ? '' : noResultsMessage,\n              });\n            } else {\n              // No results\n              return Promise.resolve({\n                citations: [],\n                status: CitationSourceListStatus.noResults,\n                statusMessage: noResultsMessage,\n              });\n            }\n          default:\n            // Resolve with Error\n            return Promise.resolve({\n              citations: [],\n              status: CitationSourceListStatus.error,\n              statusMessage: ui.context.translateText(errorForStatus(ui, dataciteResult.status, 'DataCite')),\n            });\n        }\n      } catch (e) {\n        logException(e);\n        return Promise.resolve({\n          citations: [],\n          status: CitationSourceListStatus.error,\n          statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n        });\n      }\n    },\n  };\n}\n\nexport const DataCiteSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n  (props: CitationSourcePanelProps, ref) => {\n    return (\n      <CitationSourceLatentSearchPanel\n        height={props.height}\n        citations={props.citations}\n        citationsToAdd={props.citationsToAdd}\n        searchTerm={props.searchTerm}\n        onSearchTermChanged={props.onSearchTermChanged}\n        executeSearch={props.onExecuteSearch}\n        onAddCitation={props.onAddCitation}\n        onRemoveCitation={props.onRemoveCitation}\n        selectedIndex={props.selectedIndex}\n        onSelectedIndexChanged={props.onSelectedIndexChanged}\n        onConfirm={props.onConfirm}\n        searchPlaceholderText={props.ui.context.translateText('Search DataCite for Citations')}\n        status={props.status}\n        statusMessage={props.statusMessage}\n        ui={props.ui}\n        ref={ref}\n      />\n    );\n  },\n);\n\nfunction toCitationListEntry(\n  record: DataCiteRecord,\n  existingIds: string[],\n  ui: EditorUI,\n  doiServer: DOIServer,\n): CitationListEntry {\n  const id = createUniqueCiteId(existingIds, suggestCiteId(record));\n  const providerKey = 'datacite';\n  return {\n    id,\n    isIdEditable: true,\n    title: record.title || '',\n    type: record.type || '',\n    date: record.publicationYear?.toString() || '',\n    journal: record.publisher,\n    image: imageForType(ui.images, record.type || '')[0],\n    doi: record.doi,\n    authors: (length: number) => {\n      return formatAuthors(record.creators || [], length);\n    },\n    toBibliographySource: async (finalId: string) => {\n      // Generate CSL using the DOI\n      const doiResult = await doiServer.fetchCSL(record.doi, -1);\n\n      const csl = doiResult.message as CSL;\n      return { ...csl, id: finalId, providerKey };\n    },\n    isSlowGeneratingBibliographySource: true,\n  };\n}\n\nfunction formatAuthors(authors: DataCiteCreator[], length: number) {\n  return authors.map(creator => creator.fullName).join(',');\n}\n","/*\n * datacite.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface DataCiteResult {\n  status: 'ok' | 'notfound' | 'nohost' | 'error';\n  message: DataCiteRecord[] | null;\n  error: string;\n}\n\nexport interface DataCiteRecord {\n  doi: string;\n  title?: string;\n  publisher?: string;\n  publicationYear?: number;\n  creators?: DataCiteCreator[];\n  type?: string; // citeproc type\n}\n\nexport interface DataCiteCreator {\n  fullName: string;\n  familyName?: string;\n  givenName?: string;\n}\n\nexport interface DataCiteServer {\n  search: (query: string) => Promise<DataCiteResult>;\n}\n\nexport function suggestCiteId(record: DataCiteRecord): string {\n  // Try to use the last name (or the first name)\n  let suggestedId = '';\n  if (record.creators && record.creators.length > 0) {\n    suggestedId = record.creators[0].familyName || record.creators[0].fullName;\n  }\n\n  // Try to read the year\n  if (record.publicationYear) {\n    suggestedId = suggestedId + record.publicationYear;\n  }\n  return suggestedId;\n}\n","/*\n * insert_citation-picker-bibliography.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { changeExtension } from '../../api/path';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { TextInput } from '../../api/widgets/text';\nimport { SelectInput } from '../../api/widgets/select';\nimport { BibliographyFile, BibliographyType } from '../../api/bibliography/bibliography';\n\nimport './insert_citation-bibliography-picker.css';\n\nexport interface CitationBiblographyPickerProps extends WidgetProps {\n  bibliographyTypes: BibliographyType[];\n  bibliographyFiles: BibliographyFile[];\n  onBiblographyFileChanged: (file: BibliographyFile) => void;\n  createBibliographyFileName: string;\n  onCreateBibliographyFileNameChanged: (fileName: string) => void;\n  ui: EditorUI;\n}\n\nexport const CitationBibliographyPicker: React.FC<CitationBiblographyPickerProps> = props => {\n  // Selection of file from list\n  const onChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n    const index = e.target.selectedIndex;\n    props.onBiblographyFileChanged(props.bibliographyFiles[index]);\n  };\n\n  // Change to the file we should create\n  const onTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const text = e.target.value;\n    props.onCreateBibliographyFileNameChanged(text);\n  };\n\n  // File type change\n  const onTypeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n    const index = e.target.selectedIndex;\n    const type = props.bibliographyTypes[index];\n    const newPath = changeExtension(props.createBibliographyFileName, type.extension);\n    props.onCreateBibliographyFileNameChanged(newPath);\n    props.ui.prefs.setBibliographyDefaultType(type.extension);\n  };\n\n  return (\n    <div className=\"pm-citation-bibliography-picker-container\" style={props.style}>\n      <div className=\"pm-citation-bibliography-picker-label pm-text-color\">\n        {props.bibliographyFiles.length > 0\n          ? props.ui.context.translateText('Add to bibliography:')\n          : props.ui.context.translateText('Create bibliography:')}\n      </div>\n      {props.bibliographyFiles.length > 0 ? (\n        <SelectInput onChange={onChange}>\n          {props.bibliographyFiles.map(file => (\n            <option key={file.fullPath} value={file.fullPath}>\n              {file.displayPath}\n            </option>\n          ))}\n        </SelectInput>\n      ) : (\n        <div className=\"pm-citation-bibliography-picker-create-controls\">\n          <TextInput\n            width=\"100\"\n            tabIndex={0}\n            className=\"pm-citation-bibliography-picker-textbox pm-block-border-color\"\n            placeholder={props.ui.context.translateText('Bibligraphy file name')}\n            value={props.createBibliographyFileName}\n            onChange={onTextChange}\n          />\n          <div className=\"pm-citation-bibliography-format-label pm-text-color\">\n            {props.ui.context.translateText('Format:')}\n          </div>\n          <SelectInput\n            onChange={onTypeChange}\n            defaultValue={props.bibliographyTypes.find(bibType => bibType.default)?.extension}\n          >\n            {props.bibliographyTypes.map(bibType => (\n              <option key={bibType.extension} value={bibType.extension}>\n                {bibType.displayName}\n              </option>\n            ))}\n          </SelectInput>\n        </div>\n      )}\n    </div>\n  );\n};\n","/*\n * text.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, KeyboardEventHandler, FocusEventHandler, ClipboardEventHandler } from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './text.css';\n\nexport interface CheckboxInputProps extends WidgetProps {\n  id?: string;\n  tabIndex?: number;\n  className?: string;\n  checked?: boolean;\n  onChange?: ChangeEventHandler;\n}\n\nexport const CheckboxInput= React.forwardRef<HTMLInputElement, CheckboxInputProps>((props, ref) => {\n  const style: React.CSSProperties = {\n    ...props.style,\n  };\n\n  return (\n      <input\n        id={props.id} \n        type=\"checkbox\"\n        className={`\n          pm-input-checkbox\n          pm-text-color \n          pm-background-color \n          ${props.className}`}\n        checked={props.checked}\n        onChange={props.onChange}\n        tabIndex={props.tabIndex}\n        ref={ref}\n      />\n  );\n});\n\n\n","/*\n * span.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Fragment, Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ExtensionContext } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { EditorUI } from '../api/ui';\nimport { markIsActive, getMarkAttrs, getSelectionMarkRange } from '../api/mark';\nimport { PandocOutput, PandocTokenType, PandocToken } from '../api/pandoc';\nimport {\n  pandocAttrSpec,\n  pandocAttrReadAST,\n  pandocAttrParseDom,\n  pandocAttrToDomAttr,\n  kSpanAttr,\n  kSpanChildren,\n} from '../api/pandoc_attr';\n\nconst extension = (context: ExtensionContext) => {\n  const { pandocExtensions, ui } = context;\n\n  if (!pandocExtensions.bracketed_spans && !pandocExtensions.native_spans) {\n    return null;\n  }\n\n  return {\n    marks: [\n      {\n        name: 'span',\n        spec: {\n          group: 'formatting',\n          attrs: pandocAttrSpec,\n          inclusive: false,\n          parseDOM: [\n            {\n              tag: 'span[data-span=\"1\"]',\n              getAttrs(dom: Node | string) {\n                const attrs: {} = { 'data-span': 1 };\n                return {\n                  ...attrs,\n                  ...pandocAttrParseDom(dom as Element, attrs),\n                };\n              },\n            },\n          ],\n          toDOM(mark: Mark): DOMOutputSpec {\n            const attr = {\n              'data-span': '1',\n              ...pandocAttrToDomAttr({\n                ...mark.attrs,\n                classes: [...mark.attrs.classes, 'pm-span pm-span-background-color'],\n              }),\n            };\n            return ['span', attr];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Span,\n              mark: 'span',\n              getAttrs: (tok: PandocToken) => {\n                return pandocAttrReadAST(tok, kSpanAttr);\n              },\n              getChildren: (tok: PandocToken) => tok.c[kSpanChildren],\n            },\n          ],\n          writer: {\n            priority: 11,\n            write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n              output.writeToken(PandocTokenType.Span, () => {\n                output.writeAttr(mark.attrs.id, mark.attrs.classes, mark.attrs.keyvalue);\n                output.writeArray(() => {\n                  output.writeInlines(parent);\n                });\n              });\n            },\n          },\n        },\n      },\n    ],\n\n    commands: (_schema: Schema) => {\n      return [new SpanCommand(ui)];\n    },\n  };\n};\n\nclass SpanCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI) {\n    super(EditorCommandId.Span, [], (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n      const schema = state.schema;\n\n      // if there is no contiguous selection and no existing span mark active\n      // then the command should be disabled (unknown what the span target is)\n      if (!markIsActive(state, schema.marks.span) && state.selection.empty) {\n        return false;\n      }\n\n      // if the current node doesn't allow this mark return false\n      if (!state.selection.$from.node().type.allowsMarkType(schema.marks.span)) {\n        return false;\n      }\n\n      async function asyncEditSpan() {\n        if (dispatch) {\n          let attr: { [key: string]: any } = { id: null, classes: [], keyvalue: [] };\n          if (markIsActive(state, schema.marks.span)) {\n            attr = getMarkAttrs(state.doc, state.selection, schema.marks.span);\n          }\n          const result = await ui.dialogs.editSpan(attr);\n          if (result) {\n            const tr = state.tr;\n            const range = getSelectionMarkRange(state.selection, schema.marks.span);\n            tr.removeMark(range.from, range.to, schema.marks.span);\n            if (result.action === 'edit') {\n              const mark = schema.marks.span.create(result.attr);\n              tr.addMark(range.from, range.to, mark);\n            }\n            dispatch(tr);\n          }\n        }\n        if (view) {\n          view.focus();\n        }\n      }\n      asyncEditSpan();\n\n      return true;\n    });\n  }\n}\n\nexport default extension;\n","/*\n * xref.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode, Mark, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Transform } from 'prosemirror-transform';\n\nimport { setTextSelection, findChildren, findChildrenByMark } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { detectAndApplyMarks, removeInvalidatedMarks, getMarkRange } from '../../api/mark';\nimport { MarkTransaction, trTransform } from '../../api/transaction';\nimport { FixupContext } from '../../api/fixup';\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { fragmentText } from '../../api/fragment';\nimport { PandocOutput } from '../../api/pandoc';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { xrefCompletionHandler } from './xref-completion';\nimport { xrefPopupPlugin } from './xref-popup';\n\nconst kRefRegExDetectAndApply = /(?:^|[^`])(\\\\?@ref\\([ A-Za-z0-9:-]*\\))/g;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, format, ui, navigation, server } = context;\n\n  if (!format.rmdExtensions.bookdownXRef) {\n    return null;\n  }\n\n  return {\n    marks: [\n      {\n        name: 'xref',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          inclusive: false,\n          excludes: 'formatting',\n          attrs: {},\n          parseDOM: [\n            {\n              tag: \"span[class*='xref']\",\n            },\n          ],\n          toDOM(_mark: Mark) {\n            return ['span', { class: 'xref pm-link-text-color pm-fixedwidth-font' }];\n          },\n        },\n        pandoc: {\n          readers: [],\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              // alias xref (may need to transform it to deal with \\ prefix)\n              let xref = parent;\n\n              // if it starts with a \\ then don't write the slash (pandoc will\n              // either create one automatically or we'll write one explicitly\n              // if pandoc won't b/c it doesn't have all_symbols_escapable)\n              if (fragmentText(xref).startsWith('\\\\')) {\n                xref = xref.cut(1, xref.size);\n              }\n\n              // if all symbols aren't escapable then we need an explicit \\\n              // (because pandoc won't automatically escape the \\)\n              if (!pandocExtensions.all_symbols_escapable) {\n                output.writeRawMarkdown('\\\\');\n              }\n\n              // write xref\n              output.writeInlines(xref);\n            },\n          },\n        },\n      },\n    ],\n\n    fixups: (schema: Schema) => {\n      return [\n        (tr: Transaction, fixupContext: FixupContext) => {\n          if (fixupContext === FixupContext.Load) {\n            // apply marks\n            const markType = schema.marks.xref;\n            const predicate = (node: ProsemirrorNode) => {\n              return node.isTextblock && node.type.allowsMarkType(markType);\n            };\n            const markTr = new MarkTransaction(tr);\n            findChildren(tr.doc, predicate).forEach(nodeWithPos => {\n              const { pos } = nodeWithPos;\n              detectAndApplyMarks(\n                markTr,\n                tr.doc.nodeAt(pos)!,\n                pos,\n                kRefRegExDetectAndApply,\n                markType,\n                () => ({}),\n                () => true,\n                match => match[1],\n              );\n            });\n\n            // remove leading \\ as necessary (this would occur if the underlying format includes\n            // a \\@ref and doesn't have all_symbols_escapable, e.g. blackfriday)\n            trTransform(tr, stripRefBackslashTransform);\n          }\n          return tr;\n        },\n      ];\n    },\n\n    appendMarkTransaction: (schema: Schema) => {\n      return [\n        {\n          name: 'xref-marks',\n          filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.xref),\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            removeInvalidatedMarks(tr, node, pos, kRefRegExDetectAndApply, node.type.schema.marks.xref);\n            detectAndApplyMarks(\n              tr,\n              tr.doc.nodeAt(pos)!,\n              pos,\n              kRefRegExDetectAndApply,\n              node.type.schema.marks.xref,\n              () => ({}),\n              () => true,\n              match => match[1],\n            );\n          },\n        },\n      ];\n    },\n\n    inputRules: (_schema: Schema) => {\n      return [atRefInputRule(), ...(format.rmdExtensions.bookdownXRefUI ? [refPrefixInputRule()] : [])];\n    },\n\n    plugins: (schema: Schema) => [xrefPopupPlugin(schema, ui, server)],\n\n    completionHandlers: () => [xrefCompletionHandler(ui, server.xref)],\n\n    commands: (schema: Schema) => {\n      if (format.rmdExtensions.bookdownXRefUI) {\n        return [\n          new ProsemirrorCommand(\n            EditorCommandId.CrossReference,\n            [],\n            (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n              // enable/disable command\n              if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.xref)(state)) {\n                return false;\n              }\n              if (dispatch) {\n                const tr = state.tr;\n                insertRef(tr);\n                dispatch(tr);\n              }\n              return true;\n            },\n            {\n              name: ui.context.translateText('Cross Reference'),\n              description: ui.context.translateText('Reference to related content'),\n              group: OmniInsertGroup.References,\n              priority: 0,\n              image: () =>\n                ui.prefs.darkMode()\n                  ? ui.images.omni_insert!.cross_reference_dark!\n                  : ui.images.omni_insert!.cross_reference!,\n            },\n          ),\n        ];\n      } else {\n        return [];\n      }\n    },\n  };\n};\n\nfunction atRefInputRule() {\n  return new InputRule(/(^|[^`])(\\\\?@ref\\()$/, (state: EditorState, match: string[], start: number, end: number) => {\n    // if this completes an xref at this position then stand down\n    const kRefLen = 4;\n    const { parent, parentOffset } = state.selection.$head;\n    const before = parent.textContent.slice(parentOffset - kRefLen, parentOffset);\n    const after = parent.textContent.slice(parentOffset);\n    const potentialXRef = before + '(' + after;\n    if (/^@ref\\([A-Za-z0-9:-]*\\).*$/.test(potentialXRef)) {\n      return null;\n    }\n\n    // insert the xref\n    const tr = state.tr;\n    tr.delete(start + match[1].length, end);\n    insertRef(tr);\n    return tr;\n  });\n}\n\nfunction refPrefixInputRule() {\n  return new InputRule(\n    /(^|[^`])(Chapter|Section|Figure|Table|Equation) $/,\n    (state: EditorState, match: string[], start: number, end: number) => {\n      const tr = state.tr;\n      tr.insertText(' ');\n      let prefix = '';\n      if (match[2] === 'Figure') {\n        prefix = 'fig:';\n      } else if (match[2] === 'Table') {\n        prefix = 'tab:';\n      } else if (match[2] === 'Equation') {\n        prefix = 'eq:';\n      }\n      insertRef(tr, prefix);\n      setTextSelection(tr.selection.head - 1)(tr);\n      return tr;\n    },\n  );\n}\n\nfunction insertRef(tr: Transaction, prefix = '') {\n  const schema = tr.doc.type.schema;\n  const selection = tr.selection;\n  const refText = `@ref(${prefix})`;\n  tr.replaceSelectionWith(schema.text(refText, schema.marks.xref.create()), false);\n  setTextSelection(tr.mapping.map(selection.head) - 1)(tr);\n}\n\nfunction stripRefBackslashTransform(tr: Transform) {\n  const markType = tr.doc.type.schema.marks.xref;\n  findChildrenByMark(tr.doc, markType).forEach(markedNode => {\n    const pos = tr.mapping.map(markedNode.pos);\n    if (markType.isInSet(markedNode.node.marks)) {\n      const markRange = getMarkRange(tr.doc.resolve(pos), markType);\n      if (markRange) {\n        const text = tr.doc.textBetween(markRange.from, markRange.to);\n        if (text.startsWith('\\\\')) {\n          tr.deleteRange(markRange.from, markRange.from + 1);\n        }\n      }\n    }\n  });\n}\n\nexport default extension;\n","/*\n * xref-completion.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { DecorationSet } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport Fuse from 'fuse.js';\nimport uniqby from 'lodash.uniqby';\n\nimport { EditorUI } from '../../api/ui';\nimport { CompletionHandler, CompletionResult } from '../../api/completion';\nimport { XRef, XRefServer, xrefKey } from '../../api/xref';\nimport { markIsActive } from '../../api/mark';\nimport { searchPlaceholderDecoration } from '../../api/placeholder';\nimport { CompletionItemView } from '../../api/widgets/completion';\n\nimport './xref-completion.css';\n\nconst kMaxResults = 20;\n\nexport function xrefCompletionHandler(ui: EditorUI, server: XRefServer): CompletionHandler<XRef> {\n  const index = new FuseIndex();\n\n  return {\n    id: 'BAACC160-56BE-4322-B079-54477A880623',\n\n    enabled: (context: EditorState | Transaction) => {\n      return markIsActive(context, context.doc.type.schema.marks.xref);\n    },\n\n    completions: xrefCompletions(ui, server, index),\n\n    filter: (completions: XRef[], _state: EditorState, token: string) => {\n      if (token.length > 0) {\n        return index.search(token, kMaxResults);\n      } else {\n        return completions.slice(0, kMaxResults);\n      }\n    },\n\n    replacement(schema: Schema, xref: XRef | null): string | ProsemirrorNode | null {\n      if (xref) {\n        return xrefKey(xref);\n      } else {\n        return null;\n      }\n    },\n\n    view: {\n      component: xrefView(ui),\n      key: xref => xrefKey(xref),\n      height: 52,\n      width: 350,\n      maxVisible: 5,\n      hideNoResults: true,\n    },\n  };\n}\n\nclass FuseIndex {\n  private fuse: Fuse<XRef, Fuse.IFuseOptions<XRef>>;\n\n  private keys: Fuse.FuseOptionKeyObject[] = [\n    { name: 'id', weight: 20 },\n    { name: 'type', weight: 1 },\n    { name: 'title', weight: 1 },\n  ];\n\n  constructor() {\n    this.fuse = this.createIndex([]);\n  }\n\n  public update(xrefs: XRef[]) {\n    this.fuse = this.createIndex(xrefs);\n  }\n\n  public search(query: string, limit: number) {\n    // see if we have an explicit type\n    let type: string | null = null;\n    let typeQuery: string | null = null;\n    const colonLoc = query.indexOf(':');\n    if (colonLoc !== -1) {\n      const prefix = query.slice(0, colonLoc);\n      if (kXRefTypes.hasOwnProperty(prefix)) {\n        type = prefix;\n        if (query.length > type.length + 1) {\n          typeQuery = query.slice(colonLoc + 1);\n        }\n      }\n    }\n\n    // search options\n    const options = {\n      isCaseSensitive: false,\n      shouldSort: true,\n      minMatchCharLength: 2,\n      limit,\n      keys: this.keys,\n    };\n\n    // perform query (use type if we have one)\n    const results = type\n      ? typeQuery\n        ? this.fuse.search({ $and: [{ type }, { $or: [{ id: typeQuery }, { title: typeQuery }] }] }, options)\n        : this.fuse.search({ type }, options)\n      : this.fuse.search(query, options);\n\n    // return results (eliminating duplicates)\n    return uniqby(\n      results.map((result: { item: XRef }) => result.item),\n      xrefKey,\n    );\n  }\n\n  private createIndex(xrefs: XRef[]) {\n    const options = {\n      keys: this.keys.map(key => key.name),\n    };\n    const index = Fuse.createIndex(options.keys, xrefs);\n    return new Fuse(xrefs, options, index);\n  }\n}\n\nfunction xrefCompletions(ui: EditorUI, server: XRefServer, index: FuseIndex) {\n  const kXRefCompletionRegEx = /(@ref\\()([ A-Za-z0-9:-]*)$/;\n  return (text: string, context: EditorState | Transaction): CompletionResult<XRef> | null => {\n    const match = text.match(kXRefCompletionRegEx);\n    if (match) {\n      const pos = context.selection.head - match[2].length;\n      const token = match[2];\n      return {\n        pos,\n        offset: -match[1].length + 1,\n        token,\n        completions: async () => {\n          const docPath = ui.context.getDocumentPath();\n          if (docPath) {\n            await ui.context.withSavedDocument();\n            const xrefs = await server.indexForFile(docPath);\n            index.update(xrefs.refs);\n            return xrefs.refs;\n          } else {\n            index.update([]);\n            return Promise.resolve([]);\n          }\n        },\n        decorations:\n          token.length === 0 ? DecorationSet.create(context.doc, [searchPlaceholderDecoration(pos, ui)]) : undefined,\n      };\n    } else {\n      return null;\n    }\n  };\n}\n\nfunction xrefView(ui: EditorUI): React.FC<XRef> {\n  return (xref: XRef) => {\n    const type = kXRefTypes[xref.type];\n    const image = type?.image(ui) || ui.images.omni_insert?.generic!;\n\n    return (\n      <CompletionItemView\n        width={350}\n        classes={['pm-xref-completion-item']}\n        image={image}\n        title={xrefKey(xref)}\n        subTitle={xref.title || ''}\n        detail={xref.file}\n      />\n    );\n  };\n}\n\nconst kGenericType = {\n  image: (ui: EditorUI) => ui.images.omni_insert?.generic!,\n};\n\nconst kEqType = {\n  image: (ui: EditorUI) =>\n    ui.prefs.darkMode() ? ui.images.omni_insert?.math_display_dark : ui.images.omni_insert?.math_display,\n};\n\nconst kXRefTypes: { [key: string]: { image: (ui: EditorUI) => string | undefined } } = {\n  h1: {\n    image: (ui: EditorUI) =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.heading1_dark : ui.images.omni_insert?.heading1,\n  },\n  h2: {\n    image: (ui: EditorUI) =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.heading2_dark : ui.images.omni_insert?.heading2,\n  },\n  h3: {\n    image: (ui: EditorUI) =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.heading3_dark : ui.images.omni_insert?.heading3,\n  },\n  h4: {\n    image: (ui: EditorUI) =>\n      ui.prefs.darkMode() ? ui.images.omni_insert?.heading4_dark : ui.images.omni_insert?.heading4,\n  },\n  fig: {\n    image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.omni_insert?.image_dark : ui.images.omni_insert?.image),\n  },\n  tab: {\n    image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.omni_insert?.table_dark : ui.images.omni_insert?.table),\n  },\n  eq: kEqType,\n  thm: kEqType,\n  lem: kEqType,\n  cor: kEqType,\n  prp: kEqType,\n  cnj: kEqType,\n  def: kEqType,\n  exm: kGenericType,\n  exr: kGenericType,\n};\n","/*\n * xref-popup.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { Popup } from '../../api/widgets/popup';\nimport { EditorServer } from '../../api/server';\nimport { XRef, xrefKey } from '../../api/xref';\nimport { LinkButton } from '../../api/widgets/button';\n\nimport './xref-popup.css';\n\nconst kMaxWidth = 350; // also in xref-popup.css\n\nexport function xrefPopupPlugin(schema: Schema, ui: EditorUI, server: EditorServer) {\n  return textPopupDecorationPlugin({\n    key: new PluginKey<DecorationSet>('xref-popup'),\n    markType: schema.marks.xref,\n    maxWidth: kMaxWidth,\n    dismissOnEdit: true,\n    createPopup: async (view: EditorView, target: TextPopupTarget, style: React.CSSProperties) => {\n      // lookup xref on server\n      const docPath = ui.context.getDocumentPath();\n      if (docPath) {\n        const kXRefRegEx = /^@ref\\(([A-Za-z0-9:-]*)\\)$/;\n        const match = target.text.match(kXRefRegEx);\n        if (match && match[1].length) {\n          await ui.context.withSavedDocument();\n          const xrefs = await server.xref.xrefForId(docPath, match[1]);\n          if (xrefs.refs.length) {\n            const xref = xrefs.refs[0];\n\n            // click handler\n            const onClick = () => {\n              const file = xrefs.baseDir + '/' + xref.file;\n              ui.display.navigateToXRef(file, xref);\n            };\n\n            return <XRefPopup xref={xref} onClick={onClick} style={style} />;\n          }\n        }\n      }\n      return null;\n    },\n    specKey: (target: TextPopupTarget) => {\n      return `xref:${target.text}`;\n    },\n  });\n}\n\ninterface XRefPopupProps extends WidgetProps {\n  xref: XRef;\n  onClick: VoidFunction;\n  style: React.CSSProperties;\n}\n\nconst XRefPopup: React.FC<XRefPopupProps> = props => {\n  return (\n    <Popup classes={['pm-xref-popup']} style={props.style}>\n      <div>\n        <LinkButton\n          text={xrefKey(props.xref)}\n          onClick={props.onClick}\n          maxWidth={kMaxWidth - 20}\n          classes={['pm-xref-popup-key pm-fixedwidth-font']}\n        />\n      </div>\n      <div className=\"pm-xref-popup-file\">{props.xref.file}</div>\n    </Popup>\n  );\n};\n","/*\n * raw_html-comment.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, TextSelection, EditorState } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { EditorCommandId, ProsemirrorCommand, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { ProsemirrorWriter, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { EditorUI } from '../../api/ui';\nimport { MarkTransaction } from '../../api/transaction';\nimport { removeInvalidatedMarks, detectAndApplyMarks } from '../../api/mark';\nimport { matchPandocFormatComment } from '../../api/pandoc_format';\nimport { kHTMLCommentRegEx, isHTMLComment } from '../../api/html';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport './raw_html_comment-styles.css';\n\nconst kHTMLEditingCommentRegEx = /^<!--# ([\\s\\S]*?)-->$/;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { options, ui } = context;\n\n  return {\n    marks: [\n      {\n        name: 'raw_html_comment',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          attrs: {\n            editing: { default: false },\n            format: { default: false },\n          },\n          inclusive: false,\n          excludes: 'formatting',\n          parseDOM: [\n            {\n              tag: \"span[class*='raw-html-comment']\",\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                return {\n                  editing: el.getAttribute('data-editing') === '1',\n                  format: el.getAttribute('data-format') === '1',\n                };\n              },\n            },\n          ],\n          toDOM(mark: Mark) {\n            const attr: any = {\n              class:\n                'raw-html-comment pm-fixedwidth-font ' +\n                (mark.attrs.editing ? 'pm-comment-color pm-comment-background-color' : 'pm-light-text-color') +\n                (mark.attrs.format && options.hideFormatComment ? ' pm-comment-hidden' : ''),\n              'data-editing': mark.attrs.editing ? '1' : '0',\n              'data-format': mark.attrs.format ? '1' : '0',\n            };\n            return ['span', attr];\n          },\n        },\n        pandoc: {\n          readers: [],\n          inlineHTMLReader: (schema: Schema, html: string, writer?: ProsemirrorWriter) => {\n            const isComment = isHTMLComment(html);\n            if (!isComment) {\n              return false;\n            }\n\n            if (writer) {\n              const mark = schema.marks.raw_html_comment.create(commentMarkAttribs(html));\n              writer.openMark(mark);\n              writer.writeText(html);\n              writer.closeMark(mark);\n            }\n\n            return isComment;\n          },\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              output.writeRawMarkdown(parent);\n            },\n          },\n        },\n      },\n    ],\n\n    appendMarkTransaction: (schema: Schema) => {\n      const markType = schema.marks.raw_html_comment;\n      const kHTMLCommentMarkRegEx = new RegExp(kHTMLCommentRegEx.source, 'g');\n      return [\n        {\n          name: 'html-editing-comment-marks',\n          filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(markType),\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            removeInvalidatedMarks(tr, node, pos, kHTMLCommentRegEx, markType);\n            detectAndApplyMarks(\n              tr,\n              tr.doc.nodeAt(pos)!,\n              pos,\n              kHTMLCommentMarkRegEx,\n              markType,\n              match => commentMarkAttribs(match[1]),\n              () => true,\n              match => match[1],\n            );\n          },\n        },\n      ];\n    },\n\n    // insert command\n    commands: (schema: Schema) => {\n      return [new InsertHTMLCommentCommand(schema, ui)];\n    },\n  };\n};\n\nexport class InsertHTMLCommentCommand extends ProsemirrorCommand {\n  constructor(schema: Schema, ui: EditorUI) {\n    super(\n      EditorCommandId.HTMLComment,\n      ['Shift-Mod-c'],\n      (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n        // make sure we can insert a text node here\n        if (!canInsertNode(state, schema.nodes.text)) {\n          return false;\n        }\n\n        // make sure we can apply this mark here\n        if (!toggleMarkType(schema.marks.raw_html)(state)) {\n          return false;\n        }\n\n        // make sure the end of the selection (where we will insert the comment)\n        // isn't already in a mark of this type\n        if (state.doc.rangeHasMark(state.selection.to, state.selection.to + 1, schema.marks.raw_html)) {\n          return false;\n        }\n\n        if (dispatch) {\n          const tr = state.tr;\n\n          // set the selection to the end of the current selection (comment 'on' the selection)\n          setTextSelection(tr.selection.to)(tr);\n\n          // if we have a character right before us then insert a space\n          const { parent, parentOffset } = tr.selection.$to;\n          const charBefore = parent.textContent.slice(parentOffset - 1, parentOffset);\n          if (charBefore.length && charBefore !== ' ') {\n            tr.insertText(' ');\n          }\n\n          // insert the comment\n          const comment = '<!--#  -->';\n          const mark = schema.marks.raw_html_comment.create({ editing: true });\n          tr.insert(tr.selection.to, schema.text(comment, [mark]));\n\n          // set the selection to the middle of the comment\n          tr.setSelection(new TextSelection(tr.doc.resolve(tr.selection.to - (comment.length / 2 - 1))));\n\n          // dispatch\n          dispatch(tr);\n        }\n\n        return true;\n      },\n      {\n        name: ui.context.translateText('Comment'),\n        description: ui.context.translateText('Editing comment'),\n        group: OmniInsertGroup.Content,\n        priority: 3,\n        image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.comment_dark! : ui.images.omni_insert?.comment!),\n      },\n    );\n  }\n}\n\nfunction commentMarkAttribs(comment: string) {\n  return {\n    editing: !!comment.match(kHTMLEditingCommentRegEx),\n    format: !!matchPandocFormatComment(comment),\n  };\n}\n\nexport default extension;\n","/*\n * shortcode.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode, Mark, Fragment } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\n\nimport { findChildren } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { detectAndApplyMarks, removeInvalidatedMarks } from '../api/mark';\nimport { MarkTransaction } from '../api/transaction';\nimport { FixupContext } from '../api/fixup';\nimport { kShortcodeRegEx } from '../api/shortcode';\nimport { PandocOutput } from '../api/pandoc';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { format } = context;\n\n  if (!format.hugoExtensions.shortcodes) {\n    return null;\n  }\n\n  return {\n    marks: [\n      {\n        name: 'shortcode',\n        noInputRules: true,\n        noSpelling: true,\n        spec: {\n          inclusive: false,\n          excludes: 'formatting',\n          attrs: {},\n          parseDOM: [\n            {\n              tag: \"span[class*='shortcode']\",\n            },\n          ],\n          toDOM(_mark: Mark) {\n            return ['span', { class: 'shortcode pm-markup-text-color pm-fixedwidth-font' }];\n          },\n        },\n        pandoc: {\n          readers: [],\n          writer: {\n            priority: 1,\n            write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n              output.writeRawMarkdown(parent);\n            },\n          },\n        },\n      },\n    ],\n\n    fixups: (schema: Schema) => {\n      return [\n        (tr: Transaction, fixupContext: FixupContext) => {\n          if (fixupContext === FixupContext.Load) {\n            // apply marks\n            const markType = schema.marks.shortcode;\n            const predicate = (node: ProsemirrorNode) => {\n              return node.isTextblock && node.type.allowsMarkType(markType);\n            };\n            const markTr = new MarkTransaction(tr);\n            findChildren(tr.doc, predicate).forEach(nodeWithPos => {\n              const { pos } = nodeWithPos;\n              detectAndCreateShortcodes(schema, markTr, pos);\n            });\n          }\n          return tr;\n        },\n      ];\n    },\n\n    appendMarkTransaction: (schema: Schema) => {\n      return [\n        {\n          name: 'shortcode-marks',\n          filter: (node: ProsemirrorNode) =>\n            node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.shortcode),\n          append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n            removeInvalidatedMarks(tr, node, pos, kShortcodeRegEx, node.type.schema.marks.shortcode);\n            detectAndCreateShortcodes(node.type.schema, tr, pos);\n          },\n        },\n      ];\n    },\n  };\n};\n\nfunction detectAndCreateShortcodes(schema: Schema, tr: MarkTransaction, pos: number) {\n  // apply marks wherever they belong\n  detectAndApplyMarks(\n    tr,\n    tr.doc.nodeAt(pos)!,\n    pos,\n    kShortcodeRegEx,\n    schema.marks.shortcode,\n    () => ({}),\n    () => true,\n    match => match[1],\n  );\n}\n\nexport default extension;\n","/*\n * footnote.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, NodeType, DOMOutputSpec } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport {\n  findChildrenByType,\n  findParentNodeOfType,\n  findSelectedNodeOfType,\n  NodeWithPos,\n  findChildren,\n} from 'prosemirror-utils';\n\nimport { ExtensionContext } from '../../api/extension';\nimport { uuidv4 } from '../../api/util';\nimport { PandocOutput, PandocTokenType, ProsemirrorWriter, PandocToken } from '../../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport {\n  footnoteEditorKeyDownHandler,\n  footnoteEditorActivationPlugin,\n  footnoteEditorNodeViews,\n} from './footnote-editor';\nimport {\n  footnoteAppendTransaction,\n  footnoteFilterTransaction,\n  footnoteSelectNoteAppendTransaction,\n} from './footnote-transaction';\n\nimport './footnote-styles.css';\n\nconst plugin = new PluginKey('footnote');\n\nconst extension = (context: ExtensionContext) => {\n  const { pandocExtensions, ui } = context;\n\n  if (!pandocExtensions.footnotes) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'footnote',\n        spec: {\n          inline: true,\n          attrs: {\n            number: { default: 1 },\n            ref: {},\n            content: { default: '' },\n          },\n          group: 'inline',\n          // atom: true,\n          parseDOM: [\n            {\n              tag: \"span[class*='footnote']\",\n              getAttrs(dom: Node | string) {\n                const el = dom as Element;\n                return {\n                  ref: el.getAttribute('data-ref'),\n                  content: el.getAttribute('data-content'),\n                };\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode): DOMOutputSpec {\n            return [\n              'span',\n              { class: 'footnote pm-footnote', 'data-ref': node.attrs.ref, 'data-content': node.attrs.content },\n              node.attrs.number.toString(),\n            ];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Note,\n              handler: writePandocNote,\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeNote(node);\n          },\n        },\n      },\n    ],\n\n    appendTransaction: (_schema: Schema) => {\n      return [footnoteAppendTransaction()];\n    },\n\n    plugins: (_schema: Schema) => {\n      return [\n        footnoteEditorActivationPlugin(),\n\n        new Plugin({\n          key: plugin,\n\n          // footnote editor\n          props: {\n            handleKeyDown: footnoteEditorKeyDownHandler(),\n            nodeViews: footnoteEditorNodeViews(),\n          },\n\n          // footnote transactions (fixups, etc.)\n          filterTransaction: footnoteFilterTransaction(),\n          appendTransaction: footnoteSelectNoteAppendTransaction(),\n        }),\n      ];\n    },\n\n    commands: () => {\n      return [\n        new ProsemirrorCommand(EditorCommandId.Footnote, ['Shift-Mod-F7'], footnoteCommandFn(), footnoteOmniInsert(ui)),\n      ];\n    },\n  };\n};\n\nfunction writePandocNote(schema: Schema) {\n  return (writer: ProsemirrorWriter, tok: PandocToken) => {\n    // generate unique id\n    const ref = uuidv4();\n\n    // add note to notes collection (will be handled specially by closeNode b/c it\n    // has schema.nodes.node type)\n    writer.openNoteNode(ref);\n    writer.writeTokens(tok.c);\n    const noteNode = writer.closeNode();\n\n    // store json version of node in an attribute of the footnote (we can copy/paste)\n    // between different documents\n    const content = JSON.stringify(noteNode.content.toJSON());\n\n    // add inline node to the body\n    writer.addNode(schema.nodes.footnote, { ref, number: noteNode.attrs.number, content }, []);\n  };\n}\n\nfunction footnoteCommandFn() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    if (!canInsertFootnote(state)) {\n      return false;\n    }\n    if (dispatch) {\n      const tr = state.tr;\n      insertFootnote(tr);\n      dispatch(tr);\n    }\n    return true;\n  };\n}\n\nfunction footnoteOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Footnote'),\n    description: ui.context.translateText('Note placed at the bottom of the page'),\n    group: OmniInsertGroup.References,\n    priority: 2,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.footnote_dark! : ui.images.omni_insert?.footnote!),\n  };\n}\n\nfunction canInsertFootnote(state: EditorState) {\n  return (\n    canInsertNode(state, state.schema.nodes.footnote) && !findParentNodeOfType(state.schema.nodes.note)(state.selection)\n  );\n}\n\nfunction insertFootnote(\n  tr: Transaction,\n  edit = true,\n  content?: Fragment | ProsemirrorNode | ProsemirrorNode[] | undefined,\n): string {\n  // resolve content\n  const schema = tr.doc.type.schema;\n  if (!content) {\n    content = schema.nodes.paragraph.create();\n  }\n\n  // generate note id\n  const ref = uuidv4();\n\n  // insert empty note\n  const notes = findChildrenByType(tr.doc, schema.nodes.notes, true)[0];\n  const note = schema.nodes.note.createAndFill({ ref }, content);\n  tr.insert(notes.pos + 1, note as ProsemirrorNode);\n\n  // insert footnote linked to note\n  const footnote = schema.nodes.footnote.create({ ref });\n  tr.replaceSelectionWith(footnote, false);\n\n  // open note editor\n  if (edit) {\n    const noteNode = findNoteNode(tr.doc, ref);\n    if (noteNode) {\n      tr.setSelection(TextSelection.create(tr.doc, noteNode.pos + 1));\n    }\n  }\n\n  // return ref\n  return ref;\n}\n\nexport function selectedFootnote(selection: Selection): NodeWithPos | undefined {\n  const schema = selection.$head.node().type.schema;\n  return findSelectedNodeOfType(schema.nodes.footnote)(selection);\n}\n\nexport function selectedNote(selection: Selection): NodeWithPos | undefined {\n  const schema = selection.$head.node().type.schema;\n  return findParentNodeOfType(schema.nodes.note)(selection);\n}\n\nexport function findNoteNode(doc: ProsemirrorNode, ref: string): NodeWithPos | undefined {\n  return findNodeOfTypeWithRef(doc, doc.type.schema.nodes.note, ref);\n}\n\nexport function findFootnoteNode(doc: ProsemirrorNode, ref: string): NodeWithPos | undefined {\n  return findNodeOfTypeWithRef(doc, doc.type.schema.nodes.footnote, ref);\n}\n\nfunction findNodeOfTypeWithRef(doc: ProsemirrorNode, type: NodeType, ref: string): NodeWithPos | undefined {\n  const foundNode = findChildren(doc, node => node.type === type && node.attrs.ref === ref, true);\n  if (foundNode.length) {\n    return foundNode[0];\n  } else {\n    return undefined;\n  }\n}\n\nexport default extension;\n","/*\n * shortcode.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kShortcodePattern = '(?:^|[^`])({{([%<])\\\\s+.*?[%>]}})';\nexport const kShortcodeRegEx = new RegExp(kShortcodePattern, 'g');\n","/*\n * footnote-editor.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView, DecorationSet, NodeView } from 'prosemirror-view';\nimport { findParentNodeOfType, NodeWithPos, findChildrenByType, findChildren } from 'prosemirror-utils';\nimport { EditorState, TextSelection, Plugin, PluginKey, Transaction } from 'prosemirror-state';\n\nimport { nodeDecoration } from '../../api/decoration';\nimport { firstNode, lastNode } from '../../api/node';\nimport { selectionIsWithin } from '../../api/selection';\nimport { scrollIntoView } from '../../api/scroll';\n\nimport { findFootnoteNode, selectedFootnote, selectedNote } from './footnote';\n\nconst key = new PluginKey<DecorationSet>('footnote-editor-activate');\n\nexport function footnoteEditorActivationPlugin() {\n  return new Plugin<DecorationSet>({\n    key,\n    state: {\n      init(_config: { [key: string]: any }, instance: EditorState) {\n        return DecorationSet.empty;\n      },\n\n      // whenever an edit affecting this mark type occurs then update the decorations\n      apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n        if (selectedFootnote(newState.selection) || selectedNote(newState.selection)) {\n          // if we are in the same note selection as before just return the set\n          if (oldState.selection.$head.node() === newState.selection.$head.node()) {\n            return set.map(tr.mapping, tr.doc);\n          } else {\n            return footnoteEditorDecorations(newState);\n          }\n        } else {\n          return DecorationSet.empty;\n        }\n      },\n    },\n    props: {\n      decorations(state: EditorState) {\n        return key.getState(state);\n      },\n    },\n\n    view: () => ({\n      // scroll footnote into view (if necessary) when note editor is active\n      update: (view: EditorView) => {\n        const note = selectedNote(view.state.selection);\n        if (note) {\n          const footnote = findFootnoteNode(view.state.doc, note.node.attrs.ref);\n          if (footnote) {\n            scrollIntoView(view, footnote.pos, false, 0, 30);\n          }\n        }\n      },\n    }),\n  });\n}\n\n// selection-driven decorations (mostly css classes) required to activate the footnote editor\nfunction footnoteEditorDecorations(state: EditorState) {\n  const schema = state.schema;\n\n  // see if either a footnote node or note (footnote editor) node has the selection\n  let footnoteNode = selectedFootnote(state.selection);\n  let noteNode = selectedNote(state.selection);\n\n  // if they do then we need to enable footnote editing/behavior by\n  // using decorators to inject appropriate css classes\n  if (footnoteNode || noteNode) {\n    // get body and notes nodes\n    const bodyNode = findChildrenByType(state.doc, schema.nodes.body)[0];\n    const notesNode = findChildrenByType(state.doc, schema.nodes.notes)[0];\n\n    // resolve the specific footnote node or specific note node\n    if (footnoteNode) {\n      const ref = footnoteNode.node.attrs.ref;\n      const matching = findChildren(notesNode.node, node => node.attrs.ref === ref);\n      if (matching.length) {\n        noteNode = matching[0];\n        noteNode.pos = notesNode.pos + 1 + noteNode.pos;\n      }\n    } else if (noteNode) {\n      const ref = noteNode.node.attrs.ref;\n      const matching = findChildren(\n        state.doc,\n        node => node.type === schema.nodes.footnote && node.attrs.ref === ref,\n        true,\n      );\n      if (matching.length) {\n        footnoteNode = matching[0];\n      }\n    }\n\n    if (footnoteNode && noteNode) {\n      return DecorationSet.create(state.doc, [\n        // make notes node visible\n        nodeDecoration(noteNode, { class: 'active' }),\n\n        // paint outline over footnote\n        nodeDecoration(footnoteNode, { class: 'active pm-selected-node-outline-color' }),\n\n        // position body and notes nodes for footnote editing\n        nodeDecoration(bodyNode, { class: 'editing-footnote pm-pane-border-color' }),\n        nodeDecoration(notesNode, { class: 'editing-footnote pm-pane-border-color' }),\n      ]);\n    } else {\n      return DecorationSet.empty;\n    }\n  } else {\n    return DecorationSet.empty;\n  }\n}\n\n// node view that display the note number alongside the note content\nexport function footnoteEditorNodeViews() {\n  return {\n    note(node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) {\n      return new NoteEditorView(node, view, getPos as () => number);\n    },\n  };\n}\n\nclass NoteEditorView implements NodeView {\n  public readonly dom: HTMLElement;\n  public readonly contentDOM: HTMLElement;\n\n  private readonly node: ProsemirrorNode;\n  private readonly view: EditorView;\n  private readonly getPos: () => number;\n\n  constructor(node: ProsemirrorNode, view: EditorView, getPos: () => number) {\n    this.node = node;\n    this.view = view;\n    this.getPos = getPos;\n\n    this.dom = window.document.createElement('div');\n    this.dom.setAttribute('data-ref', this.node.attrs.ref);\n    this.dom.classList.add('note');\n\n    const label = window.document.createElement('div');\n    label.classList.add('note-label');\n    label.contentEditable = 'false';\n    label.innerHTML = `<p>${this.node.attrs.number}:</p>`;\n    this.dom.appendChild(label);\n\n    const content = window.document.createElement('div');\n    content.classList.add('note-content');\n    this.contentDOM = content;\n    this.dom.appendChild(content);\n  }\n}\n\n// custom handling for arrow keys that cause selection to escape the editor\nexport function footnoteEditorKeyDownHandler() {\n  return (view: EditorView, event: KeyboardEvent) => {\n    // alias schema & selection\n    const schema = view.state.schema;\n    const selection = view.state.selection;\n\n    // pass if the selection isn't in a note\n    const noteNode: NodeWithPos | undefined = findParentNodeOfType(schema.nodes.note)(selection);\n    if (!noteNode) {\n      return false;\n    }\n\n    // function to find and move selection to associated footnote\n    // will call this from Escape, ArrowLeft, and ArrowUp handlers below\n    const selectFootnote = (before = true) => {\n      const footnoteNode = findFootnoteNode(view.state.doc, noteNode.node.attrs.ref);\n      if (footnoteNode) {\n        const tr = view.state.tr;\n        tr.setSelection(TextSelection.near(tr.doc.resolve(footnoteNode.pos + (before ? 0 : 1))));\n        view.dispatch(tr);\n      }\n    };\n\n    // if this is the Escape key then close the editor\n    if (event.key === 'Escape') {\n      selectFootnote();\n      return true;\n    }\n\n    // ...otherwise check to see if the user is attempting to arrow out of the footnote\n\n    // get first and last text block nodes (bail if we aren't in either)\n    const firstTextBlock = firstNode(noteNode, node => node.isTextblock);\n    const lastTextBlock = lastNode(noteNode, node => node.isTextblock);\n    if (!firstTextBlock && !lastTextBlock) {\n      return false;\n    }\n\n    // exiting from first text block w/ left or up arrow?\n    if (firstTextBlock) {\n      if (selectionIsWithin(selection, firstTextBlock)) {\n        switch (event.key) {\n          case 'ArrowLeft':\n            if (selection.anchor === firstTextBlock.pos + 1) {\n              selectFootnote(true);\n              return true;\n            }\n            break;\n          case 'ArrowUp': {\n            if (view.endOfTextblock('up')) {\n              selectFootnote(true);\n              return true;\n            }\n            break;\n          }\n        }\n      }\n    }\n\n    // exiting from last text block with right or down arrow?\n    if (lastTextBlock) {\n      if (selectionIsWithin(selection, lastTextBlock)) {\n        switch (event.key) {\n          case 'ArrowRight':\n            if (selection.anchor === lastTextBlock.pos + lastTextBlock.node.nodeSize - 1) {\n              selectFootnote(false);\n              return true;\n            }\n            break;\n          case 'ArrowDown': {\n            if (view.endOfTextblock('down')) {\n              selectFootnote(false);\n              return true;\n            }\n            break;\n          }\n        }\n      }\n    }\n\n    return false;\n  };\n}\n","/*\n * footnote-transaction.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, EditorState, TextSelection } from 'prosemirror-state';\nimport {\n  findChildrenByType,\n  NodeWithPos,\n  findSelectedNodeOfType,\n  ContentNodeWithPos,\n  findParentNodeOfType,\n} from 'prosemirror-utils';\nimport { Transform } from 'prosemirror-transform';\n\nimport { uuidv4 } from '../../api/util';\n\nimport { findNoteNode, selectedNote } from './footnote';\nimport { trTransform } from '../../api/transaction';\n\n// examine transactions and filter out attempts to place foonotes within note bodies\n// (this is not allowed by pandoc markdown)\nexport function footnoteFilterTransaction() {\n  return (tr: Transaction, state: EditorState) => {\n    const noteWithPos = selectedNote(tr.selection);\n    if (noteWithPos && findChildrenByType(noteWithPos.node, state.schema.nodes.footnote).length) {\n      return false;\n    }\n    return true;\n  };\n}\n\n// examine editor transactions and append a transaction that handles fixup of footnote numbers,\n// importing of pasted footnotes, selection propagation to the footnote editor, etc.\nexport function footnoteAppendTransaction() {\n  const footnoteChange = (node: ProsemirrorNode) => {\n    const schema = node.type.schema;\n    return node.type === schema.nodes.footnote || node.type === schema.nodes.note;\n  };\n\n  return {\n    name: 'footnote-renumber',\n    nodeFilter: footnoteChange,\n    append: (tr: Transaction) => {\n      const schema = tr.doc.type.schema;\n      const activeNote = findParentNodeOfType(schema.nodes.note)(tr.selection);\n      trTransform(tr, footnoteFixupTransform(activeNote));\n    },\n  };\n}\n\nfunction footnoteFixupTransform(activeNote: ContentNodeWithPos | undefined) {\n  return (tr: Transform) => {\n    // query for notes and footnotes. note that since these are computed at the beginning\n    // before any steps are applied, we always need to map their positions before using them\n    const schema = tr.doc.type.schema;\n    const footnotes = findAllFootnotes(tr.doc);\n    const allNotes = findAllNotes(tr.doc);\n\n    // iterate through footnotes in the newState\n    const refs = new Set<string>();\n    footnotes.forEach((footnote, index) => {\n      // map position\n      footnote.pos = tr.mapping.map(footnote.pos);\n\n      // footnote number\n      const number = index + 1;\n\n      // alias ref and content (either or both may be updated)\n      let { ref, content } = footnote.node.attrs;\n\n      // we may be creating a new note to append\n      let newNote: any;\n\n      // get reference to note (if any)\n      const note = allNotes.find(noteWithPos => noteWithPos.node.attrs.ref === ref);\n\n      // matching note found\n      if (note) {\n        // map position since we scanned for all of the notes at the top and we may\n        // have called tr.insert for a new note below which would have invalidated\n        // the positions\n        note.pos = tr.mapping.map(note.pos);\n\n        // update content if this is a note edit (used to propagate user edits back to data-content)\n        if (activeNote && activeNote.node.attrs.ref === ref) {\n          content = JSON.stringify(note.node.content.toJSON());\n        }\n\n        // if we've already processed this ref then it's a duplicate, make a copy w/ a new ref/id\n        if (refs.has(ref)) {\n          // create a new unique id and change the ref to it\n          ref = uuidv4();\n\n          // create and insert new note with this id\n          newNote = schema.nodes.note.createAndFill({ ref, number }, note.node.content);\n\n          // otherwise update the note with the correct number (if necessary)\n        } else {\n          if (note.node.attrs.number !== number) {\n            tr.setNodeMarkup(note.pos, schema.nodes.note, {\n              ...note.node.attrs,\n              number,\n            });\n          }\n        }\n\n        // if there is no note then create one using the content attr\n        // (this can happen for a copy/paste operation from another document)\n      } else if (content) {\n        newNote = schema.nodes.note.createAndFill({ ref, number }, Fragment.fromJSON(schema, JSON.parse(content)));\n      }\n\n      // insert newNote if necessary\n      if (newNote) {\n        const notesContainer = findNotesContainer(tr.doc);\n        tr.insert(notesContainer.pos + 1, newNote as ProsemirrorNode);\n      }\n\n      // indicate that we've seen this ref\n      refs.add(ref);\n\n      // set new footnote markup if necessary\n      const attrs = footnote.node.attrs;\n      if (ref !== attrs.ref || content !== attrs.content || number !== attrs.number) {\n        tr.setNodeMarkup(footnote.pos, schema.nodes.footnote, {\n          ...footnote.node.attrs,\n          ref,\n          content,\n          number,\n        });\n      }\n    });\n\n    // remove ophraned notes\n    for (let i = allNotes.length - 1; i >= 0; i--) {\n      const note = allNotes[i];\n      note.pos = tr.mapping.map(note.pos);\n      const footnote = footnotes.find(fn => fn.node.attrs.ref === note.node.attrs.ref);\n      if (!footnote) {\n        tr.delete(note.pos, note.pos + note.node.nodeSize);\n      }\n    }\n  };\n}\n\nexport function footnoteSelectNoteAppendTransaction() {\n  return (_transactions: Transaction[], _oldState: EditorState, newState: EditorState) => {\n    const schema = newState.schema;\n    const footnoteNode: NodeWithPos | undefined = findSelectedNodeOfType(schema.nodes.footnote)(newState.selection);\n    if (footnoteNode) {\n      const tr = newState.tr;\n      const ref = footnoteNode.node.attrs.ref;\n      const noteNode = findNoteNode(tr.doc, ref);\n      if (noteNode) {\n        tr.setSelection(TextSelection.near(tr.doc.resolve(noteNode.pos)));\n      }\n      return tr;\n    }\n  };\n}\n\nfunction findAllFootnotes(doc: ProsemirrorNode) {\n  const schema = doc.type.schema;\n  return findChildrenByType(doc, schema.nodes.footnote, true);\n}\n\nfunction findAllNotes(doc: ProsemirrorNode) {\n  const schema = doc.type.schema;\n  const notesContainer = findNotesContainer(doc);\n  const offset = notesContainer.pos + 1;\n  const notes = findChildrenByType(notesContainer.node, schema.nodes.note, false);\n  return notes.map(note => ({ ...note, pos: note.pos + offset }));\n}\n\nfunction findNotesContainer(doc: ProsemirrorNode) {\n  return findChildrenByType(doc, doc.type.schema.nodes.notes, false)[0];\n}\n","/*\n * raw_block.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, NodeType } from 'prosemirror-model';\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { setBlockType } from 'prosemirror-commands';\n\nimport { findParentNode } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../api/extension';\n\nimport {\n  PandocOutput,\n  PandocToken,\n  PandocTokenType,\n  ProsemirrorWriter,\n  kRawBlockContent,\n  kRawBlockFormat,\n} from '../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\n\nimport { EditorUI } from '../api/ui';\nimport { isSingleLineHTML } from '../api/html';\nimport { kHTMLFormat, kTexFormat, editRawBlockCommand, isRawHTMLFormat } from '../api/raw';\nimport { isSingleLineTex } from '../api/tex';\nimport { OmniInsert, OmniInsertGroup } from '../api/omni_insert';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, pandocCapabilities, ui } = context;\n\n  const rawAttribute = pandocExtensions.raw_attribute;\n\n  return {\n    nodes: [\n      {\n        name: 'raw_block',\n        spec: {\n          content: 'text*',\n          group: 'block',\n          marks: '',\n          code: true,\n          defining: true,\n          isolating: true,\n          attrs: {\n            format: {},\n          },\n          parseDOM: [\n            {\n              tag: \"div[class*='raw-block']\",\n              preserveWhitespace: 'full',\n              getAttrs: (node: Node | string) => {\n                const el = node as Element;\n                return {\n                  format: el.getAttribute('data-format'),\n                };\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return [\n              'div',\n              {\n                class: 'raw-block pm-fixedwidth-font pm-code-block pm-markup-text-color',\n                'data-format': node.attrs.format,\n              },\n              0,\n            ];\n          },\n        },\n\n        code_view: {\n          lang: (node: ProsemirrorNode) => {\n            return node.attrs.format;\n          },\n          attrEditFn: rawAttribute ? editRawBlockCommand(ui, pandocCapabilities.output_formats) : undefined,\n          borderColorClass: 'pm-raw-block-border',\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.raw_block,\n          tags: (node: ProsemirrorNode) => [node.attrs.format],\n          editFn: rawAttribute\n            ? () => editRawBlockCommand(ui, pandocCapabilities.output_formats)\n            : () => (state: EditorState) => false,\n        }),\n\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.RawBlock,\n              block: 'raw_block',\n            },\n          ],\n\n          // ensure that usethis badges comment ends up in it's own block\n          preprocessor: (markdown: string) => {\n            return markdown.replace(/([^\\n])(\\n^<!-- badges: end -->$)/gm, (_match, p1, p2) => {\n              return p1 + '\\n' + p2;\n            });\n          },\n\n          // we define a custom blockReader here so that we can convert html and tex blocks with\n          // a single line of code into paragraph with a raw inline\n          blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n            if (tok.t === PandocTokenType.RawBlock) {\n              readPandocRawBlock(schema, tok, writer);\n              return true;\n            } else if (isParagraphWrappingMultilineRaw(tok)) {\n              const rawTok = tok.c[0];\n              const format = rawTok.c[kRawBlockFormat];\n              const content = rawTok.c[kRawBlockContent];\n              writer.addNode(schema.nodes.raw_block, { format }, [schema.text(content)]);\n              return true;\n            } else {\n              return false;\n            }\n          },\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            if (!pandocExtensions.raw_attribute || node.textContent.trim() === '<!-- -->') {\n              output.writeToken(PandocTokenType.Para, () => {\n                output.writeRawMarkdown(node.textContent);\n              });\n            } else {\n              output.writeToken(PandocTokenType.RawBlock, () => {\n                output.write(node.attrs.format);\n                output.write(node.textContent);\n              });\n            }\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      const commands: ProsemirrorCommand[] = [];\n\n      commands.push(\n        new FormatRawBlockCommand(EditorCommandId.HTMLBlock, kHTMLFormat, schema.nodes.raw_block, {\n          name: ui.context.translateText('HTML Block'),\n          description: ui.context.translateText('Raw HTML content'),\n          group: OmniInsertGroup.Blocks,\n          priority: 6,\n          image: () =>\n            ui.prefs.darkMode() ? ui.images.omni_insert?.html_block_dark! : ui.images.omni_insert?.html_block!,\n        }),\n      );\n\n      if (pandocExtensions.raw_tex) {\n        commands.push(\n          new FormatRawBlockCommand(EditorCommandId.TexBlock, kTexFormat, schema.nodes.raw_block, {\n            name: ui.context.translateText('TeX Block'),\n            description: ui.context.translateText('Raw TeX content'),\n            group: OmniInsertGroup.Blocks,\n            priority: 5,\n            image: () =>\n              ui.prefs.darkMode() ? ui.images.omni_insert?.tex_block_dark! : ui.images.omni_insert?.tex_block!,\n          }),\n        );\n      }\n\n      if (rawAttribute) {\n        commands.push(new RawBlockCommand(ui, pandocCapabilities.output_formats));\n      }\n\n      return commands;\n    },\n  };\n};\n\nfunction readPandocRawBlock(schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) {\n  // single lines of html should be read as inline html (allows for\n  // highlighting and more seamless editing experience)\n  const format = tok.c[kRawBlockFormat];\n  const text = tok.c[kRawBlockContent] as string;\n  const textTrimmed = text.trimRight();\n  if (isRawHTMLFormat(format) && isSingleLineHTML(textTrimmed) && writer.hasInlineHTMLWriter(textTrimmed)) {\n    writer.openNode(schema.nodes.paragraph, {});\n    writer.writeInlineHTML(textTrimmed);\n    writer.closeNode();\n\n    // similarly, single lines of tex should be read as inline tex\n  } else if (format === kTexFormat && isSingleLineTex(textTrimmed)) {\n    writer.openNode(schema.nodes.paragraph, {});\n    const rawTexMark = schema.marks.raw_tex.create();\n    writer.openMark(rawTexMark);\n    writer.writeText(textTrimmed);\n    writer.closeMark(rawTexMark);\n    writer.closeNode();\n  } else {\n    writer.openNode(schema.nodes.raw_block, { format });\n    writer.writeText(text);\n    writer.closeNode();\n  }\n}\n\nfunction isParagraphWrappingMultilineRaw(tok: PandocToken) {\n  return isSingleChildParagraph(tok) && \n         tok.c[0].t === PandocTokenType.RawInline &&\n         isMultilineString(tok.c[0].c[kRawBlockContent]);\n}\n\nfunction isSingleChildParagraph(tok: PandocToken) {\n  return tok.t === PandocTokenType.Para && tok.c && tok.c.length === 1;\n}\n\nfunction isMultilineString(str: string) {\n  return str.indexOf('\\n') !== -1;\n}\n\n// base class for format specific raw block commands (e.g. html/tex)\nclass FormatRawBlockCommand extends ProsemirrorCommand {\n  private format: string;\n  private nodeType: NodeType;\n\n  constructor(id: EditorCommandId, format: string, nodeType: NodeType, omniInsert?: OmniInsert) {\n    super(\n      id,\n      [],\n      (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n        if (!this.isActive(state) && !setBlockType(this.nodeType, { format })(state)) {\n          return false;\n        }\n\n        if (dispatch) {\n          const schema = state.schema;\n          if (this.isActive(state)) {\n            setBlockType(schema.nodes.paragraph)(state, dispatch);\n          } else {\n            setBlockType(this.nodeType, { format })(state, dispatch);\n          }\n        }\n\n        return true;\n      },\n      omniInsert,\n    );\n    this.format = format;\n    this.nodeType = nodeType;\n  }\n\n  public isActive(state: EditorState) {\n    return !!findParentNode(node => node.type === this.nodeType && node.attrs.format === this.format)(state.selection);\n  }\n}\n\n// generic raw block command (shows dialog to allow choosing from among raw formats)\nclass RawBlockCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI, outputFormats: string[]) {\n    super(EditorCommandId.RawBlock, [], editRawBlockCommand(ui, outputFormats), {\n      name: ui.context.translateText('Raw Block...'),\n      description: ui.context.translateText('Raw content block'),\n      group: OmniInsertGroup.Blocks,\n      priority: 4,\n      image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.raw_block_dark! : ui.images.omni_insert?.raw_block!),\n    });\n  }\n}\n\nexport default extension;\n","/*\n * yaml_metadata.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, DOMOutputSpec, ParseRule } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { ExtensionContext, Extension } from '../../api/extension';\nimport { PandocOutput, PandocTokenType } from '../../api/pandoc';\nimport { EditorUI } from '../../api/ui';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { codeNodeSpec } from '../../api/code';\nimport { selectionIsBodyTopLevel } from '../../api/selection';\nimport { yamlMetadataTitlePlugin } from './yaml_metadata-title';\nimport { yamlMetadataBlockCapsuleFilter } from './yaml_metadata-capsule';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { fragmentText } from '../../api/fragment';\nimport { stripYamlDelimeters } from '../../api/yaml';\n\nconst extension = (context: ExtensionContext): Extension => {\n  const { ui } = context;\n\n  return {\n    nodes: [\n      {\n        name: 'yaml_metadata',\n\n        spec: {\n          ...codeNodeSpec(),\n          attrs: {\n            navigation_id: { default: null },\n          },\n          parseDOM: [\n            {\n              tag: \"div[class*='yaml-block']\",\n              preserveWhitespace: 'full',\n            } as ParseRule,\n          ],\n          toDOM(node: ProsemirrorNode): DOMOutputSpec {\n            return ['div', { class: 'yaml-block pm-code-block' }, 0];\n          },\n        },\n\n        code_view: {\n          lang: () => 'yaml-frontmatter',\n          classes: ['pm-metadata-background-color', 'pm-yaml-metadata-block'],\n        },\n\n        pandoc: {\n          blockCapsuleFilter: yamlMetadataBlockCapsuleFilter(),\n\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Para, () => {\n              const yaml = '---\\n' + stripYamlDelimeters(fragmentText(node.content)) + '\\n---';\n              output.writeRawMarkdown(yaml);\n            });\n          },\n        },\n      },\n    ],\n\n    commands: () => {\n      return [new YamlMetadataCommand(ui)];\n    },\n\n    plugins: () => [yamlMetadataTitlePlugin()],\n  };\n};\n\nclass YamlMetadataCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI) {\n    super(\n      EditorCommandId.YamlMetadata,\n      [],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        const schema = state.schema;\n\n        if (!canInsertNode(state, schema.nodes.yaml_metadata)) {\n          return false;\n        }\n\n        // only allow inserting at the top level\n        if (!selectionIsBodyTopLevel(state.selection)) {\n          return false;\n        }\n\n        // create yaml metadata text\n        if (dispatch) {\n          const tr = state.tr;\n          const kYamlLeading = '---\\n';\n          const kYamlTrailing = '\\n---';\n          const yamlText = schema.text(kYamlLeading + kYamlTrailing);\n          const yamlNode = schema.nodes.yaml_metadata.create({}, yamlText);\n          tr.replaceSelectionWith(yamlNode);\n          setTextSelection(tr.mapping.map(state.selection.from) - kYamlTrailing.length - 1)(tr);\n          dispatch(tr);\n        }\n\n        return true;\n      },\n      {\n        name: ui.context.translateText('YAML'),\n        description: ui.context.translateText('YAML metadata block'),\n        group: OmniInsertGroup.Blocks,\n        priority: 3,\n        selectionOffset: 4,\n        image: () =>\n          ui.prefs.darkMode() ? ui.images.omni_insert?.yaml_block_dark! : ui.images.omni_insert?.yaml_block!,\n      },\n    );\n  }\n}\n\nexport default extension;\n","/*\n * yaml_metadata-capsule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { ProsemirrorWriter } from '../../api/pandoc';\nimport { uuidv4 } from '../../api/util';\nimport {\n  encodedBlockCapsuleRegex,\n  blockCapsuleSourceWithoutPrefix,\n  PandocBlockCapsule,\n  blockCapsuleParagraphTokenHandler,\n  blockCapsuleTextHandler,\n} from '../../api/pandoc_capsule';\n\nconst kYamlBlocksRegex = /(^)(---[ \\t]*\\n(?![ \\t]*\\n)[\\W\\w]*?\\n(?:---|\\.\\.\\.))([ \\t]*)$/gm;\n\nconst kYamlDiscardRegex = /^([\\t >]*)`{3,}/m;\n\nexport function yamlMetadataBlockCapsuleFilter() {\n  const kYamlMetadataCapsuleType = 'E1819605-0ACD-4FAE-8B99-9C1B7BD7C0F1'.toLowerCase();\n\n  return {\n    type: kYamlMetadataCapsuleType,\n\n    match: kYamlBlocksRegex,\n\n    // if there was an unterminated yaml block inside a code block (followed by more yaml,\n    // perhaps in yet another code block) then the main regex eats the code block boundary.\n    // provide a discard expression that excludes any yaml block that has what appears\n    // to be a fenced code block boundary\n    discard: kYamlDiscardRegex,\n\n    // add a newline to ensure that if the metadata block has text right\n    // below it we still end up in our own pandoc paragarph block\n    enclose: (capsuleText: string) => capsuleText + '\\n',\n    // globally replace any instances of our block capsule found in text\n    handleText: blockCapsuleTextHandler(\n      kYamlMetadataCapsuleType,\n      encodedBlockCapsuleRegex(undefined, '\\\\n', 'gm'),\n      (text: string) => text.substring(0, text.length - 1), // trim off newline\n    ),\n\n    // we are looking for a paragraph token consisting entirely of a\n    // block capsule of our type. if find that then return the block\n    // capsule text\n    handleToken: blockCapsuleParagraphTokenHandler(kYamlMetadataCapsuleType),\n\n    // write as yaml_metadata\n    writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n      writer.openNode(schema.nodes.yaml_metadata, {\n        navigation_id: uuidv4(),\n        md_index: capsule.position,\n      });\n      // write the lines w/o the source-level prefix\n      writer.writeText(blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix));\n      writer.closeNode();\n    },\n  };\n}\n","/*\n * rmd_chunk.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocOutput, PandocTokenType } from '../../api/pandoc';\n\nimport { codeNodeSpec } from '../../api/code';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\n\nimport { EditorUI } from '../../api/ui';\nimport { kBookdownDocType } from '../../api/format';\nimport { rmdChunk, insertRmdChunk } from '../../api/rmd';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { RmdChunkImagePreviewPlugin } from './rmd_chunk-image';\nimport { rmdChunkBlockCapsuleFilter } from './rmd_chunk-capsule';\n\nimport './rmd_chunk-styles.css';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { ui, options, format } = context;\n\n  if (!format.rmdExtensions.codeChunks) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'rmd_chunk',\n        spec: {\n          ...codeNodeSpec(),\n          attrs: {\n            navigation_id: { default: null },\n            md_index: { default: 0 },\n          },\n          parseDOM: [\n            {\n              tag: \"div[class*='rmd-chunk']\",\n              preserveWhitespace: 'full',\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return ['div', { class: 'rmd-chunk pm-code-block' }, 0];\n          },\n        },\n\n        code_view: {\n          firstLineMeta: true,\n          lineNumbers: true,\n          lineNumberFormatter: (lineNumber: number, lineCount?: number, line?: string) => {\n            if (lineNumber === 1) {\n              return '';\n            } else {\n              return lineNumber - 1 + '';\n            }\n          },\n          bookdownTheorems: format.docTypes.includes(kBookdownDocType),\n          classes: ['pm-chunk-background-color'],\n          lang: (_node: ProsemirrorNode, content: string) => {\n            const match = content.match(/^\\{([a-zA-Z0-9_]+)/);\n            if (match) {\n              return match[1];\n            } else {\n              return null;\n            }\n          },\n          createFromPastePattern: /^\\{([a-zA-Z0-9_]+).*}.*?\\n/m,\n        },\n\n        pandoc: {\n          blockCapsuleFilter: rmdChunkBlockCapsuleFilter(),\n\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Para, () => {\n              const parts = rmdChunk(node.textContent);\n              if (parts) {\n                output.writeRawMarkdown('```{' + parts.meta + '}\\n' + parts.code + '```\\n');\n              }\n            });\n          },\n        },\n      },\n    ],\n\n    commands: (_schema: Schema) => {\n      const commands = [\n        new RChunkCommand(ui),\n        new PythonChunkCommand(ui),\n        new BashChunkCommand(ui),\n        new RcppChunkCommand(ui),\n        new SQLChunkCommand(ui),\n        new D3ChunkCommand(ui),\n        new StanChunkCommand(ui),\n      ];\n      return commands;\n    },\n\n    plugins: (_schema: Schema) => {\n      if (options.rmdImagePreview) {\n        return [new RmdChunkImagePreviewPlugin(ui.context)];\n      } else {\n        return [];\n      }\n    },\n  };\n};\n\nclass RmdChunkCommand extends ProsemirrorCommand {\n  constructor(\n    ui: EditorUI,\n    id: EditorCommandId,\n    keymap: string[],\n    priority: number,\n    lang: string,\n    placeholder: string,\n    image: () => string,\n    rowOffset = 1,\n    colOffset = 0,\n    selectionOffset?: number,\n  ) {\n    super(id, keymap, insertRmdChunk(placeholder, rowOffset, colOffset), {\n      name: `${lang} ${ui.context.translateText('Code Chunk')}`,\n      description: `${ui.context.translateText('Executable')} ${lang} ${ui.context.translateText('chunk')}`,\n      group: OmniInsertGroup.Chunks,\n      priority,\n      selectionOffset: selectionOffset || colOffset || placeholder.length,\n      image,\n    });\n  }\n}\n\nclass RChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(ui, EditorCommandId.RCodeChunk, ['Mod-Alt-i'], 10, 'R', '{r}\\n', () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert!.r_chunk_dark! : ui.images.omni_insert!.r_chunk!,\n    );\n  }\n}\n\nclass PythonChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(\n      ui,\n      EditorCommandId.PythonCodeChunk,\n      [],\n      8,\n      'Python',\n      '{python}\\n',\n      () => ui.images.omni_insert!.python_chunk!,\n    );\n  }\n}\n\nclass BashChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(ui, EditorCommandId.BashCodeChunk, [], 7, 'Bash', '{bash}\\n', () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert!.bash_chunk_dark! : ui.images.omni_insert!.bash_chunk!,\n    );\n  }\n}\n\nclass RcppChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(ui, EditorCommandId.RcppCodeChunk, [], 6, 'Rcpp', '{Rcpp}\\n', () =>\n      ui.prefs.darkMode() ? ui.images.omni_insert!.rcpp_chunk_dark! : ui.images.omni_insert!.rcpp_chunk!,\n    );\n  }\n}\n\nclass SQLChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(\n      ui,\n      EditorCommandId.SQLCodeChunk,\n      [],\n      5,\n      'SQL',\n      '{sql connection=}\\n',\n      () => ui.images.omni_insert!.sql_chunk!,\n      0,\n      16,\n    );\n  }\n}\n\nclass D3ChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(ui, EditorCommandId.D3CodeChunk, [], 4, 'D3', '{d3 data=}\\n', () => ui.images.omni_insert!.d3_chunk!, 0, 9);\n  }\n}\n\nclass StanChunkCommand extends RmdChunkCommand {\n  constructor(ui: EditorUI) {\n    super(\n      ui,\n      EditorCommandId.StanCodeChunk,\n      [],\n      7,\n      'Stan',\n      '{stan output.var=}\\n',\n      () => ui.images.omni_insert!.stan_chunk!,\n      0,\n      17,\n    );\n  }\n}\n\nexport default extension;\n","/*\n * rmd_chunk-image.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { findChildrenByType, setTextSelection } from 'prosemirror-utils';\n\nimport { transactionsAreTypingChange, transactionsHaveChange } from '../../api/transaction';\nimport { EditorUIContext } from '../../api/ui';\nimport { stripQuotes } from '../../api/text';\nimport { onElementRemoved } from '../../api/dom';\n\nconst key = new PluginKey<DecorationSet>('rmd-chunk-image-preview');\n\nexport class RmdChunkImagePreviewPlugin extends Plugin<DecorationSet> {\n  constructor(uiContext: EditorUIContext) {\n    super({\n      key,\n      state: {\n        init: (_config: { [key: string]: any }, state: EditorState) => {\n          return imagePreviewDecorations(state, uiContext);\n        },\n        apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n          const transactions = [tr];\n\n          // doc didn't change, return existing decorations\n          if (!tr.docChanged) {\n            return old.map(tr.mapping, tr.doc);\n\n            // non-typing change, do a full rescan\n          } else if (!transactionsAreTypingChange(transactions)) {\n            return imagePreviewDecorations(newState, uiContext);\n\n            // change that affects a rmd chunk block, do a full rescan\n          } else if (transactionsHaveChange(transactions, oldState, newState, isRmdChunkNode)) {\n            return imagePreviewDecorations(newState, uiContext);\n          }\n\n          // otherwise return the existing set (mapped)\n          else {\n            return old.map(tr.mapping, tr.doc);\n          }\n        },\n      },\n      props: {\n        decorations: (state: EditorState) => {\n          return key.getState(state);\n        },\n      },\n    });\n  }\n}\n\nfunction imagePreviewDecorations(state: EditorState, uiContext: EditorUIContext) {\n  // find all rmd code chunks with knitr::include_graphics\n  const decorations: Decoration[] = [];\n  findChildrenByType(state.doc, state.schema.nodes.rmd_chunk).forEach(rmdChunk => {\n    // look for a line with knitr::include_graphics\n    const match = rmdChunk.node.textContent.match(/^(knitr::)?include_graphics\\((['\"])([^\\2]+)\\2/m);\n    if (match) {\n      // see if we can also find an out.width on the first line\n      let width = '';\n      const firstLine = rmdChunk.node.textContent.split(/\\r?\\n/)[0];\n      const widthMatch = firstLine.match(/^\\s*\\{[r|R][, ].*out\\.width\\s*=\\s*([^ ,$]+).*}/);\n      if (widthMatch) {\n        width = stripQuotes(widthMatch[1].trim());\n        // revert if they are using out.width = NULL\n        if (width === 'NULL') {\n          width = '';\n        }\n      }\n\n      // see if we can find fig.align='center'\n      const alignCenter = !!firstLine.match(/^\\s*\\{[r|R][, ].*fig\\.align\\s*=\\s*['\"]?center['\"]?/);\n\n      const imagePath = match[3];\n      const decoration = Decoration.widget(\n        rmdChunk.pos + rmdChunk.node.nodeSize,\n        (view: EditorView, getPos: () => number) => {\n          const container = window.document.createElement('div');\n          container.style.marginTop = '-1.5em'; // to bridge back to the codemirror block\n          // which has a margin-block-end of 1em\n          container.classList.add('pm-image-preview');\n          container.classList.add('pm-block-border-color');\n          const img = window.document.createElement('img');\n          if (alignCenter) {\n            img.classList.add('pm-image-centered');\n          }\n\n          img.src = uiContext.mapResourceToURL(imagePath);\n\n          // watch for changes to the file\n          const unsubscribe = uiContext.watchResource(imagePath, () => {\n            img.src = uiContext.mapResourceToURL(imagePath);\n          });\n          onElementRemoved(view.dom, container, unsubscribe);\n\n          if (width) {\n            img.setAttribute('width', width);\n          }\n          img.draggable = false;\n          img.onload = () => {\n            img.alt = '';\n          };\n          img.onerror = () => {\n            img.alt = ` ${uiContext.translateText('Image not found')}: ${imagePath}`;\n          };\n          // select rmd_chunk for clicks on the preview image\n          img.onclick = () => {\n            const tr = view.state.tr;\n            setTextSelection(getPos() - 1)(tr);\n            view.dispatch(tr);\n          };\n          container.append(img);\n          return container;\n        },\n        { key: imagePath + 'width:' + width + 'center:' + alignCenter },\n      );\n      decorations.push(decoration);\n    }\n  });\n\n  // return decorations\n  return DecorationSet.create(state.doc, decorations);\n}\n\nfunction isRmdChunkNode(node: ProsemirrorNode) {\n  return node.type === node.type.schema.nodes.rmd_chunk;\n}\n","/*\n * rmd_chunk-capsule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { PandocBlockCapsule, parsePandocBlockCapsule, blockCapsuleSourceWithoutPrefix } from '../../api/pandoc_capsule';\nimport { PandocToken, PandocTokenType, ProsemirrorWriter } from '../../api/pandoc';\nimport { pandocAttrReadAST, kCodeBlockAttr, PandocAttr, kCodeBlockText } from '../../api/pandoc_attr';\nimport { uuidv4 } from '../../api/util';\n\nexport function rmdChunkBlockCapsuleFilter() {\n  // (note that this constant is also defined in VisualMode.java)\n  const kBlockCapsuleType = 'F3175F2A-E8A0-4436-BE12-B33925B6D220'.toLowerCase();\n  const kBlockCapsuleTextRegEx = new RegExp('```' + kBlockCapsuleType + '\\\\n[ \\\\t>]*([^`]+)\\\\n[ \\\\t>]*```', 'g');\n\n  return {\n    type: kBlockCapsuleType,\n\n    match: /^([\\t >]*)(```+\\s*\\{[a-zA-Z0-9_]+(?: *[ ,].*?)?\\}[ \\t]*\\n(?:[\\t >]*```+|[\\W\\w]*?\\n[\\t >]*```+))([ \\t]*)$/gm,\n\n    // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n    // (in this case a code block). we use the capsule prefix here to make sure that the code block's\n    // content and end backticks match the indentation level of the first line correctly\n    enclose: (capsuleText: string, capsule: PandocBlockCapsule) =>\n      '```' + kBlockCapsuleType + '\\n' + capsule.prefix + capsuleText + '\\n' + capsule.prefix + '```',\n    // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n    // and if we find it, parse and return the original source code\n    handleText: (text: string, tok: PandocToken) => {\n      // if this is a code block then we need to strip the prefix\n      const stripPrefix = tok.t === PandocTokenType.CodeBlock;\n\n      return text.replace(kBlockCapsuleTextRegEx, (_match, p1) => {\n        const capsuleText = p1;\n        const capsule = parsePandocBlockCapsule(capsuleText);\n        if (stripPrefix) {\n          return blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n        } else {\n          return capsule.source;\n        }\n      });\n    },\n\n    // look for a block capsule of our type within a code block (indicated by the\n    // presence of a special css class)\n    handleToken: (tok: PandocToken) => {\n      if (tok.t === PandocTokenType.CodeBlock) {\n        const attr = pandocAttrReadAST(tok, kCodeBlockAttr) as PandocAttr;\n        if (attr.classes.includes(kBlockCapsuleType)) {\n          return tok.c[kCodeBlockText];\n        }\n      }\n      return null;\n    },\n\n    // write the node as an rmd_chunk, being careful to remove the backticks\n    // preserved as part of the source, and striping out the base indentation\n    // level implied by the prefix\n    writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n      // open node\n      writer.openNode(schema.nodes.rmd_chunk, {\n        navigation_id: uuidv4(),\n        md_index: capsule.position,\n      });\n\n      // source still has leading and trailing backticks, remove them\n      const source = capsule.source.replace(/^```+/, '').replace(/\\n[\\t >]*```+$/, '');\n\n      // write the lines w/o the source-level prefix\n      writer.writeText(blockCapsuleSourceWithoutPrefix(source, capsule.prefix));\n\n      // all done\n      writer.closeNode();\n    },\n  };\n}\n","/*\n * div.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec, ResolvedPos } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfType, ContentNodeWithPos, findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\nimport { wrapIn } from 'prosemirror-commands';\nimport { GapCursor } from 'prosemirror-gapcursor';\nimport { liftTarget } from 'prosemirror-transform';\n\nimport { ExtensionContext, Extension } from '../api/extension';\nimport {\n  pandocAttrSpec,\n  pandocAttrToDomAttr,\n  pandocAttrParseDom,\n  pandocAttrReadAST,\n  pandocAttrFrom,\n  pandocAttrAvailable,\n  PandocAttr,\n} from '../api/pandoc_attr';\nimport { PandocOutput, PandocTokenType, PandocToken } from '../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId, toggleWrap } from '../api/command';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup, OmniInsert } from '../api/omni_insert';\nimport { markIsActive } from '../api/mark';\nimport { BaseKey } from '../api/basekeys';\nimport { attrInputToProps } from '../api/ui-dialogs';\n\nimport './div-styles.css';\n\nconst DIV_ATTR = 0;\nconst DIV_CHILDREN = 1;\n\nconst extension = (context: ExtensionContext) : Extension | null => {\n  const { pandocExtensions, ui } = context;\n\n  if (!pandocExtensions.fenced_divs && !pandocExtensions.native_divs) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'div',\n        spec: {\n          attrs: {\n            ...pandocAttrSpec,\n          },\n          defining: true,\n          content: 'block+',\n          group: 'block list_item_block',\n          parseDOM: [\n            {\n              tag: 'div[data-div=\"1\"]',\n              getAttrs(dom: Node | string) {\n                const attrs: {} = { 'data-div': 1 };\n                return {\n                  ...attrs,\n                  ...pandocAttrParseDom(dom as Element, attrs),\n                };\n              },\n            },\n          ],\n          toDOM(node: ProsemirrorNode): DOMOutputSpec {\n            const attr = {\n              'data-div': '1',\n              ...pandocAttrToDomAttr({\n                ...node.attrs,\n                classes: [...node.attrs.classes, 'pm-div', 'pm-div-background-color'],\n              }),\n            };\n            return ['div', attr, 0];\n          },\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.div,\n          editFn: () => divCommand(ui, true),\n          offset: {\n            top: 3,\n            right: 0\n          }\n        }),\n\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.Div,\n              block: 'div',\n              getAttrs: (tok: PandocToken) => ({\n                ...pandocAttrReadAST(tok, DIV_ATTR),\n              }),\n              getChildren: (tok: PandocToken) => tok.c[DIV_CHILDREN],\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Div, () => {\n              output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n              output.writeArray(() => {\n                output.writeNodes(node);\n              });\n            });\n          },\n        },\n      },\n    ],\n\n    baseKeys: () => {\n      return [\n        { key: BaseKey.Enter, command: divInputRuleEnter() },\n      ];\n    },\n\n    commands: () => {\n      return [\n        // turn current block into a div\n        new DivCommand(EditorCommandId.Div, ui, true),\n\n        // insert a div\n        new DivCommand(EditorCommandId.InsertDiv, ui, false, {\n          name: ui.context.translateText('Div...'),\n          description: ui.context.translateText('Block containing other content'),\n          group: OmniInsertGroup.Blocks,\n          priority: 1,\n          image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.div_dark! : ui.images.omni_insert?.div!),\n        }),\n      ];\n    },\n  };\n};\n\n\nfunction divCommand(ui: EditorUI, allowEdit: boolean) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    // two different modes:\n    //  - editing attributes of an existing div\n    //  - wrapping (a la blockquote)\n    const schema = state.schema;\n    const div = allowEdit ? findParentNodeOfType(schema.nodes.div)(state.selection) : undefined;\n    if (!div && !toggleWrap(schema.nodes.div)(state)) {\n      return false;\n    }\n\n    async function asyncEditDiv() {\n      if (dispatch) {\n        // selecting nothing or entire div means edit, selecting text outside of a\n        // div or a subset of an existing div means create new one\n        const editMode = div && (state.selection.empty || isFullDivSelection(div, state));\n        if (editMode) {\n          await editDiv(ui, state, dispatch, div!);\n        } else {\n          await createDiv(ui, state, dispatch);\n        }\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncEditDiv();\n\n    return true;\n  };\n}\n\nclass DivCommand extends ProsemirrorCommand {\n  constructor(id: EditorCommandId, ui: EditorUI, allowEdit: boolean, omniInsert?: OmniInsert) {\n    super(id, [], divCommand(ui, allowEdit), omniInsert);\n  }\n}\n\nasync function editDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void, div: ContentNodeWithPos) {\n  const attr = pandocAttrFrom(div.node.attrs);\n  const result = await ui.dialogs.editDiv(attr, pandocAttrAvailable(attr));\n  if (result) {\n    const tr = state.tr;\n    if (result.action === 'edit') {\n      tr.setNodeMarkup(div.pos, div.node.type, result.attr);\n      dispatch(tr);\n    } else if (result.action === 'remove') {\n      const fromPos = tr.doc.resolve(div.pos + 1);\n      const toPos = tr.doc.resolve(div.pos + div.node.nodeSize - 1);\n      const nodeRange = fromPos.blockRange(toPos);\n      if (nodeRange) {\n        const targetLiftDepth = liftTarget(nodeRange);\n        if (targetLiftDepth || targetLiftDepth === 0) {\n          tr.lift(nodeRange, targetLiftDepth);\n        }\n      }\n      dispatch(tr);\n    }\n  }\n}\n\nasync function createDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void) {\n  const result = await ui.dialogs.editDiv({}, false);\n  if (result) {\n    wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n      const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n      tr.setNodeMarkup(div.pos, div.node.type, result.attr);\n      dispatch(tr);\n    });\n  }\n}\n\nfunction isFullDivSelection(div: ContentNodeWithPos, state: EditorState) {\n  const divStart = div.pos;\n  const divEnd = div.pos + div.node.nodeSize;\n  return state.selection.from - 2 === divStart && state.selection.to + 2 === divEnd;\n}\n\nfunction divInputRuleEnter() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // see if the parent consist of a pending code block input rule\n    const schema = state.schema;\n\n    // selection must be empty\n    if (!state.selection.empty) {\n      return false;\n    }\n\n    // full text of parent must meet the pattern\n    // eslint-disable-next-line no-useless-escape\n    const match = state.selection.$head.parent.textContent.match(/^:{3,}(\\s+({.*?}|\\S+)?[\\s:]*)?$/);\n    if (!match) {\n      return false;\n    }\n\n    // no inline code marks\n    if (markIsActive(state, schema.marks.code)) {\n      return false;\n    }\n\n    // must be able to perform the replacement\n    if (!canApplyDivInputRule(state)) {\n      return false;\n    }\n\n    // execute\n    if (dispatch) {\n      // if it's just followed by whitespace then don't do it\n      if (match[1] && match[1].trim().length === 0) {\n        return false;\n      }\n\n      // parse attributes\n      const attrs: PandocAttr = pandocAttrFrom({});\n      const attribMatch = match[2];\n      if (attribMatch) {\n        const bracesMatch = attribMatch.match(/^{(.*?)}$/);\n        if (bracesMatch) {\n          const pandocAttrsText = bracesMatch[1];\n          const pandocAttrsMatch = pandocAttrsText.match(/^\\s*(#\\S+)?\\s*((?:\\.\\S+\\s*)*)?(.*)?$/);\n          if (pandocAttrsMatch) {\n            const attrProps = attrInputToProps({ id: pandocAttrsMatch[1], classes: pandocAttrsMatch[2] });\n            attrs.id = attrProps.id || '';\n            attrs.classes = attrProps.classes || [];\n          }\n        } else {\n          attrs.classes = [attribMatch];\n        }\n      }\n\n      wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n        const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n        tr.setNodeMarkup(div.pos, div.node.type, attrs);\n        const $head = tr.selection.$head;\n        const start = $head.start();\n        const end = start + $head.parent.textContent.length;\n        tr.deleteRange(start, end);\n        dispatch(tr);\n      });\n    }\n\n    return true;\n  };\n}\n\nfunction canReplaceNodeWithDiv(schema: Schema, $pos: ResolvedPos) {\n  return $pos.node(-1).canReplaceWith($pos.index(-1), $pos.indexAfter(-1), schema.nodes.div);\n}\n\nfunction canApplyDivInputRule(state: EditorState) {\n  const schema = state.schema;\n  const { $head } = state.selection;\n  return canReplaceNodeWithDiv(schema, $head);\n}\n\nexport default extension;\n","/*\n * line_block.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType, PandocToken } from '../api/pandoc';\n\nimport { EditorCommandId, WrapCommand } from '../api/command';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nimport './line_block-styles.css';\n\nconst extension = (context: ExtensionContext) => {\n  const { pandocExtensions, ui } = context;\n\n  if (!pandocExtensions.line_blocks) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'line_block',\n        spec: {\n          content: 'paragraph+',\n          group: 'block',\n          defining: true,\n          parseDOM: [\n            {\n              tag: \"div[class*='line-block']\",\n            },\n          ],\n          toDOM(): DOMOutputSpec {\n            return ['div', { class: 'line-block pm-line-block pm-block-border-color pm-margin-bordered' }, 0];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.LineBlock,\n              block: 'line_block',\n              getChildren: (tok: PandocToken) => {\n                return tok.c.map((line: PandocToken[]) => ({ t: PandocTokenType.Para, c: line }));\n              },\n            },\n          ],\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.withOption('writeSpaces', false, () => {\n              output.writeToken(PandocTokenType.LineBlock, () => {\n                node.forEach(line => {\n                  output.writeArray(() => {\n                    output.writeInlines(line.content);\n                  });\n                });\n              });\n            });\n          },\n        },\n      },\n    ],\n    commands: (schema: Schema) => {\n      return [\n        new WrapCommand(\n          EditorCommandId.LineBlock,\n          [],\n          schema.nodes.line_block,\n          {},\n          {\n            name: ui.context.translateText('Line Block'),\n            description: ui.context.translateText('Preserve leading spaces and line breaks'),\n            group: OmniInsertGroup.Blocks,\n            priority: 2,\n            image: () =>\n              ui.prefs.darkMode() ? ui.images.omni_insert?.line_block_dark! : ui.images.omni_insert?.line_block!,\n          },\n        ),\n      ];\n    },\n  };\n};\n\nexport default extension;\n","/*\n * table.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { Transaction } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\nimport { tableEditing, columnResizing, goToNextCell, deleteColumn, deleteRow } from 'prosemirror-tables';\n\nimport { findChildrenByType } from 'prosemirror-utils';\n\nimport { EditorUI } from '../../api/ui';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocExtensions } from '../../api/pandoc';\nimport { BaseKey } from '../../api/basekeys';\nimport { ProsemirrorCommand, EditorCommandId, exitNode } from '../../api/command';\nimport { TableCapabilities } from '../../api/table';\nimport { trTransform } from '../../api/transaction';\nimport { PandocCapabilities } from '../../api/pandoc_capabilities';\n\nimport {\n  insertTable,\n  deleteTable,\n  deleteTableCaption,\n  addRows,\n  addColumns,\n  TableColumnAlignmentCommand,\n  TableRowCommand,\n  TableColumnCommand,\n  TableToggleHeaderCommand,\n  TableToggleCaptionCommand,\n  CssAlignment,\n  insertTableOmniInsert,\n} from './table-commands';\n\nimport {\n  tableContainerNode,\n  tableNode,\n  tableCaptionNode,\n  tableCellNode,\n  tableHeaderNode,\n  tableRowNode,\n} from './table-nodes';\n\nimport { fixupTableWidths } from './table-columns';\nimport { TableContextMenuPlugin } from './table-contextmenu';\nimport { tablePaste } from './table-paste';\n\nimport 'prosemirror-tables/style/tables.css';\nimport './table-styles.css';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { pandocExtensions, ui } = context;\n\n  // not enabled if there are no tables enabled\n  if (\n    !pandocExtensions.grid_tables &&\n    !pandocExtensions.pipe_tables &&\n    !pandocExtensions.simple_tables &&\n    !pandocExtensions.multiline_tables\n  ) {\n    return null;\n  }\n\n  // define table capabilities\n  const capabilities: TableCapabilities = {\n    captions: pandocExtensions.table_captions,\n    headerOptional: pandocExtensions.grid_tables,\n    multiline: pandocExtensions.multiline_tables || pandocExtensions.grid_tables,\n  };\n\n  return {\n    nodes: [\n      tableContainerNode,\n      tableNode,\n      tableCaptionNode,\n      tableCellNode(pandocExtensions.grid_tables),\n      tableHeaderNode,\n      tableRowNode,\n    ],\n\n    commands: (_schema: Schema) => {\n      const commands = [\n        new ProsemirrorCommand(\n          EditorCommandId.TableInsertTable,\n          ['Alt-Mod-t'],\n          insertTable(capabilities, ui),\n          insertTableOmniInsert(ui),\n        ),\n        new ProsemirrorCommand(EditorCommandId.TableNextCell, ['Tab'], goToNextCell(1)),\n        new ProsemirrorCommand(EditorCommandId.TablePreviousCell, ['Shift-Tab'], goToNextCell(-1)),\n        new TableColumnCommand(EditorCommandId.TableAddColumnAfter, [], addColumns(true)),\n        new TableColumnCommand(EditorCommandId.TableAddColumnBefore, [], addColumns(false)),\n        new TableColumnCommand(EditorCommandId.TableDeleteColumn, [], deleteColumn),\n        new TableRowCommand(EditorCommandId.TableAddRowAfter, [], addRows(true)),\n        new TableRowCommand(EditorCommandId.TableAddRowBefore, [], addRows(false)),\n        new TableRowCommand(EditorCommandId.TableDeleteRow, [], deleteRow),\n        new ProsemirrorCommand(EditorCommandId.TableDeleteTable, [], deleteTable()),\n        new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnLeft, CssAlignment.Left),\n        new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnRight, CssAlignment.Right),\n        new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnCenter, CssAlignment.Center),\n        new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnDefault, null),\n      ];\n      if (capabilities.captions) {\n        commands.push(new TableToggleCaptionCommand());\n      }\n      if (capabilities.headerOptional) {\n        commands.push(new TableToggleHeaderCommand());\n      }\n      return commands;\n    },\n\n    plugins: (schema: Schema) => {\n      return [\n        columnResizing({\n          handleWidth: 5,\n        }),\n        tableEditing(),\n        tablePaste(),\n        new TableContextMenuPlugin(schema, ui),\n      ];\n    },\n\n    baseKeys: (schema: Schema) => {\n      // core keys\n      const keys = [\n        { key: BaseKey.Backspace, command: deleteTableCaption() },\n        { key: BaseKey.Enter, command: exitNode(schema.nodes.table_caption, -2, false) },\n        { key: BaseKey.Tab, command: goToNextCell(1) },\n        { key: BaseKey.ShiftTab, command: goToNextCell(-1) },\n      ];\n\n      // turn enter key variations into tab if we don't support multi-line\n      if (!capabilities.multiline) {\n        keys.push({ key: BaseKey.Enter, command: goToNextCell(1) });\n        keys.push({ key: BaseKey.ShiftEnter, command: goToNextCell(-11) });\n        keys.push({ key: BaseKey.ModEnter, command: goToNextCell(1) });\n      }\n\n      return keys;\n    },\n\n    fixups: (_schema: Schema, view: EditorView) => {\n      return [fixupTableWidths(view)];\n    },\n\n    appendTransaction: (_schema: Schema) => {\n      return [\n        {\n          name: 'table-repair',\n          nodeFilter: node => node.type === node.type.schema.nodes.table,\n          append: (tr: Transaction) => {\n            trTransform(tr, tableRepairTransform);\n          },\n        },\n      ];\n    },\n  };\n};\n\nfunction tableRepairTransform(tr: Transform) {\n  const schema = tr.doc.type.schema;\n  const tables = findChildrenByType(tr.doc, schema.nodes.table);\n  tables.forEach(table => {\n    // map the position\n    const pos = tr.mapping.map(table.pos);\n\n    // get containing node (pos is right before the table)\n    const containingNode = tr.doc.resolve(pos).node();\n\n    // table with no container\n    if (containingNode.type !== schema.nodes.table_container) {\n      // add the container\n      const caption = schema.nodes.table_caption.createAndFill({ inactive: true }, undefined)!;\n      const container = schema.nodes.table_container.createAndFill({}, [table.node, caption])!;\n      tr.replaceWith(pos, pos + table.node.nodeSize, container);\n    }\n\n    // table with no content (possible w/ half caption leftover)\n    else if (table.node.firstChild && table.node.firstChild.childCount === 0) {\n      // delete the table (and container if necessary)\n      const hasContainer = containingNode.type === schema.nodes.table_container;\n      if (hasContainer) {\n        tr.deleteRange(pos - 1, pos - 1 + containingNode.nodeSize);\n      } else {\n        tr.deleteRange(pos, table.node.nodeSize);\n      }\n    }\n  });\n}\n\nexport default extension;\n","/*\n * table-commands.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { Node as ProsemirrorNode, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNodeOfType, setTextSelection, findChildrenByType } from 'prosemirror-utils';\nimport {\n  isInTable,\n  Rect,\n  TableMap,\n  selectionCell,\n  CellSelection,\n  toggleHeader,\n  addRow,\n  addColumn,\n} from 'prosemirror-tables';\n\nimport { EditorUI } from '../../api/ui';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { TableCapabilities } from '../../api/table';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport function insertTable(capabilities: TableCapabilities, ui: EditorUI) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n    const schema = state.schema;\n\n    // can we insert?\n    if (!canInsertNode(state, schema.nodes.table_container)) {\n      return false;\n    }\n\n    // is the selection inside a table caption? if it is then we can't insert\n    // as it will \"split\" the table_container in such a way that an invalid\n    // table will be created\n    if (findParentNodeOfType(schema.nodes.table_caption)(state.selection)) {\n      return false;\n    }\n\n    async function asyncInsertTable() {\n      if (dispatch) {\n        const result = await ui.dialogs.insertTable(capabilities);\n        if (result) {\n          // create cells\n          const numRows = result.rows + (result.header ? 1 : 0);\n          const rows: ProsemirrorNode[] = [];\n          for (let r = 0; r < numRows; r++) {\n            const cells: ProsemirrorNode[] = [];\n            const cellType = r === 0 && result.header ? schema.nodes.table_header : schema.nodes.table_cell;\n            for (let c = 0; c < result.cols; c++) {\n              const content =\n                cellType === schema.nodes.table_header\n                  ? schema.text(`${ui.context.translateText('Col')}${c + 1}`)\n                  : Fragment.empty;\n              cells.push(cellType.createAndFill({}, schema.nodes.paragraph.createAndFill({}, content)!)!);\n            }\n            rows.push(schema.nodes.table_row.createAndFill({}, cells)!);\n          }\n\n          // create table\n          const table = schema.nodes.table.createAndFill({}, rows)!;\n          const tableCaption = schema.nodes.table_caption.createAndFill(\n            { inactive: !result.caption },\n            result.caption ? schema.text(result.caption) : undefined,\n          )!;\n          const tableContainer = schema.nodes.table_container.createAndFill({}, [table, tableCaption])!;\n\n          // insert\n          const tr = state.tr;\n          tr.replaceSelectionWith(tableContainer);\n\n          // select first cell\n          const selectionPos = tr.mapping.map(state.selection.from, -1);\n          setTextSelection(selectionPos)(tr).scrollIntoView();\n\n          // dispatch & focus\n          dispatch(tr);\n        }\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncInsertTable();\n\n    return true;\n  };\n}\n\nexport function insertTableOmniInsert(ui: EditorUI) {\n  return {\n    name: ui.context.translateText('Table'),\n    description: ui.context.translateText('Content in rows and columns'),\n    group: OmniInsertGroup.Lists,\n    priority: 1,\n    image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.table_dark! : ui.images.omni_insert?.table!),\n  };\n}\n\nexport function deleteTable() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    const schema = state.schema;\n    const container = findParentNodeOfType(schema.nodes.table_container)(state.selection);\n    if (container) {\n      if (dispatch) {\n        const tr = state.tr;\n        tr.delete(container.pos, container.pos + container.node.nodeSize);\n        dispatch(tr.scrollIntoView());\n      }\n      return true;\n    }\n    return false;\n  };\n}\n\nexport function deleteTableCaption() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // must be a selection within an empty table caption\n    const schema = state.schema;\n    const { $head } = state.selection;\n    if ($head.parent.type !== schema.nodes.table_caption || $head.parent.childCount !== 0) {\n      return false;\n    }\n\n    if (dispatch) {\n      // set the caption to inactive\n      const tr = state.tr;\n      const caption = $head.parent;\n      tr.setNodeMarkup($head.pos - 1, schema.nodes.table_caption, {\n        ...caption.attrs,\n        inactive: true,\n      });\n      setTextSelection($head.pos - 1, -1)(tr);\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nexport function addColumns(after: boolean) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    if (!isInTable(state)) {\n      return false;\n    }\n    if (dispatch) {\n      let tr = state.tr;\n      const rect = selectedRect(state);\n      const columns = rect.right - rect.left;\n      for (let i = 0; i < columns; i++) {\n        tr = addColumn(tr, rect, after ? rect.right : rect.left);\n      }\n      dispatch(tr);\n    }\n    return true;\n  };\n}\n\nexport function addRows(after: boolean) {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    if (!isInTable(state)) {\n      return false;\n    }\n    if (dispatch) {\n      // add the rows\n      let tr = state.tr;\n      const rect = selectedRect(state);\n      const rows = rect.bottom - rect.top;\n      for (let i = 0; i < rows; i++) {\n        tr = addRow(tr, rect, after ? rect.bottom : rect.top);\n      }\n\n      // sync column alignments for table\n      const table = findParentNodeOfType(state.schema.nodes.table)(tr.selection);\n      if (table) {\n        const alignments = new Array<CssAlignment | null>(rect.map.width);\n        table.node.forEach((rowNode, rowOffset, rowIndex) => {\n          rowNode.forEach((cellNode, cellOffset, colIndex) => {\n            const cellPos = table.pos + 1 + rowOffset + 1 + cellOffset;\n            if (rowIndex === 0) {\n              const cell = tr.doc.nodeAt(cellPos);\n              alignments[colIndex] = cell?.attrs.align || null;\n            } else {\n              tr.setNodeMarkup(cellPos, cellNode.type, {\n                ...cellNode.attrs,\n                align: alignments[colIndex] || null,\n              });\n            }\n          });\n        });\n      }\n\n      dispatch(tr);\n    }\n    return true;\n  };\n}\n\nexport class TableToggleHeaderCommand extends ProsemirrorCommand {\n  constructor() {\n    super(EditorCommandId.TableToggleHeader, [], toggleHeader('row'));\n  }\n\n  public isActive(state: EditorState): boolean {\n    if (!isInTable(state)) {\n      return false;\n    }\n    const { table } = selectedRect(state);\n    const firstCell = table.firstChild!.firstChild!;\n    return firstCell.type === state.schema.nodes.table_header;\n  }\n}\n\nexport class TableToggleCaptionCommand extends ProsemirrorCommand {\n  constructor() {\n    super(\n      EditorCommandId.TableToggleCaption,\n      [],\n      (state: EditorState, dispatch?: (tr: Transaction<any>, view?: EditorView) => void) => {\n        if (!isInTable(state)) {\n          return false;\n        }\n        const caption = this.tableCaptionNode(state);\n        if (!caption) {\n          return false;\n        }\n\n        if (dispatch) {\n          const focus = caption.node.attrs.inactive;\n          const tr = state.tr;\n          tr.setNodeMarkup(caption.pos + 1, state.schema.nodes.table_caption, {\n            ...caption.node.attrs,\n            inactive: !caption.node.attrs.inactive,\n          });\n          if (focus) {\n            setTextSelection(caption.pos + 1)(tr).scrollIntoView();\n          }\n          dispatch(tr);\n        }\n\n        return true;\n      },\n    );\n  }\n\n  public isActive(state: EditorState): boolean {\n    if (!isInTable(state)) {\n      return false;\n    }\n\n    const caption = this.tableCaptionNode(state);\n    if (!caption) {\n      return false;\n    }\n\n    return !caption.node.attrs.inactive;\n  }\n\n  private tableCaptionNode(state: EditorState) {\n    const container = findParentNodeOfType(state.schema.nodes.table_container)(state.selection);\n    if (container) {\n      const caption = findChildrenByType(container.node, state.schema.nodes.table_caption);\n      return {\n        node: caption[0].node,\n        pos: container.pos + caption[0].pos,\n      };\n    } else {\n      return undefined;\n    }\n  }\n}\n\nexport enum CssAlignment {\n  Left = 'left',\n  Right = 'right',\n  Center = 'center',\n}\n\nexport class TableRowCommand extends ProsemirrorCommand {\n  public plural(state: EditorState) {\n    if (!isInTable(state)) {\n      return 1;\n    }\n\n    const rect = selectedRect(state);\n    return rect.bottom - rect.top;\n  }\n}\n\nexport class TableColumnCommand extends ProsemirrorCommand {\n  public plural(state: EditorState) {\n    if (!isInTable(state)) {\n      return 1;\n    }\n\n    const rect = selectedRect(state);\n    return rect.right - rect.left;\n  }\n}\n\nexport class TableColumnAlignmentCommand extends ProsemirrorCommand {\n  private readonly align: CssAlignment | null;\n\n  constructor(id: EditorCommandId, align: CssAlignment | null) {\n    super(id, [], (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n      if (!isInTable(state)) {\n        return false;\n      }\n\n      if (dispatch) {\n        const { table, tableStart, left, right } = selectedRect(state);\n        const tr = state.tr;\n        table.forEach((rowNode, rowOffset) => {\n          rowNode.forEach((cellNode, cellOffset, i) => {\n            if (i >= left && i < right) {\n              const cellPos = tableStart + 1 + rowOffset + cellOffset;\n              tr.setNodeMarkup(cellPos, cellNode.type, {\n                ...cellNode.attrs,\n                align,\n              });\n            }\n          });\n        });\n        dispatch(tr);\n      }\n\n      return true;\n    });\n    this.align = align;\n  }\n\n  public isActive(state: EditorState): boolean {\n    if (!isInTable(state)) {\n      return false;\n    }\n    const { table, top, left } = selectedRect(state);\n    const cell = table.child(top).child(left);\n    return cell.attrs.align === this.align;\n  }\n}\n\n// from: https://github.com/ProseMirror/prosemirror-tables/blob/master/src/commands.js\n\ninterface SelectedRect extends Rect {\n  tableStart: number;\n  map: TableMap;\n  table: ProsemirrorNode;\n}\n\nfunction selectedRect(state: EditorState): SelectedRect {\n  const sel = state.selection;\n  const $pos = selectionCell(state)!;\n  const table = $pos.node(-1);\n  const tableStart = $pos.start(-1);\n  const map = TableMap.get(table);\n  let rect: Rect;\n  if (sel instanceof CellSelection) {\n    rect = map.rectBetween(sel.$anchorCell.pos - tableStart, sel.$headCell.pos - tableStart);\n  } else {\n    rect = map.findCell($pos.pos - tableStart);\n  }\n  return {\n    ...rect,\n    tableStart,\n    map,\n    table,\n  };\n}\n","/*\n * table-nodes.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { tableNodes } from 'prosemirror-tables';\nimport { Node as ProsemirrorNode, DOMOutputSpec } from 'prosemirror-model';\n\nimport { PandocTokenType } from '../../api/pandoc';\n\nimport {\n  readPandocTable,\n  writePandocTableContainer,\n  writePandocTable,\n  writePandocTableCaption,\n  writePandocTableNodes,\n  writePandocTableHeaderNodes,\n} from './table-pandoc';\nimport { tableColumnWidths } from './table-columns';\nimport { tableBlockCapsuleFilter } from './table-capsule';\n\nexport const kDefaultCellClasses = 'pm-table-cell pm-block-border-color';\n\nconst nodes = tableNodes({\n  tableGroup: 'block',\n  cellContent: 'block+',\n  cellAttributes: {\n    align: {\n      default: null,\n      getFromDOM(dom: Element) {\n        return (dom as HTMLElement).style.textAlign || null;\n      },\n      setDOMAttr(value, attrs) {\n        if (value) {\n          attrs.style = (attrs.style || '') + `text-align: ${value};`;\n        }\n      },\n    },\n    className: {\n      default: kDefaultCellClasses,\n      getFromDOM(dom: Element) {\n        return (dom as HTMLElement).className;\n      },\n      setDOMAttr(value, attrs) {\n        attrs.class = kDefaultCellClasses;\n      },\n    },\n  },\n});\n\nexport const tableContainerNode = {\n  name: 'table_container',\n  spec: {\n    content: 'table table_caption',\n    group: 'block',\n    parseDOM: [{ tag: \"div[class*='table-container']\" }],\n    toDOM(node: ProsemirrorNode): DOMOutputSpec {\n      return ['div', { class: 'table-container pm-table-container' }, 0];\n    },\n  },\n  pandoc: {\n    readers: [\n      {\n        token: PandocTokenType.Table,\n        handler: readPandocTable,\n      },\n    ],\n    writer: writePandocTableContainer,\n    blockCapsuleFilter: tableBlockCapsuleFilter(),\n  },\n};\n\nexport const tableNode = {\n  name: 'table',\n  spec: {\n    ...nodes.table,\n    attrs: {\n      ...nodes.table.attrs,\n      width: { default: null },\n      colpercents: { default: null },\n    },\n    parseDOM: [\n      {\n        tag: 'table',\n        getAttrs: (dom: Node | string) => {\n          const el = dom as HTMLElement;\n\n          // shared colpercents\n          let colpercents: number[] | null = null;\n\n          // if we have a colgroup w/ widths then read percents from there\n          // <colgroup><col style=\"width: 44%\" /><col style=\"width: 11%\" /></colgroup>\n          const colgroup = el.getElementsByTagName('colgroup');\n          if (colgroup.length) {\n            const cols = colgroup[0].childElementCount;\n            colpercents = new Array<number>(cols).fill(0);\n            for (let i = 0; i < cols; i++) {\n              const col = colgroup[0].children.item(i) as HTMLElement;\n              if (col.style.width) {\n                colpercents[i] = (parseInt(col.style.width, 10) || 0) / 100;\n              }\n            }\n            if (colpercents.every(value => !!value)) {\n              return {\n                colpercents,\n              };\n            }\n          }\n\n          // otherwise read from data-colwidth\n          let width: number | null = null;\n          const rows = el.getElementsByTagName('tr');\n          if (rows.length) {\n            const firstRow = rows.item(0)!;\n            const numCells = firstRow.cells.length;\n            const colWidths = new Array<number>(numCells).fill(0);\n            for (let i = 0; i < numCells; i++) {\n              const cell = firstRow.cells.item(i)!;\n              const colWidth = cell.getAttribute('data-colwidth');\n              if (colWidth) {\n                colWidths[i] = Number(colWidth);\n              }\n            }\n            if (colWidths.every(colWidth => colWidth > 0)) {\n              width = colWidths.reduce((total, value) => total + value, 0);\n              colpercents = colWidths.map(colWidth => colWidth / width!);\n            }\n          }\n\n          return {\n            width,\n            colpercents,\n          };\n        },\n      },\n    ],\n    toDOM(node: ProsemirrorNode): DOMOutputSpec {\n      const attrs: any = {};\n      if (node.attrs.width) {\n        attrs['data-width'] = node.attrs.width.toString();\n      }\n      attrs['data-colpercents'] = tableColumnWidths(node).join(',');\n      return ['table', attrs, ['tbody', 0]];\n    },\n  },\n  pandoc: {\n    writer: writePandocTable,\n  },\n};\n\nexport const tableCaptionNode = {\n  name: 'table_caption',\n  spec: {\n    attrs: {\n      inactive: { default: false },\n    },\n    content: 'inline*',\n    parseDOM: [\n      {\n        tag: \"p[class*='table-caption']\",\n        getAttrs(dom: Node | string) {\n          return {\n            inactive: (dom as HTMLElement).classList.contains('table-caption-inactive'),\n          };\n        },\n      },\n    ],\n    toDOM(node: ProsemirrorNode): DOMOutputSpec {\n      const classes = ['table-caption', 'pm-node-caption'];\n      if (node.attrs.inactive) {\n        classes.push('table-caption-inactive');\n      }\n      return ['p', { class: classes.join(' ') }, 0];\n    },\n  },\n  pandoc: {\n    writer: writePandocTableCaption,\n  },\n};\n\nexport const tableRowNode = {\n  name: 'table_row',\n  spec: nodes.table_row,\n  pandoc: {\n    writer: writePandocTableNodes,\n  },\n};\n\nexport const tableCellNode = (blocks: boolean) => ({\n  name: 'table_cell',\n  spec: {\n    ...nodes.table_cell,\n    content: blocks ? 'block+' : 'paragraph',\n  },\n  pandoc: {\n    writer: writePandocTableNodes,\n  },\n});\n\nexport const tableHeaderNode = {\n  name: 'table_header',\n  spec: nodes.table_header,\n  pandoc: {\n    writer: writePandocTableHeaderNodes,\n  },\n};\n","/*\n * table-pandoc.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, NodeType, Node as ProsemirrorNode, Fragment } from 'prosemirror-model';\n\nimport { ProsemirrorWriter, PandocToken, PandocTokenType, PandocOutput } from '../../api/pandoc';\n\nimport { CssAlignment } from './table-commands';\nimport { tableColumnAlignments, tableColumnWidths } from './table-columns';\n\n// attributes\nconst kTableAttr = 0;\n\n// caption\nconst kTableCaption = 1;\nconst kTableCaptionShort = 0; // [Inline]\nconst kTableCaptionFull = 1;  // [Block]\n\n// columdefs\nconst kTableColSpec = 2;\nconst kTableColSpecAlign = 0;\nconst kTableColSpecWidth = 1;\n\n// table head\nconst kTableHead = 3;\nconst kTableHeadAttr = 0;\nconst kTableHeadRows = 1; // [Row]\n\n// table body\nconst kTableBody = 4;\nconst kTableBodyAttr = 0;\nconst kTableBodyRowHeadNumColumns = 1;\nconst kTableBodyRowHead = 2;\nconst kTableBodyRows = 3; // [Row]\n\n// table foot\nconst kTableFoot = 5;\nconst kTableFootAttr = 0;\nconst kTableFootRows = 1; // [Row]\n\n// table row\nconst kTableRowAttr = 0;\nconst kTableRowCells = 1; // [Cell]\n\n// table cell\nconst kTableCellAttr = 0;\nconst kTableCellAlignments = 1;\nconst kTableCellRowSpan = 2;\nconst kTableCellColSpan = 3;\nconst KTableCellContents = 4; // [Block]\n\n\nexport function readPandocTable(schema: Schema) {\n  return (writer: ProsemirrorWriter, tok: PandocToken) => {\n    // get alignments and columns widths\n    const alignments = columnCssAlignments(tok);\n    const colpercents = columnPercents(tok);\n\n    // helper function to parse a table row\n    const parseRow = (row: any[], cellType: NodeType) => {\n      const cells: any[] = row[kTableRowCells];\n      if (cells.length) {\n        writer.openNode(schema.nodes.table_row, {});\n        cells.forEach((cell: any[], i) => {\n          writer.openNode(cellType, { align: alignments[i] });\n          writer.writeTokens(cell[KTableCellContents]);\n          writer.closeNode();\n        });\n        writer.closeNode();\n      }\n    };\n\n    // open table container node\n    writer.openNode(schema.nodes.table_container, {});\n\n    // open table node\n    writer.openNode(schema.nodes.table, { colpercents });\n\n    // parse column headers\n    const head = tok.c[kTableHead] as any[];\n    const firstRow = head[kTableHeadRows][0];\n    if (firstRow && firstRow[kTableRowCells].some((cell: any[]) => cell[KTableCellContents].length > 0)) {\n      parseRow(firstRow, schema.nodes.table_header);\n    }\n\n    // parse table rows\n    const body = tok.c[kTableBody][0] as any[];\n    body[kTableBodyRows].forEach((row: any[]) => {\n      parseRow(row, schema.nodes.table_cell);\n    });\n\n    // close table node\n    writer.closeNode();\n\n    // read caption\n    const caption = tok.c[kTableCaption][kTableCaptionFull];\n    const captionBlock: PandocToken[] = caption.length ? caption[0].c : [];\n    writer.openNode(schema.nodes.table_caption, { inactive: captionBlock.length === 0 });\n    writer.writeTokens(captionBlock);\n    writer.closeNode();\n\n    // close table container node\n    writer.closeNode();\n  };\n}\n\nexport function writePandocTableContainer(output: PandocOutput, node: ProsemirrorNode) {\n  const caption = node.lastChild!;\n  const table = node.firstChild!;\n\n  output.writeToken(PandocTokenType.Table, () => {\n\n    // write empty attributes\n    output.writeAttr();\n\n    // write caption\n    output.writeNode(caption);\n\n    // write table\n    output.writeNode(table);\n  });\n}\n\nexport function writePandocTable(output: PandocOutput, node: ProsemirrorNode) {\n  const firstRow = node.firstChild!;\n\n  // get alignments and column widths\n  const alignments = tableColumnAlignments(node);\n  const widths = tableColumnWidths(node);\n\n  // write colspcs\n  // TODO: Columns are coming out ColWidthDefault\n  output.writeArray(() => {\n    alignments.forEach((align, i) => {\n      output.writeArray(() => {\n        output.writeToken(align);\n        if (widths[i] === 0) {\n          output.writeToken(PandocTokenType.ColWidthDefault);\n        } else {\n          output.writeToken(PandocTokenType.ColWidth, widths[i]);\n        }\n      });\n    });\n  });\n\n\n  // write header row if necessary\n  const headerCut = firstRow.firstChild!.type === node.type.schema.nodes.table_header ? 1 : 0;\n  output.writeArray(() => {\n    output.writeAttr();\n    output.writeArray(() => {\n      writePandocTableRow(output, firstRow, headerCut === 0);\n    });\n  });\n\n  // write table body\n  output.writeArray(() => {\n    output.writeArray(() => {\n      output.writeAttr();\n      output.write(0);\n      output.writeArray(() => { /* */ });\n      // write rows\n      output.writeArray(() => {\n        for (let i = headerCut; i < node.childCount; i++) {\n          writePandocTableRow(output, node.content.child(i));\n        }\n      });\n    });\n  });\n\n  // write table footer\n  output.writeArray(() => {\n    output.writeAttr();\n    output.writeArray(() => { /* */ });\n  });\n\n\n}\n\nexport function writePandocTableCaption(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeArray(() => {\n    output.write(null);\n    output.writeArray(() => {\n      if (!node.attrs.inactive && node.childCount > 0) {\n        output.writeToken(PandocTokenType.Plain, () => {\n          output.writeInlines(node.content);\n        });\n      }\n    });\n  });\n}\n\nexport function writePandocTableNodes(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeArray(() => {\n    output.writeNodes(node);\n  });\n}\n\nexport function writePandocTableHeaderNodes(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeArray(() => {\n    if (node.textContent.length > 0) {\n      output.writeNodes(node);\n    } else {\n      // write a paragraph containing a space (this is an attempt to fix an issue where\n      // empty headers don't get correct round-tripping)\n      output.writeToken(PandocTokenType.Para, () => {\n        output.writeRawMarkdown(' ');\n      });\n    }\n  });\n}\n\nfunction writePandocTableRow(output: PandocOutput, node: ProsemirrorNode, empty = false) {\n  output.writeArray(() => {\n    output.writeAttr();\n    output.writeArray(() => {\n      node.forEach((cellNode) => {\n        output.writeArray(() => {\n          output.writeAttr();\n          output.writeToken(PandocTokenType.AlignDefault);\n          output.write(1);\n          output.write(1);\n          if (!empty) {\n            output.writeNode(cellNode);\n          } else {\n            output.writeArray(() => {\n              output.writeInlines(Fragment.empty);\n            });\n          }\n        });\n      });\n    });\n  });\n}\n\n\nfunction columnCssAlignments(tableToken: PandocToken) {\n  return tableToken.c[kTableColSpec].map((spec: any) => {\n    const alignment = spec[kTableColSpecAlign];\n    switch (alignment.t) {\n      case PandocTokenType.AlignLeft:\n        return CssAlignment.Left;\n      case PandocTokenType.AlignRight:\n        return CssAlignment.Right;\n      case PandocTokenType.AlignCenter:\n        return CssAlignment.Center;\n      case PandocTokenType.AlignDefault:\n      default:\n        return null;\n    }\n  });\n}\n\nfunction columnPercents(tableToken: PandocToken): number[] {\n  return tableToken.c[kTableColSpec].map((spec: any) => {\n    const width = spec[kTableColSpecWidth];\n    return width.t === PandocTokenType.ColWidth ? width.c : 0;\n  });\n}\n","/*\n * table-columns.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { Transaction } from 'prosemirror-state';\nimport { findChildrenByType } from 'prosemirror-utils';\n\nimport { PandocTokenType } from '../../api/pandoc';\n\nimport { CssAlignment } from './table-commands';\n\nexport function tableColumnAlignments(node: ProsemirrorNode) {\n  // get the first row (schema requires at least 1 row)\n  const firstRow = node.firstChild!;\n\n  // determine # of columns\n  const cols = firstRow.childCount;\n\n  // return alignments\n  const alignments = new Array<PandocTokenType>(cols);\n  for (let i = 0; i < cols; i++) {\n    const cell = firstRow.child(i);\n    const align: CssAlignment = cell.attrs.align;\n    switch (align) {\n      case CssAlignment.Left:\n        alignments[i] = PandocTokenType.AlignLeft;\n        break;\n      case CssAlignment.Right:\n        alignments[i] = PandocTokenType.AlignRight;\n        break;\n      case CssAlignment.Center:\n        alignments[i] = PandocTokenType.AlignCenter;\n        break;\n      case null:\n      default:\n        alignments[i] = PandocTokenType.AlignDefault;\n        break;\n    }\n  }\n  return alignments;\n}\n\nexport function tableColumnWidths(node: ProsemirrorNode) {\n  // get the first row (schema requires at least 1 row)\n  const firstRow = node.firstChild!;\n\n  // determine # of columns\n  const cols = firstRow.childCount;\n\n  // width percentages\n  let widths = new Array<number>(cols).fill(0);\n\n  // take note of explicitly sized columns\n  const totalWidth = node.attrs.width;\n  let availableWidth = totalWidth;\n  let colsWithWidth = 0;\n  for (let i = 0; i < cols; i++) {\n    const col = firstRow.child(i);\n    if (col.attrs.colwidth && col.attrs.colwidth[0]) {\n      widths[i] = col.attrs.colwidth[0];\n      colsWithWidth++;\n      availableWidth -= widths[i];\n    }\n  }\n\n  // allocate remaining widths if we have at least 1 sized columns (otherwise\n  // we leave all of the widths at 0 which results in no sizing)\n  if (colsWithWidth > 0) {\n    if (availableWidth > 0) {\n      const defaultWidth = availableWidth / (cols - colsWithWidth);\n      for (let i = 0; i < cols; i++) {\n        const col = firstRow.child(i);\n        if (!col.attrs.colwidth || !col.attrs.colwidth[0]) {\n          widths[i] = defaultWidth;\n        }\n      }\n    }\n\n    // convert widths to percentages\n    widths = widths.map(width => width / totalWidth);\n  }\n\n  return widths;\n}\n\nexport function fixupTableWidths(view: EditorView) {\n  return (tr: Transaction) => {\n    const schema = tr.doc.type.schema;\n\n    // don't do fixup if we aren't connected to the DOM\n    if (!view.dom || !view.dom.isConnected) {\n      return tr;\n    }\n\n    const tables = findChildrenByType(tr.doc, schema.nodes.table);\n    for (const table of tables) {\n      // get table width\n      const el = view.domAtPos(table.pos).node as HTMLElement;\n      const containerWidth = table.node.attrs.width || el.clientWidth;\n      if (containerWidth === 0) {\n        continue;\n      }\n\n      // resolve colpercents (read by tokenzier)\n      const colpercents = table.node.attrs.colpercents;\n      if (colpercents) {\n        // for each row\n        table.node.forEach((rowNode, rowOffset, r) => {\n          // for each cell\n          rowNode.forEach((cellNode, cellOffset, c) => {\n            const cellPos = table.pos + 1 + rowOffset + 1 + cellOffset;\n            const colWidth = [colpercents[c] * containerWidth];\n            if (colWidth !== cellNode.attrs.colwidth) {\n              tr.setNodeMarkup(cellPos, cellNode.type, {\n                ...cellNode.attrs,\n                colwidth: colWidth,\n              });\n            }\n          });\n        });\n      }\n\n      if (containerWidth !== table.node.attrs.width || colpercents) {\n        tr.setNodeMarkup(table.pos, schema.nodes.table, {\n          ...table.node.attrs,\n          width: containerWidth,\n          colpercents: null,\n        });\n      }\n    }\n    return tr;\n  };\n}\n","/*\n * table-capsule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMParser } from 'prosemirror-model';\n\nimport {\n  PandocBlockCapsuleFilter,\n  PandocBlockCapsule,\n  blockCapsuleParagraphTokenHandler,\n  encodedBlockCapsuleRegex,\n  blockCapsuleTextHandler,\n  blockCapsuleSourceWithoutPrefix,\n  parsePandocBlockCapsule,\n} from '../../api/pandoc_capsule';\nimport { ProsemirrorWriter, PandocToken, PandocTokenType } from '../../api/pandoc';\nimport { kHTMLFormat } from '../../api/raw';\n\nexport function tableBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n  const kTableBlockCapsuleType = '8EF5A772-DD63-4622-84BF-AF1995A1B2B9'.toLowerCase();\n  const pagraphTokenCapsuleHandler = blockCapsuleParagraphTokenHandler(kTableBlockCapsuleType);\n  const tokenRegex = encodedBlockCapsuleRegex('^', '$');\n\n  return {\n    type: kTableBlockCapsuleType,\n\n    match: /^([\\t >]*)(<table[\\W\\w]*?<\\/table>)([ \\t]*)$/gm,\n\n    // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n    // (in this case we don't do anything because pandoc would have written this table as a\n    // semantically standalone block)\n    enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n      return capsuleText;\n    },\n\n    // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n    // and if we find it, parse and return the original source code\n    handleText: blockCapsuleTextHandler(kTableBlockCapsuleType, encodedBlockCapsuleRegex(undefined, undefined, 'gm')),\n\n    // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n    // if find that then return the block capsule text\n    handleToken: (tok: PandocToken) => {\n      // first check for a paragraph\n      const capsuleText = pagraphTokenCapsuleHandler(tok);\n      if (capsuleText) {\n        return capsuleText;\n      }\n\n      // now look for a definition list (which is what a table with a caption parses as)\n      if (tok.t === PandocTokenType.DefinitionList) {\n        if (tok.c.length === 1) {\n          const definition = tok.c[0];\n          if (definition[0][0].t === PandocTokenType.Str) {\n            const term = definition[0][0].c as string;\n            const match = term.match(tokenRegex);\n            if (match) {\n              const capsuleRecord = parsePandocBlockCapsule(term);\n              if (capsuleRecord.type === kTableBlockCapsuleType) {\n                return term;\n              }\n            }\n          }\n        }\n      }\n\n      return null;\n    },\n\n    // write the node as a table (parse the html)\n    writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n      // remove the source prefix\n      const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n      // fallback to write as raw html\n      const writeAsRawHTML = () => {\n        writer.openNode(schema.nodes.raw_block, { format: kHTMLFormat });\n        writer.writeText(source);\n        writer.closeNode();\n      };\n\n      // parse the table from the string\n      const parser = new window.DOMParser();\n      const doc = parser.parseFromString(capsule.source, 'text/html');\n      if (doc.body && doc.body.firstChild instanceof HTMLTableElement) {\n        // get prosemirror dom parser\n        const prosemirrorDomParser = DOMParser.fromSchema(schema);\n\n        // get unparsed (by prosemirror) table\n        const unparsedTable = doc.body.firstChild;\n\n        // ensure that table cells all have content\n        const ensureCellContent = (tag: string) => {\n          const cells = unparsedTable.getElementsByTagName(tag);\n          for (let i = 0; i < cells.length; i++) {\n            const cell = cells.item(i)!;\n            if (cell.children.length === 0) {\n              cell.append(window.document.createElement('p'));\n            }\n          }\n        };\n        ensureCellContent('td');\n        ensureCellContent('th');\n\n        // extract caption element\n        let captionElement: HTMLTableCaptionElement | null = null;\n        const captionCollection = unparsedTable.getElementsByTagName('caption');\n        if (captionCollection.length) {\n          captionElement = captionCollection.item(0);\n          if (captionElement) {\n            captionElement.remove();\n          }\n        }\n\n        // determine caption (either empty or parsed from element)\n        let caption = schema.nodes.table_caption.create({ inactive: true });\n        if (captionElement) {\n          const captionSlice = prosemirrorDomParser.parseSlice(captionElement);\n          caption = schema.nodes.table_caption.createAndFill({ inactive: false }, captionSlice.content)!;\n        }\n\n        // parse the prosemirror table element\n        const slice = prosemirrorDomParser.parseSlice(doc.body);\n        if (slice.content.firstChild && slice.content.firstChild.type === schema.nodes.table) {\n          const table = slice.content.firstChild;\n          writer.addNode(schema.nodes.table_container, {}, [table, caption]);\n        } else {\n          writeAsRawHTML();\n        }\n\n        // fallback to writing as raw_html (round-trip unmodified)\n      } else {\n        writeAsRawHTML();\n      }\n    },\n  };\n}\n","/*\n * table-contextmenu.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\nimport { isInTable } from 'prosemirror-tables';\n\nimport { EditorUI } from '../../api/ui';\nimport { EditorCommandId } from '../../api/command';\n\nexport class TableContextMenuPlugin extends Plugin {\n  private menuVisible = false;\n\n  constructor(_schema: Schema, ui: EditorUI) {\n    super({\n      key: new PluginKey('table-contextmenu'),\n\n      props: {\n        handleDOMEvents: {\n          contextmenu: (view: EditorView, event: Event) => {\n            // only trigger when in table\n            if (!isInTable(view.state)) {\n              return false;\n            }\n\n            const asyncShowTableContextMenu = async () => {\n              const menu = [\n                { command: EditorCommandId.TableAddRowBefore },\n                { command: EditorCommandId.TableAddRowAfter },\n                { separator: true },\n                { command: EditorCommandId.TableAddColumnBefore },\n                { command: EditorCommandId.TableAddColumnAfter },\n                { separator: true },\n                { command: EditorCommandId.TableDeleteRow },\n                { command: EditorCommandId.TableDeleteColumn },\n                { separator: true },\n                { command: EditorCommandId.TableDeleteTable },\n                { separator: true },\n                {\n                  text: ui.context.translateText('Align Column'),\n                  subMenu: {\n                    items: [\n                      { command: EditorCommandId.TableAlignColumnLeft },\n                      { command: EditorCommandId.TableAlignColumnCenter },\n                      { command: EditorCommandId.TableAlignColumnRight },\n                      { separator: true },\n                      { command: EditorCommandId.TableAlignColumnDefault },\n                    ],\n                  },\n                },\n                { separator: true },\n                { command: EditorCommandId.TableToggleHeader },\n                { command: EditorCommandId.TableToggleCaption },\n              ];\n\n              const { clientX, clientY } = event as MouseEvent;\n              await ui.display.showContextMenu!(menu, clientX, clientY);\n              this.menuVisible = false;\n            };\n\n            if (ui.display.showContextMenu) {\n              this.menuVisible = true;\n              asyncShowTableContextMenu();\n              event.stopPropagation();\n              event.preventDefault();\n              return true;\n            } else {\n              return false;\n            }\n          },\n        },\n      },\n\n      // prevent selection while the context menu is visible (the right-click\n      // that invokes the context menu ends up resetting the selection, which\n      // makes the selection-based commands behave incorrectly when multiple\n      // rows or columns are selected)\n      filterTransaction: (tr: Transaction, state: EditorState) => {\n        if (this.menuVisible && isInTable(state)) {\n          return !(tr.selectionSet && !tr.docChanged && !tr.storedMarksSet);\n        } else {\n          return true;\n        }\n      },\n    });\n  }\n}\n","/*\n * table-paste.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { Slice, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { sliceHasNode } from '../../api/slice';\n\nimport { fixupTableWidths } from './table-columns';\nimport { forChangedNodes } from '../../api/transaction';\n\nimport { kDefaultCellClasses } from './table-nodes';\n\nexport function tablePaste() {\n  return new Plugin({\n    key: new PluginKey('table-paste'),\n    props: {\n      handlePaste: (view: EditorView, _event: Event, slice: Slice) => {\n        // if the slice contains a table then we handle it\n        if (sliceHasNode(slice, node => node.type === node.type.schema.nodes.table)) {\n          // based on https://github.com/ProseMirror/prosemirror-view/blob/fb799aae4e9dd5cfc256708a6845d76aaaf145bf/src/input.js#L503-L510\n          const tr = view.state.tr.replaceSelection(slice);\n          view.dispatch(\n            tr\n              .scrollIntoView()\n              .setMeta('paste', true)\n              .setMeta('tablePaste', true)\n              .setMeta('uiEvent', 'paste'),\n          );\n          view.dispatch(fixupTableWidths(view)(view.state.tr));\n          return true;\n        } else {\n          return false;\n        }\n      },\n    },\n    appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n      // alias schema\n      const schema = newState.schema;\n\n      // only process table paste transactions\n      if (!transactions.some(transaction => transaction.getMeta('tablePaste'))) {\n        return null;\n      }\n\n      // cleanup table by converting the first row to header cells, ensuring that column alignments\n      // are derived from the alignment of the first row, and applying the standard cell class names\n      const tr = newState.tr;\n      forChangedNodes(\n        oldState,\n        newState,\n        node => node.type === node.type.schema.nodes.table,\n        (node, pos) => {\n          let firstRow: ProsemirrorNode;\n          let currentColumn = 0;\n          const columnAlignments: string[] = [];\n\n          node.descendants((childNode, childPos, parent) => {\n            // if this is a row then reset the current column to 0\n            if (childNode.type === schema.nodes.table_row) {\n              currentColumn = 0;\n            }\n\n            // first thing we will encounter in traveral is the first row, note that and move along to cells\n            if (!firstRow) {\n              // note first row\n              firstRow = childNode;\n\n              // children of the first row are the headers\n            } else if (parent === firstRow) {\n              // collect alignment (will be applied below to cells in this column)\n              columnAlignments.push(childNode.attrs.align);\n\n              // convert to a table header w/ default class\n              const headerPos = pos + 1 + childPos;\n              tr.setNodeMarkup(headerPos, schema.nodes.table_header, {\n                ...childNode.attrs,\n                className: kDefaultCellClasses,\n              });\n\n              // normal cell - apply the requisite alignment and give it the default class\n            } else if (childNode.type === schema.nodes.table_cell) {\n              // determine alignment\n              const align = columnAlignments[currentColumn] || null;\n\n              // apply markup\n              const cellPos = pos + 1 + childPos;\n              tr.setNodeMarkup(cellPos, schema.nodes.table_cell, {\n                ...childNode.attrs,\n                align,\n                className: kDefaultCellClasses,\n              });\n            }\n\n            // if this is a cell then advance the current column\n            if (childNode.type === schema.nodes.table_header || childNode.type === schema.nodes.table_cell) {\n              currentColumn++;\n            }\n          });\n        },\n      );\n\n      if (tr.docChanged) {\n        return tr;\n      }\n    },\n  });\n}\n","/*\n * definition_list.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { PandocTokenType } from '../../api/pandoc';\nimport { ExtensionContext } from '../../api/extension';\nimport { BaseKey } from '../../api/basekeys';\n\nimport { InsertDefinitionList, InsertDefinitionDescription, InsertDefinitionTerm } from './definition_list-commands';\n\nimport {\n  definitionListEnter,\n  definitionListBackspace,\n  definitionListTab,\n  definitionListShiftTab,\n} from './definition-list-keys';\n\nimport { definitionInputRule } from './definition_list-inputrule';\n\nimport { insertDefinitionListAppendTransaction } from './definition_list-insert';\nimport {\n  readPandocDefinitionList,\n  writePandocDefinitionList,\n  writePandocDefinitionListTerm,\n  writePandocDefinitionListDescription,\n} from './definition_list-pandoc';\n\nimport './definition_list-styles.css';\nimport { emptyNodePlaceholderPlugin } from '../../api/placeholder';\n\nconst extension = (context: ExtensionContext) => {\n  const { pandocExtensions, ui } = context;\n\n  if (!pandocExtensions.definition_lists) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'definition_list_term',\n        spec: {\n          content: 'inline*',\n          isolating: true,\n          parseDOM: [{ tag: 'dt' }],\n          toDOM(): DOMOutputSpec {\n            return ['dt', { class: 'pm-definition-term' }, 0];\n          },\n        },\n        pandoc: {\n          writer: writePandocDefinitionListTerm,\n        },\n      },\n      {\n        name: 'definition_list_description',\n        spec: {\n          content: 'block+',\n          parseDOM: [{ tag: 'dd' }],\n          toDOM(): DOMOutputSpec {\n            return ['dd', { class: 'pm-definition-description pm-block-border-color pm-margin-bordered' }, 0];\n          },\n        },\n        pandoc: {\n          writer: writePandocDefinitionListDescription,\n        },\n      },\n      {\n        name: 'definition_list',\n        spec: {\n          content: '(definition_list_term definition_list_description*)+',\n          group: 'block',\n          defining: true,\n          parseDOM: [{ tag: 'dl' }],\n          toDOM(): DOMOutputSpec {\n            return ['dl', { class: 'pm-definition-list' }, 0];\n          },\n        },\n        pandoc: {\n          readers: [\n            {\n              token: PandocTokenType.DefinitionList,\n              handler: readPandocDefinitionList,\n            },\n          ],\n\n          writer: writePandocDefinitionList,\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      return [\n        new InsertDefinitionList(ui),\n        new InsertDefinitionTerm(schema, ui),\n        new InsertDefinitionDescription(schema),\n      ];\n    },\n\n    baseKeys: (_schema: Schema) => {\n      return [\n        { key: BaseKey.Enter, command: definitionListEnter() },\n        { key: BaseKey.Backspace, command: definitionListBackspace() },\n        { key: BaseKey.Tab, command: definitionListTab() },\n        { key: BaseKey.ShiftTab, command: definitionListShiftTab() },\n      ];\n    },\n\n    inputRules: (_schema: Schema) => {\n      return [definitionInputRule()];\n    },\n\n    appendTransaction: (_schema: Schema) => {\n      return [insertDefinitionListAppendTransaction()];\n    },\n\n    plugins: (schema: Schema) => {\n      return [emptyNodePlaceholderPlugin(schema.nodes.definition_list_term, () => ui.context.translateText('Term'))];\n    },\n  };\n};\n\nexport default extension;\n","/*\n * definition_list-commands.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nimport { canInsertNode } from '../../api/node';\nimport { insertDefinitionList } from './definition_list-insert';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport class InsertDefinitionList extends ProsemirrorCommand {\n  constructor(ui: EditorUI) {\n    super(\n      EditorCommandId.DefinitionList,\n      [],\n      (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n        const schema = state.schema;\n\n        if (\n          findParentNodeOfType(schema.nodes.definition_list)(state.selection) ||\n          !canInsertNode(state, schema.nodes.definition_list)\n        ) {\n          return false;\n        }\n\n        // new definition list\n        if (dispatch) {\n          const tr = state.tr;\n\n          // create new list\n          const termText = insertTermText(ui);\n          const term = schema.text(termText);\n          insertDefinitionList(tr, [\n            schema.nodes.definition_list_term.createAndFill({}, term),\n            createDefinitionDescription(schema),\n          ]);\n          const start = state.selection.from;\n          tr.setSelection(TextSelection.create(tr.doc, start, start + termText.length + 1)).scrollIntoView();\n          dispatch(tr);\n        }\n        return true;\n      },\n      // omni insert\n      {\n        name: ui.context.translateText('Definition List'),\n        description: ui.context.translateText('List with a definition for each item'),\n        group: OmniInsertGroup.Lists,\n        priority: 3,\n        image: () =>\n          ui.prefs.darkMode() ? ui.images.omni_insert?.definition_list_dark! : ui.images.omni_insert?.definition_list!,\n      },\n    );\n  }\n}\n\nclass InsertDefinitionListItemCommand extends ProsemirrorCommand {\n  constructor(id: EditorCommandId, createFn: () => ProsemirrorNode) {\n    super(id, [], (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n      const schema = state.schema;\n\n      if (!findParentNodeOfType(schema.nodes.definition_list)(state.selection)) {\n        return false;\n      }\n\n      if (dispatch) {\n        const tr = state.tr;\n        const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n        const parent = findParentNodeOfType(dlTypes)(state.selection)!;\n        const insertPos = parent.pos + parent.node.nodeSize;\n        const insertNode = createFn();\n        tr.insert(insertPos, insertNode);\n        if (insertNode.textContent.length > 1) {\n          tr.setSelection(TextSelection.create(tr.doc, insertPos, insertPos + insertNode.textContent.length + 1));\n        } else {\n          setTextSelection(insertPos, 1)(tr);\n        }\n        tr.scrollIntoView();\n\n        dispatch(tr);\n      }\n\n      return true;\n    });\n  }\n}\n\nexport class InsertDefinitionTerm extends InsertDefinitionListItemCommand {\n  constructor(schema: Schema, ui: EditorUI) {\n    super(EditorCommandId.DefinitionTerm, () => {\n      const term = schema.text(insertTermText(ui));\n      return schema.nodes.definition_list_term.createAndFill({}, term)!;\n    });\n  }\n}\n\nexport class InsertDefinitionDescription extends InsertDefinitionListItemCommand {\n  constructor(schema: Schema) {\n    super(EditorCommandId.DefinitionDescription, () => {\n      return createDefinitionDescription(schema);\n    });\n  }\n}\n\nfunction insertTermText(ui: EditorUI) {\n  return ui.context.translateText('term');\n}\n\nfunction createDefinitionDescription(schema: Schema) {\n  return schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!;\n}\n","/*\n * definition_list-insert.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\nimport { setTextSelection } from 'prosemirror-utils';\nimport { findChildrenByType } from 'prosemirror-utils';\nimport { trTransform } from '../../api/transaction';\nimport { Transform } from 'prosemirror-transform';\n\nexport function insertDefinitionList(tr: Transaction, items: ProsemirrorNode[]) {\n  const schema = items[0].type.schema;\n  const definitionList = schema.nodes.definition_list.createAndFill({}, items)!;\n  const prevCursor = tr.selection.to;\n  tr.replaceSelectionWith(definitionList);\n  setTextSelection(tr.mapping.map(prevCursor) - 1, -1)(tr).scrollIntoView();\n  return tr;\n}\n\nexport function insertDefinitionListAppendTransaction() {\n  return {\n    name: 'definition-list-join',\n    nodeFilter: (node: ProsemirrorNode) => node.type === node.type.schema.nodes.definition_list,\n    append: (tr: Transaction) => {\n      // if a transaction creates 2 adjacent definition lists then join them\n      trTransform(tr, joinDefinitionListsTransform);\n    },\n  };\n}\n\nfunction joinDefinitionListsTransform(tr: Transform) {\n  const nodeType = tr.doc.type.schema.nodes.definition_list;\n  const lists = findChildrenByType(tr.doc, nodeType, true);\n  for (const list of lists) {\n    // NOTE: no mapping (checking for deletion + getting the updated\n    // position) is required here because we only ever do one transform\n    // (see return after tr.join below)\n    const listPos = tr.doc.resolve(list.pos + 1);\n    const listIndex = listPos.index(listPos.depth - 1);\n    const listParent = listPos.node(listPos.depth - 1);\n    if (listIndex + 1 < listParent.childCount) {\n      const nextNode = listParent.child(listIndex + 1);\n      if (nextNode.type === nodeType) {\n        tr.join(list.pos + list.node.nodeSize);\n        return;\n      }\n    }\n  }\n}\n","/*\n * definition_list-keys.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport {\n  findParentNodeOfType,\n  findParentNodeOfTypeClosestToPos,\n  setTextSelection,\n  hasParentNodeOfType,\n  ContentNodeWithPos,\n} from 'prosemirror-utils';\n\nimport { isLastChild, isOnlyChild } from '../../api/position';\n\nexport function definitionListEnter() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // process if we are within a definition list\n    const schema = state.schema;\n    const parentDL = findParentNodeOfType(schema.nodes.definition_list)(state.selection);\n    if (!parentDL) {\n      return false;\n    }\n\n    // handle only empty selections\n    if (!state.selection.empty) {\n      return false;\n    }\n\n    // handle enter in either a term or definition\n    const parentTerm = findParentNodeOfType(schema.nodes.definition_list_term)(state.selection);\n    if (parentTerm) {\n      return termEnter(parentTerm, state, dispatch);\n\n      // enter in trailing empty description paragraph (append a term)\n    } else if (isTrailingEmptyParagraph(state)) {\n      if (dispatch) {\n        endOfDescriptionEnter(state, dispatch);\n      }\n      return true;\n    } else {\n      return false;\n    }\n  };\n}\n\nexport function definitionListBackspace() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // process if we are within a definition item\n    const schema = state.schema;\n    const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n    const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n    if (!parentTerm) {\n      return false;\n    }\n\n    if (parentTerm.node.type === schema.nodes.definition_list_term) {\n      // if it's empty\n      if (parentTerm.node.childCount === 0) {\n        if (dispatch) {\n          emptyTermBackspace(state, dispatch);\n        }\n        return true;\n      }\n    } else {\n      // if the enclosing description is empty then delete it\n      if (parentTerm.node.textContent.length === 0) {\n        if (dispatch) {\n          emptyDescriptionBackspace(parentTerm, state, dispatch);\n        }\n\n        return true;\n      }\n    }\n\n    return false;\n  };\n}\n\nexport function definitionListTab() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // process if we are within a definition_term\n    const schema = state.schema;\n    const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n    const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n    if (!parentTerm) {\n      return false;\n    }\n\n    // advance past node\n    if (dispatch) {\n      const tr = state.tr;\n      const advancePos = parentTerm.pos + parentTerm.node.nodeSize;\n      setTextSelection(advancePos, 1)(tr).scrollIntoView();\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nexport function definitionListShiftTab() {\n  return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n    // process if we are within a definition_term\n    const schema = state.schema;\n    const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n    const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n    if (!parentTerm) {\n      return false;\n    }\n\n    if (dispatch) {\n      const tr = state.tr;\n      const backwardPos = state.doc.resolve(parentTerm.pos - 1);\n      const prevNode = findParentNodeOfTypeClosestToPos(backwardPos, dlTypes);\n      if (prevNode) {\n        setTextSelection(prevNode.start, 1)(tr).scrollIntoView();\n      } else {\n        const listNode = findParentNodeOfType(schema.nodes.definition_list)(tr.selection)!;\n        setTextSelection(listNode.pos, -1)(tr).scrollIntoView();\n      }\n\n      dispatch(tr);\n    }\n\n    return true;\n  };\n}\n\nfunction termEnter(term: ContentNodeWithPos, state: EditorState, dispatch?: (tr: Transaction) => void) {\n  const schema = state.schema;\n  const $head = state.selection.$head;\n\n  // only handle empty selections\n  if (!state.selection.empty) {\n    return false;\n  }\n\n  // if we are empty then it's an exit (delete the term)\n  const isEmpty = term.node.textContent.length === 0;\n  if (isEmpty) {\n    if (dispatch) {\n      const tr = state.tr;\n      tr.deleteRange(term.pos, term.pos + term.node.nodeSize);\n      tr.replaceSelectionWith(schema.nodes.paragraph.create());\n      setTextSelection(tr.mapping.map(state.selection.from), 1)(tr);\n      dispatch(tr);\n    }\n    return true;\n\n    // variable handling for non-empty\n  } else {\n    // selection at the beginning means insert another term above\n    if ($head.parentOffset === 0) {\n      if (dispatch) {\n        const tr = state.tr;\n        const insertPos = tr.selection.$head.before($head.depth);\n        tr.insert(insertPos, schema.nodes.definition_list_term.create());\n        dispatch(tr);\n      }\n      return true;\n\n      // selection at the end means insert a description below\n    } else if ($head.parentOffset === term.node.textContent.length) {\n      if (dispatch) {\n        const tr = state.tr;\n        const insertPos = tr.selection.$head.after($head.depth);\n        tr.insert(\n          insertPos,\n          schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n        );\n        setTextSelection(insertPos, 1)(tr).scrollIntoView();\n        dispatch(tr);\n      }\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction emptyTermBackspace(state: EditorState, dispatch: (tr: Transaction) => void) {\n  const { $head } = state.selection;\n  const tr = state.tr;\n  // if it's the only child then delete the entire list\n  if (isOnlyChild($head)) {\n    const start = $head.start($head.depth - 1) - 1;\n    tr.deleteRange(start, start + $head.node($head.depth - 1).nodeSize);\n  } else {\n    const start = $head.start($head.depth) - 1;\n    tr.deleteRange(start, start + $head.node($head.depth).nodeSize);\n  }\n  dispatch(tr);\n}\n\nfunction endOfDescriptionEnter(state: EditorState, dispatch: (tr: Transaction) => void) {\n  const schema = state.schema;\n  const { $head } = state.selection;\n  const selectionNode = $head.node($head.depth);\n\n  const tr = state.tr;\n\n  // if the parent description is empty then delete it\n  let start = null;\n  const descriptionNode = $head.node($head.depth - 1);\n  if (descriptionNode.textContent.trim().length === 0) {\n    start = $head.start($head.depth - 1) - 1;\n    tr.deleteRange(start, start + descriptionNode.nodeSize);\n\n    // only if at very end\n    if (isLastChild($head, 2)) {\n      const insertPos = tr.mapping.map($head.after($head.depth - 2));\n      tr.insert(insertPos, schema.nodes.paragraph.create());\n      setTextSelection(insertPos, 1)(tr).scrollIntoView();\n    }\n\n    // otherwise just delete the paragraph and insert a term\n  } else {\n    start = $head.start($head.depth) - 1;\n    tr.deleteRange(start, start + selectionNode.nodeSize);\n    start = tr.mapping.map(start);\n    tr.insert(start + 1, schema.nodes.definition_list_term.create());\n    setTextSelection(start, 1)(tr).scrollIntoView();\n  }\n\n  dispatch(tr);\n}\n\nfunction emptyDescriptionBackspace(\n  description: ContentNodeWithPos,\n  state: EditorState,\n  dispatch: (tr: Transaction) => void,\n) {\n  const tr = state.tr;\n  tr.deleteRange(description.pos, description.pos + description.node.nodeSize);\n  dispatch(tr);\n}\n\nfunction isTrailingEmptyParagraph(state: EditorState) {\n  const { $head } = state.selection;\n  const selectionNode = $head.node($head.depth);\n  const isParagraph = selectionNode.type === state.schema.nodes.paragraph;\n  const isEmpty = selectionNode.textContent.trim().length === 0;\n  return isParagraph && isEmpty && isLastChild($head);\n}\n\n// eslint-disable-next-line\nfunction selectionCrossesListBoundary(state: EditorState) {\n  const { $head, $anchor } = state.selection;\n  const headInDL = hasParentNodeOfType(state.schema.nodes.definition_list)(TextSelection.near($head));\n  const anchorInDL = hasParentNodeOfType(state.schema.nodes.definition_list)(TextSelection.near($anchor));\n  return headInDL !== anchorInDL;\n}\n","/*\n * definition_list-inputrule.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\nimport { setTextSelection, findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nimport { insertDefinitionList } from './definition_list-insert';\n\nexport function definitionInputRule() {\n  return new InputRule(/^:[ ]+$/, (state: EditorState, match: string[], start: number, end: number) => {\n    const schema = state.schema;\n\n    // if we are inside a definiition list description this means start a new description\n    const { $head } = state.selection;\n    const container = $head.node($head.depth - 1);\n    const parent = $head.node($head.depth);\n\n    // must be just ': '\n    if (parent.textContent.trim() !== ':') {\n      return null;\n    }\n\n    // check for : within a definition list description\n    if (container.type === schema.nodes.definition_list_description && parent.type === schema.nodes.paragraph) {\n      const tr = state.tr;\n      const startPos = $head.start($head.depth) - 1;\n      tr.deleteRange(startPos, startPos + $head.node($head.depth).nodeSize);\n      const insertPos = tr.mapping.map(startPos) + 1;\n      tr.insert(\n        insertPos,\n        schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n      );\n      setTextSelection(insertPos, 1)(tr).scrollIntoView();\n      return tr;\n\n      // check for : in a paragraph immediately after another paragraph\n    } else if (container.type !== schema.nodes.definition_list_description && isParagraphAfterParagraph(state)) {\n      const prevPara = findParentNodeOfTypeClosestToPos(state.doc.resolve(start - 2), schema.nodes.paragraph);\n      if (prevPara) {\n        const tr = state.tr;\n        tr.deleteRange(prevPara.start, end);\n        insertDefinitionList(tr, [\n          schema.nodes.definition_list_term.createAndFill({}, prevPara.node.content)!,\n          schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n        ]);\n        return tr;\n      } else {\n        return null;\n      }\n    } else {\n      return null;\n    }\n  });\n}\n\nfunction isParagraphAfterParagraph(state: EditorState) {\n  const schema = state.schema;\n  const { $head } = state.selection;\n\n  // check if the selection is in a paragraph\n  const selectionInParagraph = $head.node($head.depth).type === schema.nodes.paragraph;\n  if (!selectionInParagraph) {\n    return false;\n  }\n\n  // check if the previous node is a paragraph\n  const parent = $head.node($head.depth - 1);\n  const parentIndex = $head.index($head.depth - 1);\n  return parentIndex > 0 && parent.child(parentIndex - 1).type === schema.nodes.paragraph;\n}\n","/*\n * position.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos } from 'prosemirror-model';\n\nexport function isOnlyChild(pos: ResolvedPos, depthOffset = 1) {\n  return pos.node(pos.depth - depthOffset).childCount === 1;\n}\n\nexport function isLastChild(pos: ResolvedPos, depthOffset = 1) {\n  return pos.index(pos.depth - depthOffset) === pos.node(pos.depth - depthOffset).childCount - 1;\n}\n","/*\n * definition_list-pandoc.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ProsemirrorWriter, PandocToken, PandocOutput, PandocTokenType } from '../../api/pandoc';\n\nexport function readPandocDefinitionList(schema: Schema) {\n  return (writer: ProsemirrorWriter, tok: PandocToken) => {\n    writer.openNode(schema.nodes.definition_list, {});\n\n    const definitions = tok.c;\n    definitions.forEach((definition: [PandocToken[], PandocToken[][]]) => {\n      const term = definition[0];\n      writer.openNode(schema.nodes.definition_list_term, {});\n      writer.writeTokens(term);\n      writer.closeNode();\n\n      const descriptions = definition[1];\n      descriptions.forEach(description => {\n        writer.openNode(schema.nodes.definition_list_description, {});\n        writer.writeTokens(description);\n        writer.closeNode();\n      });\n    });\n    writer.closeNode();\n  };\n}\n\nexport function writePandocDefinitionList(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeToken(PandocTokenType.DefinitionList, () => {\n    // collect terms and descriptions\n    const currentDefinition: {\n      term?: ProsemirrorNode;\n      descriptions: ProsemirrorNode[];\n    } = { descriptions: new Array<ProsemirrorNode>() };\n\n    // functions to manipulate current definition\n    function writeCurrent() {\n      if (currentDefinition.term) {\n        output.writeArray(() => {\n          output.writeNode(currentDefinition.term!);\n          output.writeArray(() => {\n            currentDefinition.descriptions.forEach(description => {\n              output.writeNode(description);\n            });\n          });\n        });\n      }\n    }\n\n    // write the list\n    node.forEach(child => {\n      if (child.type === child.type.schema.nodes.definition_list_term) {\n        writeCurrent();\n        currentDefinition.term = child;\n        currentDefinition.descriptions = [];\n      } else {\n        currentDefinition.descriptions.push(child);\n      }\n    });\n    writeCurrent();\n  });\n}\n\nexport function writePandocDefinitionListTerm(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeArray(() => {\n    output.writeInlines(node.content);\n  });\n}\n\nexport function writePandocDefinitionListDescription(output: PandocOutput, node: ProsemirrorNode) {\n  output.writeArray(() => {\n    output.writeNodes(node);\n  });\n}\n","/*\n * shortcode_block.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocOutput, PandocTokenType, PandocToken, stringifyTokens, ProsemirrorWriter } from '../api/pandoc';\n\nimport { kHugoDocType } from '../api/format';\n\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { codeNodeSpec } from '../api/code';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { canInsertNode } from '../api/node';\nimport { kShortcodeRegEx } from '../api/shortcode';\nimport {\n  PandocBlockCapsuleFilter,\n  blockCapsuleParagraphTokenHandler,\n  encodedBlockCapsuleRegex,\n  PandocBlockCapsule,\n  blockCapsuleTextHandler,\n  blockCapsuleSourceWithoutPrefix,\n} from '../api/pandoc_capsule';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { format } = context;\n\n  // return null if no shortcodes\n  if (!format.hugoExtensions.shortcodes) {\n    return null;\n  }\n\n  return {\n    nodes: [\n      {\n        name: 'shortcode_block',\n\n        spec: {\n          ...codeNodeSpec(),\n          attrs: {},\n          parseDOM: [\n            {\n              tag: \"div[class*='shortcode-block']\",\n              preserveWhitespace: 'full',\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return ['div', { class: 'shortcode-block pm-fixedwidth-font pm-code-block pm-markup-text-color' }, 0];\n          },\n        },\n\n        code_view: {\n          lang: () => 'text',\n          borderColorClass: 'pm-raw-block-border',\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.shortcode_block,\n          tags: () => ['shortcode'],\n          editFn: () => () => false,\n        }),\n\n        pandoc: {\n          // unroll shortcode from paragraph with single shortcode\n          blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n            if (isParaWrappingShortcode(tok)) {\n              const text = stringifyTokens(tok.c);\n              writer.addNode(schema.nodes.shortcode_block, {}, [schema.text(text)]);\n              return true;\n            } else {\n              return false;\n            }\n          },\n\n          // capture shortcuts w/ begin/end tags\n          blockCapsuleFilter: shortcodeBlockCapsuleFilter(),\n\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Para, () => {\n              output.writeRawMarkdown(node.content);\n            });\n          },\n        },\n      },\n    ],\n\n    commands: (schema: Schema) => {\n      // only create command for hugo doc types\n      if (!format.docTypes.includes(kHugoDocType)) {\n        return [];\n      }\n\n      return [\n        new ProsemirrorCommand(\n          EditorCommandId.Shortcode,\n          [],\n          (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n            // enable/disable command\n            if (!canInsertNode(state, schema.nodes.shortcode_block)) {\n              return false;\n            }\n            if (dispatch) {\n              const tr = state.tr;\n              const shortcode = '{{<  >}}';\n              const shortcodeNode = schema.nodes.shortcode_block.create({}, schema.text(shortcode));\n              tr.replaceSelectionWith(shortcodeNode);\n              setTextSelection(tr.mapping.map(state.selection.from) - shortcode.length / 2 - 1)(tr);\n              dispatch(tr);\n            }\n            return true;\n          },\n        ),\n      ];\n    },\n  };\n};\n\nfunction isParaWrappingShortcode(tok: PandocToken) {\n  if (tok.t === PandocTokenType.Para) {\n    // qualify that this paragraph has text that begins with {{< (so that\n    // we don't end up scanning every token of every paragraph )\n    const children: PandocToken[] = tok.c;\n    if (tok.c.length > 1) {\n      const [first, second] = tok.c;\n      const firstText = first.t === PandocTokenType.Str ? first.c : second.c;\n      if (typeof firstText === 'string' && firstText.startsWith('{{<')) {\n        const text = stringifyTokens(children);\n        return !!text.match(kShortcodeRegEx);\n      }\n    }\n  }\n  return false;\n}\n\nexport function shortcodeBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n  const kShortcodeBlockCapsuleType = 'B65B58FD-D707-4C30-8C97-3D99ACF9A157'.toLowerCase();\n\n  return {\n    type: kShortcodeBlockCapsuleType,\n\n    // eslint-disable-next-line no-useless-escape\n    match: /^([\\t >]*)(\\{\\{<\\s+([^\\/][^\\t ]+).*?>\\}\\}[ \\t]*\\n(?![ \\t]*\\n)[\\W\\w]*?\\n[\\t >]*\\{\\{<\\s+\\/\\3\\s+>\\}\\})([ \\t]*)$/gm,\n\n    extract: (_match: string, p1: string, p2: string, _p3: string, p4: string) => {\n      return {\n        prefix: p1,\n        source: p2,\n        suffix: p4,\n      };\n    },\n\n    // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n    // (in this case we don't do anything because pandoc would have written this table as a\n    // semantically standalone block)\n    enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n      return capsuleText;\n    },\n\n    // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n    // and if we find it, parse and return the original source code\n    handleText: blockCapsuleTextHandler(\n      kShortcodeBlockCapsuleType,\n      encodedBlockCapsuleRegex(undefined, undefined, 'gm'),\n    ),\n\n    // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n    // if find that then return the block capsule text\n    handleToken: blockCapsuleParagraphTokenHandler(kShortcodeBlockCapsuleType),\n\n    // write the node\n    writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n      // remove the source prefix\n      const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n      // write the node\n      writer.addNode(schema.nodes.shortcode_block, {}, [schema.text(source)]);\n    },\n  };\n}\n\nexport default extension;\n","/*\n * html_preserve.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { PandocOutput, PandocTokenType, ProsemirrorWriter } from '../api/pandoc';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { codeNodeSpec } from '../api/code';\n\nimport {\n  PandocBlockCapsuleFilter,\n  blockCapsuleParagraphTokenHandler,\n  encodedBlockCapsuleRegex,\n  PandocBlockCapsule,\n  blockCapsuleTextHandler,\n  blockCapsuleSourceWithoutPrefix,\n} from '../api/pandoc_capsule';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n  const { format } = context;\n\n  return {\n    nodes: [\n      {\n        name: 'html_preserve',\n\n        spec: {\n          ...codeNodeSpec(),\n          attrs: {},\n          parseDOM: [\n            {\n              tag: \"div[class*='pm-html-preserve']\",\n              preserveWhitespace: 'full',\n            },\n          ],\n          toDOM(node: ProsemirrorNode) {\n            return ['div', { class: 'pm-html-preserve pm-fixedwidth-font pm-code-block pm-markup-text-color' }, 0];\n          },\n        },\n\n        code_view: {\n          lang: () => 'html',\n          borderColorClass: 'pm-raw-block-border',\n        },\n\n        attr_edit: () => ({\n          type: (schema: Schema) => schema.nodes.html_preserve,\n          tags: () => ['html_preserve'],\n          editFn: () => () => false,\n        }),\n\n        pandoc: {\n          // capture shortcuts w/ begin/end tags\n          blockCapsuleFilter: htmlPreserveBlockCapsuleFilter(),\n\n          writer: (output: PandocOutput, node: ProsemirrorNode) => {\n            output.writeToken(PandocTokenType.Para, () => {\n              output.writeRawMarkdown(node.content);\n            });\n          },\n        },\n      },\n    ],\n  };\n};\n\nexport function htmlPreserveBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n  const kHtmlPreserveBlockCapsuleType = '83CFCBF3-0429-4822-AAC6-D6F31591AEA8'.toLowerCase();\n\n  return {\n    type: kHtmlPreserveBlockCapsuleType,\n\n    // eslint-disable-next-line no-useless-escape\n    match: /^([\\t >]*)(<!--html_preserve-->[\\W\\w]*?<!--\\/html_preserve-->)([ \\t]*)$/gm,\n\n    extract: (_match: string, p1: string, p2: string, p3: string) => {\n      return {\n        prefix: p1,\n        source: p2,\n        suffix: p3,\n      };\n    },\n\n    // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n    // (in this case we don't do anything because pandoc would have written this as a\n    // semantically standalone block)\n    enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n      return capsuleText;\n    },\n\n    // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n    // and if we find it, parse and return the original source code\n    handleText: blockCapsuleTextHandler(\n      kHtmlPreserveBlockCapsuleType,\n      encodedBlockCapsuleRegex(undefined, undefined, 'gm'),\n    ),\n\n    // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n    // if find that then return the block capsule text\n    handleToken: blockCapsuleParagraphTokenHandler(kHtmlPreserveBlockCapsuleType),\n\n    // write the node\n    writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n      // remove the source prefix\n      const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n      // write the node\n      writer.addNode(schema.nodes.html_preserve, {}, [schema.text(source)]);\n    },\n  };\n}\n\nexport default extension;\n","/*\n * ace.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport {\n  Plugin,\n  PluginKey,\n  TextSelection,\n  EditorState,\n  Transaction,\n  Selection,\n  NodeSelection,\n} from 'prosemirror-state';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView, NodeView, Decoration } from 'prosemirror-view';\nimport { undo, redo } from 'prosemirror-history';\nimport { exitCode } from 'prosemirror-commands';\nimport { keymap } from 'prosemirror-keymap';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport { CodeViewOptions, editingRootNode } from '../../api/node';\nimport { insertParagraph } from '../../api/paragraph';\nimport { createImageButton } from '../../api/widgets/widgets';\nimport { EditorUI, ChunkEditor } from '../../api/ui';\nimport { EditorOptions } from '../../api/options';\nimport { EditorEvents } from '../../api/events';\nimport { kPlatformMac } from '../../api/platform';\nimport { rmdChunk, previousExecutableRmdChunks, mergeRmdChunks } from '../../api/rmd';\nimport { ExtensionContext } from '../../api/extension';\nimport { DispatchEvent, ResizeEvent, ScrollEvent } from '../../api/event-types';\nimport { verticalArrowCanAdvanceWithinTextBlock } from '../../api/basekeys';\nimport { handleArrowToAdjacentNode } from '../../api/cursor';\n\nimport { selectAll } from '../../behaviors/select_all';\nimport { findPluginState } from '../../behaviors/find';\n\nimport { AceRenderQueue } from './ace-render-queue';\nimport { AcePlaceholder } from './ace-placeholder';\nimport { AceNodeViews } from './ace-node-views';\n\nimport zenscroll from 'zenscroll';\n\nimport './ace.css';\n\nconst plugin = new PluginKey('ace');\n\nexport function acePlugins(codeViews: { [key: string]: CodeViewOptions }, context: ExtensionContext): Plugin[] {\n  // shared services\n  const aceRenderQueue = new AceRenderQueue(context.events);\n  const aceNodeViews = new AceNodeViews();\n\n  // build nodeViews\n  const nodeTypes = Object.keys(codeViews);\n  const nodeViews: {\n    [name: string]: (node: ProsemirrorNode<any>, view: EditorView<any>, getPos: boolean | (() => number)) => NodeView;\n  } = {};\n  nodeTypes.forEach(name => {\n    nodeViews[name] = (node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) => {\n      return new AceNodeView(\n        node,\n        view,\n        getPos as () => number,\n        context,\n        codeViews[name],\n        aceRenderQueue,\n        aceNodeViews,\n      );\n    };\n  });\n\n  return [\n    new Plugin({\n      key: plugin,\n      props: {\n        nodeViews,\n        handleDOMEvents: {\n          click: aceNodeViews.handleClick.bind(aceNodeViews),\n        },\n      },\n    }),\n    // arrow in and out of editor\n    keymap({\n      ArrowLeft: arrowHandler('left', nodeTypes),\n      ArrowRight: arrowHandler('right', nodeTypes),\n      ArrowUp: arrowHandler('up', nodeTypes),\n      ArrowDown: arrowHandler('down', nodeTypes),\n    }),\n  ];\n}\n\n/**\n * Represents a selection that was applied prior to the editor rendering (needs\n * to be applied when the editor rendering completes)\n */\nclass QueuedSelection {\n  constructor(public readonly anchor: number, public readonly head: number) {}\n}\n\nexport class AceNodeView implements NodeView {\n  public readonly getPos: () => number;\n  public node: ProsemirrorNode;\n  public readonly dom: HTMLElement;\n\n  private readonly view: EditorView;\n  private readonly ui: EditorUI;\n  private readonly nodeViews: AceNodeViews;\n  private readonly renderQueue: AceRenderQueue;\n  private chunk?: ChunkEditor;\n  private aceEditor?: AceAjax.Editor;\n  private editSession?: AceAjax.IEditSession;\n  private readonly editorOptions: EditorOptions;\n  private readonly options: CodeViewOptions;\n  private readonly events: EditorEvents;\n\n  private updating: boolean;\n  private escaping: boolean;\n  private gapCursorPending: boolean;\n  private mouseDown: boolean;\n  private mode: string;\n  private findMarkers: number[];\n  private selectionMarker: number | null;\n  private queuedSelection: QueuedSelection | null;\n  private resizeTimer: number;\n  private renderedWidth: number;\n  private scrollRow: number;\n  private cursorDirty: boolean;\n\n  private readonly subscriptions: VoidFunction[];\n\n  constructor(\n    node: ProsemirrorNode,\n    view: EditorView,\n    getPos: () => number,\n    context: ExtensionContext,\n    options: CodeViewOptions,\n    renderQueue: AceRenderQueue,\n    nodeViews: AceNodeViews,\n  ) {\n    // context\n    const ui = context.ui;\n    const editorOptions = context.options;\n\n    // Store for later\n    this.node = node;\n    this.view = view;\n    this.ui = context.ui;\n    this.events = context.events;\n    this.getPos = getPos;\n\n    // Initialize values\n    this.mode = '';\n    this.escaping = false;\n    this.gapCursorPending = false;\n    this.findMarkers = [];\n    this.selectionMarker = null;\n    this.renderQueue = renderQueue;\n    this.nodeViews = nodeViews;\n    this.queuedSelection = null;\n    this.subscriptions = [];\n    this.resizeTimer = 0;\n    this.renderedWidth = 0;\n    this.scrollRow = -1;\n    this.cursorDirty = false;\n    this.mouseDown = false;\n\n    // options\n    this.editorOptions = editorOptions;\n    this.options = options;\n\n    // The editor's outer node is our DOM representation\n    this.dom = document.createElement('div');\n    this.dom.classList.add('pm-code-editor');\n    this.dom.classList.add('pm-ace-editor');\n    this.dom.classList.add('pm-ace-editor-inactive');\n    this.dom.classList.add(options.borderColorClass || 'pm-block-border-color');\n    if (this.options.classes) {\n      this.options.classes.forEach(className => this.dom.classList.add(className));\n    }\n\n    // Create a preview of the text (will be shown until editor is fully initialized)\n    const preview = new AcePlaceholder(node.textContent);\n    this.dom.appendChild(preview.getElement());\n\n    // Style the first line differently if requested\n    if (options.firstLineMeta) {\n      this.dom.classList.add('pm-ace-first-line-meta');\n    }\n\n    // update mode\n    this.updateMode();\n\n    // observe all editor dispatches\n    this.subscriptions.push(\n      this.events.subscribe(DispatchEvent, (tr: Transaction | undefined) => {\n        if (tr) {\n          this.onEditorDispatch(tr);\n        }\n      }),\n    );\n\n    // This flag is used to avoid an update loop between the outer and\n    // inner editor\n    this.updating = false;\n\n    if (renderQueue.isRenderCompleted()) {\n      // All editors have been rendered and the queue is empty; initialize\n      // directly (this happens when e.g., inserting code chunks interactively\n      // after the document is fully rendered)\n      this.initEditor();\n    } else {\n      // Rendering is not complete; add to the queue\n      renderQueue.add(this);\n    }\n\n    // add ourselves to the list of all ace node views\n    this.nodeViews.add(this);\n  }\n\n  public destroy() {\n    // Unsubscribe from events\n    this.subscriptions.forEach(unsub => unsub());\n\n    // Clean up attached editor instance when it's removed from the DOM\n    if (this.chunk) {\n      this.chunk.destroy();\n    }\n\n    // remove ourselves from the list of all ace node views\n    this.nodeViews.remove(this);\n  }\n\n  public update(node: ProsemirrorNode, _decos: Decoration[]) {\n    if (node.type !== this.node.type) {\n      return false;\n    }\n    if (!this.editSession) {\n      return false;\n    }\n    this.node = node;\n    this.updateMode();\n\n    const AceRange = window.require('ace/range').Range;\n    const doc = this.editSession.getDocument();\n\n    const change = computeChange(this.editSession.getValue(), node.textContent);\n    if (change) {\n      this.updating = true;\n      const range = AceRange.fromPoints(doc.indexToPosition(change.from, 0), doc.indexToPosition(change.to, 0));\n      this.editSession.replace(range, change.text);\n      this.updating = false;\n    }\n\n    // Clear any previously rendered find markers\n    this.findMarkers.forEach(id => {\n      if (this.editSession) {\n        this.editSession.removeMarker(id);\n      }\n    });\n    this.findMarkers = [];\n\n    // Get all of the find results inside this node\n    const decorations = findPluginState(this.view.state);\n    if (decorations) {\n      const decos = decorations?.find(this.getPos(), this.getPos() + node.nodeSize - 1);\n\n      // If we got results, render them\n      if (decos) {\n        decos.forEach((deco: any) => {\n          if (!this.editSession) {\n            return;\n          }\n\n          // Calculate from/to position for result marker (adjust for zero based column)\n          const markerFrom = doc.indexToPosition(deco.from - this.getPos(), 0);\n          markerFrom.column--;\n          const markerTo = doc.indexToPosition(deco.to - this.getPos(), 0);\n          markerTo.column--;\n          const range = AceRange.fromPoints(markerFrom, markerTo);\n\n          // Create the search result marker and add it to the rendered set\n          const markerId = this.editSession.addMarker(range, deco.type.attrs.class, 'result', true);\n          this.findMarkers.push(markerId);\n        });\n      }\n    }\n\n    return true;\n  }\n\n  public setSelection(anchor: number, head: number) {\n    // We haven't drawn the editor yet, so queue the selection until we can\n    // apply it.\n    if (!this.aceEditor || !this.editSession) {\n      this.queuedSelection = new QueuedSelection(anchor, head);\n      return;\n    }\n    if (!this.escaping && !this.gapCursorPending) {\n      this.aceEditor.focus();\n    }\n    this.updating = true;\n    const doc = this.editSession.getDocument();\n    const AceRange = window.require('ace/range').Range;\n    const range = AceRange.fromPoints(doc.indexToPosition(anchor, 0), doc.indexToPosition(head, 0));\n    this.editSession.getSelection().setSelectionRange(range);\n    this.updating = false;\n  }\n\n  public setGapCursorPending(pending: boolean) {\n    this.gapCursorPending = pending;\n  }\n\n  public selectNode() {\n    if (this.aceEditor) {\n      this.aceEditor.focus();\n    }\n  }\n\n  public stopEvent() {\n    return true;\n  }\n\n  public ignoreMutation(_mutation: MutationRecord | { type: 'selection'; target: Element }) {\n    return true;\n  }\n\n  private onEditorDispatch(tr: Transaction) {\n    if (!tr.docChanged && tr.selectionSet) {\n      this.highlightSelectionAcross(tr.selection);\n    }\n  }\n\n  private forwardSelection() {\n    // ignore if we don't have focus\n    if (!this.chunk || !this.chunk.element.contains(window.document.activeElement)) {\n      return;\n    }\n\n    const state = this.view.state;\n    const selection = this.asProseMirrorSelection(state.doc);\n    if (selection && !selection.eq(state.selection)) {\n      this.view.dispatch(state.tr.setSelection(selection));\n    }\n  }\n\n  private asProseMirrorSelection(doc: ProsemirrorNode) {\n    if (!this.editSession) {\n      return null;\n    }\n    const offset = this.getPos() + 1;\n    const session = this.editSession;\n    const range = session.getSelection().getRange();\n    const anchor = session.getDocument().positionToIndex(range.start, 0) + offset;\n    const head = session.getDocument().positionToIndex(range.end, 0) + offset;\n    return TextSelection.create(doc, anchor, head);\n  }\n\n  // detect the entire editor being selected across, in which case we add an ace marker\n  // visually indicating that the text is selected\n  private highlightSelectionAcross(selection: Selection) {\n    if (!this.aceEditor || !this.editSession) {\n      return;\n    }\n\n    // clear any existing selection marker\n    if (this.selectionMarker !== null) {\n      this.editSession.removeMarker(this.selectionMarker);\n      this.selectionMarker = null;\n    }\n\n    // check for selection spanning us\n    const pos = this.getPos();\n    if (selection.from < pos && selection.to > pos + this.node.nodeSize) {\n      const doc = this.editSession.getDocument();\n      const AceRange = window.require('ace/range').Range;\n      const range = AceRange.fromPoints(doc.indexToPosition(0, 0), doc.indexToPosition(this.node.nodeSize - 1, 0));\n      this.selectionMarker = this.editSession.addMarker(range, 'pm-selected-text', 'selection', true);\n    }\n  }\n\n  private valueChanged() {\n    const change = computeChange(this.node.textContent, this.getContents());\n    if (change) {\n      // update content\n      const start = this.getPos() + 1;\n      if (!isNaN(start)) {\n        const tr = this.view.state.tr.replaceWith(\n          start + change.from,\n          start + change.to,\n          change.text ? this.node.type.schema.text(change.text) : null,\n        );\n        this.view.dispatch(tr);\n      }\n    }\n    this.updateMode();\n  }\n\n  /**\n   * Scrolls a child of the editor chunk into view.\n   *\n   * @param ele The child to scroll.\n   */\n  private scrollIntoView(ele: HTMLElement) {\n    const editingRoot = editingRootNode(this.view.state.selection);\n    if (editingRoot) {\n      const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n      const scroller = zenscroll.createScroller(container);\n\n      // Since the element we want to scroll into view is not a direct child of\n      // the scrollable container, do a little math to figure out the\n      // destination scroll position.\n      const top = ele.offsetTop + this.dom.offsetTop;\n      const bottom = top + ele.offsetHeight;\n      const viewTop = container.scrollTop;\n      const viewBottom = container.scrollTop + container.offsetHeight;\n\n      // Scroll based on element's current position and size\n      if (top > viewTop && bottom < viewBottom) {\n        // Element is already fully contained in the viewport\n        return;\n      } else if (ele.offsetHeight > container.offsetHeight) {\n        // Element is taller than the viewport, so show the first part of it\n        scroller.toY(top);\n      } else if (top < viewTop) {\n        // Element is above viewport, so scroll it into view\n        scroller.toY(top);\n      } else if (bottom > viewBottom) {\n        // Part of the element is beneath the viewport, so scroll just enough to\n        // bring it into view\n        scroller.toY(container.scrollTop - (viewBottom - bottom));\n      }\n    }\n  }\n\n  /**\n   * Initializes the editing surface by creating and injecting an Ace editor\n   * instance from the host.\n   */\n  public initEditor() {\n    // skip if we're already initialized\n    if (this.aceEditor) {\n      return;\n    }\n\n    // call host factory to instantiate editor\n    this.chunk = this.ui.chunks.createChunkEditor('ace', this.node.attrs.md_index, {\n      getPos: () => this.getPos(),\n      scrollIntoView: ele => this.scrollIntoView(ele),\n      scrollCursorIntoView: () => this.scrollCursorIntoView(),\n    });\n\n    // populate initial contents\n    this.aceEditor = this.chunk.editor as AceAjax.Editor;\n    this.updating = true;\n    this.aceEditor.setValue(this.node.textContent);\n    this.updating = false;\n\n    this.aceEditor.clearSelection();\n\n    // cache edit session for convenience; most operations happen on the session\n    this.editSession = this.aceEditor.getSession();\n\n    // remove the preview and recreate chunk toolbar\n    this.dom.innerHTML = '';\n    this.dom.appendChild(this.chunk.element);\n\n    // Propagate updates from the code editor to ProseMirror\n    this.aceEditor.on('changeSelection', () => {\n      if (!this.updating) {\n        this.forwardSelection();\n      }\n    });\n    this.aceEditor.on('change', () => {\n      if (!this.updating) {\n        this.valueChanged();\n      }\n    });\n\n    // Forward selection we we receive it\n    this.aceEditor.on('focus', () => {\n      this.dom.classList.remove('pm-ace-editor-inactive');\n      this.forwardSelection();\n    });\n\n    this.aceEditor.on('blur', () => {\n      // Add a class to editor; this class contains CSS rules that hide editor\n      // components that Ace cannot hide natively (such as the cursor,\n      // matching bracket indicator, and active selection)\n      this.dom.classList.add('pm-ace-editor-inactive');\n    });\n\n    // If the cursor moves and we're in focus, ensure that the cursor is\n    // visible. Ace's own cursor visiblity mechanisms don't work in embedded\n    // editors.\n    this.aceEditor.getSelection().on('changeCursor', () => {\n      if (this.dom.contains(document.activeElement) && !this.mouseDown) {\n        this.cursorDirty = true;\n      }\n    });\n\n    this.aceEditor.renderer.on('afterRender', () => {\n      // If the cursor position is dirty and the mouse is not down, scroll the\n      // cursor into view. Don't scroll while the mouse is down, as it will be\n      // treated as a click-and-drag by Ace.\n      if (this.cursorDirty && !this.mouseDown) {\n        this.scrollCursorIntoView();\n        this.cursorDirty = false;\n      }\n    });\n\n    // Add custom escape commands for movement keys (left/right/up/down); these\n    // will check to see whether the movement should leave the editor, and if\n    // so will do so instead of moving the cursor.\n    this.aceEditor.commands.addCommand({\n      name: 'leftEscape',\n      bindKey: 'Left',\n      exec: () => {\n        this.arrowMaybeEscape('char', -1, 'gotoleft');\n      },\n    });\n    this.aceEditor.commands.addCommand({\n      name: 'rightEscape',\n      bindKey: 'Right',\n      exec: () => {\n        this.arrowMaybeEscape('char', 1, 'gotoright');\n      },\n    });\n    this.aceEditor.commands.addCommand({\n      name: 'upEscape',\n      bindKey: 'Up',\n      exec: () => {\n        this.arrowMaybeEscape('line', -1, 'golineup');\n      },\n    });\n    this.aceEditor.commands.addCommand({\n      name: 'downEscape',\n      bindKey: 'Down',\n      exec: () => {\n        this.arrowMaybeEscape('line', 1, 'golinedown');\n      },\n    });\n\n    // Pressing Backspace in the editor when it's empty should delete it.\n    this.aceEditor.commands.addCommand({\n      name: 'backspaceDeleteNode',\n      bindKey: 'Backspace',\n      exec: () => {\n        this.backspaceMaybeDeleteNode();\n      },\n    });\n\n    // Handle undo/redo in ProseMirror\n    this.aceEditor.commands.addCommand({\n      name: 'undoProsemirror',\n      bindKey: {\n        win: 'Ctrl-Z',\n        mac: 'Command-Z',\n      },\n      exec: () => {\n        if (undo(this.view.state, this.view.dispatch)) {\n          this.view.focus();\n        }\n      },\n    });\n    this.aceEditor.commands.addCommand({\n      name: 'redoProsemirror',\n      bindKey: {\n        win: 'Ctrl-Shift-Z|Ctrl-Y',\n        mac: 'Command-Shift-Z|Command-Y',\n      },\n      exec: () => {\n        if (redo(this.view.state, this.view.dispatch)) {\n          this.view.focus();\n        }\n      },\n    });\n\n    // Handle Select All in ProseMirror\n    this.aceEditor.commands.addCommand({\n      name: 'selectAllProsemirror',\n      bindKey: {\n        win: 'Ctrl-A',\n        mac: 'Command-A',\n      },\n      exec: () => {\n        if (selectAll(this.view.state, this.view.dispatch, this.view)) {\n          this.view.focus();\n        }\n      },\n    });\n\n    // Handle shortcuts for moving focus out of the code editor and into\n    // ProseMirror\n    this.aceEditor.commands.addCommand({\n      name: 'exitCodeBlock',\n      bindKey: 'Shift-Enter',\n      exec: () => {\n        if (exitCode(this.view.state, this.view.dispatch)) {\n          this.view.focus();\n        }\n      },\n    });\n\n    // Create a command for inserting paragraphs from the code editor\n    this.aceEditor.commands.addCommand({\n      name: 'insertParagraph',\n      bindKey: {\n        win: 'Ctrl-\\\\',\n        mac: 'Command-\\\\',\n      },\n      exec: () => {\n        if (insertParagraph(this.view.state, this.view.dispatch)) {\n          this.view.focus();\n        }\n      },\n    });\n\n    // Line-by-line execution\n    this.aceEditor.commands.addCommand({\n      name: 'executeSelection',\n      bindKey: {\n        win: 'Ctrl-Enter',\n        mac: 'Ctrl-Enter|Command-Enter',\n      },\n      exec: () => {\n        if (this.chunk && this.aceEditor) {\n          // Record the position prior to execution\n          const pos = this.aceEditor.getCursorPosition();\n\n          // Execute the selection\n          this.chunk.executeSelection();\n\n          // If the cursor stayed on the last line, step out of the code block\n          // if we're not at the end of the doc (this is a no-op when not on the\n          // last line, and mirrors the behavior when stepping past the end of\n          // chunks in the code editor)\n          if (pos.row === this.aceEditor.getCursorPosition().row) {\n            this.arrowMaybeEscape('line', 1);\n          }\n        }\n      },\n    });\n\n    // If an attribute editor function was supplied, bind it to F4\n    if (this.options.attrEditFn) {\n      this.aceEditor.commands.addCommand({\n        name: 'editAttributes',\n        bindKey: 'F4',\n        exec: () => {\n          this.options.attrEditFn!(this.view.state, this.view.dispatch, this.view);\n        },\n      });\n    }\n\n    // Apply editor mode\n    if (this.mode) {\n      this.chunk.setMode(this.mode);\n    }\n\n    // Disconnect font metrics system after render loop\n    (this.aceEditor.renderer as any).on('afterRender', () => {\n      // Update known rendered width\n      if (this.chunk) {\n        this.renderedWidth = this.chunk.element.offsetWidth;\n      }\n\n      window.setTimeout(() => {\n        if (this.aceEditor) {\n          const metrics = (this.aceEditor.renderer as any).$fontMetrics;\n          if (metrics && metrics.$observer) {\n            metrics.$observer.disconnect();\n          }\n        }\n      }, 0);\n    });\n\n    // Hook up the container to the render queue\n    const editingRoot = editingRootNode(this.view.state.selection)!;\n    const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n    if (container.parentElement) {\n      this.renderQueue.setContainer(container);\n    }\n\n    // Forward selection, if we have one (this can be set while the editor is\n    // waiting to render)\n    if (this.queuedSelection) {\n      this.setSelection(this.queuedSelection.anchor, this.queuedSelection.head);\n      this.queuedSelection = null;\n    }\n\n    // Subscribe to resize event; will reflow the editor to wrap properly at the\n    // new width\n    this.subscriptions.push(\n      this.events.subscribe(ResizeEvent, () => {\n        this.debounceResize();\n      }),\n    );\n\n    // Subscribe to scroll event; invalidates the row we're scrolled to so\n    // scrollback will be triggered if necessary (after e.g., typing after\n    // scrolling offscreen)\n    this.subscriptions.push(\n      this.events.subscribe(ScrollEvent, () => {\n        this.scrollRow = -1;\n      }),\n    );\n\n    // Keep track of mouse state so we can avoid e.g., autoscrolling while the\n    // mouse is down\n    this.dom.addEventListener(\"mousedown\", (evt) => {\n      this.mouseDown = true;\n    });\n    this.dom.addEventListener(\"mouseup\", (evt) => {\n      this.mouseDown = false;\n    });\n    this.dom.addEventListener(\"mouseleave\", (evt) => {\n      // Treat mouse exit as an up since it will cause us to miss the up event\n      this.mouseDown = false;\n    });\n  }\n\n  /**\n   * Debounced version of editor resize; ensures we don't aggressively resize\n   * while size is still changing.\n   */\n  private debounceResize() {\n    // Clear any previously running resize timer\n    if (this.resizeTimer !== 0) {\n      window.clearTimeout(this.resizeTimer);\n    }\n\n    // Create a new resize timer\n    this.resizeTimer = window.setTimeout(() => {\n      if (this.chunk && this.aceEditor) {\n        // If the width we last rendered is different than our current width,\n        // trigger an Ace resize event (causes editor to reflow wrapped text)\n        if (this.renderedWidth !== this.chunk.element.offsetWidth) {\n          this.aceEditor.resize();\n        }\n      }\n      this.resizeTimer = 0;\n    }, 500);\n  }\n\n  private updateMode() {\n    // get lang\n    const lang = this.options.lang(this.node, this.getContents());\n\n    if (lang !== null && this.mode !== lang) {\n      if (this.chunk) {\n        this.chunk.setMode(lang);\n      }\n      this.mode = lang;\n    }\n  }\n\n  private backspaceMaybeDeleteNode() {\n    // if the node is empty and we execute a backspace then delete the node\n    if (this.node.childCount === 0) {\n      // if there is an input rule we just executed then use this to undo it\n      if (undoInputRule(this.view.state)) {\n        undoInputRule(this.view.state, this.view.dispatch);\n        this.view.focus();\n      } else {\n        const tr = this.view.state.tr;\n        tr.delete(this.getPos(), this.getPos() + this.node.nodeSize);\n        tr.setSelection(TextSelection.near(tr.doc.resolve(this.getPos()), -1));\n        this.view.dispatch(tr);\n        this.view.focus();\n      }\n    } else if (this.aceEditor) {\n      this.aceEditor.execCommand('backspace');\n    }\n  }\n\n  // Checks to see whether an arrow key should escape the editor or not. If so,\n  // sends the focus to the right node; if not, executes the given Ace command\n  // (to perform the arrow key's usual action)\n  private arrowMaybeEscape(unit: string, dir: number, command?: string) {\n    if (!this.aceEditor || !this.editSession) {\n      return;\n    }\n    const pos = this.aceEditor.getCursorPosition();\n    const lastrow = this.editSession.getLength() - 1;\n    if (\n      !this.aceEditor.getSelection().isEmpty() ||\n      pos.row !== (dir < 0 ? 0 : lastrow) ||\n      (unit === 'char' && pos.column !== (dir < 0 ? 0 : this.editSession.getDocument().getLine(pos.row).length))\n    ) {\n      // this movement is happening inside the editor itself. don't escape\n      // the editor; just execute the underlying command\n      if (command) {\n        this.aceEditor.execCommand(command);\n      }\n      return;\n    }\n\n    // the cursor is about to leave the editor region; flag this to avoid side\n    // effects\n    this.escaping = true;\n\n    // ensure we are focused\n    this.view.focus();\n\n    // handle arrow key\n    handleArrowToAdjacentNode(this.getPos(), dir, this.view.state, this.view.dispatch);\n\n    // set focus\n    this.view.focus();\n    this.escaping = false;\n  }\n\n  private getContents(): string {\n    if (this.editSession) {\n      return this.editSession.getValue();\n    } else {\n      return this.dom.innerText;\n    }\n  }\n\n  /**\n   * Ensures that the Ace cursor is visible in the scrollable region of the document.\n   */\n  private scrollCursorIntoView(): void {\n    // No need to try to enforce cursor position if we're already scrolled to\n    // this row\n    if (this.editSession && this.editSession.getSelection().getCursor().row === this.scrollRow) {\n      return;\n    }\n\n    // Ensure we still have focus before proceeding\n    if (this.dom.contains(document.activeElement)) {\n\n      // Find the element containing the rendered virtual cursor \n      const cursor = this.dom.querySelector(\".ace_cursor\");\n      if (cursor === null) {\n        return;\n      }\n\n      // Ace doesn't actually move the cursor but uses CSS translations to\n      // make it appear in the right place, so we need to use the somewhat\n      // expensive getBoundingClientRect call to get a resolved position.\n      // (The alternative would be parse the translate: transform(10px 20px))\n      // call from the style property.)\n      const editingRoot = editingRootNode(this.view.state.selection)!;\n      const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n      const containerRect = container.getBoundingClientRect();\n      const cursorRect = cursor.getBoundingClientRect();\n\n      // Scrolling down?\n      const down = cursorRect.bottom + 10 - containerRect.bottom;\n      if (down > 0) {\n        container.scrollTop += down;\n      } else {\n        // Scrolling up?\n        const up = containerRect.top + 10 - cursorRect.top;\n        if (up > 0) {\n          container.scrollTop -= up;\n        }\n      }\n\n      // Update cached scroll row so we don't unnecessarily redo these\n      // computations\n      if (this.editSession) {\n        this.scrollRow = this.editSession.getSelection().getCursor().row;\n      }\n    }\n  }\n}\n\nfunction computeChange(oldVal: string, newVal: string) {\n  if (oldVal === newVal) {\n    return null;\n  }\n  let start = 0;\n  let oldEnd = oldVal.length;\n  let newEnd = newVal.length;\n  while (start < oldEnd && oldVal.charCodeAt(start) === newVal.charCodeAt(start)) {\n    ++start;\n  }\n  while (oldEnd > start && newEnd > start && oldVal.charCodeAt(oldEnd - 1) === newVal.charCodeAt(newEnd - 1)) {\n    oldEnd--;\n    newEnd--;\n  }\n  return {\n    from: start,\n    to: oldEnd,\n    text: newVal.slice(start, newEnd),\n  };\n}\n\nfunction arrowHandler(dir: 'up' | 'down' | 'left' | 'right', nodeTypes: string[]) {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    if (state.selection.empty && !(state.selection instanceof GapCursor) && view && view.endOfTextblock(dir)) {\n      const side = dir === 'left' || dir === 'up' ? -1 : 1;\n      const $head = state.selection.$head;\n      const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n      if (nextPos.$head && nodeTypes.includes(nextPos.$head.parent.type.name)) {\n        // check for e.g. math where you can advance across embedded newlines\n        if ((dir === 'up' || dir === 'down') && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n          return false;\n        }\n        if (dispatch) {\n          dispatch(state.tr.setSelection(nextPos));\n        }\n        return true;\n      }\n    }\n    return false;\n  };\n}\n","/*\n * cursor.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection, Selection } from 'prosemirror-state';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nexport function handleArrowToAdjacentNode(\n  nodePos: number,\n  dir: number,\n  state: EditorState,\n  dispatch?: (tr: Transaction<any>) => void,\n): boolean {\n  // resolve the node and position\n  const node = state.doc.nodeAt(nodePos);\n  if (!node) {\n    return false;\n  }\n  const $pos = state.doc.resolve(nodePos);\n\n  // helpers to figure out the nature of prev/next nodes\n  const prevNodeSelectable = () => {\n    return $pos.nodeBefore && $pos.nodeBefore.type.spec.selectable;\n  };\n  const nextNodeSelectable = () => {\n    const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n    return nextNode?.type.spec.selectable;\n  };\n  const prevNodeTextBlock = () => {\n    return $pos.nodeBefore && $pos.nodeBefore.isTextblock;\n  };\n  const nextNodeTextBlock = () => {\n    const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n    return nextNode?.isTextblock;\n  };\n  const prevNodeCode = () => {\n    return $pos.nodeBefore && !!$pos.nodeBefore.type.spec.code;\n  };\n  const nextNodeCode = () => {\n    const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n    return !!nextNode?.type.spec.code;\n  };\n\n  // see if we can get a new selection\n  const tr = state.tr;\n  let selection: Selection | undefined;\n\n  // if we are going backwards and there is no previous position, then return a gap cursor\n  if (dir < 0 && !$pos.nodeBefore) {\n    selection = new GapCursor(tr.doc.resolve(nodePos), tr.doc.resolve(nodePos));\n\n    // if we are going forwards and there is no next position, then return a gap cursor\n  } else if (dir > 0 && !$pos.nodeAfter) {\n    const cursorPos = nodePos + node.nodeSize;\n    selection = new GapCursor(tr.doc.resolve(cursorPos), tr.doc.resolve(cursorPos));\n\n    // if we are going backwards and the previous node can take node selections then select it\n  } else if (dir < 0 && prevNodeSelectable()) {\n    const prevNodePos = nodePos - $pos.nodeBefore!.nodeSize;\n    selection = NodeSelection.create(tr.doc, prevNodePos);\n\n    // if we are going forwards and the next node can take node selections then select it\n  } else if (dir >= 0 && nextNodeSelectable()) {\n    const nextNodePos = nodePos + node.nodeSize;\n    selection = NodeSelection.create(tr.doc, nextNodePos);\n\n    // if we are going backwards and the previous node is not a text block then create a gap cursor\n  } else if (dir < 0 && (!prevNodeTextBlock() || prevNodeCode())) {\n    selection = new GapCursor(tr.doc.resolve(nodePos), tr.doc.resolve(nodePos));\n\n    // if we are going forwards and the next node is not a text block then create a gap cursor\n  } else if (dir >= 0 && (!nextNodeTextBlock() || nextNodeCode())) {\n    const endPos = nodePos + node.nodeSize;\n    selection = new GapCursor(tr.doc.resolve(endPos), tr.doc.resolve(endPos));\n\n    // otherwise use text selection handling (handles forward/backward text selections)\n  } else {\n    const targetPos = nodePos + (dir < 0 ? 0 : node.nodeSize);\n    const targetNode = tr.doc.nodeAt(targetPos);\n    if (targetNode) {\n      selection = Selection.near(tr.doc.resolve(targetPos), dir);\n    }\n  }\n\n  if (selection) {\n    if (dispatch) {\n      tr.setSelection(selection);\n      dispatch(tr);\n    }\n    return true;\n  } else {\n    return false;\n  }\n}\n","/*\n * ace-render-queue.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { AceNodeView } from './ace';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent, UpdateEvent } from '../../api/event-types';\n\n/**\n * Represents a queue of Ace editor instances that are rendered asynchronously.\n */\nexport class AceRenderQueue {\n  private readonly renderQueue: AceNodeView[] = [];\n\n  private renderCompleted: boolean = false;\n  private renderTimer: number = 0;\n  private updateTimer: number = 0;\n  private container?: HTMLElement;\n  private needsSort: boolean = true;\n  private bypass: number = 5;\n  private observer?: IntersectionObserver;\n  private visible: boolean = true;\n  private readonly subscriptions: VoidFunction[] = [];\n\n  constructor(private events: EditorEvents) {\n    // Begin listening for scroll and update events so we can manage the queue\n    // accordingly\n    this.subscriptions.push(\n      events.subscribe(ScrollEvent, () => {\n        this.onScroll();\n      }),\n    );\n    this.subscriptions.push(\n      events.subscribe(UpdateEvent, () => {\n        this.onUpdate();\n      }),\n    );\n  }\n\n  /**\n   * Sets (or replaces) the scroll container hosting the render queue. The\n   * scroll container is used to prioritize the queue (i.e. objects in the\n   * viewport or close to it are to be given more priority).\n   *\n   * @param container The HTML element of the scroll container\n   */\n  public setContainer(container: HTMLElement) {\n    // Skip if we're already looking at this container\n    if (this.container === container) {\n      return;\n    }\n\n    // Clean up observer on any previous container\n    if (this.observer) {\n      this.observer.disconnect();\n    }\n\n    // Save reference to container\n    this.container = container;\n\n    // Create intersection observer to ensure that we don't needlessly churn\n    // through renders while offscreen.\n    this.observer = new IntersectionObserver(\n      (entries: IntersectionObserverEntry[]) => {\n        for (const entry of entries) {\n          if (entry.isIntersecting && !this.visible) {\n            // We just became visible; process the render queue now.\n            this.visible = true;\n            this.processRenderQueue();\n          }\n          if (!entry.isIntersecting && this.visible) {\n            // We just lost visibility; end processing of the render queue. (Note\n            // that we only do this when connected to the DOM as another reason\n            // the element can become invisible is ProseMirror swapping it out\n            // internally.)\n            if (this.container?.parentElement) {\n              this.visible = false;\n              this.cancelTimer();\n            }\n          }\n        }\n      },\n      {\n        root: null,\n      },\n    );\n\n    // Begin observing intersection events in container\n    this.observer.observe(container);\n  }\n\n  /**\n   * Invoke when the editor surface is scrolled\n   */\n  private onScroll() {\n    // Whenever a scroll event occurs, we need to re-sort the queue so that\n    // objects in or closest to the viewport are given priority.\n    this.needsSort = true;\n\n    // If we don't think we're visible but we're scrolling and have height,\n    // then we are in fact visible. (This catches a case where the\n    // intsersection observer created below doesn't fire for visiblity\n    // changes.)\n    if (!this.visible && this.container && this.container.offsetHeight > 0) {\n      this.visible = true;\n      this.processRenderQueue();\n    }\n  }\n\n  /**\n   * Invoke when the document has changed\n   */\n  private onUpdate() {\n    // Debounce update timer. This timer is used to prevent the CPU intensive\n    // editor rendering from happening while the user is actively updating the\n    // document.\n    if (this.updateTimer !== 0) {\n      window.clearTimeout(this.updateTimer);\n    }\n    this.updateTimer = window.setTimeout(() => {\n      this.updateTimer = 0;\n      // Process queue immediately if we have one\n      this.scheduleRender(0);\n    }, 1000);\n  }\n\n  /**\n   * Indicates whether the render queue has a scroll container defined\n   */\n  public hasContainer(): boolean {\n    if (this.container) {\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Indicates whether the rendering is finished.\n   */\n  public isRenderCompleted(): boolean {\n    return this.renderCompleted;\n  }\n\n  /**\n   * Adds a node view to the render queue\n   */\n  public add(view: AceNodeView) {\n    // We allow the first few code blocks to render synchronously instead of\n    // being dumped into the queue for later processing. This slightly increases\n    // startup time but prevents the flicker that would otherwise occur as\n    // editors render one by one.\n    if (this.bypass > 0) {\n      this.bypass--;\n      view.initEditor();\n      return;\n    }\n\n    this.renderQueue.push(view);\n\n    // Defer/debounce rendering of editors until event loop finishes\n    if (this.renderTimer === 0) {\n      this.scheduleRender(0);\n    }\n  }\n\n  /**\n   * Processes the queue of editor instances that need to be rendered.\n   */\n  private processRenderQueue() {\n    // No work to do if queue is empty\n    if (this.renderQueue.length === 0) {\n      return;\n    }\n\n    // Don't render while hidden; it wastes resources plus can result in\n    // incorrect sizing calculations\n    if (!this.visible) {\n      return;\n    }\n\n    // Don't render while the user is actively updating the document (it makes\n    // the interface sluggish)\n    if (this.updateTimer !== 0) {\n      return;\n    }\n\n    // Compute offset for sorting (based on scroll position)\n    let offset = 0;\n    if (this.container) {\n      offset = this.container.scrollTop;\n    }\n\n    // Sort the queue if required\n    if (this.needsSort) {\n      // Sort the render queue based on distance from the top of the viewport\n      this.renderQueue.sort((a, b) => {\n        return Math.abs(a.dom.offsetTop - offset) - Math.abs(b.dom.offsetTop - offset);\n      });\n\n      // Clear flag so we don't sort the queue on every render\n      this.needsSort = false;\n    }\n\n    // Pop the next view (editor instance) to be rendered off the stack.\n    // Fast-forward past instances that no longer have a position; these can\n    // accumulate when NodeViews are added to the render queue but replaced\n    // (by a document rebuild) before they have a chance to render.\n    let view: AceNodeView | undefined;\n    while ((view === null || view === undefined || view.getPos() === undefined) &&\n           this.renderQueue.length > 0) {\n      view = this.renderQueue.shift();\n    }\n\n    // Render this view\n    if (view) {\n      view.initEditor();\n    }\n\n    if (this.renderQueue.length > 0) {\n      // There are still remaining editors to be rendered, so process again on\n      // the next event loop.\n      //\n      // If these editors are near the viewport, render them as soon as\n      // possible; otherwise, let the render proceed at a slower pace to\n      // increase responsiveness.\n      let delayMs = 1000;\n      if (this.container) {\n        const distance = Math.abs(this.renderQueue[0].dom.offsetTop - offset);\n        if (distance < this.container.offsetHeight * 2) {\n          // Container is near the viewport, so render it ASAP\n          delayMs = 0;\n        }\n      }\n      this.scheduleRender(delayMs);\n    } else {\n      // No remaining editors; we're done.\n      this.renderCompleted = true;\n      this.destroy();\n    }\n  }\n\n  /**\n   * Cancels the timer that is responsible for triggering the processing of the\n   * next unit in the render queue.\n   */\n  private cancelTimer() {\n    if (this.renderTimer !== 0) {\n      window.clearTimeout(this.renderTimer);\n      this.renderTimer = 0;\n    }\n  }\n\n  /**\n   * Reschedules a pending render, or schedules a new one.\n   */\n  private scheduleRender(delayMs: number) {\n    this.cancelTimer();\n    this.renderTimer = window.setTimeout(() => {\n      this.processRenderQueue();\n      this.renderTimer = 0;\n    }, delayMs);\n  }\n\n  /**\n   * Cleans up the render queue instance\n   */\n  private destroy() {\n    // Cancel any pending renders\n    this.cancelTimer();\n\n    // Clear any pending update timer\n    if (this.updateTimer !== 0) {\n      window.clearTimeout(this.updateTimer);\n    }\n\n    // Remove event subscriptions\n    this.subscriptions.forEach(unsub => unsub());\n\n    // Clean up resize observer\n    if (this.observer) {\n      this.observer.disconnect();\n    }\n  }\n}\n","/*\n * ace-placeholder.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n/**\n * Represents a placeholder (preview) rendering of an Ace editor. Since Ace\n * editors are somewhat expensive to draw, this placeholder is used in place\n * of a real editor instance to make code visible and allow for correct height\n * computations.\n */\nexport class AcePlaceholder {\n  private readonly element: HTMLElement;\n\n  constructor(content: string) {\n    const ele = document.createElement('pre');\n    ele.innerText = content;\n    ele.className = 'ace_editor';\n    this.element = ele;\n  }\n\n  public getElement() {\n    return this.element;\n  }\n}\n","/*\n * ace-node-views.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { GapCursor } from 'prosemirror-gapcursor';\nimport { AceNodeView } from './ace';\nimport { EditorView } from 'prosemirror-view';\n\n/**\n * Track all Ace node view instances to implement additional behavior\n * (e.g. gap cursor for clicks between editor instances)\n */\n\nexport class AceNodeViews {\n  private nodeViews: AceNodeView[];\n\n  constructor() {\n    this.nodeViews = [];\n  }\n  public add(nodeView: AceNodeView) {\n    this.nodeViews.push(nodeView);\n  }\n\n  public remove(nodeView: AceNodeView) {\n    const index = this.nodeViews.indexOf(nodeView);\n    if (index >= 0) {\n      this.nodeViews.splice(index, 1);\n    }\n  }\n\n  public handleClick(view: EditorView, event: Event): boolean {\n    // alias to mouseEvent\n    const mouseEvent = event as MouseEvent;\n\n    // see if the click is between 2 contiguously located node views\n    for (const nodeView of this.nodeViews) {\n      // gap cursor we might detect\n      let gapCursor: GapCursor | null = null;\n\n      // get the position\n      const pos = nodeView.getPos();\n      const $pos = view.state.doc.resolve(pos);\n\n      // if the previous node is code, see if the click is between the 2 nodes\n      if ($pos.nodeBefore && $pos.nodeBefore.type.spec.code) {\n        // get our bounding rect\n        const dom = nodeView.dom;\n        const nodeViewRect = dom.getBoundingClientRect();\n\n        // get the previous node's bounding rect\n        const prevNodePos = pos - $pos.nodeBefore!.nodeSize;\n        const prevNodeView = this.nodeViews.find(nv => nv.getPos() === prevNodePos);\n        if (prevNodeView) {\n          const prevNodeRect = prevNodeView.dom.getBoundingClientRect();\n\n          // check for a click between the two nodes\n          const mouseY = mouseEvent.clientY;\n          if (mouseY > prevNodeRect.top + prevNodeRect.height && mouseY < nodeViewRect.top) {\n            gapCursor = new GapCursor($pos, $pos);\n          }\n        }\n\n        // if there is no previous node and the click is above us then gap cursor above\n        // (only do this if the cursor is within 150 pixels of the left edge)\n      } else if (\n        !$pos.nodeBefore &&\n        $pos.depth === 1 &&\n        mouseEvent.clientY < nodeView.dom.getBoundingClientRect().top &&\n        Math.abs(mouseEvent.clientX - nodeView.dom.getBoundingClientRect().left) < 150\n      ) {\n        gapCursor = new GapCursor($pos, $pos);\n      }\n\n      // return gapCursor if we found one\n      if (gapCursor) {\n        const tr = view.state.tr;\n\n        // notify the node views that we are setting a gap cursor\n        this.nodeViews.forEach(ndView => ndView.setGapCursorPending(true));\n\n        // ensure the view is focused\n        view.focus();\n\n        // set the selection\n        tr.setSelection(gapCursor);\n        view.dispatch(tr);\n\n        // notify the node views that we are done setting the gap cursor\n        this.nodeViews.forEach(ndView => ndView.setGapCursorPending(false));\n\n        // prevent default event handling\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        return true;\n      }\n    }\n\n    return false;\n  }\n}\n","/*\n * attr_edit.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { EditorUI } from '../../api/ui';\nimport { pandocAttrEnabled } from '../../api/pandoc_attr';\n\nimport { AttrEditCommand } from './attr_edit-command';\nimport { AttrEditOptions } from '../../api/attr_edit';\nimport { PandocExtensions } from '../../api/pandoc';\nimport { AttrEditDecorationPlugin } from './attr_edit-decoration';\nimport { Extension } from '../../api/extension';\nimport { hasFencedCodeBlocks } from '../../api/pandoc_format';\n\nexport const kEditAttrShortcut = 'F4';\n\nexport function attrEditExtension(\n  pandocExtensions: PandocExtensions,\n  ui: EditorUI,\n  editors: AttrEditOptions[],\n): Extension {\n  const hasAttr = pandocAttrEnabled(pandocExtensions) || hasFencedCodeBlocks(pandocExtensions);\n\n  return {\n    commands: (_schema: Schema) => {\n      if (hasAttr) {\n        return [new AttrEditCommand(ui, pandocExtensions, editors)];\n      } else {\n        return [];\n      }\n    },\n\n    plugins: (_schema: Schema) => {\n      if (hasAttr) {\n        return [new AttrEditDecorationPlugin(ui, pandocExtensions, editors)];\n      } else {\n        return [];\n      }\n    },\n  };\n}\n","/*\n * attr_edit-command.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Mark, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { findParentNodeOfType, NodeWithPos } from 'prosemirror-utils';\n\nimport { EditorUI } from '../../api/ui';\nimport { pandocAttrInSpec } from '../../api/pandoc_attr';\nimport { getSelectionMarkRange } from '../../api/mark';\nimport { EditorCommandId, ProsemirrorCommand } from '../../api/command';\n\nimport { kEditAttrShortcut } from './attr_edit';\nimport { AttrEditOptions } from '../../api/attr_edit';\nimport { pandocAutoIdentifier, gfmAutoIdentifier } from '../../api/pandoc_id';\nimport { PandocExtensions } from '../../api/pandoc';\nimport { fragmentText } from '../../api/fragment';\n\nexport class AttrEditCommand extends ProsemirrorCommand {\n  constructor(ui: EditorUI, pandocExtensions: PandocExtensions, editors: AttrEditOptions[]) {\n    super(EditorCommandId.AttrEdit, [kEditAttrShortcut], attrEditCommandFn(ui, pandocExtensions, editors));\n  }\n}\n\nexport function attrEditCommandFn(\n  ui: EditorUI, \n  pandocExtensions: PandocExtensions, \n  editors: AttrEditOptions[]\n) {\n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n    // see if there is an active mark with attrs or a parent node with attrs\n    const marks = state.storedMarks || state.selection.$head.marks();\n    const mark = marks.find((m: Mark) => pandocAttrInSpec(m.type.spec));\n\n    let node: ProsemirrorNode | null = null;\n    let pos: number = 0;\n    // node selection of node with attributes\n    if (state.selection instanceof NodeSelection && pandocAttrInSpec(state.selection.node.type.spec)) {\n      node = state.selection.node;\n      pos = state.selection.$anchor.pos;\n    } else {\n      // selection inside node with editable attributes\n      const nodeTypes = editors.map(editor => editor.type(state.schema));\n      const parentWithAttrs = findParentNodeOfType(nodeTypes)(state.selection);\n      if (parentWithAttrs) {\n        node = parentWithAttrs.node;\n        pos = parentWithAttrs.pos;\n      }\n    }\n\n    // return false (disabled) for no targets\n    if (!mark && !node) {\n      return false;\n    }\n\n    // if this is a node and we have a custom attribute editor then just delegate to that\n    if (node) {\n      const editor = editors.find(ed => ed.type(state.schema) === node!.type)!;\n      if (editor && editor.editFn) {\n        return editor.editFn()(state, dispatch, view);\n      }\n    }\n\n    // edit attributes\n    async function asyncEditAttrs() {\n      if (dispatch) {\n        if (mark) {\n          await editMarkAttrs(mark, state, dispatch, ui);\n        } else {\n          await editNodeAttrs(node!, pos, state, dispatch, ui, pandocExtensions);\n        }\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncEditAttrs();\n\n    // return true\n    return true;\n  };\n}\n\nexport function attrEditNodeCommandFn(nodeWithPos: NodeWithPos, \n                                      ui: EditorUI, \n                                      pandocExtensions: PandocExtensions, \n                                      editors: AttrEditOptions[]) {\n  \n  return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n\n    // alias\n    const { node, pos } = nodeWithPos;\n\n    // registered editor\n    const editor = editors.find(ed => ed.type(state.schema) === node!.type)!;\n    if (editor && editor.editFn) {\n      return editor.editFn()(state, dispatch, view);\n    }\n\n    // generic editor\n    async function asyncEditAttrs() {\n      if (dispatch) {\n        await editNodeAttrs(node!, pos, state, dispatch, ui, pandocExtensions);\n        if (view) {\n          view.focus();\n        }\n      }\n    }\n    asyncEditAttrs();\n\n    // return true\n    return true;\n  };\n}\n\nasync function editMarkAttrs(\n  mark: Mark,\n  state: EditorState,\n  dispatch: (tr: Transaction<any>) => void,\n  ui: EditorUI,\n): Promise<void> {\n  const attrs = mark.attrs;\n  const markType = mark.type;\n  const result = await ui.dialogs.editAttr({ ...attrs });\n  if (result) {\n    const tr = state.tr;\n    const range = getSelectionMarkRange(state.selection, markType);\n    tr.removeMark(range.from, range.to, markType);\n    tr.addMark(\n      range.from,\n      range.to,\n      markType.create({\n        ...attrs,\n        ...result.attr,\n      }),\n    );\n    dispatch(tr);\n  }\n}\n\nasync function editNodeAttrs(\n  node: ProsemirrorNode,\n  pos: number,\n  state: EditorState,\n  dispatch: (tr: Transaction<any>) => void,\n  ui: EditorUI,\n  pandocExtensions: PandocExtensions,\n): Promise<void> {\n  const attrs = node.attrs;\n  const result = await ui.dialogs.editAttr({ ...attrs }, idHint(node, pandocExtensions));\n  if (result) {\n    dispatch(\n      state.tr.setNodeMarkup(pos, node.type, {\n        ...attrs,\n        ...result.attr,\n      }),\n    );\n  }\n}\n\nfunction idHint(node: ProsemirrorNode, pandocExtensions: PandocExtensions) {\n  if (node.type === node.type.schema.nodes.heading) {\n    const unemoji = pandocExtensions.gfm_auto_identifiers;\n    const text = fragmentText(node.content, unemoji);\n\n    if (pandocExtensions.gfm_auto_identifiers) {\n      return gfmAutoIdentifier(text, pandocExtensions.ascii_identifiers);\n    } else {\n      return pandocAutoIdentifier(text, pandocExtensions.ascii_identifiers);\n    }\n  } else {\n    return undefined;\n  }\n}\n","/*\n * attr_edit-decoration.tsx\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { DecorationSet, EditorView, Decoration } from 'prosemirror-view';\n\nimport * as React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { AttrEditOptions } from '../../api/attr_edit';\nimport { ImageButton } from '../../api/widgets/button';\nimport { CommandFn } from '../../api/command';\nimport { AttrProps } from '../../api/ui-dialogs';\nimport { WidgetProps, reactRenderForEditorView } from '../../api/widgets/react';\nimport { PandocExtensions } from '../../api/pandoc';\n\nimport { kEditAttrShortcut } from './attr_edit';\nimport { attrEditNodeCommandFn } from './attr_edit-command';\n\nimport './attr_edit-decoration.css';\n\ninterface AttrEditDecorationProps extends WidgetProps {\n  tags: string[];\n  attrs: AttrProps;\n  editFn: CommandFn;\n  view: EditorView;\n  ui: EditorUI;\n}\n\nconst AttrEditDecoration: React.FC<AttrEditDecorationProps> = props => {\n  const buttonTitle = `${props.ui.context.translateText('Edit Attributes')} (${kEditAttrShortcut})`;\n\n  const onClick = () => {\n    props.editFn(props.view.state, props.view.dispatch, props.view);\n  };\n\n  return (\n    <div className=\"pm-attr-edit-decoration pm-surface-widget-text-color \" style={props.style}>\n      {props.tags.length\n        ? props.tags.map(tag => {\n            return (\n              <span\n                key={tag}\n                className=\"attr-edit-tag attr-edit-widget pm-block-border-color pm-border-background-color\"\n                onClick={onClick}\n              >\n                {tag}\n              </span>\n            );\n          })\n        : null}\n      {props.editFn(props.view.state) ? (\n        <ImageButton\n          classes={['attr-edit-button']}\n          image={props.ui.prefs.darkMode() ? props.ui.images.properties_deco_dark! : props.ui.images.properties_deco!}\n          title={buttonTitle}\n          tabIndex={-1}\n          onClick={onClick}\n        />\n      ) : null}\n    </div>\n  );\n};\n\nconst key = new PluginKey<DecorationSet>('attr_edit_decoration');\n\nexport class AttrEditDecorationPlugin extends Plugin<DecorationSet> {\n  constructor(ui: EditorUI, pandocExtensions: PandocExtensions, editors: AttrEditOptions[]) {\n    super({\n      key,\n      state: {\n        init: (_config: { [key: string]: any }) => {\n          return DecorationSet.empty;\n        },\n        apply: (tr: Transaction, old: DecorationSet, _oldState: EditorState, newState: EditorState) => {\n          // node types\n          const schema = newState.schema;\n          const nodeTypes = editors.map(ed => ed.type(schema));\n\n          // decorations to return\n          const decorations: Decoration[] = [];\n\n          // start from current selection\n          const $head = tr.selection.$head;\n\n          for (let i=1; i<=$head.depth; i++) {\n\n            const parentWithAttrs = { node: $head.node(i), pos: $head.before(i) };\n            if (!nodeTypes.includes(parentWithAttrs.node.type)) {\n              continue;\n            }\n\n            // get editor\n            const editor = editors.find(ed => ed.type(schema) === parentWithAttrs.node.type)!;\n\n            // screen for noDecorator\n            if (editor.noDecorator) {\n              continue;\n            }\n\n            // provide some editor defaults\n            editor.tags =\n              editor.tags ||\n              (editorNode => {\n                const attrTags = [];\n                if (editorNode.attrs.id) {\n                  attrTags.push(`#${editorNode.attrs.id}`);\n                }\n                if (editorNode.attrs.classes && editorNode.attrs.classes.length) {\n                  attrTags.push(`${editorNode.attrs.classes.map((clz: string) => '.' + clz).join(' ')}`);\n                }\n                return attrTags;\n              });\n            editor.offset = editor.offset || { top: 0, right: 0 };\n\n            // get editFn\n            const editFn = (editorUI: EditorUI) => attrEditNodeCommandFn(parentWithAttrs, editorUI, pandocExtensions, editors);\n\n            // get attrs/tags\n            const node = parentWithAttrs.node;\n            const attrs = node.attrs;\n            const tags = editor.tags(node);\n\n            // attr_edit controls\n            const attrEditDecoration = Decoration.widget(\n              parentWithAttrs.pos,\n              (view: EditorView, getPos: () => number) => {\n                // does the offsetParent have any right padding we need to offset for?\n                // we normally use right: 5px for positioning but that is relative to\n                // the edge of the offsetParent. However, some offset parents (e.g. a\n                // td or a nested div) have their own internal padding to account for\n                // so we look for it here\n                let rightPaddingOffset = 0;\n                const attrsNode = view.nodeDOM(getPos());\n                if (attrsNode) {\n                  const attrsEl = attrsNode as HTMLElement;\n                  if (attrsEl.offsetParent) {\n                    const offsetParentStyle = window.getComputedStyle(attrsEl.offsetParent);\n                    rightPaddingOffset = -parseInt(offsetParentStyle.paddingRight!, 10) || 0;\n                  }\n                }\n\n                // cacculate position offsets\n                const baseOffset = editor.offset || { top: 0, right: 0 };\n                const xOffset = baseOffset.right + rightPaddingOffset;\n                const yOffset = baseOffset.top + 6;\n                const cssProps: React.CSSProperties = {\n                  transform: `translate(${xOffset}px,-${yOffset}px)`,\n                };\n\n                // create attr edit react component\n                const attrEdit = (\n                  <AttrEditDecoration\n                    tags={tags}\n                    attrs={attrs}\n                    editFn={editFn(ui)}\n                    view={view}\n                    ui={ui}\n                    style={cssProps}\n                  />\n                );\n\n                // create decorator and render attr editor into it\n                const decoration = window.document.createElement('div');\n                reactRenderForEditorView(attrEdit, decoration, view);\n\n                return decoration;\n              },\n              {\n                // re-use existing instance for same tags\n                key: `tags:${tags.join('/')}`,\n                ignoreSelection: true,\n                stopEvent: () => {\n                  return true;\n                },\n              },\n            );\n\n            decorations.push(attrEditDecoration);\n          }\n\n         \n          // return decorations\n          return DecorationSet.create(tr.doc, decorations);\n        },\n      },\n      props: {\n        decorations: (state: EditorState) => {\n          return key.getState(state);\n        },\n      },\n    });\n  }\n}\n","/*\n * editor-theme.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface EditorTheme {\n  darkMode: boolean;\n  solarizedMode: boolean;\n  cursorColor: string;\n  selectionColor: string;\n  nodeSelectionColor: string;\n  backgroundColor: string;\n  metadataBackgroundColor: string;\n  chunkBackgroundColor: string;\n  spanBackgroundColor: string;\n  divBackgroundColor: string;\n  commentColor: string;\n  commentBackgroundColor: string;\n  gutterBackgroundColor: string;\n  gutterTextColor: string;\n  textColor: string;\n  lightTextColor: string;\n  placeholderTextColor: string;\n  invisibleTextColor: string;\n  linkTextColor: string;\n  surfaceWidgetTextColor: string;\n  markupTextColor: string;\n  findTextBackgroundColor: string;\n  findTextBorderColor: string;\n  borderBackgroundColor: string;\n  blockBorderColor: string;\n  focusOutlineColor: string;\n  paneBorderColor: string;\n  fixedWidthFont: string;\n  fixedWidthFontSizePt: number;\n  proportionalFont: string;\n  proportionalFontSizePt: number;\n  code: CodeTheme;\n}\n\nexport interface CodeTheme {\n  keywordColor: string;\n  atomColor: string;\n  numberColor: string;\n  variableColor: string;\n  defColor: string;\n  operatorColor: string;\n  commentColor: string;\n  stringColor: string;\n  metaColor: string;\n  builtinColor: string;\n  bracketColor: string;\n  tagColor: string;\n  attributeColor: string;\n  hrColor: string;\n  linkColor: string;\n  errorColor: string;\n}\n\nexport function defaultTheme(): EditorTheme {\n  return {\n    darkMode: false,\n    solarizedMode: false,\n    cursorColor: 'black',\n    selectionColor: '#8cf',\n    nodeSelectionColor: 'rgb(102,155,243)',\n    backgroundColor: 'white',\n    metadataBackgroundColor: 'rgb(255, 255, 255)',\n    chunkBackgroundColor: 'rgb(251,251,251)',\n    spanBackgroundColor: '#fff8dc',\n    divBackgroundColor: 'rgb(243, 243, 243)',\n    commentColor: '#3c4c72',\n    commentBackgroundColor: '#FFECCB',\n    gutterBackgroundColor: '#f0f0f0',\n    gutterTextColor: '#333',\n    textColor: 'black',\n    surfaceWidgetTextColor: 'rgba(0,0,0,0.5)',\n    lightTextColor: 'rgb(60, 76, 114)',\n    linkTextColor: '#106ba3',\n    placeholderTextColor: 'gray',\n    invisibleTextColor: 'rgb(191, 191, 191)',\n    markupTextColor: 'rgb(185, 6, 144)',\n    findTextBackgroundColor: 'rgb(250, 250, 255)',\n    findTextBorderColor: 'rgb(200, 200, 250)',\n    borderBackgroundColor: '#ddd',\n    blockBorderColor: '#ddd',\n    focusOutlineColor: '#5d84cd',\n    paneBorderColor: 'silver',\n    fixedWidthFont: 'monospace, monospace',\n    fixedWidthFontSizePt: 9,\n    proportionalFont: '\"Lucida Sans\", \"DejaVu Sans\", \"Lucida Grande\", \"Segoe UI\", Verdana, Helvetica, sans-serif',\n    proportionalFontSizePt: 10,\n    code: {\n      keywordColor: 'rgb(0, 0, 255)',\n      atomColor: 'rgb(88, 92, 246)',\n      numberColor: 'rgb(0, 0, 205)',\n      variableColor: 'rgb(0, 0, 0)',\n      defColor: 'rgb(0, 0, 0)',\n      operatorColor: 'rgb(104, 118, 135)',\n      commentColor: 'rgb(76, 136, 107)',\n      stringColor: 'rgb(3, 106, 7)',\n      metaColor: 'rgb(0, 0, 0)',\n      builtinColor: 'rgb(0, 0, 0)',\n      bracketColor: 'rgb(104, 118, 135)',\n      tagColor: 'rgb(0, 22, 142)',\n      attributeColor: 'rgb(0, 0, 0)',\n      hrColor: 'rgb(0, 0, 0)',\n      linkColor: 'rgb(0, 0, 255)',\n      errorColor: 'rgb(197, 6, 11)',\n    },\n  };\n}\n\nexport function applyTheme(theme: EditorTheme) {\n  // merge w/ defaults\n  const defaults = defaultTheme();\n  theme = {\n    ...defaults,\n    ...theme,\n    code: {\n      ...defaults.code,\n      ...theme.code,\n    },\n  };\n\n  // generate theme css\n  const themeCss = `\n    .pm-default-theme .pm-background-color {\n      background-color: ${defaults.backgroundColor} !important;\n    }\n    .pm-default-theme .pm-text-color {\n      color: ${defaults.textColor} !important;\n    }\n    .pm-default-theme .pm-border-background-color {\n      background-color: ${defaults.borderBackgroundColor} !important;\n    }\n    .pm-default-theme .pm-input-text {\n      border-color: ${defaults.paneBorderColor} !important\n    }\n    .pm-default-theme .pm-block-border-color {\n      border-color: ${defaults.blockBorderColor} !important;\n    }\n    .pm-default-theme .pm-input-outline-button {\n      color: ${defaults.textColor};\n      border-color: ${defaults.textColor};\n      background-color: ${defaults.backgroundColor};\n    }\n    .pm-default-theme .pm-selected-navigation-tree-item {\n      background-color: ${defaults.findTextBackgroundColor} !important;\n      border-color: ${defaults.findTextBorderColor} !important;\n    }\n    .pm-default-theme .pm-navigation-tree-item {\n      border-color: ${defaults.backgroundColor} !important;\n    }\n    .pm-default-theme .pm-block-border-color {\n      border-color: ${defaults.blockBorderColor} !important;\n    }\n    .pm-default-theme .pm-focus-outline-color {\n      border-color: ${defaults.focusOutlineColor} !important;\n    }\n    .pm-default-theme .pm-input-button {\n      border-color: ${defaults.borderBackgroundColor};\n      background-color: ${defaults.backgroundColor};\n    }\n    .pm-default-theme .pm-placeholder-text-color {\n      color: ${defaults.placeholderTextColor} !important;\n    }\n    .pm-default-theme .pm-background-color *::selection {\n      background-color: ${defaults.selectionColor} !important;\n    }\n    .pm-default-theme .pm-find-text,\n    .pm-default-theme .pm-list-item-selected,\n    .pm-default-theme .pm-grid-item-selected {\n      background-color: ${defaults.findTextBackgroundColor} !important;\n      box-shadow: 0 0 0 1px ${defaults.findTextBorderColor}; \n      border-radius: 3px;\n    }\n    .pm-default-theme .pm-rstudio-button {\n      border-color: DarkGray !important;\n    }\n    .pm-cursor-color {\n      caret-color: ${theme.cursorColor}\n    }\n    .pm-background-color {\n      background-color: ${theme.backgroundColor} !important;\n    }\n    .pm-metadata-background-color {\n      background-color: ${theme.metadataBackgroundColor} !important;\n    }\n    .pm-chunk-background-color {\n      background-color: ${theme.chunkBackgroundColor} !important;\n    }\n    .pm-span-background-color {\n      background-color: ${theme.spanBackgroundColor} !important;\n    }\n    .pm-div-background-color {\n      background-color: ${theme.divBackgroundColor} !important;\n    }\n    .pm-nbsp-background-color {\n      background-color: ${theme.spanBackgroundColor} !important;\n    }\n    .pm-comment-color {\n      color: ${theme.commentColor} !important;\n    }\n    .pm-comment-background-color {\n      background-color: ${theme.commentBackgroundColor} !important;\n    }\n    .pm-text-color {\n      color: ${theme.textColor} !important;\n    }\n    .pm-surface-widget-text-color {\n      color: ${theme.surfaceWidgetTextColor} !important;\n    }\n    .pm-light-text-color {\n      color: ${theme.lightTextColor} !important;\n    }\n    .pm-placeholder-text-color {\n      color: ${theme.placeholderTextColor} !important;\n    }\n    .pm-invisible-text-color {\n      color: ${theme.invisibleTextColor} !important;\n    }\n    .pm-link-text-color {\n      color: ${theme.linkTextColor} !important;\n    }\n    .pm-markup-text-color {\n      color: ${theme.markupTextColor} !important;\n    }\n    .pm-find-text,\n    .pm-list-item-selected,\n    .pm-grid-item-selected {\n      background-color: ${theme.findTextBackgroundColor} !important;\n      box-shadow: 0 0 0 1px ${theme.findTextBorderColor}; \n      border-radius: 3px;\n    }\n    .pm-selected-text {\n      background-color: ${theme.selectionColor} !important;\n    }\n    .pm-selected-list-item {\n      background-color: ${theme.findTextBackgroundColor} !important;\n      border: 1px solid ${theme.findTextBorderColor} !important;\n      border-radius: 3px;\n    }\n    .pm-dark-mode .pm-selected-list-item {\n      background-color: ${theme.chunkBackgroundColor} !important;\n      border: 1px solid transparent !important;\n    }\n    .pm-navigation-tree-item {\n      border: 1px solid ${theme.backgroundColor} !important;\n      border-radius: 3px;\n      margin-left: 2px;\n      margin-right: 2px;\n    }\n    .pm-selected-navigation-tree-item {\n      background-color: ${theme.findTextBackgroundColor} !important;\n      border: 1px solid ${theme.findTextBorderColor} !important;\n      border-radius: 3px;\n      margin-left: 2px;\n      margin-right: 2px;\n    }\n    .pm-border-background-color {\n      background-color: ${theme.borderBackgroundColor}!important;\n    }\n    .pm-block-border-color {\n      border-color: ${theme.blockBorderColor} !important;\n    }\n    .pm-focus-outline-color {\n      border-color: ${theme.focusOutlineColor} !important;\n    }\n    .pm-pane-border-color {\n      border-color: ${theme.paneBorderColor} !important;\n    }\n    .pm-div .pm-div {\n      border-color: ${theme.focusOutlineColor} !important;\n    }\n    .pm-raw-block-border {\n      border-color: ${theme.markupTextColor} !important;\n    }\n    .pm-popup {\n      box-shadow: 0 1px 3px ${theme.blockBorderColor} !important;\n    }\n    .pm-selected-node-outline-color,\n    .ProseMirror-selectednode {\n      outline-color: ${theme.nodeSelectionColor} !important;\n    }\n    .pm-selected-node-border-color {\n      border-color: ${theme.nodeSelectionColor} !important;\n    }\n    .pm-dark-mode .pm-selected-node-outline-color,\n    .pm-dark-mode .ProseMirror-selectednode {\n      outline-color: ${theme.nodeSelectionColor} !important;\n    }\n    .pm-dark-mode .pm-selected-node-border-color {\n      border-color: ${theme.nodeSelectionColor} !important;\n    }\n    .pm-background-color *::selection {\n      background-color: ${theme.selectionColor} !important;\n    }\n    .pm-background-color *::-moz-selection {\n      background-color: ${theme.selectionColor} !important;\n    }\n    .pm-fixedwidth-font {\n      font-family: ${theme.fixedWidthFont} !important;\n      font-size: ${theme.fixedWidthFontSizePt}pt !important;\n    }\n    .pm-proportional-font {\n      font-family: ${theme.proportionalFont} !important;\n      font-size: ${theme.proportionalFontSizePt}pt !important;\n    }\n    .pm-emoji-font {\n      font-family: ${theme.fixedWidthFont} !important;\n    }\n    .pm-input-text {\n      border-color: ${theme.paneBorderColor};\n    }\n    .pm-input-button {\n      border-color: ${theme.borderBackgroundColor};\n      background-color: ${theme.backgroundColor};\n    }\n    .pm-input-outline-button {\n      color: ${theme.textColor};\n      border-color: ${theme.textColor};\n      background-color: ${theme.backgroundColor};\n    }\n    .pm-ace-first-line-meta .ace_text-layer .ace_line_group:first-child,\n    .pm-ace-first-line-meta .ace_text-layer .ace_line_group:first-child span {\n      color: ${theme.lightTextColor} !important;\n    }\n    .ProseMirror-gapcursor:after {\n      border-top: 1px solid ${theme.textColor};\n    }\n  `;\n\n  // set style\n  setStyleElement('pm-editor-theme-styles-id', themeCss);\n}\n\nexport function applyPadding(padding: string) {\n  const paddingCss = `\n    .pm-editing-root-node {\n      padding-left: ${padding} !important;\n      padding-right: ${padding} !important;\n    }\n  `;\n  setStyleElement('pm-editor-padding-styles-id', paddingCss);\n}\n\nfunction setStyleElement(id: string, css: string) {\n  // get access to style element (create if necessary)\n  let styleEl = window.document.getElementById(id);\n  if (styleEl === null) {\n    styleEl = window.document.createElement('style');\n    styleEl.setAttribute('id', id);\n    styleEl.setAttribute('type', 'text/css');\n    window.document.head.appendChild(styleEl);\n  }\n\n  // set css\n  styleEl.innerHTML = css;\n}\n","/*\n * editor-images.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUIImages } from '../api/ui-images';\n\nimport copyImage from './images/copy.png';\nimport propertiesImage from './images/properties.png';\nimport propertiesDecoImage from './images/properties_deco.png';\nimport propertiesDecoDarkImage from './images/properties_deco_dark.png';\nimport removelinkImage from './images/removelink.png';\nimport runchunkImage from './images/runchunk.png';\nimport runprevchunksImage from './images/runprevchunks.png';\nimport searchImage from './images/search.png';\nimport searchProgressImage from './images/search_progress.gif';\n\nimport omniInsertGenericImage from './images/omni_insert/generic.png';\nimport heading1Image from './images/omni_insert/heading1.png';\nimport heading1DarkImage from './images/omni_insert/heading1_dark.png';\nimport heading2Image from './images/omni_insert/heading2.png';\nimport heading2DarkImage from './images/omni_insert/heading2_dark.png';\nimport heading3Image from './images/omni_insert/heading3.png';\nimport heading3DarkImage from './images/omni_insert/heading3_dark.png';\nimport heading4Image from './images/omni_insert/heading4.png';\nimport heading4DarkImage from './images/omni_insert/heading4_dark.png';\nimport bulletListImage from './images/omni_insert/bullet_list.png';\nimport bulletListDarkImage from './images/omni_insert/bullet_list_dark.png';\nimport orderedListImage from './images/omni_insert/ordered_list.png';\nimport orderedListDarkImage from './images/omni_insert/ordered_list_dark.png';\nimport blockquoteImage from './images/omni_insert/blockquote.png';\nimport blockquoteDarkImage from './images/omni_insert/blockquote_dark.png';\nimport mathInlineImage from './images/omni_insert/math_inline.png';\nimport mathInlineDarkImage from './images/omni_insert/math_inline_dark.png';\nimport mathDisplayImage from './images/omni_insert/math_display.png';\nimport mathDisplayDarkImage from './images/omni_insert/math_display_dark.png';\nimport htmlBlockImage from './images/omni_insert/html_block.png';\nimport htmlBlockDarkImage from './images/omni_insert/html_block_dark.png';\nimport lineBlockImage from './images/omni_insert/line_block.png';\nimport lineBlockDarkImage from './images/omni_insert/line_block_dark.png';\nimport emojiImage from './images/omni_insert/emoji.png';\nimport emojiDarkImage from './images/omni_insert/emoji_dark.png';\nimport commentImage from './images/omni_insert/comment.png';\nimport commentDarkImage from './images/omni_insert/comment_dark.png';\nimport divImage from './images/omni_insert/div.png';\nimport divDarkImage from './images/omni_insert/div_dark.png';\nimport codeBlockImage from './images/omni_insert/code_block.png';\nimport codeBlockDarkImage from './images/omni_insert/code_block_dark.png';\nimport footnoteImage from './images/omni_insert/footnote.png';\nimport footnoteDarkImage from './images/omni_insert/footnote_dark.png';\nimport citationImage from './images/omni_insert/citation.png';\nimport citationDarkImage from './images/omni_insert/citation_dark.png';\nimport crossReferenceImage from './images/omni_insert/cross_reference.png';\nimport crossReferenceDarkImage from './images/omni_insert/cross_reference_dark.png';\nimport symbolImage from './images/omni_insert/symbol.png';\nimport symbolDarkImage from './images/omni_insert/symbol_dark.png';\nimport tableImage from './images/omni_insert/table.png';\nimport tableDarkImage from './images/omni_insert/table_dark.png';\nimport definitionListImage from './images/omni_insert/definition_list.png';\nimport definitionListDarkImage from './images/omni_insert/definition_list_dark.png';\nimport horizontalRuleImage from './images/omni_insert/horizontal_rule.png';\nimport horizontalRuleDarkImage from './images/omni_insert/horizontal_rule_dark.png';\nimport imgImage from './images/omni_insert/image.png';\nimport imgDarkImage from './images/omni_insert/image_dark.png';\nimport linkImage from './images/omni_insert/link.png';\nimport linkDarkImage from './images/omni_insert/link_dark.png';\nimport paragraphImage from './images/omni_insert/paragraph.png';\nimport paragraphDarkImage from './images/omni_insert/paragraph_dark.png';\nimport rawBlockImage from './images/omni_insert/raw_block.png';\nimport rawBlockDarkImage from './images/omni_insert/raw_block_dark.png';\nimport rawInlineImage from './images/omni_insert/raw_inline.png';\nimport rawInlineDarkImage from './images/omni_insert/raw_inline_dark.png';\nimport texBlockImage from './images/omni_insert/tex_block.png';\nimport texBlockDarkImage from './images/omni_insert/tex_block_dark.png';\nimport yamlBlockImage from './images/omni_insert/yaml_block.png';\nimport yamlBlockDarkImage from './images/omni_insert/yaml_block_dark.png';\nimport pythonChunkImage from './images/omni_insert/python_chunk.png';\nimport sqlChunkImage from './images/omni_insert/sql_chunk.png';\nimport d3ChunkImage from './images/omni_insert/d3_chunk.png';\nimport stanChunkImage from './images/omni_insert/stan_chunk.png';\nimport bashChunkImage from './images/omni_insert/bash_chunk.png';\nimport bashChunkDarkImage from './images/omni_insert/bash_chunk_dark.png';\nimport rChunkImage from './images/omni_insert/r_chunk.png';\nimport rChunkDarkImage from './images/omni_insert/r_chunk_dark.png';\nimport rcppChunkImage from './images/omni_insert/rcpp_chunk.png';\nimport rcppChunkDarkImage from './images/omni_insert/rcpp_chunk_dark.png';\n\nimport articleImage from './images/citations/article.png';\nimport articleDarkImage from './images/citations/article_dark.png';\nimport bookImage from './images/citations/book.png';\nimport bookDarkImage from './images/citations/book_dark.png';\nimport broadcastImage from './images/citations/broadcast.png';\nimport broadcastDarkImage from './images/citations/broadcast_dark.png';\nimport dataImage from './images/citations/data.png';\nimport dataDarkImage from './images/citations/data_dark.png';\nimport entryImage from './images/citations/entry.png';\nimport entryDarkImage from './images/citations/entry_dark.png';\nimport imageImage from './images/citations/image.png';\nimport imageDarkImage from './images/citations/image_dark.png';\nimport legalImage from './images/citations/legal.png';\nimport legalDarkImage from './images/citations/legal_dark.png';\nimport mapImage from './images/citations/map.png';\nimport mapDarkImage from './images/citations/map_dark.png';\nimport movieImage from './images/citations/movie.png';\nimport movieDarkImage from './images/citations/movie_dark.png';\nimport otherImage from './images/citations/other.png';\nimport otherDarkImage from './images/citations/other_dark.png';\nimport songImage from './images/citations/song.png';\nimport songDarkImage from './images/citations/song_dark.png';\nimport webImage from './images/citations/web.png';\nimport webDarkImage from './images/citations/web_dark.png';\nimport zoteroOverlayImage from './images/citations/zotero-overlay.png';\nimport localSourcesImage from './images/citations/insert/local-sources.png';\nimport bibliographyImage from './images/citations/insert/bibliography.png';\nimport bibliographyFolderImage from './images/citations/insert/bibliography-folder.png';\nimport zoteroRootImage from './images/citations/insert/zotero-root.png';\nimport zoteroLibraryImage from './images/citations/insert/zotero-library.png';\nimport zoteroCollectionImage from './images/citations/insert/zotero-collection.png';\nimport doiImage from './images/citations/insert/doi.png';\nimport crossRefImage from './images/citations/insert/crossref.png';\nimport pubmedImage from './images/citations/insert/pubmed.png';\nimport dataciteImage from './images/citations/insert/datacite.png';\n\nimport tagDelete from './images/widgets/tag-delete.png';\nimport tagEdit from './images/widgets/tag-edit.png';\n\nexport function defaultEditorUIImages(): EditorUIImages {\n  return {\n    copy: copyImage,\n    properties: propertiesImage,\n    properties_deco: propertiesDecoImage,\n    properties_deco_dark: propertiesDecoDarkImage,\n    removelink: removelinkImage,\n    runchunk: runchunkImage,\n    runprevchunks: runprevchunksImage,\n    search: searchImage,\n    search_progress: searchProgressImage,\n    omni_insert: {\n      generic: omniInsertGenericImage,\n      heading1: heading1Image,\n      heading1_dark: heading1DarkImage,\n      heading2: heading2Image,\n      heading2_dark: heading2DarkImage,\n      heading3: heading3Image,\n      heading3_dark: heading3DarkImage,\n      heading4: heading4Image,\n      heading4_dark: heading4DarkImage,\n      bullet_list: bulletListImage,\n      bullet_list_dark: bulletListDarkImage,\n      ordered_list: orderedListImage,\n      ordered_list_dark: orderedListDarkImage,\n      blockquote: blockquoteImage,\n      blockquote_dark: blockquoteDarkImage,\n      math_inline: mathInlineImage,\n      math_inline_dark: mathInlineDarkImage,\n      math_display: mathDisplayImage,\n      math_display_dark: mathDisplayDarkImage,\n      html_block: htmlBlockImage,\n      html_block_dark: htmlBlockDarkImage,\n      line_block: lineBlockImage,\n      line_block_dark: lineBlockDarkImage,\n      emoji: emojiImage,\n      emoji_dark: emojiDarkImage,\n      comment: commentImage,\n      comment_dark: commentDarkImage,\n      div: divImage,\n      div_dark: divDarkImage,\n      code_block: codeBlockImage,\n      code_block_dark: codeBlockDarkImage,\n      footnote: footnoteImage,\n      footnote_dark: footnoteDarkImage,\n      citation: citationImage,\n      citation_dark: citationDarkImage,\n      cross_reference: crossReferenceImage,\n      cross_reference_dark: crossReferenceDarkImage,\n      symbol: symbolImage,\n      symbol_dark: symbolDarkImage,\n      table: tableImage,\n      table_dark: tableDarkImage,\n      definition_list: definitionListImage,\n      definition_list_dark: definitionListDarkImage,\n      horizontal_rule: horizontalRuleImage,\n      horizontal_rule_dark: horizontalRuleDarkImage,\n      image: imgImage,\n      image_dark: imgDarkImage,\n      link: linkImage,\n      link_dark: linkDarkImage,\n      paragraph: paragraphImage,\n      paragraph_dark: paragraphDarkImage,\n      raw_block: rawBlockImage,\n      raw_block_dark: rawBlockDarkImage,\n      raw_inline: rawInlineImage,\n      raw_inline_dark: rawInlineDarkImage,\n      tex_block: texBlockImage,\n      tex_block_dark: texBlockDarkImage,\n      yaml_block: yamlBlockImage,\n      yaml_block_dark: yamlBlockDarkImage,\n      python_chunk: pythonChunkImage,\n      sql_chunk: sqlChunkImage,\n      d3_chunk: d3ChunkImage,\n      stan_chunk: stanChunkImage,\n      bash_chunk: bashChunkImage,\n      bash_chunk_dark: bashChunkDarkImage,\n      r_chunk: rChunkImage,\n      r_chunk_dark: rChunkDarkImage,\n      rcpp_chunk: rcppChunkImage,\n      rcpp_chunk_dark: rcppChunkDarkImage,\n    },\n    citations: {\n      article: articleImage,\n      article_dark: articleDarkImage,\n      book: bookImage,\n      book_dark: bookDarkImage,\n      broadcast: broadcastImage,\n      broadcast_dark: broadcastDarkImage,\n      data: dataImage,\n      data_dark: dataDarkImage,\n      entry: entryImage,\n      entry_dark: entryDarkImage,\n      image: imageImage,\n      image_dark: imageDarkImage,\n      legal: legalImage,\n      legal_dark: legalDarkImage,\n      map: mapImage,\n      map_dark: mapDarkImage,\n      movie: movieImage,\n      movie_dark: movieDarkImage,\n      other: otherImage,\n      other_dark: otherDarkImage,\n      song: songImage,\n      song_dark: songDarkImage,\n      web: webImage,\n      web_dark: webDarkImage,\n      zoteroOverlay: zoteroOverlayImage,\n      local_sources: localSourcesImage,\n      bibligraphy: bibliographyImage,\n      bibligraphy_folder: bibliographyFolderImage,\n      zotero_library: zoteroLibraryImage,\n      zotero_collection: zoteroCollectionImage,\n      zotero_root: zoteroRootImage,\n      doi: doiImage,\n      crossref: crossRefImage,\n      pubmed: pubmedImage,\n      datacite: dataciteImage,\n    },\n    widgets: {\n      tag_delete: tagDelete,\n      tag_edit: tagEdit,\n    },\n  };\n}\n","/*\n * editor-menus.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorMenuItem, EditorUI } from '../api/ui';\nimport { tableMenu } from '../api/table';\nimport { EditorCommandId, EditorCommand } from '../api/command';\nimport { Editor } from './editor';\n\nexport interface EditorMenus {\n  format: EditorMenuItem[];\n  insert: EditorMenuItem[];\n  table: EditorMenuItem[];\n}\n\nexport function editorMenus(ui: EditorUI, commands: EditorCommand[]) {\n  return {\n    format: formatMenu(ui, commands),\n    insert: insertMenu(ui, commands),\n    table: tableMenu(true, ui),\n  };\n}\n\nfunction formatMenu(ui: EditorUI, commands: EditorCommand[]) {\n  return [\n    { command: EditorCommandId.Strong },\n    { command: EditorCommandId.Em },\n    { command: EditorCommandId.Underline },\n    { command: EditorCommandId.Code },\n    {\n      text: ui.context.translateText('Text'),\n      subMenu: {\n        items: [\n          { command: EditorCommandId.Strikeout },\n          { command: EditorCommandId.Superscript },\n          { command: EditorCommandId.Subscript },\n          { command: EditorCommandId.Smallcaps },\n        ],\n      },\n    },\n    { separator: true },\n    {\n      text: ui.context.translateText('Bullets & Numbering'),\n      subMenu: {\n        items: [\n          { command: EditorCommandId.BulletList },\n          { command: EditorCommandId.OrderedList },\n          { separator: true },\n          { command: EditorCommandId.TightList },\n          { separator: true },\n          { command: EditorCommandId.ListItemCheck },\n          { command: EditorCommandId.ListItemCheckToggle },\n          { separator: true },\n          { command: EditorCommandId.ListItemSink },\n          { command: EditorCommandId.ListItemLift },\n          { separator: true },\n          { command: EditorCommandId.EditListProperties },\n        ],\n      },\n    },\n    { separator: true },\n    { command: codeBlockCommand(commands) },\n    { command: EditorCommandId.Blockquote },\n    { command: EditorCommandId.LineBlock },\n    { separator: haveAnyOf(commands, EditorCommandId.Div, EditorCommandId.Span) },\n    { command: EditorCommandId.Div },\n    { command: EditorCommandId.Span },\n    { separator: true },\n    {\n      text: ui.context.translateText('Raw'),\n      subMenu: {\n        items: [\n          { command: EditorCommandId.HTMLInline },\n          { command: EditorCommandId.HTMLBlock },\n          { separator: true },\n          { command: EditorCommandId.TexInline },\n          { command: EditorCommandId.TexBlock },\n          { separator: true },\n          { command: EditorCommandId.RawInline },\n          { command: EditorCommandId.RawBlock },\n        ],\n      },\n    },\n    { separator: true },\n    { command: EditorCommandId.ClearFormatting },\n    { separator: true },\n    { command: EditorCommandId.AttrEdit },\n  ];\n}\n\nfunction insertMenu(ui: EditorUI, commands: EditorCommand[]) {\n  return [\n    { command: EditorCommandId.OmniInsert },\n    ...(haveAnyOf(commands, EditorCommandId.RCodeChunk, EditorCommandId.PythonCodeChunk)\n      ? [\n          { separator: true },\n          {\n            text: ui.context.translateText('Code Chunk'),\n            subMenu: {\n              items: [\n                { command: EditorCommandId.RCodeChunk },\n                { separator: true },\n                { command: EditorCommandId.PythonCodeChunk },\n                { command: EditorCommandId.BashCodeChunk },\n                { command: EditorCommandId.RcppCodeChunk },\n                { command: EditorCommandId.SQLCodeChunk },\n                { command: EditorCommandId.D3CodeChunk },\n                { command: EditorCommandId.StanCodeChunk },\n              ],\n            },\n          },\n        ]\n      : []),\n    { separator: true },\n    { command: EditorCommandId.Citation },\n    { command: EditorCommandId.CrossReference },\n    { command: EditorCommandId.Footnote },\n    { separator: true },\n    { command: EditorCommandId.Image },\n    { command: EditorCommandId.Link },\n    { command: EditorCommandId.HorizontalRule },\n    ...(haveAnyOf(commands, EditorCommandId.DefinitionList)\n      ? [\n          { separator: true },\n          {\n            text: ui.context.translateText('Definition'),\n            subMenu: {\n              items: [\n                { command: EditorCommandId.DefinitionList },\n                { separator: true },\n                { command: EditorCommandId.DefinitionTerm },\n                { command: EditorCommandId.DefinitionDescription },\n              ],\n            },\n          },\n        ]\n      : []),\n    { separator: true },\n    { command: EditorCommandId.InlineMath },\n    { command: EditorCommandId.DisplayMath },\n    { separator: true },\n    {\n      text: ui.context.translateText('Special Characters'),\n      subMenu: {\n        items: [\n          { command: EditorCommandId.Emoji },\n          { command: EditorCommandId.Symbol },\n          { separator: true },\n          { command: EditorCommandId.EnDash },\n          { command: EditorCommandId.EmDash },\n          { separator: true },\n          { command: EditorCommandId.NonBreakingSpace },\n          { separator: true },\n          { command: EditorCommandId.HardLineBreak },\n        ],\n      },\n    },\n    { separator: true },\n    { command: EditorCommandId.ParagraphInsert },\n    { command: EditorCommandId.CodeBlockFormat },\n    { command: EditorCommandId.InsertDiv },\n    { command: EditorCommandId.YamlMetadata },\n    { separator: true },\n    { command: EditorCommandId.Shortcode },\n    { separator: true },\n    { command: EditorCommandId.HTMLComment },\n  ];\n}\n\nfunction haveAnyOf(commands: EditorCommand[], ...ids: EditorCommandId[]) {\n  for (const command of commands) {\n    if (ids.includes(command.id)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction codeBlockCommand(commands: EditorCommand[]) {\n  return haveAnyOf(commands, EditorCommandId.CodeBlockFormat)\n    ? EditorCommandId.CodeBlockFormat\n    : EditorCommandId.CodeBlock;\n}\n","/*\n * table.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorCommandId } from './command';\nimport { EditorUI } from './ui';\n\nexport interface TableCapabilities {\n  captions: boolean;\n  headerOptional: boolean;\n  multiline: boolean;\n}\n\nexport function tableMenu(insert: boolean, ui: EditorUI) {\n  return [\n    ...(insert ? [{ command: EditorCommandId.TableInsertTable }] : []),\n    { command: EditorCommandId.TableAddRowBefore },\n    { command: EditorCommandId.TableAddRowAfter },\n    { separator: true },\n    { command: EditorCommandId.TableAddColumnBefore },\n    { command: EditorCommandId.TableAddColumnAfter },\n    { separator: true },\n    { command: EditorCommandId.TableDeleteRow },\n    { command: EditorCommandId.TableDeleteColumn },\n    { separator: true },\n    { command: EditorCommandId.TableDeleteTable },\n    { separator: true },\n    {\n      text: ui.context.translateText('Align Column'),\n      subMenu: {\n        items: [\n          { command: EditorCommandId.TableAlignColumnLeft },\n          { command: EditorCommandId.TableAlignColumnCenter },\n          { command: EditorCommandId.TableAlignColumnRight },\n          { separator: true },\n          { command: EditorCommandId.TableAlignColumnDefault },\n        ],\n      },\n    },\n    { separator: true },\n    { command: EditorCommandId.TableToggleHeader },\n    { command: EditorCommandId.TableToggleCaption },\n  ];\n}\n","/*\n * editor-schema.ts\n *\n * Copyright (C) 2021 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, NodeSpec, MarkSpec, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ExtensionManager } from './editor-extensions';\nimport { PandocNode } from '../api/node';\nimport { PandocMark } from '../api/mark';\n\nexport function editorSchema(extensions: ExtensionManager): Schema {\n  // build in doc node + nodes from extensions\n  const nodes: { [name: string]: NodeSpec } = {\n    doc: {\n      attrs: {\n        initial: { default: false },\n      },\n      content: 'body notes',\n    },\n\n    body: {\n      content: 'block+',\n      isolating: true,\n      parseDOM: [{ tag: 'div[class*=\"body\"]' }],\n      toDOM() {\n        return [\n          'div',\n          { class: 'body pm-cursor-color pm-text-color pm-background-color pm-editing-root-node' },\n          ['div', { class: 'pm-content' }, 0],\n        ];\n      },\n    },\n\n    notes: {\n      content: 'note*',\n      parseDOM: [{ tag: 'div[class*=\"notes\"]' }],\n      toDOM() {\n        return [\n          'div',\n          { class: 'notes pm-cursor-color pm-text-color pm-background-color pm-editing-root-node' },\n          ['div', { class: 'pm-content' }, 0],\n        ];\n      },\n    },\n\n    note: {\n      content: 'block+',\n      attrs: {\n        ref: {},\n        number: { default: 1 },\n      },\n      isolating: true,\n      parseDOM: [\n        {\n          tag: 'div[class*=\"note\"]',\n          getAttrs(dom: Node | string) {\n            const el = dom as Element;\n            return {\n              ref: el.getAttribute('data-ref'),\n            };\n          },\n        },\n      ],\n      toDOM(node: ProsemirrorNode) {\n        return [\n          'div',\n          { 'data-ref': node.attrs.ref, class: 'note pm-footnote-body', 'data-number': node.attrs.number },\n          0,\n        ];\n      },\n    },\n  };\n  extensions.pandocNodes().forEach((node: PandocNode) => {\n    nodes[node.name] = node.spec;\n  });\n\n  // marks from extensions\n  const marks: { [name: string]: MarkSpec } = {};\n  extensions.pandocMarks().forEach((mark: PandocMark) => {\n    marks[mark.name] = mark.spec;\n  });\n\n  // allow code to exclude marks that don't support input rules\n  // (e.g. marks that denote a special escape sequences from markdown,\n  // like raw_tex, raw_html, shortcodes, xrefs, math, etc.)\n  if (marks.code) {\n    const excludeInCode = extensions\n      .pandocMarks()\n      .filter(mark => mark.noInputRules && mark.name !== 'code')\n      .map(mark => mark.name)\n      .join(' ');\n    marks.code.excludes = excludeInCode;\n  }\n\n  // return schema\n  return new Schema({\n    nodes,\n    marks,\n  });\n}\n"]}
\ No newline at end of file
overalldiffered=1 (not bit-by-bit identical)
overall=1