diff --git a/lib/docs/commonmark.js b/lib/docs/commonmark.js new file mode 100644 index 0000000000..c1b33d7571 --- /dev/null +++ b/lib/docs/commonmark.js @@ -0,0 +1,10255 @@ +/* commonmark 0.30.0 https://github.com/commonmark/commonmark.js @license BSD3 */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.commonmark = {})); +}(this, (function (exports) { 'use strict'; + + function isContainer(node) { + switch (node._type) { + case "document": + case "block_quote": + case "list": + case "item": + case "paragraph": + case "heading": + case "emph": + case "strong": + case "link": + case "image": + case "custom_inline": + case "custom_block": + return true; + default: + return false; + } + } + + var resumeAt = function(node, entering) { + this.current = node; + this.entering = entering === true; + }; + + var next = function() { + var cur = this.current; + var entering = this.entering; + + if (cur === null) { + return null; + } + + var container = isContainer(cur); + + if (entering && container) { + if (cur._firstChild) { + this.current = cur._firstChild; + this.entering = true; + } else { + // stay on node but exit + this.entering = false; + } + } else if (cur === this.root) { + this.current = null; + } else if (cur._next === null) { + this.current = cur._parent; + this.entering = false; + } else { + this.current = cur._next; + this.entering = true; + } + + return { entering: entering, node: cur }; + }; + + var NodeWalker = function(root) { + return { + current: root, + root: root, + entering: true, + next: next, + resumeAt: resumeAt + }; + }; + + var Node = function(nodeType, sourcepos) { + this._type = nodeType; + this._parent = null; + this._firstChild = null; + this._lastChild = null; + this._prev = null; + this._next = null; + this._sourcepos = sourcepos; + this._lastLineBlank = false; + this._lastLineChecked = false; + this._open = true; + this._string_content = null; + this._literal = null; + this._listData = {}; + this._info = null; + this._destination = null; + this._title = null; + this._isFenced = false; + this._fenceChar = null; + this._fenceLength = 0; + this._fenceOffset = null; + this._level = null; + this._onEnter = null; + this._onExit = null; + }; + + var proto = Node.prototype; + + Object.defineProperty(proto, "isContainer", { + get: function() { + return isContainer(this); + } + }); + + Object.defineProperty(proto, "type", { + get: function() { + return this._type; + } + }); + + Object.defineProperty(proto, "firstChild", { + get: function() { + return this._firstChild; + } + }); + + Object.defineProperty(proto, "lastChild", { + get: function() { + return this._lastChild; + } + }); + + Object.defineProperty(proto, "next", { + get: function() { + return this._next; + } + }); + + Object.defineProperty(proto, "prev", { + get: function() { + return this._prev; + } + }); + + Object.defineProperty(proto, "parent", { + get: function() { + return this._parent; + } + }); + + Object.defineProperty(proto, "sourcepos", { + get: function() { + return this._sourcepos; + } + }); + + Object.defineProperty(proto, "literal", { + get: function() { + return this._literal; + }, + set: function(s) { + this._literal = s; + } + }); + + Object.defineProperty(proto, "destination", { + get: function() { + return this._destination; + }, + set: function(s) { + this._destination = s; + } + }); + + Object.defineProperty(proto, "title", { + get: function() { + return this._title; + }, + set: function(s) { + this._title = s; + } + }); + + Object.defineProperty(proto, "info", { + get: function() { + return this._info; + }, + set: function(s) { + this._info = s; + } + }); + + Object.defineProperty(proto, "level", { + get: function() { + return this._level; + }, + set: function(s) { + this._level = s; + } + }); + + Object.defineProperty(proto, "listType", { + get: function() { + return this._listData.type; + }, + set: function(t) { + this._listData.type = t; + } + }); + + Object.defineProperty(proto, "listTight", { + get: function() { + return this._listData.tight; + }, + set: function(t) { + this._listData.tight = t; + } + }); + + Object.defineProperty(proto, "listStart", { + get: function() { + return this._listData.start; + }, + set: function(n) { + this._listData.start = n; + } + }); + + Object.defineProperty(proto, "listDelimiter", { + get: function() { + return this._listData.delimiter; + }, + set: function(delim) { + this._listData.delimiter = delim; + } + }); + + Object.defineProperty(proto, "onEnter", { + get: function() { + return this._onEnter; + }, + set: function(s) { + this._onEnter = s; + } + }); + + Object.defineProperty(proto, "onExit", { + get: function() { + return this._onExit; + }, + set: function(s) { + this._onExit = s; + } + }); + + Node.prototype.appendChild = function(child) { + child.unlink(); + child._parent = this; + if (this._lastChild) { + this._lastChild._next = child; + child._prev = this._lastChild; + this._lastChild = child; + } else { + this._firstChild = child; + this._lastChild = child; + } + }; + + Node.prototype.prependChild = function(child) { + child.unlink(); + child._parent = this; + if (this._firstChild) { + this._firstChild._prev = child; + child._next = this._firstChild; + this._firstChild = child; + } else { + this._firstChild = child; + this._lastChild = child; + } + }; + + Node.prototype.unlink = function() { + if (this._prev) { + this._prev._next = this._next; + } else if (this._parent) { + this._parent._firstChild = this._next; + } + if (this._next) { + this._next._prev = this._prev; + } else if (this._parent) { + this._parent._lastChild = this._prev; + } + this._parent = null; + this._next = null; + this._prev = null; + }; + + Node.prototype.insertAfter = function(sibling) { + sibling.unlink(); + sibling._next = this._next; + if (sibling._next) { + sibling._next._prev = sibling; + } + sibling._prev = this; + this._next = sibling; + sibling._parent = this._parent; + if (!sibling._next) { + sibling._parent._lastChild = sibling; + } + }; + + Node.prototype.insertBefore = function(sibling) { + sibling.unlink(); + sibling._prev = this._prev; + if (sibling._prev) { + sibling._prev._next = sibling; + } + sibling._next = this; + this._prev = sibling; + sibling._parent = this._parent; + if (!sibling._prev) { + sibling._parent._firstChild = sibling; + } + }; + + Node.prototype.walker = function() { + var walker = new NodeWalker(this); + return walker; + }; + + /* Example of use of walker: + + var walker = w.walker(); + var event; + + while (event = walker.next()) { + console.log(event.entering, event.node.type); + } + + */ + + var encodeCache = {}; + + + // Create a lookup array where anything but characters in `chars` string + // and alphanumeric chars is percent-encoded. + // + function getEncodeCache(exclude) { + var i, ch, cache = encodeCache[exclude]; + if (cache) { return cache; } + + cache = encodeCache[exclude] = []; + + for (i = 0; i < 128; i++) { + ch = String.fromCharCode(i); + + if (/^[0-9a-z]$/i.test(ch)) { + // always allow unencoded alphanumeric characters + cache.push(ch); + } else { + cache.push('%' + ('0' + i.toString(16).toUpperCase()).slice(-2)); + } + } + + for (i = 0; i < exclude.length; i++) { + cache[exclude.charCodeAt(i)] = exclude[i]; + } + + return cache; + } + + + // Encode unsafe characters with percent-encoding, skipping already + // encoded sequences. + // + // - string - string to encode + // - exclude - list of characters to ignore (in addition to a-zA-Z0-9) + // - keepEscaped - don't encode '%' in a correct escape sequence (default: true) + // + function encode(string, exclude, keepEscaped) { + var i, l, code, nextCode, cache, + result = ''; + + if (typeof exclude !== 'string') { + // encode(string, keepEscaped) + keepEscaped = exclude; + exclude = encode.defaultChars; + } + + if (typeof keepEscaped === 'undefined') { + keepEscaped = true; + } + + cache = getEncodeCache(exclude); + + for (i = 0, l = string.length; i < l; i++) { + code = string.charCodeAt(i); + + if (keepEscaped && code === 0x25 /* % */ && i + 2 < l) { + if (/^[0-9a-f]{2}$/i.test(string.slice(i + 1, i + 3))) { + result += string.slice(i, i + 3); + i += 2; + continue; + } + } + + if (code < 128) { + result += cache[code]; + continue; + } + + if (code >= 0xD800 && code <= 0xDFFF) { + if (code >= 0xD800 && code <= 0xDBFF && i + 1 < l) { + nextCode = string.charCodeAt(i + 1); + if (nextCode >= 0xDC00 && nextCode <= 0xDFFF) { + result += encodeURIComponent(string[i] + string[i + 1]); + i++; + continue; + } + } + result += '%EF%BF%BD'; + continue; + } + + result += encodeURIComponent(string[i]); + } + + return result; + } + + encode.defaultChars = ";/?:@&=+$,-_.!~*'()#"; + encode.componentChars = "-_.!~*'()"; + + + var encode_1 = encode; + + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function unwrapExports (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; + } + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + function getCjsExportFromNamespace (n) { + return n && n['default'] || n; + } + + var Aacute = "Á"; + var aacute = "á"; + var Abreve = "Ă"; + var abreve = "ă"; + var ac = "∾"; + var acd = "∿"; + var acE = "∾̳"; + var Acirc = "Â"; + var acirc = "â"; + var acute = "´"; + var Acy = "А"; + var acy = "а"; + var AElig = "Æ"; + var aelig = "æ"; + var af = "⁡"; + var Afr = "𝔄"; + var afr = "𝔞"; + var Agrave = "À"; + var agrave = "à"; + var alefsym = "ℵ"; + var aleph = "ℵ"; + var Alpha = "Α"; + var alpha = "α"; + var Amacr = "Ā"; + var amacr = "ā"; + var amalg = "⨿"; + var amp = "&"; + var AMP = "&"; + var andand = "⩕"; + var And = "⩓"; + var and = "∧"; + var andd = "⩜"; + var andslope = "⩘"; + var andv = "⩚"; + var ang = "∠"; + var ange = "⦤"; + var angle = "∠"; + var angmsdaa = "⦨"; + var angmsdab = "⦩"; + var angmsdac = "⦪"; + var angmsdad = "⦫"; + var angmsdae = "⦬"; + var angmsdaf = "⦭"; + var angmsdag = "⦮"; + var angmsdah = "⦯"; + var angmsd = "∡"; + var angrt = "∟"; + var angrtvb = "⊾"; + var angrtvbd = "⦝"; + var angsph = "∢"; + var angst = "Å"; + var angzarr = "⍼"; + var Aogon = "Ą"; + var aogon = "ą"; + var Aopf = "𝔸"; + var aopf = "𝕒"; + var apacir = "⩯"; + var ap = "≈"; + var apE = "⩰"; + var ape = "≊"; + var apid = "≋"; + var apos = "'"; + var ApplyFunction = "⁡"; + var approx = "≈"; + var approxeq = "≊"; + var Aring = "Å"; + var aring = "å"; + var Ascr = "𝒜"; + var ascr = "𝒶"; + var Assign = "≔"; + var ast = "*"; + var asymp = "≈"; + var asympeq = "≍"; + var Atilde = "Ã"; + var atilde = "ã"; + var Auml = "Ä"; + var auml = "ä"; + var awconint = "∳"; + var awint = "⨑"; + var backcong = "≌"; + var backepsilon = "϶"; + var backprime = "‵"; + var backsim = "∽"; + var backsimeq = "⋍"; + var Backslash = "∖"; + var Barv = "⫧"; + var barvee = "⊽"; + var barwed = "⌅"; + var Barwed = "⌆"; + var barwedge = "⌅"; + var bbrk = "⎵"; + var bbrktbrk = "⎶"; + var bcong = "≌"; + var Bcy = "Б"; + var bcy = "б"; + var bdquo = "„"; + var becaus = "∵"; + var because = "∵"; + var Because = "∵"; + var bemptyv = "⦰"; + var bepsi = "϶"; + var bernou = "ℬ"; + var Bernoullis = "ℬ"; + var Beta = "Β"; + var beta = "β"; + var beth = "ℶ"; + var between = "≬"; + var Bfr = "𝔅"; + var bfr = "𝔟"; + var bigcap = "⋂"; + var bigcirc = "◯"; + var bigcup = "⋃"; + var bigodot = "⨀"; + var bigoplus = "⨁"; + var bigotimes = "⨂"; + var bigsqcup = "⨆"; + var bigstar = "★"; + var bigtriangledown = "▽"; + var bigtriangleup = "△"; + var biguplus = "⨄"; + var bigvee = "⋁"; + var bigwedge = "⋀"; + var bkarow = "⤍"; + var blacklozenge = "⧫"; + var blacksquare = "▪"; + var blacktriangle = "▴"; + var blacktriangledown = "▾"; + var blacktriangleleft = "◂"; + var blacktriangleright = "▸"; + var blank = "␣"; + var blk12 = "▒"; + var blk14 = "░"; + var blk34 = "▓"; + var block = "█"; + var bne = "=⃥"; + var bnequiv = "≡⃥"; + var bNot = "⫭"; + var bnot = "⌐"; + var Bopf = "𝔹"; + var bopf = "𝕓"; + var bot = "⊥"; + var bottom = "⊥"; + var bowtie = "⋈"; + var boxbox = "⧉"; + var boxdl = "┐"; + var boxdL = "╕"; + var boxDl = "╖"; + var boxDL = "╗"; + var boxdr = "┌"; + var boxdR = "╒"; + var boxDr = "╓"; + var boxDR = "╔"; + var boxh = "─"; + var boxH = "═"; + var boxhd = "┬"; + var boxHd = "╤"; + var boxhD = "╥"; + var boxHD = "╦"; + var boxhu = "┴"; + var boxHu = "╧"; + var boxhU = "╨"; + var boxHU = "╩"; + var boxminus = "⊟"; + var boxplus = "⊞"; + var boxtimes = "⊠"; + var boxul = "┘"; + var boxuL = "╛"; + var boxUl = "╜"; + var boxUL = "╝"; + var boxur = "└"; + var boxuR = "╘"; + var boxUr = "╙"; + var boxUR = "╚"; + var boxv = "│"; + var boxV = "║"; + var boxvh = "┼"; + var boxvH = "╪"; + var boxVh = "╫"; + var boxVH = "╬"; + var boxvl = "┤"; + var boxvL = "╡"; + var boxVl = "╢"; + var boxVL = "╣"; + var boxvr = "├"; + var boxvR = "╞"; + var boxVr = "╟"; + var boxVR = "╠"; + var bprime = "‵"; + var breve = "˘"; + var Breve = "˘"; + var brvbar = "¦"; + var bscr = "𝒷"; + var Bscr = "ℬ"; + var bsemi = "⁏"; + var bsim = "∽"; + var bsime = "⋍"; + var bsolb = "⧅"; + var bsol = "\\"; + var bsolhsub = "⟈"; + var bull = "•"; + var bullet = "•"; + var bump = "≎"; + var bumpE = "⪮"; + var bumpe = "≏"; + var Bumpeq = "≎"; + var bumpeq = "≏"; + var Cacute = "Ć"; + var cacute = "ć"; + var capand = "⩄"; + var capbrcup = "⩉"; + var capcap = "⩋"; + var cap = "∩"; + var Cap = "⋒"; + var capcup = "⩇"; + var capdot = "⩀"; + var CapitalDifferentialD = "ⅅ"; + var caps = "∩︀"; + var caret = "⁁"; + var caron = "ˇ"; + var Cayleys = "ℭ"; + var ccaps = "⩍"; + var Ccaron = "Č"; + var ccaron = "č"; + var Ccedil = "Ç"; + var ccedil = "ç"; + var Ccirc = "Ĉ"; + var ccirc = "ĉ"; + var Cconint = "∰"; + var ccups = "⩌"; + var ccupssm = "⩐"; + var Cdot = "Ċ"; + var cdot = "ċ"; + var cedil = "¸"; + var Cedilla = "¸"; + var cemptyv = "⦲"; + var cent = "¢"; + var centerdot = "·"; + var CenterDot = "·"; + var cfr = "𝔠"; + var Cfr = "ℭ"; + var CHcy = "Ч"; + var chcy = "ч"; + var check = "✓"; + var checkmark = "✓"; + var Chi = "Χ"; + var chi = "χ"; + var circ = "ˆ"; + var circeq = "≗"; + var circlearrowleft = "↺"; + var circlearrowright = "↻"; + var circledast = "⊛"; + var circledcirc = "⊚"; + var circleddash = "⊝"; + var CircleDot = "⊙"; + var circledR = "®"; + var circledS = "Ⓢ"; + var CircleMinus = "⊖"; + var CirclePlus = "⊕"; + var CircleTimes = "⊗"; + var cir = "○"; + var cirE = "⧃"; + var cire = "≗"; + var cirfnint = "⨐"; + var cirmid = "⫯"; + var cirscir = "⧂"; + var ClockwiseContourIntegral = "∲"; + var CloseCurlyDoubleQuote = "”"; + var CloseCurlyQuote = "’"; + var clubs = "♣"; + var clubsuit = "♣"; + var colon = ":"; + var Colon = "∷"; + var Colone = "⩴"; + var colone = "≔"; + var coloneq = "≔"; + var comma = ","; + var commat = "@"; + var comp = "∁"; + var compfn = "∘"; + var complement = "∁"; + var complexes = "ℂ"; + var cong = "≅"; + var congdot = "⩭"; + var Congruent = "≡"; + var conint = "∮"; + var Conint = "∯"; + var ContourIntegral = "∮"; + var copf = "𝕔"; + var Copf = "ℂ"; + var coprod = "∐"; + var Coproduct = "∐"; + var copy = "©"; + var COPY = "©"; + var copysr = "℗"; + var CounterClockwiseContourIntegral = "∳"; + var crarr = "↵"; + var cross = "✗"; + var Cross = "⨯"; + var Cscr = "𝒞"; + var cscr = "𝒸"; + var csub = "⫏"; + var csube = "⫑"; + var csup = "⫐"; + var csupe = "⫒"; + var ctdot = "⋯"; + var cudarrl = "⤸"; + var cudarrr = "⤵"; + var cuepr = "⋞"; + var cuesc = "⋟"; + var cularr = "↶"; + var cularrp = "⤽"; + var cupbrcap = "⩈"; + var cupcap = "⩆"; + var CupCap = "≍"; + var cup = "∪"; + var Cup = "⋓"; + var cupcup = "⩊"; + var cupdot = "⊍"; + var cupor = "⩅"; + var cups = "∪︀"; + var curarr = "↷"; + var curarrm = "⤼"; + var curlyeqprec = "⋞"; + var curlyeqsucc = "⋟"; + var curlyvee = "⋎"; + var curlywedge = "⋏"; + var curren = "¤"; + var curvearrowleft = "↶"; + var curvearrowright = "↷"; + var cuvee = "⋎"; + var cuwed = "⋏"; + var cwconint = "∲"; + var cwint = "∱"; + var cylcty = "⌭"; + var dagger = "†"; + var Dagger = "‡"; + var daleth = "ℸ"; + var darr = "↓"; + var Darr = "↡"; + var dArr = "⇓"; + var dash = "‐"; + var Dashv = "⫤"; + var dashv = "⊣"; + var dbkarow = "⤏"; + var dblac = "˝"; + var Dcaron = "Ď"; + var dcaron = "ď"; + var Dcy = "Д"; + var dcy = "д"; + var ddagger = "‡"; + var ddarr = "⇊"; + var DD = "ⅅ"; + var dd = "ⅆ"; + var DDotrahd = "⤑"; + var ddotseq = "⩷"; + var deg = "°"; + var Del = "∇"; + var Delta = "Δ"; + var delta = "δ"; + var demptyv = "⦱"; + var dfisht = "⥿"; + var Dfr = "𝔇"; + var dfr = "𝔡"; + var dHar = "⥥"; + var dharl = "⇃"; + var dharr = "⇂"; + var DiacriticalAcute = "´"; + var DiacriticalDot = "˙"; + var DiacriticalDoubleAcute = "˝"; + var DiacriticalGrave = "`"; + var DiacriticalTilde = "˜"; + var diam = "⋄"; + var diamond = "⋄"; + var Diamond = "⋄"; + var diamondsuit = "♦"; + var diams = "♦"; + var die = "¨"; + var DifferentialD = "ⅆ"; + var digamma = "ϝ"; + var disin = "⋲"; + var div = "÷"; + var divide = "÷"; + var divideontimes = "⋇"; + var divonx = "⋇"; + var DJcy = "Ђ"; + var djcy = "ђ"; + var dlcorn = "⌞"; + var dlcrop = "⌍"; + var dollar = "$"; + var Dopf = "𝔻"; + var dopf = "𝕕"; + var Dot = "¨"; + var dot = "˙"; + var DotDot = "⃜"; + var doteq = "≐"; + var doteqdot = "≑"; + var DotEqual = "≐"; + var dotminus = "∸"; + var dotplus = "∔"; + var dotsquare = "⊡"; + var doublebarwedge = "⌆"; + var DoubleContourIntegral = "∯"; + var DoubleDot = "¨"; + var DoubleDownArrow = "⇓"; + var DoubleLeftArrow = "⇐"; + var DoubleLeftRightArrow = "⇔"; + var DoubleLeftTee = "⫤"; + var DoubleLongLeftArrow = "⟸"; + var DoubleLongLeftRightArrow = "⟺"; + var DoubleLongRightArrow = "⟹"; + var DoubleRightArrow = "⇒"; + var DoubleRightTee = "⊨"; + var DoubleUpArrow = "⇑"; + var DoubleUpDownArrow = "⇕"; + var DoubleVerticalBar = "∥"; + var DownArrowBar = "⤓"; + var downarrow = "↓"; + var DownArrow = "↓"; + var Downarrow = "⇓"; + var DownArrowUpArrow = "⇵"; + var DownBreve = "̑"; + var downdownarrows = "⇊"; + var downharpoonleft = "⇃"; + var downharpoonright = "⇂"; + var DownLeftRightVector = "⥐"; + var DownLeftTeeVector = "⥞"; + var DownLeftVectorBar = "⥖"; + var DownLeftVector = "↽"; + var DownRightTeeVector = "⥟"; + var DownRightVectorBar = "⥗"; + var DownRightVector = "⇁"; + var DownTeeArrow = "↧"; + var DownTee = "⊤"; + var drbkarow = "⤐"; + var drcorn = "⌟"; + var drcrop = "⌌"; + var Dscr = "𝒟"; + var dscr = "𝒹"; + var DScy = "Ѕ"; + var dscy = "ѕ"; + var dsol = "⧶"; + var Dstrok = "Đ"; + var dstrok = "đ"; + var dtdot = "⋱"; + var dtri = "▿"; + var dtrif = "▾"; + var duarr = "⇵"; + var duhar = "⥯"; + var dwangle = "⦦"; + var DZcy = "Џ"; + var dzcy = "џ"; + var dzigrarr = "⟿"; + var Eacute = "É"; + var eacute = "é"; + var easter = "⩮"; + var Ecaron = "Ě"; + var ecaron = "ě"; + var Ecirc = "Ê"; + var ecirc = "ê"; + var ecir = "≖"; + var ecolon = "≕"; + var Ecy = "Э"; + var ecy = "э"; + var eDDot = "⩷"; + var Edot = "Ė"; + var edot = "ė"; + var eDot = "≑"; + var ee = "ⅇ"; + var efDot = "≒"; + var Efr = "𝔈"; + var efr = "𝔢"; + var eg = "⪚"; + var Egrave = "È"; + var egrave = "è"; + var egs = "⪖"; + var egsdot = "⪘"; + var el = "⪙"; + var Element = "∈"; + var elinters = "⏧"; + var ell = "ℓ"; + var els = "⪕"; + var elsdot = "⪗"; + var Emacr = "Ē"; + var emacr = "ē"; + var empty = "∅"; + var emptyset = "∅"; + var EmptySmallSquare = "◻"; + var emptyv = "∅"; + var EmptyVerySmallSquare = "▫"; + var emsp13 = " "; + var emsp14 = " "; + var emsp = " "; + var ENG = "Ŋ"; + var eng = "ŋ"; + var ensp = " "; + var Eogon = "Ę"; + var eogon = "ę"; + var Eopf = "𝔼"; + var eopf = "𝕖"; + var epar = "⋕"; + var eparsl = "⧣"; + var eplus = "⩱"; + var epsi = "ε"; + var Epsilon = "Ε"; + var epsilon = "ε"; + var epsiv = "ϵ"; + var eqcirc = "≖"; + var eqcolon = "≕"; + var eqsim = "≂"; + var eqslantgtr = "⪖"; + var eqslantless = "⪕"; + var Equal = "⩵"; + var equals = "="; + var EqualTilde = "≂"; + var equest = "≟"; + var Equilibrium = "⇌"; + var equiv = "≡"; + var equivDD = "⩸"; + var eqvparsl = "⧥"; + var erarr = "⥱"; + var erDot = "≓"; + var escr = "ℯ"; + var Escr = "ℰ"; + var esdot = "≐"; + var Esim = "⩳"; + var esim = "≂"; + var Eta = "Η"; + var eta = "η"; + var ETH = "Ð"; + var eth = "ð"; + var Euml = "Ë"; + var euml = "ë"; + var euro = "€"; + var excl = "!"; + var exist = "∃"; + var Exists = "∃"; + var expectation = "ℰ"; + var exponentiale = "ⅇ"; + var ExponentialE = "ⅇ"; + var fallingdotseq = "≒"; + var Fcy = "Ф"; + var fcy = "ф"; + var female = "♀"; + var ffilig = "ffi"; + var fflig = "ff"; + var ffllig = "ffl"; + var Ffr = "𝔉"; + var ffr = "𝔣"; + var filig = "fi"; + var FilledSmallSquare = "◼"; + var FilledVerySmallSquare = "▪"; + var fjlig = "fj"; + var flat = "♭"; + var fllig = "fl"; + var fltns = "▱"; + var fnof = "ƒ"; + var Fopf = "𝔽"; + var fopf = "𝕗"; + var forall = "∀"; + var ForAll = "∀"; + var fork = "⋔"; + var forkv = "⫙"; + var Fouriertrf = "ℱ"; + var fpartint = "⨍"; + var frac12 = "½"; + var frac13 = "⅓"; + var frac14 = "¼"; + var frac15 = "⅕"; + var frac16 = "⅙"; + var frac18 = "⅛"; + var frac23 = "⅔"; + var frac25 = "⅖"; + var frac34 = "¾"; + var frac35 = "⅗"; + var frac38 = "⅜"; + var frac45 = "⅘"; + var frac56 = "⅚"; + var frac58 = "⅝"; + var frac78 = "⅞"; + var frasl = "⁄"; + var frown = "⌢"; + var fscr = "𝒻"; + var Fscr = "ℱ"; + var gacute = "ǵ"; + var Gamma = "Γ"; + var gamma = "γ"; + var Gammad = "Ϝ"; + var gammad = "ϝ"; + var gap = "⪆"; + var Gbreve = "Ğ"; + var gbreve = "ğ"; + var Gcedil = "Ģ"; + var Gcirc = "Ĝ"; + var gcirc = "ĝ"; + var Gcy = "Г"; + var gcy = "г"; + var Gdot = "Ġ"; + var gdot = "ġ"; + var ge = "≥"; + var gE = "≧"; + var gEl = "⪌"; + var gel = "⋛"; + var geq = "≥"; + var geqq = "≧"; + var geqslant = "⩾"; + var gescc = "⪩"; + var ges = "⩾"; + var gesdot = "⪀"; + var gesdoto = "⪂"; + var gesdotol = "⪄"; + var gesl = "⋛︀"; + var gesles = "⪔"; + var Gfr = "𝔊"; + var gfr = "𝔤"; + var gg = "≫"; + var Gg = "⋙"; + var ggg = "⋙"; + var gimel = "ℷ"; + var GJcy = "Ѓ"; + var gjcy = "ѓ"; + var gla = "⪥"; + var gl = "≷"; + var glE = "⪒"; + var glj = "⪤"; + var gnap = "⪊"; + var gnapprox = "⪊"; + var gne = "⪈"; + var gnE = "≩"; + var gneq = "⪈"; + var gneqq = "≩"; + var gnsim = "⋧"; + var Gopf = "𝔾"; + var gopf = "𝕘"; + var grave = "`"; + var GreaterEqual = "≥"; + var GreaterEqualLess = "⋛"; + var GreaterFullEqual = "≧"; + var GreaterGreater = "⪢"; + var GreaterLess = "≷"; + var GreaterSlantEqual = "⩾"; + var GreaterTilde = "≳"; + var Gscr = "𝒢"; + var gscr = "ℊ"; + var gsim = "≳"; + var gsime = "⪎"; + var gsiml = "⪐"; + var gtcc = "⪧"; + var gtcir = "⩺"; + var gt = ">"; + var GT = ">"; + var Gt = "≫"; + var gtdot = "⋗"; + var gtlPar = "⦕"; + var gtquest = "⩼"; + var gtrapprox = "⪆"; + var gtrarr = "⥸"; + var gtrdot = "⋗"; + var gtreqless = "⋛"; + var gtreqqless = "⪌"; + var gtrless = "≷"; + var gtrsim = "≳"; + var gvertneqq = "≩︀"; + var gvnE = "≩︀"; + var Hacek = "ˇ"; + var hairsp = " "; + var half = "½"; + var hamilt = "ℋ"; + var HARDcy = "Ъ"; + var hardcy = "ъ"; + var harrcir = "⥈"; + var harr = "↔"; + var hArr = "⇔"; + var harrw = "↭"; + var Hat = "^"; + var hbar = "ℏ"; + var Hcirc = "Ĥ"; + var hcirc = "ĥ"; + var hearts = "♥"; + var heartsuit = "♥"; + var hellip = "…"; + var hercon = "⊹"; + var hfr = "𝔥"; + var Hfr = "ℌ"; + var HilbertSpace = "ℋ"; + var hksearow = "⤥"; + var hkswarow = "⤦"; + var hoarr = "⇿"; + var homtht = "∻"; + var hookleftarrow = "↩"; + var hookrightarrow = "↪"; + var hopf = "𝕙"; + var Hopf = "ℍ"; + var horbar = "―"; + var HorizontalLine = "─"; + var hscr = "𝒽"; + var Hscr = "ℋ"; + var hslash = "ℏ"; + var Hstrok = "Ħ"; + var hstrok = "ħ"; + var HumpDownHump = "≎"; + var HumpEqual = "≏"; + var hybull = "⁃"; + var hyphen = "‐"; + var Iacute = "Í"; + var iacute = "í"; + var ic = "⁣"; + var Icirc = "Î"; + var icirc = "î"; + var Icy = "И"; + var icy = "и"; + var Idot = "İ"; + var IEcy = "Е"; + var iecy = "е"; + var iexcl = "¡"; + var iff = "⇔"; + var ifr = "𝔦"; + var Ifr = "ℑ"; + var Igrave = "Ì"; + var igrave = "ì"; + var ii = "ⅈ"; + var iiiint = "⨌"; + var iiint = "∭"; + var iinfin = "⧜"; + var iiota = "℩"; + var IJlig = "IJ"; + var ijlig = "ij"; + var Imacr = "Ī"; + var imacr = "ī"; + var image = "ℑ"; + var ImaginaryI = "ⅈ"; + var imagline = "ℐ"; + var imagpart = "ℑ"; + var imath = "ı"; + var Im = "ℑ"; + var imof = "⊷"; + var imped = "Ƶ"; + var Implies = "⇒"; + var incare = "℅"; + var infin = "∞"; + var infintie = "⧝"; + var inodot = "ı"; + var intcal = "⊺"; + var int = "∫"; + var Int = "∬"; + var integers = "ℤ"; + var Integral = "∫"; + var intercal = "⊺"; + var Intersection = "⋂"; + var intlarhk = "⨗"; + var intprod = "⨼"; + var InvisibleComma = "⁣"; + var InvisibleTimes = "⁢"; + var IOcy = "Ё"; + var iocy = "ё"; + var Iogon = "Į"; + var iogon = "į"; + var Iopf = "𝕀"; + var iopf = "𝕚"; + var Iota = "Ι"; + var iota = "ι"; + var iprod = "⨼"; + var iquest = "¿"; + var iscr = "𝒾"; + var Iscr = "ℐ"; + var isin = "∈"; + var isindot = "⋵"; + var isinE = "⋹"; + var isins = "⋴"; + var isinsv = "⋳"; + var isinv = "∈"; + var it = "⁢"; + var Itilde = "Ĩ"; + var itilde = "ĩ"; + var Iukcy = "І"; + var iukcy = "і"; + var Iuml = "Ï"; + var iuml = "ï"; + var Jcirc = "Ĵ"; + var jcirc = "ĵ"; + var Jcy = "Й"; + var jcy = "й"; + var Jfr = "𝔍"; + var jfr = "𝔧"; + var jmath = "ȷ"; + var Jopf = "𝕁"; + var jopf = "𝕛"; + var Jscr = "𝒥"; + var jscr = "𝒿"; + var Jsercy = "Ј"; + var jsercy = "ј"; + var Jukcy = "Є"; + var jukcy = "є"; + var Kappa = "Κ"; + var kappa = "κ"; + var kappav = "ϰ"; + var Kcedil = "Ķ"; + var kcedil = "ķ"; + var Kcy = "К"; + var kcy = "к"; + var Kfr = "𝔎"; + var kfr = "𝔨"; + var kgreen = "ĸ"; + var KHcy = "Х"; + var khcy = "х"; + var KJcy = "Ќ"; + var kjcy = "ќ"; + var Kopf = "𝕂"; + var kopf = "𝕜"; + var Kscr = "𝒦"; + var kscr = "𝓀"; + var lAarr = "⇚"; + var Lacute = "Ĺ"; + var lacute = "ĺ"; + var laemptyv = "⦴"; + var lagran = "ℒ"; + var Lambda = "Λ"; + var lambda = "λ"; + var lang = "⟨"; + var Lang = "⟪"; + var langd = "⦑"; + var langle = "⟨"; + var lap = "⪅"; + var Laplacetrf = "ℒ"; + var laquo = "«"; + var larrb = "⇤"; + var larrbfs = "⤟"; + var larr = "←"; + var Larr = "↞"; + var lArr = "⇐"; + var larrfs = "⤝"; + var larrhk = "↩"; + var larrlp = "↫"; + var larrpl = "⤹"; + var larrsim = "⥳"; + var larrtl = "↢"; + var latail = "⤙"; + var lAtail = "⤛"; + var lat = "⪫"; + var late = "⪭"; + var lates = "⪭︀"; + var lbarr = "⤌"; + var lBarr = "⤎"; + var lbbrk = "❲"; + var lbrace = "{"; + var lbrack = "["; + var lbrke = "⦋"; + var lbrksld = "⦏"; + var lbrkslu = "⦍"; + var Lcaron = "Ľ"; + var lcaron = "ľ"; + var Lcedil = "Ļ"; + var lcedil = "ļ"; + var lceil = "⌈"; + var lcub = "{"; + var Lcy = "Л"; + var lcy = "л"; + var ldca = "⤶"; + var ldquo = "“"; + var ldquor = "„"; + var ldrdhar = "⥧"; + var ldrushar = "⥋"; + var ldsh = "↲"; + var le = "≤"; + var lE = "≦"; + var LeftAngleBracket = "⟨"; + var LeftArrowBar = "⇤"; + var leftarrow = "←"; + var LeftArrow = "←"; + var Leftarrow = "⇐"; + var LeftArrowRightArrow = "⇆"; + var leftarrowtail = "↢"; + var LeftCeiling = "⌈"; + var LeftDoubleBracket = "⟦"; + var LeftDownTeeVector = "⥡"; + var LeftDownVectorBar = "⥙"; + var LeftDownVector = "⇃"; + var LeftFloor = "⌊"; + var leftharpoondown = "↽"; + var leftharpoonup = "↼"; + var leftleftarrows = "⇇"; + var leftrightarrow = "↔"; + var LeftRightArrow = "↔"; + var Leftrightarrow = "⇔"; + var leftrightarrows = "⇆"; + var leftrightharpoons = "⇋"; + var leftrightsquigarrow = "↭"; + var LeftRightVector = "⥎"; + var LeftTeeArrow = "↤"; + var LeftTee = "⊣"; + var LeftTeeVector = "⥚"; + var leftthreetimes = "⋋"; + var LeftTriangleBar = "⧏"; + var LeftTriangle = "⊲"; + var LeftTriangleEqual = "⊴"; + var LeftUpDownVector = "⥑"; + var LeftUpTeeVector = "⥠"; + var LeftUpVectorBar = "⥘"; + var LeftUpVector = "↿"; + var LeftVectorBar = "⥒"; + var LeftVector = "↼"; + var lEg = "⪋"; + var leg = "⋚"; + var leq = "≤"; + var leqq = "≦"; + var leqslant = "⩽"; + var lescc = "⪨"; + var les = "⩽"; + var lesdot = "⩿"; + var lesdoto = "⪁"; + var lesdotor = "⪃"; + var lesg = "⋚︀"; + var lesges = "⪓"; + var lessapprox = "⪅"; + var lessdot = "⋖"; + var lesseqgtr = "⋚"; + var lesseqqgtr = "⪋"; + var LessEqualGreater = "⋚"; + var LessFullEqual = "≦"; + var LessGreater = "≶"; + var lessgtr = "≶"; + var LessLess = "⪡"; + var lesssim = "≲"; + var LessSlantEqual = "⩽"; + var LessTilde = "≲"; + var lfisht = "⥼"; + var lfloor = "⌊"; + var Lfr = "𝔏"; + var lfr = "𝔩"; + var lg = "≶"; + var lgE = "⪑"; + var lHar = "⥢"; + var lhard = "↽"; + var lharu = "↼"; + var lharul = "⥪"; + var lhblk = "▄"; + var LJcy = "Љ"; + var ljcy = "љ"; + var llarr = "⇇"; + var ll = "≪"; + var Ll = "⋘"; + var llcorner = "⌞"; + var Lleftarrow = "⇚"; + var llhard = "⥫"; + var lltri = "◺"; + var Lmidot = "Ŀ"; + var lmidot = "ŀ"; + var lmoustache = "⎰"; + var lmoust = "⎰"; + var lnap = "⪉"; + var lnapprox = "⪉"; + var lne = "⪇"; + var lnE = "≨"; + var lneq = "⪇"; + var lneqq = "≨"; + var lnsim = "⋦"; + var loang = "⟬"; + var loarr = "⇽"; + var lobrk = "⟦"; + var longleftarrow = "⟵"; + var LongLeftArrow = "⟵"; + var Longleftarrow = "⟸"; + var longleftrightarrow = "⟷"; + var LongLeftRightArrow = "⟷"; + var Longleftrightarrow = "⟺"; + var longmapsto = "⟼"; + var longrightarrow = "⟶"; + var LongRightArrow = "⟶"; + var Longrightarrow = "⟹"; + var looparrowleft = "↫"; + var looparrowright = "↬"; + var lopar = "⦅"; + var Lopf = "𝕃"; + var lopf = "𝕝"; + var loplus = "⨭"; + var lotimes = "⨴"; + var lowast = "∗"; + var lowbar = "_"; + var LowerLeftArrow = "↙"; + var LowerRightArrow = "↘"; + var loz = "◊"; + var lozenge = "◊"; + var lozf = "⧫"; + var lpar = "("; + var lparlt = "⦓"; + var lrarr = "⇆"; + var lrcorner = "⌟"; + var lrhar = "⇋"; + var lrhard = "⥭"; + var lrm = "‎"; + var lrtri = "⊿"; + var lsaquo = "‹"; + var lscr = "𝓁"; + var Lscr = "ℒ"; + var lsh = "↰"; + var Lsh = "↰"; + var lsim = "≲"; + var lsime = "⪍"; + var lsimg = "⪏"; + var lsqb = "["; + var lsquo = "‘"; + var lsquor = "‚"; + var Lstrok = "Ł"; + var lstrok = "ł"; + var ltcc = "⪦"; + var ltcir = "⩹"; + var lt = "<"; + var LT = "<"; + var Lt = "≪"; + var ltdot = "⋖"; + var lthree = "⋋"; + var ltimes = "⋉"; + var ltlarr = "⥶"; + var ltquest = "⩻"; + var ltri = "◃"; + var ltrie = "⊴"; + var ltrif = "◂"; + var ltrPar = "⦖"; + var lurdshar = "⥊"; + var luruhar = "⥦"; + var lvertneqq = "≨︀"; + var lvnE = "≨︀"; + var macr = "¯"; + var male = "♂"; + var malt = "✠"; + var maltese = "✠"; + var map = "↦"; + var mapsto = "↦"; + var mapstodown = "↧"; + var mapstoleft = "↤"; + var mapstoup = "↥"; + var marker = "▮"; + var mcomma = "⨩"; + var Mcy = "М"; + var mcy = "м"; + var mdash = "—"; + var mDDot = "∺"; + var measuredangle = "∡"; + var MediumSpace = " "; + var Mellintrf = "ℳ"; + var Mfr = "𝔐"; + var mfr = "𝔪"; + var mho = "℧"; + var micro = "µ"; + var midast = "*"; + var midcir = "⫰"; + var mid = "∣"; + var middot = "·"; + var minusb = "⊟"; + var minus = "−"; + var minusd = "∸"; + var minusdu = "⨪"; + var MinusPlus = "∓"; + var mlcp = "⫛"; + var mldr = "…"; + var mnplus = "∓"; + var models = "⊧"; + var Mopf = "𝕄"; + var mopf = "𝕞"; + var mp = "∓"; + var mscr = "𝓂"; + var Mscr = "ℳ"; + var mstpos = "∾"; + var Mu = "Μ"; + var mu = "μ"; + var multimap = "⊸"; + var mumap = "⊸"; + var nabla = "∇"; + var Nacute = "Ń"; + var nacute = "ń"; + var nang = "∠⃒"; + var nap = "≉"; + var napE = "⩰̸"; + var napid = "≋̸"; + var napos = "ʼn"; + var napprox = "≉"; + var natural = "♮"; + var naturals = "ℕ"; + var natur = "♮"; + var nbsp = " "; + var nbump = "≎̸"; + var nbumpe = "≏̸"; + var ncap = "⩃"; + var Ncaron = "Ň"; + var ncaron = "ň"; + var Ncedil = "Ņ"; + var ncedil = "ņ"; + var ncong = "≇"; + var ncongdot = "⩭̸"; + var ncup = "⩂"; + var Ncy = "Н"; + var ncy = "н"; + var ndash = "–"; + var nearhk = "⤤"; + var nearr = "↗"; + var neArr = "⇗"; + var nearrow = "↗"; + var ne = "≠"; + var nedot = "≐̸"; + var NegativeMediumSpace = "​"; + var NegativeThickSpace = "​"; + var NegativeThinSpace = "​"; + var NegativeVeryThinSpace = "​"; + var nequiv = "≢"; + var nesear = "⤨"; + var nesim = "≂̸"; + var NestedGreaterGreater = "≫"; + var NestedLessLess = "≪"; + var NewLine = "\n"; + var nexist = "∄"; + var nexists = "∄"; + var Nfr = "𝔑"; + var nfr = "𝔫"; + var ngE = "≧̸"; + var nge = "≱"; + var ngeq = "≱"; + var ngeqq = "≧̸"; + var ngeqslant = "⩾̸"; + var nges = "⩾̸"; + var nGg = "⋙̸"; + var ngsim = "≵"; + var nGt = "≫⃒"; + var ngt = "≯"; + var ngtr = "≯"; + var nGtv = "≫̸"; + var nharr = "↮"; + var nhArr = "⇎"; + var nhpar = "⫲"; + var ni = "∋"; + var nis = "⋼"; + var nisd = "⋺"; + var niv = "∋"; + var NJcy = "Њ"; + var njcy = "њ"; + var nlarr = "↚"; + var nlArr = "⇍"; + var nldr = "‥"; + var nlE = "≦̸"; + var nle = "≰"; + var nleftarrow = "↚"; + var nLeftarrow = "⇍"; + var nleftrightarrow = "↮"; + var nLeftrightarrow = "⇎"; + var nleq = "≰"; + var nleqq = "≦̸"; + var nleqslant = "⩽̸"; + var nles = "⩽̸"; + var nless = "≮"; + var nLl = "⋘̸"; + var nlsim = "≴"; + var nLt = "≪⃒"; + var nlt = "≮"; + var nltri = "⋪"; + var nltrie = "⋬"; + var nLtv = "≪̸"; + var nmid = "∤"; + var NoBreak = "⁠"; + var NonBreakingSpace = " "; + var nopf = "𝕟"; + var Nopf = "ℕ"; + var Not = "⫬"; + var not = "¬"; + var NotCongruent = "≢"; + var NotCupCap = "≭"; + var NotDoubleVerticalBar = "∦"; + var NotElement = "∉"; + var NotEqual = "≠"; + var NotEqualTilde = "≂̸"; + var NotExists = "∄"; + var NotGreater = "≯"; + var NotGreaterEqual = "≱"; + var NotGreaterFullEqual = "≧̸"; + var NotGreaterGreater = "≫̸"; + var NotGreaterLess = "≹"; + var NotGreaterSlantEqual = "⩾̸"; + var NotGreaterTilde = "≵"; + var NotHumpDownHump = "≎̸"; + var NotHumpEqual = "≏̸"; + var notin = "∉"; + var notindot = "⋵̸"; + var notinE = "⋹̸"; + var notinva = "∉"; + var notinvb = "⋷"; + var notinvc = "⋶"; + var NotLeftTriangleBar = "⧏̸"; + var NotLeftTriangle = "⋪"; + var NotLeftTriangleEqual = "⋬"; + var NotLess = "≮"; + var NotLessEqual = "≰"; + var NotLessGreater = "≸"; + var NotLessLess = "≪̸"; + var NotLessSlantEqual = "⩽̸"; + var NotLessTilde = "≴"; + var NotNestedGreaterGreater = "⪢̸"; + var NotNestedLessLess = "⪡̸"; + var notni = "∌"; + var notniva = "∌"; + var notnivb = "⋾"; + var notnivc = "⋽"; + var NotPrecedes = "⊀"; + var NotPrecedesEqual = "⪯̸"; + var NotPrecedesSlantEqual = "⋠"; + var NotReverseElement = "∌"; + var NotRightTriangleBar = "⧐̸"; + var NotRightTriangle = "⋫"; + var NotRightTriangleEqual = "⋭"; + var NotSquareSubset = "⊏̸"; + var NotSquareSubsetEqual = "⋢"; + var NotSquareSuperset = "⊐̸"; + var NotSquareSupersetEqual = "⋣"; + var NotSubset = "⊂⃒"; + var NotSubsetEqual = "⊈"; + var NotSucceeds = "⊁"; + var NotSucceedsEqual = "⪰̸"; + var NotSucceedsSlantEqual = "⋡"; + var NotSucceedsTilde = "≿̸"; + var NotSuperset = "⊃⃒"; + var NotSupersetEqual = "⊉"; + var NotTilde = "≁"; + var NotTildeEqual = "≄"; + var NotTildeFullEqual = "≇"; + var NotTildeTilde = "≉"; + var NotVerticalBar = "∤"; + var nparallel = "∦"; + var npar = "∦"; + var nparsl = "⫽⃥"; + var npart = "∂̸"; + var npolint = "⨔"; + var npr = "⊀"; + var nprcue = "⋠"; + var nprec = "⊀"; + var npreceq = "⪯̸"; + var npre = "⪯̸"; + var nrarrc = "⤳̸"; + var nrarr = "↛"; + var nrArr = "⇏"; + var nrarrw = "↝̸"; + var nrightarrow = "↛"; + var nRightarrow = "⇏"; + var nrtri = "⋫"; + var nrtrie = "⋭"; + var nsc = "⊁"; + var nsccue = "⋡"; + var nsce = "⪰̸"; + var Nscr = "𝒩"; + var nscr = "𝓃"; + var nshortmid = "∤"; + var nshortparallel = "∦"; + var nsim = "≁"; + var nsime = "≄"; + var nsimeq = "≄"; + var nsmid = "∤"; + var nspar = "∦"; + var nsqsube = "⋢"; + var nsqsupe = "⋣"; + var nsub = "⊄"; + var nsubE = "⫅̸"; + var nsube = "⊈"; + var nsubset = "⊂⃒"; + var nsubseteq = "⊈"; + var nsubseteqq = "⫅̸"; + var nsucc = "⊁"; + var nsucceq = "⪰̸"; + var nsup = "⊅"; + var nsupE = "⫆̸"; + var nsupe = "⊉"; + var nsupset = "⊃⃒"; + var nsupseteq = "⊉"; + var nsupseteqq = "⫆̸"; + var ntgl = "≹"; + var Ntilde = "Ñ"; + var ntilde = "ñ"; + var ntlg = "≸"; + var ntriangleleft = "⋪"; + var ntrianglelefteq = "⋬"; + var ntriangleright = "⋫"; + var ntrianglerighteq = "⋭"; + var Nu = "Ν"; + var nu = "ν"; + var num = "#"; + var numero = "№"; + var numsp = " "; + var nvap = "≍⃒"; + var nvdash = "⊬"; + var nvDash = "⊭"; + var nVdash = "⊮"; + var nVDash = "⊯"; + var nvge = "≥⃒"; + var nvgt = ">⃒"; + var nvHarr = "⤄"; + var nvinfin = "⧞"; + var nvlArr = "⤂"; + var nvle = "≤⃒"; + var nvlt = "<⃒"; + var nvltrie = "⊴⃒"; + var nvrArr = "⤃"; + var nvrtrie = "⊵⃒"; + var nvsim = "∼⃒"; + var nwarhk = "⤣"; + var nwarr = "↖"; + var nwArr = "⇖"; + var nwarrow = "↖"; + var nwnear = "⤧"; + var Oacute = "Ó"; + var oacute = "ó"; + var oast = "⊛"; + var Ocirc = "Ô"; + var ocirc = "ô"; + var ocir = "⊚"; + var Ocy = "О"; + var ocy = "о"; + var odash = "⊝"; + var Odblac = "Ő"; + var odblac = "ő"; + var odiv = "⨸"; + var odot = "⊙"; + var odsold = "⦼"; + var OElig = "Œ"; + var oelig = "œ"; + var ofcir = "⦿"; + var Ofr = "𝔒"; + var ofr = "𝔬"; + var ogon = "˛"; + var Ograve = "Ò"; + var ograve = "ò"; + var ogt = "⧁"; + var ohbar = "⦵"; + var ohm = "Ω"; + var oint = "∮"; + var olarr = "↺"; + var olcir = "⦾"; + var olcross = "⦻"; + var oline = "‾"; + var olt = "⧀"; + var Omacr = "Ō"; + var omacr = "ō"; + var Omega = "Ω"; + var omega = "ω"; + var Omicron = "Ο"; + var omicron = "ο"; + var omid = "⦶"; + var ominus = "⊖"; + var Oopf = "𝕆"; + var oopf = "𝕠"; + var opar = "⦷"; + var OpenCurlyDoubleQuote = "“"; + var OpenCurlyQuote = "‘"; + var operp = "⦹"; + var oplus = "⊕"; + var orarr = "↻"; + var Or = "⩔"; + var or = "∨"; + var ord = "⩝"; + var order = "ℴ"; + var orderof = "ℴ"; + var ordf = "ª"; + var ordm = "º"; + var origof = "⊶"; + var oror = "⩖"; + var orslope = "⩗"; + var orv = "⩛"; + var oS = "Ⓢ"; + var Oscr = "𝒪"; + var oscr = "ℴ"; + var Oslash = "Ø"; + var oslash = "ø"; + var osol = "⊘"; + var Otilde = "Õ"; + var otilde = "õ"; + var otimesas = "⨶"; + var Otimes = "⨷"; + var otimes = "⊗"; + var Ouml = "Ö"; + var ouml = "ö"; + var ovbar = "⌽"; + var OverBar = "‾"; + var OverBrace = "⏞"; + var OverBracket = "⎴"; + var OverParenthesis = "⏜"; + var para = "¶"; + var parallel = "∥"; + var par = "∥"; + var parsim = "⫳"; + var parsl = "⫽"; + var part = "∂"; + var PartialD = "∂"; + var Pcy = "П"; + var pcy = "п"; + var percnt = "%"; + var period = "."; + var permil = "‰"; + var perp = "⊥"; + var pertenk = "‱"; + var Pfr = "𝔓"; + var pfr = "𝔭"; + var Phi = "Φ"; + var phi = "φ"; + var phiv = "ϕ"; + var phmmat = "ℳ"; + var phone = "☎"; + var Pi = "Π"; + var pi = "π"; + var pitchfork = "⋔"; + var piv = "ϖ"; + var planck = "ℏ"; + var planckh = "ℎ"; + var plankv = "ℏ"; + var plusacir = "⨣"; + var plusb = "⊞"; + var pluscir = "⨢"; + var plus = "+"; + var plusdo = "∔"; + var plusdu = "⨥"; + var pluse = "⩲"; + var PlusMinus = "±"; + var plusmn = "±"; + var plussim = "⨦"; + var plustwo = "⨧"; + var pm = "±"; + var Poincareplane = "ℌ"; + var pointint = "⨕"; + var popf = "𝕡"; + var Popf = "ℙ"; + var pound = "£"; + var prap = "⪷"; + var Pr = "⪻"; + var pr = "≺"; + var prcue = "≼"; + var precapprox = "⪷"; + var prec = "≺"; + var preccurlyeq = "≼"; + var Precedes = "≺"; + var PrecedesEqual = "⪯"; + var PrecedesSlantEqual = "≼"; + var PrecedesTilde = "≾"; + var preceq = "⪯"; + var precnapprox = "⪹"; + var precneqq = "⪵"; + var precnsim = "⋨"; + var pre = "⪯"; + var prE = "⪳"; + var precsim = "≾"; + var prime = "′"; + var Prime = "″"; + var primes = "ℙ"; + var prnap = "⪹"; + var prnE = "⪵"; + var prnsim = "⋨"; + var prod = "∏"; + var Product = "∏"; + var profalar = "⌮"; + var profline = "⌒"; + var profsurf = "⌓"; + var prop = "∝"; + var Proportional = "∝"; + var Proportion = "∷"; + var propto = "∝"; + var prsim = "≾"; + var prurel = "⊰"; + var Pscr = "𝒫"; + var pscr = "𝓅"; + var Psi = "Ψ"; + var psi = "ψ"; + var puncsp = " "; + var Qfr = "𝔔"; + var qfr = "𝔮"; + var qint = "⨌"; + var qopf = "𝕢"; + var Qopf = "ℚ"; + var qprime = "⁗"; + var Qscr = "𝒬"; + var qscr = "𝓆"; + var quaternions = "ℍ"; + var quatint = "⨖"; + var quest = "?"; + var questeq = "≟"; + var quot = "\""; + var QUOT = "\""; + var rAarr = "⇛"; + var race = "∽̱"; + var Racute = "Ŕ"; + var racute = "ŕ"; + var radic = "√"; + var raemptyv = "⦳"; + var rang = "⟩"; + var Rang = "⟫"; + var rangd = "⦒"; + var range = "⦥"; + var rangle = "⟩"; + var raquo = "»"; + var rarrap = "⥵"; + var rarrb = "⇥"; + var rarrbfs = "⤠"; + var rarrc = "⤳"; + var rarr = "→"; + var Rarr = "↠"; + var rArr = "⇒"; + var rarrfs = "⤞"; + var rarrhk = "↪"; + var rarrlp = "↬"; + var rarrpl = "⥅"; + var rarrsim = "⥴"; + var Rarrtl = "⤖"; + var rarrtl = "↣"; + var rarrw = "↝"; + var ratail = "⤚"; + var rAtail = "⤜"; + var ratio = "∶"; + var rationals = "ℚ"; + var rbarr = "⤍"; + var rBarr = "⤏"; + var RBarr = "⤐"; + var rbbrk = "❳"; + var rbrace = "}"; + var rbrack = "]"; + var rbrke = "⦌"; + var rbrksld = "⦎"; + var rbrkslu = "⦐"; + var Rcaron = "Ř"; + var rcaron = "ř"; + var Rcedil = "Ŗ"; + var rcedil = "ŗ"; + var rceil = "⌉"; + var rcub = "}"; + var Rcy = "Р"; + var rcy = "р"; + var rdca = "⤷"; + var rdldhar = "⥩"; + var rdquo = "”"; + var rdquor = "”"; + var rdsh = "↳"; + var real = "ℜ"; + var realine = "ℛ"; + var realpart = "ℜ"; + var reals = "ℝ"; + var Re = "ℜ"; + var rect = "▭"; + var reg = "®"; + var REG = "®"; + var ReverseElement = "∋"; + var ReverseEquilibrium = "⇋"; + var ReverseUpEquilibrium = "⥯"; + var rfisht = "⥽"; + var rfloor = "⌋"; + var rfr = "𝔯"; + var Rfr = "ℜ"; + var rHar = "⥤"; + var rhard = "⇁"; + var rharu = "⇀"; + var rharul = "⥬"; + var Rho = "Ρ"; + var rho = "ρ"; + var rhov = "ϱ"; + var RightAngleBracket = "⟩"; + var RightArrowBar = "⇥"; + var rightarrow = "→"; + var RightArrow = "→"; + var Rightarrow = "⇒"; + var RightArrowLeftArrow = "⇄"; + var rightarrowtail = "↣"; + var RightCeiling = "⌉"; + var RightDoubleBracket = "⟧"; + var RightDownTeeVector = "⥝"; + var RightDownVectorBar = "⥕"; + var RightDownVector = "⇂"; + var RightFloor = "⌋"; + var rightharpoondown = "⇁"; + var rightharpoonup = "⇀"; + var rightleftarrows = "⇄"; + var rightleftharpoons = "⇌"; + var rightrightarrows = "⇉"; + var rightsquigarrow = "↝"; + var RightTeeArrow = "↦"; + var RightTee = "⊢"; + var RightTeeVector = "⥛"; + var rightthreetimes = "⋌"; + var RightTriangleBar = "⧐"; + var RightTriangle = "⊳"; + var RightTriangleEqual = "⊵"; + var RightUpDownVector = "⥏"; + var RightUpTeeVector = "⥜"; + var RightUpVectorBar = "⥔"; + var RightUpVector = "↾"; + var RightVectorBar = "⥓"; + var RightVector = "⇀"; + var ring = "˚"; + var risingdotseq = "≓"; + var rlarr = "⇄"; + var rlhar = "⇌"; + var rlm = "‏"; + var rmoustache = "⎱"; + var rmoust = "⎱"; + var rnmid = "⫮"; + var roang = "⟭"; + var roarr = "⇾"; + var robrk = "⟧"; + var ropar = "⦆"; + var ropf = "𝕣"; + var Ropf = "ℝ"; + var roplus = "⨮"; + var rotimes = "⨵"; + var RoundImplies = "⥰"; + var rpar = ")"; + var rpargt = "⦔"; + var rppolint = "⨒"; + var rrarr = "⇉"; + var Rrightarrow = "⇛"; + var rsaquo = "›"; + var rscr = "𝓇"; + var Rscr = "ℛ"; + var rsh = "↱"; + var Rsh = "↱"; + var rsqb = "]"; + var rsquo = "’"; + var rsquor = "’"; + var rthree = "⋌"; + var rtimes = "⋊"; + var rtri = "▹"; + var rtrie = "⊵"; + var rtrif = "▸"; + var rtriltri = "⧎"; + var RuleDelayed = "⧴"; + var ruluhar = "⥨"; + var rx = "℞"; + var Sacute = "Ś"; + var sacute = "ś"; + var sbquo = "‚"; + var scap = "⪸"; + var Scaron = "Š"; + var scaron = "š"; + var Sc = "⪼"; + var sc = "≻"; + var sccue = "≽"; + var sce = "⪰"; + var scE = "⪴"; + var Scedil = "Ş"; + var scedil = "ş"; + var Scirc = "Ŝ"; + var scirc = "ŝ"; + var scnap = "⪺"; + var scnE = "⪶"; + var scnsim = "⋩"; + var scpolint = "⨓"; + var scsim = "≿"; + var Scy = "С"; + var scy = "с"; + var sdotb = "⊡"; + var sdot = "⋅"; + var sdote = "⩦"; + var searhk = "⤥"; + var searr = "↘"; + var seArr = "⇘"; + var searrow = "↘"; + var sect = "§"; + var semi = ";"; + var seswar = "⤩"; + var setminus = "∖"; + var setmn = "∖"; + var sext = "✶"; + var Sfr = "𝔖"; + var sfr = "𝔰"; + var sfrown = "⌢"; + var sharp = "♯"; + var SHCHcy = "Щ"; + var shchcy = "щ"; + var SHcy = "Ш"; + var shcy = "ш"; + var ShortDownArrow = "↓"; + var ShortLeftArrow = "←"; + var shortmid = "∣"; + var shortparallel = "∥"; + var ShortRightArrow = "→"; + var ShortUpArrow = "↑"; + var shy = "­"; + var Sigma = "Σ"; + var sigma = "σ"; + var sigmaf = "ς"; + var sigmav = "ς"; + var sim = "∼"; + var simdot = "⩪"; + var sime = "≃"; + var simeq = "≃"; + var simg = "⪞"; + var simgE = "⪠"; + var siml = "⪝"; + var simlE = "⪟"; + var simne = "≆"; + var simplus = "⨤"; + var simrarr = "⥲"; + var slarr = "←"; + var SmallCircle = "∘"; + var smallsetminus = "∖"; + var smashp = "⨳"; + var smeparsl = "⧤"; + var smid = "∣"; + var smile = "⌣"; + var smt = "⪪"; + var smte = "⪬"; + var smtes = "⪬︀"; + var SOFTcy = "Ь"; + var softcy = "ь"; + var solbar = "⌿"; + var solb = "⧄"; + var sol = "/"; + var Sopf = "𝕊"; + var sopf = "𝕤"; + var spades = "♠"; + var spadesuit = "♠"; + var spar = "∥"; + var sqcap = "⊓"; + var sqcaps = "⊓︀"; + var sqcup = "⊔"; + var sqcups = "⊔︀"; + var Sqrt = "√"; + var sqsub = "⊏"; + var sqsube = "⊑"; + var sqsubset = "⊏"; + var sqsubseteq = "⊑"; + var sqsup = "⊐"; + var sqsupe = "⊒"; + var sqsupset = "⊐"; + var sqsupseteq = "⊒"; + var square = "□"; + var Square = "□"; + var SquareIntersection = "⊓"; + var SquareSubset = "⊏"; + var SquareSubsetEqual = "⊑"; + var SquareSuperset = "⊐"; + var SquareSupersetEqual = "⊒"; + var SquareUnion = "⊔"; + var squarf = "▪"; + var squ = "□"; + var squf = "▪"; + var srarr = "→"; + var Sscr = "𝒮"; + var sscr = "𝓈"; + var ssetmn = "∖"; + var ssmile = "⌣"; + var sstarf = "⋆"; + var Star = "⋆"; + var star = "☆"; + var starf = "★"; + var straightepsilon = "ϵ"; + var straightphi = "ϕ"; + var strns = "¯"; + var sub = "⊂"; + var Sub = "⋐"; + var subdot = "⪽"; + var subE = "⫅"; + var sube = "⊆"; + var subedot = "⫃"; + var submult = "⫁"; + var subnE = "⫋"; + var subne = "⊊"; + var subplus = "⪿"; + var subrarr = "⥹"; + var subset = "⊂"; + var Subset = "⋐"; + var subseteq = "⊆"; + var subseteqq = "⫅"; + var SubsetEqual = "⊆"; + var subsetneq = "⊊"; + var subsetneqq = "⫋"; + var subsim = "⫇"; + var subsub = "⫕"; + var subsup = "⫓"; + var succapprox = "⪸"; + var succ = "≻"; + var succcurlyeq = "≽"; + var Succeeds = "≻"; + var SucceedsEqual = "⪰"; + var SucceedsSlantEqual = "≽"; + var SucceedsTilde = "≿"; + var succeq = "⪰"; + var succnapprox = "⪺"; + var succneqq = "⪶"; + var succnsim = "⋩"; + var succsim = "≿"; + var SuchThat = "∋"; + var sum = "∑"; + var Sum = "∑"; + var sung = "♪"; + var sup1 = "¹"; + var sup2 = "²"; + var sup3 = "³"; + var sup = "⊃"; + var Sup = "⋑"; + var supdot = "⪾"; + var supdsub = "⫘"; + var supE = "⫆"; + var supe = "⊇"; + var supedot = "⫄"; + var Superset = "⊃"; + var SupersetEqual = "⊇"; + var suphsol = "⟉"; + var suphsub = "⫗"; + var suplarr = "⥻"; + var supmult = "⫂"; + var supnE = "⫌"; + var supne = "⊋"; + var supplus = "⫀"; + var supset = "⊃"; + var Supset = "⋑"; + var supseteq = "⊇"; + var supseteqq = "⫆"; + var supsetneq = "⊋"; + var supsetneqq = "⫌"; + var supsim = "⫈"; + var supsub = "⫔"; + var supsup = "⫖"; + var swarhk = "⤦"; + var swarr = "↙"; + var swArr = "⇙"; + var swarrow = "↙"; + var swnwar = "⤪"; + var szlig = "ß"; + var Tab = "\t"; + var target = "⌖"; + var Tau = "Τ"; + var tau = "τ"; + var tbrk = "⎴"; + var Tcaron = "Ť"; + var tcaron = "ť"; + var Tcedil = "Ţ"; + var tcedil = "ţ"; + var Tcy = "Т"; + var tcy = "т"; + var tdot = "⃛"; + var telrec = "⌕"; + var Tfr = "𝔗"; + var tfr = "𝔱"; + var there4 = "∴"; + var therefore = "∴"; + var Therefore = "∴"; + var Theta = "Θ"; + var theta = "θ"; + var thetasym = "ϑ"; + var thetav = "ϑ"; + var thickapprox = "≈"; + var thicksim = "∼"; + var ThickSpace = "  "; + var ThinSpace = " "; + var thinsp = " "; + var thkap = "≈"; + var thksim = "∼"; + var THORN = "Þ"; + var thorn = "þ"; + var tilde = "˜"; + var Tilde = "∼"; + var TildeEqual = "≃"; + var TildeFullEqual = "≅"; + var TildeTilde = "≈"; + var timesbar = "⨱"; + var timesb = "⊠"; + var times = "×"; + var timesd = "⨰"; + var tint = "∭"; + var toea = "⤨"; + var topbot = "⌶"; + var topcir = "⫱"; + var top = "⊤"; + var Topf = "𝕋"; + var topf = "𝕥"; + var topfork = "⫚"; + var tosa = "⤩"; + var tprime = "‴"; + var trade = "™"; + var TRADE = "™"; + var triangle = "▵"; + var triangledown = "▿"; + var triangleleft = "◃"; + var trianglelefteq = "⊴"; + var triangleq = "≜"; + var triangleright = "▹"; + var trianglerighteq = "⊵"; + var tridot = "◬"; + var trie = "≜"; + var triminus = "⨺"; + var TripleDot = "⃛"; + var triplus = "⨹"; + var trisb = "⧍"; + var tritime = "⨻"; + var trpezium = "⏢"; + var Tscr = "𝒯"; + var tscr = "𝓉"; + var TScy = "Ц"; + var tscy = "ц"; + var TSHcy = "Ћ"; + var tshcy = "ћ"; + var Tstrok = "Ŧ"; + var tstrok = "ŧ"; + var twixt = "≬"; + var twoheadleftarrow = "↞"; + var twoheadrightarrow = "↠"; + var Uacute = "Ú"; + var uacute = "ú"; + var uarr = "↑"; + var Uarr = "↟"; + var uArr = "⇑"; + var Uarrocir = "⥉"; + var Ubrcy = "Ў"; + var ubrcy = "ў"; + var Ubreve = "Ŭ"; + var ubreve = "ŭ"; + var Ucirc = "Û"; + var ucirc = "û"; + var Ucy = "У"; + var ucy = "у"; + var udarr = "⇅"; + var Udblac = "Ű"; + var udblac = "ű"; + var udhar = "⥮"; + var ufisht = "⥾"; + var Ufr = "𝔘"; + var ufr = "𝔲"; + var Ugrave = "Ù"; + var ugrave = "ù"; + var uHar = "⥣"; + var uharl = "↿"; + var uharr = "↾"; + var uhblk = "▀"; + var ulcorn = "⌜"; + var ulcorner = "⌜"; + var ulcrop = "⌏"; + var ultri = "◸"; + var Umacr = "Ū"; + var umacr = "ū"; + var uml = "¨"; + var UnderBar = "_"; + var UnderBrace = "⏟"; + var UnderBracket = "⎵"; + var UnderParenthesis = "⏝"; + var Union = "⋃"; + var UnionPlus = "⊎"; + var Uogon = "Ų"; + var uogon = "ų"; + var Uopf = "𝕌"; + var uopf = "𝕦"; + var UpArrowBar = "⤒"; + var uparrow = "↑"; + var UpArrow = "↑"; + var Uparrow = "⇑"; + var UpArrowDownArrow = "⇅"; + var updownarrow = "↕"; + var UpDownArrow = "↕"; + var Updownarrow = "⇕"; + var UpEquilibrium = "⥮"; + var upharpoonleft = "↿"; + var upharpoonright = "↾"; + var uplus = "⊎"; + var UpperLeftArrow = "↖"; + var UpperRightArrow = "↗"; + var upsi = "υ"; + var Upsi = "ϒ"; + var upsih = "ϒ"; + var Upsilon = "Υ"; + var upsilon = "υ"; + var UpTeeArrow = "↥"; + var UpTee = "⊥"; + var upuparrows = "⇈"; + var urcorn = "⌝"; + var urcorner = "⌝"; + var urcrop = "⌎"; + var Uring = "Ů"; + var uring = "ů"; + var urtri = "◹"; + var Uscr = "𝒰"; + var uscr = "𝓊"; + var utdot = "⋰"; + var Utilde = "Ũ"; + var utilde = "ũ"; + var utri = "▵"; + var utrif = "▴"; + var uuarr = "⇈"; + var Uuml = "Ü"; + var uuml = "ü"; + var uwangle = "⦧"; + var vangrt = "⦜"; + var varepsilon = "ϵ"; + var varkappa = "ϰ"; + var varnothing = "∅"; + var varphi = "ϕ"; + var varpi = "ϖ"; + var varpropto = "∝"; + var varr = "↕"; + var vArr = "⇕"; + var varrho = "ϱ"; + var varsigma = "ς"; + var varsubsetneq = "⊊︀"; + var varsubsetneqq = "⫋︀"; + var varsupsetneq = "⊋︀"; + var varsupsetneqq = "⫌︀"; + var vartheta = "ϑ"; + var vartriangleleft = "⊲"; + var vartriangleright = "⊳"; + var vBar = "⫨"; + var Vbar = "⫫"; + var vBarv = "⫩"; + var Vcy = "В"; + var vcy = "в"; + var vdash = "⊢"; + var vDash = "⊨"; + var Vdash = "⊩"; + var VDash = "⊫"; + var Vdashl = "⫦"; + var veebar = "⊻"; + var vee = "∨"; + var Vee = "⋁"; + var veeeq = "≚"; + var vellip = "⋮"; + var verbar = "|"; + var Verbar = "‖"; + var vert = "|"; + var Vert = "‖"; + var VerticalBar = "∣"; + var VerticalLine = "|"; + var VerticalSeparator = "❘"; + var VerticalTilde = "≀"; + var VeryThinSpace = " "; + var Vfr = "𝔙"; + var vfr = "𝔳"; + var vltri = "⊲"; + var vnsub = "⊂⃒"; + var vnsup = "⊃⃒"; + var Vopf = "𝕍"; + var vopf = "𝕧"; + var vprop = "∝"; + var vrtri = "⊳"; + var Vscr = "𝒱"; + var vscr = "𝓋"; + var vsubnE = "⫋︀"; + var vsubne = "⊊︀"; + var vsupnE = "⫌︀"; + var vsupne = "⊋︀"; + var Vvdash = "⊪"; + var vzigzag = "⦚"; + var Wcirc = "Ŵ"; + var wcirc = "ŵ"; + var wedbar = "⩟"; + var wedge = "∧"; + var Wedge = "⋀"; + var wedgeq = "≙"; + var weierp = "℘"; + var Wfr = "𝔚"; + var wfr = "𝔴"; + var Wopf = "𝕎"; + var wopf = "𝕨"; + var wp = "℘"; + var wr = "≀"; + var wreath = "≀"; + var Wscr = "𝒲"; + var wscr = "𝓌"; + var xcap = "⋂"; + var xcirc = "◯"; + var xcup = "⋃"; + var xdtri = "▽"; + var Xfr = "𝔛"; + var xfr = "𝔵"; + var xharr = "⟷"; + var xhArr = "⟺"; + var Xi = "Ξ"; + var xi = "ξ"; + var xlarr = "⟵"; + var xlArr = "⟸"; + var xmap = "⟼"; + var xnis = "⋻"; + var xodot = "⨀"; + var Xopf = "𝕏"; + var xopf = "𝕩"; + var xoplus = "⨁"; + var xotime = "⨂"; + var xrarr = "⟶"; + var xrArr = "⟹"; + var Xscr = "𝒳"; + var xscr = "𝓍"; + var xsqcup = "⨆"; + var xuplus = "⨄"; + var xutri = "△"; + var xvee = "⋁"; + var xwedge = "⋀"; + var Yacute = "Ý"; + var yacute = "ý"; + var YAcy = "Я"; + var yacy = "я"; + var Ycirc = "Ŷ"; + var ycirc = "ŷ"; + var Ycy = "Ы"; + var ycy = "ы"; + var yen = "¥"; + var Yfr = "𝔜"; + var yfr = "𝔶"; + var YIcy = "Ї"; + var yicy = "ї"; + var Yopf = "𝕐"; + var yopf = "𝕪"; + var Yscr = "𝒴"; + var yscr = "𝓎"; + var YUcy = "Ю"; + var yucy = "ю"; + var yuml = "ÿ"; + var Yuml = "Ÿ"; + var Zacute = "Ź"; + var zacute = "ź"; + var Zcaron = "Ž"; + var zcaron = "ž"; + var Zcy = "З"; + var zcy = "з"; + var Zdot = "Ż"; + var zdot = "ż"; + var zeetrf = "ℨ"; + var ZeroWidthSpace = "​"; + var Zeta = "Ζ"; + var zeta = "ζ"; + var zfr = "𝔷"; + var Zfr = "ℨ"; + var ZHcy = "Ж"; + var zhcy = "ж"; + var zigrarr = "⇝"; + var zopf = "𝕫"; + var Zopf = "ℤ"; + var Zscr = "𝒵"; + var zscr = "𝓏"; + var zwj = "‍"; + var zwnj = "‌"; + var entities = { + Aacute: Aacute, + aacute: aacute, + Abreve: Abreve, + abreve: abreve, + ac: ac, + acd: acd, + acE: acE, + Acirc: Acirc, + acirc: acirc, + acute: acute, + Acy: Acy, + acy: acy, + AElig: AElig, + aelig: aelig, + af: af, + Afr: Afr, + afr: afr, + Agrave: Agrave, + agrave: agrave, + alefsym: alefsym, + aleph: aleph, + Alpha: Alpha, + alpha: alpha, + Amacr: Amacr, + amacr: amacr, + amalg: amalg, + amp: amp, + AMP: AMP, + andand: andand, + And: And, + and: and, + andd: andd, + andslope: andslope, + andv: andv, + ang: ang, + ange: ange, + angle: angle, + angmsdaa: angmsdaa, + angmsdab: angmsdab, + angmsdac: angmsdac, + angmsdad: angmsdad, + angmsdae: angmsdae, + angmsdaf: angmsdaf, + angmsdag: angmsdag, + angmsdah: angmsdah, + angmsd: angmsd, + angrt: angrt, + angrtvb: angrtvb, + angrtvbd: angrtvbd, + angsph: angsph, + angst: angst, + angzarr: angzarr, + Aogon: Aogon, + aogon: aogon, + Aopf: Aopf, + aopf: aopf, + apacir: apacir, + ap: ap, + apE: apE, + ape: ape, + apid: apid, + apos: apos, + ApplyFunction: ApplyFunction, + approx: approx, + approxeq: approxeq, + Aring: Aring, + aring: aring, + Ascr: Ascr, + ascr: ascr, + Assign: Assign, + ast: ast, + asymp: asymp, + asympeq: asympeq, + Atilde: Atilde, + atilde: atilde, + Auml: Auml, + auml: auml, + awconint: awconint, + awint: awint, + backcong: backcong, + backepsilon: backepsilon, + backprime: backprime, + backsim: backsim, + backsimeq: backsimeq, + Backslash: Backslash, + Barv: Barv, + barvee: barvee, + barwed: barwed, + Barwed: Barwed, + barwedge: barwedge, + bbrk: bbrk, + bbrktbrk: bbrktbrk, + bcong: bcong, + Bcy: Bcy, + bcy: bcy, + bdquo: bdquo, + becaus: becaus, + because: because, + Because: Because, + bemptyv: bemptyv, + bepsi: bepsi, + bernou: bernou, + Bernoullis: Bernoullis, + Beta: Beta, + beta: beta, + beth: beth, + between: between, + Bfr: Bfr, + bfr: bfr, + bigcap: bigcap, + bigcirc: bigcirc, + bigcup: bigcup, + bigodot: bigodot, + bigoplus: bigoplus, + bigotimes: bigotimes, + bigsqcup: bigsqcup, + bigstar: bigstar, + bigtriangledown: bigtriangledown, + bigtriangleup: bigtriangleup, + biguplus: biguplus, + bigvee: bigvee, + bigwedge: bigwedge, + bkarow: bkarow, + blacklozenge: blacklozenge, + blacksquare: blacksquare, + blacktriangle: blacktriangle, + blacktriangledown: blacktriangledown, + blacktriangleleft: blacktriangleleft, + blacktriangleright: blacktriangleright, + blank: blank, + blk12: blk12, + blk14: blk14, + blk34: blk34, + block: block, + bne: bne, + bnequiv: bnequiv, + bNot: bNot, + bnot: bnot, + Bopf: Bopf, + bopf: bopf, + bot: bot, + bottom: bottom, + bowtie: bowtie, + boxbox: boxbox, + boxdl: boxdl, + boxdL: boxdL, + boxDl: boxDl, + boxDL: boxDL, + boxdr: boxdr, + boxdR: boxdR, + boxDr: boxDr, + boxDR: boxDR, + boxh: boxh, + boxH: boxH, + boxhd: boxhd, + boxHd: boxHd, + boxhD: boxhD, + boxHD: boxHD, + boxhu: boxhu, + boxHu: boxHu, + boxhU: boxhU, + boxHU: boxHU, + boxminus: boxminus, + boxplus: boxplus, + boxtimes: boxtimes, + boxul: boxul, + boxuL: boxuL, + boxUl: boxUl, + boxUL: boxUL, + boxur: boxur, + boxuR: boxuR, + boxUr: boxUr, + boxUR: boxUR, + boxv: boxv, + boxV: boxV, + boxvh: boxvh, + boxvH: boxvH, + boxVh: boxVh, + boxVH: boxVH, + boxvl: boxvl, + boxvL: boxvL, + boxVl: boxVl, + boxVL: boxVL, + boxvr: boxvr, + boxvR: boxvR, + boxVr: boxVr, + boxVR: boxVR, + bprime: bprime, + breve: breve, + Breve: Breve, + brvbar: brvbar, + bscr: bscr, + Bscr: Bscr, + bsemi: bsemi, + bsim: bsim, + bsime: bsime, + bsolb: bsolb, + bsol: bsol, + bsolhsub: bsolhsub, + bull: bull, + bullet: bullet, + bump: bump, + bumpE: bumpE, + bumpe: bumpe, + Bumpeq: Bumpeq, + bumpeq: bumpeq, + Cacute: Cacute, + cacute: cacute, + capand: capand, + capbrcup: capbrcup, + capcap: capcap, + cap: cap, + Cap: Cap, + capcup: capcup, + capdot: capdot, + CapitalDifferentialD: CapitalDifferentialD, + caps: caps, + caret: caret, + caron: caron, + Cayleys: Cayleys, + ccaps: ccaps, + Ccaron: Ccaron, + ccaron: ccaron, + Ccedil: Ccedil, + ccedil: ccedil, + Ccirc: Ccirc, + ccirc: ccirc, + Cconint: Cconint, + ccups: ccups, + ccupssm: ccupssm, + Cdot: Cdot, + cdot: cdot, + cedil: cedil, + Cedilla: Cedilla, + cemptyv: cemptyv, + cent: cent, + centerdot: centerdot, + CenterDot: CenterDot, + cfr: cfr, + Cfr: Cfr, + CHcy: CHcy, + chcy: chcy, + check: check, + checkmark: checkmark, + Chi: Chi, + chi: chi, + circ: circ, + circeq: circeq, + circlearrowleft: circlearrowleft, + circlearrowright: circlearrowright, + circledast: circledast, + circledcirc: circledcirc, + circleddash: circleddash, + CircleDot: CircleDot, + circledR: circledR, + circledS: circledS, + CircleMinus: CircleMinus, + CirclePlus: CirclePlus, + CircleTimes: CircleTimes, + cir: cir, + cirE: cirE, + cire: cire, + cirfnint: cirfnint, + cirmid: cirmid, + cirscir: cirscir, + ClockwiseContourIntegral: ClockwiseContourIntegral, + CloseCurlyDoubleQuote: CloseCurlyDoubleQuote, + CloseCurlyQuote: CloseCurlyQuote, + clubs: clubs, + clubsuit: clubsuit, + colon: colon, + Colon: Colon, + Colone: Colone, + colone: colone, + coloneq: coloneq, + comma: comma, + commat: commat, + comp: comp, + compfn: compfn, + complement: complement, + complexes: complexes, + cong: cong, + congdot: congdot, + Congruent: Congruent, + conint: conint, + Conint: Conint, + ContourIntegral: ContourIntegral, + copf: copf, + Copf: Copf, + coprod: coprod, + Coproduct: Coproduct, + copy: copy, + COPY: COPY, + copysr: copysr, + CounterClockwiseContourIntegral: CounterClockwiseContourIntegral, + crarr: crarr, + cross: cross, + Cross: Cross, + Cscr: Cscr, + cscr: cscr, + csub: csub, + csube: csube, + csup: csup, + csupe: csupe, + ctdot: ctdot, + cudarrl: cudarrl, + cudarrr: cudarrr, + cuepr: cuepr, + cuesc: cuesc, + cularr: cularr, + cularrp: cularrp, + cupbrcap: cupbrcap, + cupcap: cupcap, + CupCap: CupCap, + cup: cup, + Cup: Cup, + cupcup: cupcup, + cupdot: cupdot, + cupor: cupor, + cups: cups, + curarr: curarr, + curarrm: curarrm, + curlyeqprec: curlyeqprec, + curlyeqsucc: curlyeqsucc, + curlyvee: curlyvee, + curlywedge: curlywedge, + curren: curren, + curvearrowleft: curvearrowleft, + curvearrowright: curvearrowright, + cuvee: cuvee, + cuwed: cuwed, + cwconint: cwconint, + cwint: cwint, + cylcty: cylcty, + dagger: dagger, + Dagger: Dagger, + daleth: daleth, + darr: darr, + Darr: Darr, + dArr: dArr, + dash: dash, + Dashv: Dashv, + dashv: dashv, + dbkarow: dbkarow, + dblac: dblac, + Dcaron: Dcaron, + dcaron: dcaron, + Dcy: Dcy, + dcy: dcy, + ddagger: ddagger, + ddarr: ddarr, + DD: DD, + dd: dd, + DDotrahd: DDotrahd, + ddotseq: ddotseq, + deg: deg, + Del: Del, + Delta: Delta, + delta: delta, + demptyv: demptyv, + dfisht: dfisht, + Dfr: Dfr, + dfr: dfr, + dHar: dHar, + dharl: dharl, + dharr: dharr, + DiacriticalAcute: DiacriticalAcute, + DiacriticalDot: DiacriticalDot, + DiacriticalDoubleAcute: DiacriticalDoubleAcute, + DiacriticalGrave: DiacriticalGrave, + DiacriticalTilde: DiacriticalTilde, + diam: diam, + diamond: diamond, + Diamond: Diamond, + diamondsuit: diamondsuit, + diams: diams, + die: die, + DifferentialD: DifferentialD, + digamma: digamma, + disin: disin, + div: div, + divide: divide, + divideontimes: divideontimes, + divonx: divonx, + DJcy: DJcy, + djcy: djcy, + dlcorn: dlcorn, + dlcrop: dlcrop, + dollar: dollar, + Dopf: Dopf, + dopf: dopf, + Dot: Dot, + dot: dot, + DotDot: DotDot, + doteq: doteq, + doteqdot: doteqdot, + DotEqual: DotEqual, + dotminus: dotminus, + dotplus: dotplus, + dotsquare: dotsquare, + doublebarwedge: doublebarwedge, + DoubleContourIntegral: DoubleContourIntegral, + DoubleDot: DoubleDot, + DoubleDownArrow: DoubleDownArrow, + DoubleLeftArrow: DoubleLeftArrow, + DoubleLeftRightArrow: DoubleLeftRightArrow, + DoubleLeftTee: DoubleLeftTee, + DoubleLongLeftArrow: DoubleLongLeftArrow, + DoubleLongLeftRightArrow: DoubleLongLeftRightArrow, + DoubleLongRightArrow: DoubleLongRightArrow, + DoubleRightArrow: DoubleRightArrow, + DoubleRightTee: DoubleRightTee, + DoubleUpArrow: DoubleUpArrow, + DoubleUpDownArrow: DoubleUpDownArrow, + DoubleVerticalBar: DoubleVerticalBar, + DownArrowBar: DownArrowBar, + downarrow: downarrow, + DownArrow: DownArrow, + Downarrow: Downarrow, + DownArrowUpArrow: DownArrowUpArrow, + DownBreve: DownBreve, + downdownarrows: downdownarrows, + downharpoonleft: downharpoonleft, + downharpoonright: downharpoonright, + DownLeftRightVector: DownLeftRightVector, + DownLeftTeeVector: DownLeftTeeVector, + DownLeftVectorBar: DownLeftVectorBar, + DownLeftVector: DownLeftVector, + DownRightTeeVector: DownRightTeeVector, + DownRightVectorBar: DownRightVectorBar, + DownRightVector: DownRightVector, + DownTeeArrow: DownTeeArrow, + DownTee: DownTee, + drbkarow: drbkarow, + drcorn: drcorn, + drcrop: drcrop, + Dscr: Dscr, + dscr: dscr, + DScy: DScy, + dscy: dscy, + dsol: dsol, + Dstrok: Dstrok, + dstrok: dstrok, + dtdot: dtdot, + dtri: dtri, + dtrif: dtrif, + duarr: duarr, + duhar: duhar, + dwangle: dwangle, + DZcy: DZcy, + dzcy: dzcy, + dzigrarr: dzigrarr, + Eacute: Eacute, + eacute: eacute, + easter: easter, + Ecaron: Ecaron, + ecaron: ecaron, + Ecirc: Ecirc, + ecirc: ecirc, + ecir: ecir, + ecolon: ecolon, + Ecy: Ecy, + ecy: ecy, + eDDot: eDDot, + Edot: Edot, + edot: edot, + eDot: eDot, + ee: ee, + efDot: efDot, + Efr: Efr, + efr: efr, + eg: eg, + Egrave: Egrave, + egrave: egrave, + egs: egs, + egsdot: egsdot, + el: el, + Element: Element, + elinters: elinters, + ell: ell, + els: els, + elsdot: elsdot, + Emacr: Emacr, + emacr: emacr, + empty: empty, + emptyset: emptyset, + EmptySmallSquare: EmptySmallSquare, + emptyv: emptyv, + EmptyVerySmallSquare: EmptyVerySmallSquare, + emsp13: emsp13, + emsp14: emsp14, + emsp: emsp, + ENG: ENG, + eng: eng, + ensp: ensp, + Eogon: Eogon, + eogon: eogon, + Eopf: Eopf, + eopf: eopf, + epar: epar, + eparsl: eparsl, + eplus: eplus, + epsi: epsi, + Epsilon: Epsilon, + epsilon: epsilon, + epsiv: epsiv, + eqcirc: eqcirc, + eqcolon: eqcolon, + eqsim: eqsim, + eqslantgtr: eqslantgtr, + eqslantless: eqslantless, + Equal: Equal, + equals: equals, + EqualTilde: EqualTilde, + equest: equest, + Equilibrium: Equilibrium, + equiv: equiv, + equivDD: equivDD, + eqvparsl: eqvparsl, + erarr: erarr, + erDot: erDot, + escr: escr, + Escr: Escr, + esdot: esdot, + Esim: Esim, + esim: esim, + Eta: Eta, + eta: eta, + ETH: ETH, + eth: eth, + Euml: Euml, + euml: euml, + euro: euro, + excl: excl, + exist: exist, + Exists: Exists, + expectation: expectation, + exponentiale: exponentiale, + ExponentialE: ExponentialE, + fallingdotseq: fallingdotseq, + Fcy: Fcy, + fcy: fcy, + female: female, + ffilig: ffilig, + fflig: fflig, + ffllig: ffllig, + Ffr: Ffr, + ffr: ffr, + filig: filig, + FilledSmallSquare: FilledSmallSquare, + FilledVerySmallSquare: FilledVerySmallSquare, + fjlig: fjlig, + flat: flat, + fllig: fllig, + fltns: fltns, + fnof: fnof, + Fopf: Fopf, + fopf: fopf, + forall: forall, + ForAll: ForAll, + fork: fork, + forkv: forkv, + Fouriertrf: Fouriertrf, + fpartint: fpartint, + frac12: frac12, + frac13: frac13, + frac14: frac14, + frac15: frac15, + frac16: frac16, + frac18: frac18, + frac23: frac23, + frac25: frac25, + frac34: frac34, + frac35: frac35, + frac38: frac38, + frac45: frac45, + frac56: frac56, + frac58: frac58, + frac78: frac78, + frasl: frasl, + frown: frown, + fscr: fscr, + Fscr: Fscr, + gacute: gacute, + Gamma: Gamma, + gamma: gamma, + Gammad: Gammad, + gammad: gammad, + gap: gap, + Gbreve: Gbreve, + gbreve: gbreve, + Gcedil: Gcedil, + Gcirc: Gcirc, + gcirc: gcirc, + Gcy: Gcy, + gcy: gcy, + Gdot: Gdot, + gdot: gdot, + ge: ge, + gE: gE, + gEl: gEl, + gel: gel, + geq: geq, + geqq: geqq, + geqslant: geqslant, + gescc: gescc, + ges: ges, + gesdot: gesdot, + gesdoto: gesdoto, + gesdotol: gesdotol, + gesl: gesl, + gesles: gesles, + Gfr: Gfr, + gfr: gfr, + gg: gg, + Gg: Gg, + ggg: ggg, + gimel: gimel, + GJcy: GJcy, + gjcy: gjcy, + gla: gla, + gl: gl, + glE: glE, + glj: glj, + gnap: gnap, + gnapprox: gnapprox, + gne: gne, + gnE: gnE, + gneq: gneq, + gneqq: gneqq, + gnsim: gnsim, + Gopf: Gopf, + gopf: gopf, + grave: grave, + GreaterEqual: GreaterEqual, + GreaterEqualLess: GreaterEqualLess, + GreaterFullEqual: GreaterFullEqual, + GreaterGreater: GreaterGreater, + GreaterLess: GreaterLess, + GreaterSlantEqual: GreaterSlantEqual, + GreaterTilde: GreaterTilde, + Gscr: Gscr, + gscr: gscr, + gsim: gsim, + gsime: gsime, + gsiml: gsiml, + gtcc: gtcc, + gtcir: gtcir, + gt: gt, + GT: GT, + Gt: Gt, + gtdot: gtdot, + gtlPar: gtlPar, + gtquest: gtquest, + gtrapprox: gtrapprox, + gtrarr: gtrarr, + gtrdot: gtrdot, + gtreqless: gtreqless, + gtreqqless: gtreqqless, + gtrless: gtrless, + gtrsim: gtrsim, + gvertneqq: gvertneqq, + gvnE: gvnE, + Hacek: Hacek, + hairsp: hairsp, + half: half, + hamilt: hamilt, + HARDcy: HARDcy, + hardcy: hardcy, + harrcir: harrcir, + harr: harr, + hArr: hArr, + harrw: harrw, + Hat: Hat, + hbar: hbar, + Hcirc: Hcirc, + hcirc: hcirc, + hearts: hearts, + heartsuit: heartsuit, + hellip: hellip, + hercon: hercon, + hfr: hfr, + Hfr: Hfr, + HilbertSpace: HilbertSpace, + hksearow: hksearow, + hkswarow: hkswarow, + hoarr: hoarr, + homtht: homtht, + hookleftarrow: hookleftarrow, + hookrightarrow: hookrightarrow, + hopf: hopf, + Hopf: Hopf, + horbar: horbar, + HorizontalLine: HorizontalLine, + hscr: hscr, + Hscr: Hscr, + hslash: hslash, + Hstrok: Hstrok, + hstrok: hstrok, + HumpDownHump: HumpDownHump, + HumpEqual: HumpEqual, + hybull: hybull, + hyphen: hyphen, + Iacute: Iacute, + iacute: iacute, + ic: ic, + Icirc: Icirc, + icirc: icirc, + Icy: Icy, + icy: icy, + Idot: Idot, + IEcy: IEcy, + iecy: iecy, + iexcl: iexcl, + iff: iff, + ifr: ifr, + Ifr: Ifr, + Igrave: Igrave, + igrave: igrave, + ii: ii, + iiiint: iiiint, + iiint: iiint, + iinfin: iinfin, + iiota: iiota, + IJlig: IJlig, + ijlig: ijlig, + Imacr: Imacr, + imacr: imacr, + image: image, + ImaginaryI: ImaginaryI, + imagline: imagline, + imagpart: imagpart, + imath: imath, + Im: Im, + imof: imof, + imped: imped, + Implies: Implies, + incare: incare, + "in": "∈", + infin: infin, + infintie: infintie, + inodot: inodot, + intcal: intcal, + int: int, + Int: Int, + integers: integers, + Integral: Integral, + intercal: intercal, + Intersection: Intersection, + intlarhk: intlarhk, + intprod: intprod, + InvisibleComma: InvisibleComma, + InvisibleTimes: InvisibleTimes, + IOcy: IOcy, + iocy: iocy, + Iogon: Iogon, + iogon: iogon, + Iopf: Iopf, + iopf: iopf, + Iota: Iota, + iota: iota, + iprod: iprod, + iquest: iquest, + iscr: iscr, + Iscr: Iscr, + isin: isin, + isindot: isindot, + isinE: isinE, + isins: isins, + isinsv: isinsv, + isinv: isinv, + it: it, + Itilde: Itilde, + itilde: itilde, + Iukcy: Iukcy, + iukcy: iukcy, + Iuml: Iuml, + iuml: iuml, + Jcirc: Jcirc, + jcirc: jcirc, + Jcy: Jcy, + jcy: jcy, + Jfr: Jfr, + jfr: jfr, + jmath: jmath, + Jopf: Jopf, + jopf: jopf, + Jscr: Jscr, + jscr: jscr, + Jsercy: Jsercy, + jsercy: jsercy, + Jukcy: Jukcy, + jukcy: jukcy, + Kappa: Kappa, + kappa: kappa, + kappav: kappav, + Kcedil: Kcedil, + kcedil: kcedil, + Kcy: Kcy, + kcy: kcy, + Kfr: Kfr, + kfr: kfr, + kgreen: kgreen, + KHcy: KHcy, + khcy: khcy, + KJcy: KJcy, + kjcy: kjcy, + Kopf: Kopf, + kopf: kopf, + Kscr: Kscr, + kscr: kscr, + lAarr: lAarr, + Lacute: Lacute, + lacute: lacute, + laemptyv: laemptyv, + lagran: lagran, + Lambda: Lambda, + lambda: lambda, + lang: lang, + Lang: Lang, + langd: langd, + langle: langle, + lap: lap, + Laplacetrf: Laplacetrf, + laquo: laquo, + larrb: larrb, + larrbfs: larrbfs, + larr: larr, + Larr: Larr, + lArr: lArr, + larrfs: larrfs, + larrhk: larrhk, + larrlp: larrlp, + larrpl: larrpl, + larrsim: larrsim, + larrtl: larrtl, + latail: latail, + lAtail: lAtail, + lat: lat, + late: late, + lates: lates, + lbarr: lbarr, + lBarr: lBarr, + lbbrk: lbbrk, + lbrace: lbrace, + lbrack: lbrack, + lbrke: lbrke, + lbrksld: lbrksld, + lbrkslu: lbrkslu, + Lcaron: Lcaron, + lcaron: lcaron, + Lcedil: Lcedil, + lcedil: lcedil, + lceil: lceil, + lcub: lcub, + Lcy: Lcy, + lcy: lcy, + ldca: ldca, + ldquo: ldquo, + ldquor: ldquor, + ldrdhar: ldrdhar, + ldrushar: ldrushar, + ldsh: ldsh, + le: le, + lE: lE, + LeftAngleBracket: LeftAngleBracket, + LeftArrowBar: LeftArrowBar, + leftarrow: leftarrow, + LeftArrow: LeftArrow, + Leftarrow: Leftarrow, + LeftArrowRightArrow: LeftArrowRightArrow, + leftarrowtail: leftarrowtail, + LeftCeiling: LeftCeiling, + LeftDoubleBracket: LeftDoubleBracket, + LeftDownTeeVector: LeftDownTeeVector, + LeftDownVectorBar: LeftDownVectorBar, + LeftDownVector: LeftDownVector, + LeftFloor: LeftFloor, + leftharpoondown: leftharpoondown, + leftharpoonup: leftharpoonup, + leftleftarrows: leftleftarrows, + leftrightarrow: leftrightarrow, + LeftRightArrow: LeftRightArrow, + Leftrightarrow: Leftrightarrow, + leftrightarrows: leftrightarrows, + leftrightharpoons: leftrightharpoons, + leftrightsquigarrow: leftrightsquigarrow, + LeftRightVector: LeftRightVector, + LeftTeeArrow: LeftTeeArrow, + LeftTee: LeftTee, + LeftTeeVector: LeftTeeVector, + leftthreetimes: leftthreetimes, + LeftTriangleBar: LeftTriangleBar, + LeftTriangle: LeftTriangle, + LeftTriangleEqual: LeftTriangleEqual, + LeftUpDownVector: LeftUpDownVector, + LeftUpTeeVector: LeftUpTeeVector, + LeftUpVectorBar: LeftUpVectorBar, + LeftUpVector: LeftUpVector, + LeftVectorBar: LeftVectorBar, + LeftVector: LeftVector, + lEg: lEg, + leg: leg, + leq: leq, + leqq: leqq, + leqslant: leqslant, + lescc: lescc, + les: les, + lesdot: lesdot, + lesdoto: lesdoto, + lesdotor: lesdotor, + lesg: lesg, + lesges: lesges, + lessapprox: lessapprox, + lessdot: lessdot, + lesseqgtr: lesseqgtr, + lesseqqgtr: lesseqqgtr, + LessEqualGreater: LessEqualGreater, + LessFullEqual: LessFullEqual, + LessGreater: LessGreater, + lessgtr: lessgtr, + LessLess: LessLess, + lesssim: lesssim, + LessSlantEqual: LessSlantEqual, + LessTilde: LessTilde, + lfisht: lfisht, + lfloor: lfloor, + Lfr: Lfr, + lfr: lfr, + lg: lg, + lgE: lgE, + lHar: lHar, + lhard: lhard, + lharu: lharu, + lharul: lharul, + lhblk: lhblk, + LJcy: LJcy, + ljcy: ljcy, + llarr: llarr, + ll: ll, + Ll: Ll, + llcorner: llcorner, + Lleftarrow: Lleftarrow, + llhard: llhard, + lltri: lltri, + Lmidot: Lmidot, + lmidot: lmidot, + lmoustache: lmoustache, + lmoust: lmoust, + lnap: lnap, + lnapprox: lnapprox, + lne: lne, + lnE: lnE, + lneq: lneq, + lneqq: lneqq, + lnsim: lnsim, + loang: loang, + loarr: loarr, + lobrk: lobrk, + longleftarrow: longleftarrow, + LongLeftArrow: LongLeftArrow, + Longleftarrow: Longleftarrow, + longleftrightarrow: longleftrightarrow, + LongLeftRightArrow: LongLeftRightArrow, + Longleftrightarrow: Longleftrightarrow, + longmapsto: longmapsto, + longrightarrow: longrightarrow, + LongRightArrow: LongRightArrow, + Longrightarrow: Longrightarrow, + looparrowleft: looparrowleft, + looparrowright: looparrowright, + lopar: lopar, + Lopf: Lopf, + lopf: lopf, + loplus: loplus, + lotimes: lotimes, + lowast: lowast, + lowbar: lowbar, + LowerLeftArrow: LowerLeftArrow, + LowerRightArrow: LowerRightArrow, + loz: loz, + lozenge: lozenge, + lozf: lozf, + lpar: lpar, + lparlt: lparlt, + lrarr: lrarr, + lrcorner: lrcorner, + lrhar: lrhar, + lrhard: lrhard, + lrm: lrm, + lrtri: lrtri, + lsaquo: lsaquo, + lscr: lscr, + Lscr: Lscr, + lsh: lsh, + Lsh: Lsh, + lsim: lsim, + lsime: lsime, + lsimg: lsimg, + lsqb: lsqb, + lsquo: lsquo, + lsquor: lsquor, + Lstrok: Lstrok, + lstrok: lstrok, + ltcc: ltcc, + ltcir: ltcir, + lt: lt, + LT: LT, + Lt: Lt, + ltdot: ltdot, + lthree: lthree, + ltimes: ltimes, + ltlarr: ltlarr, + ltquest: ltquest, + ltri: ltri, + ltrie: ltrie, + ltrif: ltrif, + ltrPar: ltrPar, + lurdshar: lurdshar, + luruhar: luruhar, + lvertneqq: lvertneqq, + lvnE: lvnE, + macr: macr, + male: male, + malt: malt, + maltese: maltese, + "Map": "⤅", + map: map, + mapsto: mapsto, + mapstodown: mapstodown, + mapstoleft: mapstoleft, + mapstoup: mapstoup, + marker: marker, + mcomma: mcomma, + Mcy: Mcy, + mcy: mcy, + mdash: mdash, + mDDot: mDDot, + measuredangle: measuredangle, + MediumSpace: MediumSpace, + Mellintrf: Mellintrf, + Mfr: Mfr, + mfr: mfr, + mho: mho, + micro: micro, + midast: midast, + midcir: midcir, + mid: mid, + middot: middot, + minusb: minusb, + minus: minus, + minusd: minusd, + minusdu: minusdu, + MinusPlus: MinusPlus, + mlcp: mlcp, + mldr: mldr, + mnplus: mnplus, + models: models, + Mopf: Mopf, + mopf: mopf, + mp: mp, + mscr: mscr, + Mscr: Mscr, + mstpos: mstpos, + Mu: Mu, + mu: mu, + multimap: multimap, + mumap: mumap, + nabla: nabla, + Nacute: Nacute, + nacute: nacute, + nang: nang, + nap: nap, + napE: napE, + napid: napid, + napos: napos, + napprox: napprox, + natural: natural, + naturals: naturals, + natur: natur, + nbsp: nbsp, + nbump: nbump, + nbumpe: nbumpe, + ncap: ncap, + Ncaron: Ncaron, + ncaron: ncaron, + Ncedil: Ncedil, + ncedil: ncedil, + ncong: ncong, + ncongdot: ncongdot, + ncup: ncup, + Ncy: Ncy, + ncy: ncy, + ndash: ndash, + nearhk: nearhk, + nearr: nearr, + neArr: neArr, + nearrow: nearrow, + ne: ne, + nedot: nedot, + NegativeMediumSpace: NegativeMediumSpace, + NegativeThickSpace: NegativeThickSpace, + NegativeThinSpace: NegativeThinSpace, + NegativeVeryThinSpace: NegativeVeryThinSpace, + nequiv: nequiv, + nesear: nesear, + nesim: nesim, + NestedGreaterGreater: NestedGreaterGreater, + NestedLessLess: NestedLessLess, + NewLine: NewLine, + nexist: nexist, + nexists: nexists, + Nfr: Nfr, + nfr: nfr, + ngE: ngE, + nge: nge, + ngeq: ngeq, + ngeqq: ngeqq, + ngeqslant: ngeqslant, + nges: nges, + nGg: nGg, + ngsim: ngsim, + nGt: nGt, + ngt: ngt, + ngtr: ngtr, + nGtv: nGtv, + nharr: nharr, + nhArr: nhArr, + nhpar: nhpar, + ni: ni, + nis: nis, + nisd: nisd, + niv: niv, + NJcy: NJcy, + njcy: njcy, + nlarr: nlarr, + nlArr: nlArr, + nldr: nldr, + nlE: nlE, + nle: nle, + nleftarrow: nleftarrow, + nLeftarrow: nLeftarrow, + nleftrightarrow: nleftrightarrow, + nLeftrightarrow: nLeftrightarrow, + nleq: nleq, + nleqq: nleqq, + nleqslant: nleqslant, + nles: nles, + nless: nless, + nLl: nLl, + nlsim: nlsim, + nLt: nLt, + nlt: nlt, + nltri: nltri, + nltrie: nltrie, + nLtv: nLtv, + nmid: nmid, + NoBreak: NoBreak, + NonBreakingSpace: NonBreakingSpace, + nopf: nopf, + Nopf: Nopf, + Not: Not, + not: not, + NotCongruent: NotCongruent, + NotCupCap: NotCupCap, + NotDoubleVerticalBar: NotDoubleVerticalBar, + NotElement: NotElement, + NotEqual: NotEqual, + NotEqualTilde: NotEqualTilde, + NotExists: NotExists, + NotGreater: NotGreater, + NotGreaterEqual: NotGreaterEqual, + NotGreaterFullEqual: NotGreaterFullEqual, + NotGreaterGreater: NotGreaterGreater, + NotGreaterLess: NotGreaterLess, + NotGreaterSlantEqual: NotGreaterSlantEqual, + NotGreaterTilde: NotGreaterTilde, + NotHumpDownHump: NotHumpDownHump, + NotHumpEqual: NotHumpEqual, + notin: notin, + notindot: notindot, + notinE: notinE, + notinva: notinva, + notinvb: notinvb, + notinvc: notinvc, + NotLeftTriangleBar: NotLeftTriangleBar, + NotLeftTriangle: NotLeftTriangle, + NotLeftTriangleEqual: NotLeftTriangleEqual, + NotLess: NotLess, + NotLessEqual: NotLessEqual, + NotLessGreater: NotLessGreater, + NotLessLess: NotLessLess, + NotLessSlantEqual: NotLessSlantEqual, + NotLessTilde: NotLessTilde, + NotNestedGreaterGreater: NotNestedGreaterGreater, + NotNestedLessLess: NotNestedLessLess, + notni: notni, + notniva: notniva, + notnivb: notnivb, + notnivc: notnivc, + NotPrecedes: NotPrecedes, + NotPrecedesEqual: NotPrecedesEqual, + NotPrecedesSlantEqual: NotPrecedesSlantEqual, + NotReverseElement: NotReverseElement, + NotRightTriangleBar: NotRightTriangleBar, + NotRightTriangle: NotRightTriangle, + NotRightTriangleEqual: NotRightTriangleEqual, + NotSquareSubset: NotSquareSubset, + NotSquareSubsetEqual: NotSquareSubsetEqual, + NotSquareSuperset: NotSquareSuperset, + NotSquareSupersetEqual: NotSquareSupersetEqual, + NotSubset: NotSubset, + NotSubsetEqual: NotSubsetEqual, + NotSucceeds: NotSucceeds, + NotSucceedsEqual: NotSucceedsEqual, + NotSucceedsSlantEqual: NotSucceedsSlantEqual, + NotSucceedsTilde: NotSucceedsTilde, + NotSuperset: NotSuperset, + NotSupersetEqual: NotSupersetEqual, + NotTilde: NotTilde, + NotTildeEqual: NotTildeEqual, + NotTildeFullEqual: NotTildeFullEqual, + NotTildeTilde: NotTildeTilde, + NotVerticalBar: NotVerticalBar, + nparallel: nparallel, + npar: npar, + nparsl: nparsl, + npart: npart, + npolint: npolint, + npr: npr, + nprcue: nprcue, + nprec: nprec, + npreceq: npreceq, + npre: npre, + nrarrc: nrarrc, + nrarr: nrarr, + nrArr: nrArr, + nrarrw: nrarrw, + nrightarrow: nrightarrow, + nRightarrow: nRightarrow, + nrtri: nrtri, + nrtrie: nrtrie, + nsc: nsc, + nsccue: nsccue, + nsce: nsce, + Nscr: Nscr, + nscr: nscr, + nshortmid: nshortmid, + nshortparallel: nshortparallel, + nsim: nsim, + nsime: nsime, + nsimeq: nsimeq, + nsmid: nsmid, + nspar: nspar, + nsqsube: nsqsube, + nsqsupe: nsqsupe, + nsub: nsub, + nsubE: nsubE, + nsube: nsube, + nsubset: nsubset, + nsubseteq: nsubseteq, + nsubseteqq: nsubseteqq, + nsucc: nsucc, + nsucceq: nsucceq, + nsup: nsup, + nsupE: nsupE, + nsupe: nsupe, + nsupset: nsupset, + nsupseteq: nsupseteq, + nsupseteqq: nsupseteqq, + ntgl: ntgl, + Ntilde: Ntilde, + ntilde: ntilde, + ntlg: ntlg, + ntriangleleft: ntriangleleft, + ntrianglelefteq: ntrianglelefteq, + ntriangleright: ntriangleright, + ntrianglerighteq: ntrianglerighteq, + Nu: Nu, + nu: nu, + num: num, + numero: numero, + numsp: numsp, + nvap: nvap, + nvdash: nvdash, + nvDash: nvDash, + nVdash: nVdash, + nVDash: nVDash, + nvge: nvge, + nvgt: nvgt, + nvHarr: nvHarr, + nvinfin: nvinfin, + nvlArr: nvlArr, + nvle: nvle, + nvlt: nvlt, + nvltrie: nvltrie, + nvrArr: nvrArr, + nvrtrie: nvrtrie, + nvsim: nvsim, + nwarhk: nwarhk, + nwarr: nwarr, + nwArr: nwArr, + nwarrow: nwarrow, + nwnear: nwnear, + Oacute: Oacute, + oacute: oacute, + oast: oast, + Ocirc: Ocirc, + ocirc: ocirc, + ocir: ocir, + Ocy: Ocy, + ocy: ocy, + odash: odash, + Odblac: Odblac, + odblac: odblac, + odiv: odiv, + odot: odot, + odsold: odsold, + OElig: OElig, + oelig: oelig, + ofcir: ofcir, + Ofr: Ofr, + ofr: ofr, + ogon: ogon, + Ograve: Ograve, + ograve: ograve, + ogt: ogt, + ohbar: ohbar, + ohm: ohm, + oint: oint, + olarr: olarr, + olcir: olcir, + olcross: olcross, + oline: oline, + olt: olt, + Omacr: Omacr, + omacr: omacr, + Omega: Omega, + omega: omega, + Omicron: Omicron, + omicron: omicron, + omid: omid, + ominus: ominus, + Oopf: Oopf, + oopf: oopf, + opar: opar, + OpenCurlyDoubleQuote: OpenCurlyDoubleQuote, + OpenCurlyQuote: OpenCurlyQuote, + operp: operp, + oplus: oplus, + orarr: orarr, + Or: Or, + or: or, + ord: ord, + order: order, + orderof: orderof, + ordf: ordf, + ordm: ordm, + origof: origof, + oror: oror, + orslope: orslope, + orv: orv, + oS: oS, + Oscr: Oscr, + oscr: oscr, + Oslash: Oslash, + oslash: oslash, + osol: osol, + Otilde: Otilde, + otilde: otilde, + otimesas: otimesas, + Otimes: Otimes, + otimes: otimes, + Ouml: Ouml, + ouml: ouml, + ovbar: ovbar, + OverBar: OverBar, + OverBrace: OverBrace, + OverBracket: OverBracket, + OverParenthesis: OverParenthesis, + para: para, + parallel: parallel, + par: par, + parsim: parsim, + parsl: parsl, + part: part, + PartialD: PartialD, + Pcy: Pcy, + pcy: pcy, + percnt: percnt, + period: period, + permil: permil, + perp: perp, + pertenk: pertenk, + Pfr: Pfr, + pfr: pfr, + Phi: Phi, + phi: phi, + phiv: phiv, + phmmat: phmmat, + phone: phone, + Pi: Pi, + pi: pi, + pitchfork: pitchfork, + piv: piv, + planck: planck, + planckh: planckh, + plankv: plankv, + plusacir: plusacir, + plusb: plusb, + pluscir: pluscir, + plus: plus, + plusdo: plusdo, + plusdu: plusdu, + pluse: pluse, + PlusMinus: PlusMinus, + plusmn: plusmn, + plussim: plussim, + plustwo: plustwo, + pm: pm, + Poincareplane: Poincareplane, + pointint: pointint, + popf: popf, + Popf: Popf, + pound: pound, + prap: prap, + Pr: Pr, + pr: pr, + prcue: prcue, + precapprox: precapprox, + prec: prec, + preccurlyeq: preccurlyeq, + Precedes: Precedes, + PrecedesEqual: PrecedesEqual, + PrecedesSlantEqual: PrecedesSlantEqual, + PrecedesTilde: PrecedesTilde, + preceq: preceq, + precnapprox: precnapprox, + precneqq: precneqq, + precnsim: precnsim, + pre: pre, + prE: prE, + precsim: precsim, + prime: prime, + Prime: Prime, + primes: primes, + prnap: prnap, + prnE: prnE, + prnsim: prnsim, + prod: prod, + Product: Product, + profalar: profalar, + profline: profline, + profsurf: profsurf, + prop: prop, + Proportional: Proportional, + Proportion: Proportion, + propto: propto, + prsim: prsim, + prurel: prurel, + Pscr: Pscr, + pscr: pscr, + Psi: Psi, + psi: psi, + puncsp: puncsp, + Qfr: Qfr, + qfr: qfr, + qint: qint, + qopf: qopf, + Qopf: Qopf, + qprime: qprime, + Qscr: Qscr, + qscr: qscr, + quaternions: quaternions, + quatint: quatint, + quest: quest, + questeq: questeq, + quot: quot, + QUOT: QUOT, + rAarr: rAarr, + race: race, + Racute: Racute, + racute: racute, + radic: radic, + raemptyv: raemptyv, + rang: rang, + Rang: Rang, + rangd: rangd, + range: range, + rangle: rangle, + raquo: raquo, + rarrap: rarrap, + rarrb: rarrb, + rarrbfs: rarrbfs, + rarrc: rarrc, + rarr: rarr, + Rarr: Rarr, + rArr: rArr, + rarrfs: rarrfs, + rarrhk: rarrhk, + rarrlp: rarrlp, + rarrpl: rarrpl, + rarrsim: rarrsim, + Rarrtl: Rarrtl, + rarrtl: rarrtl, + rarrw: rarrw, + ratail: ratail, + rAtail: rAtail, + ratio: ratio, + rationals: rationals, + rbarr: rbarr, + rBarr: rBarr, + RBarr: RBarr, + rbbrk: rbbrk, + rbrace: rbrace, + rbrack: rbrack, + rbrke: rbrke, + rbrksld: rbrksld, + rbrkslu: rbrkslu, + Rcaron: Rcaron, + rcaron: rcaron, + Rcedil: Rcedil, + rcedil: rcedil, + rceil: rceil, + rcub: rcub, + Rcy: Rcy, + rcy: rcy, + rdca: rdca, + rdldhar: rdldhar, + rdquo: rdquo, + rdquor: rdquor, + rdsh: rdsh, + real: real, + realine: realine, + realpart: realpart, + reals: reals, + Re: Re, + rect: rect, + reg: reg, + REG: REG, + ReverseElement: ReverseElement, + ReverseEquilibrium: ReverseEquilibrium, + ReverseUpEquilibrium: ReverseUpEquilibrium, + rfisht: rfisht, + rfloor: rfloor, + rfr: rfr, + Rfr: Rfr, + rHar: rHar, + rhard: rhard, + rharu: rharu, + rharul: rharul, + Rho: Rho, + rho: rho, + rhov: rhov, + RightAngleBracket: RightAngleBracket, + RightArrowBar: RightArrowBar, + rightarrow: rightarrow, + RightArrow: RightArrow, + Rightarrow: Rightarrow, + RightArrowLeftArrow: RightArrowLeftArrow, + rightarrowtail: rightarrowtail, + RightCeiling: RightCeiling, + RightDoubleBracket: RightDoubleBracket, + RightDownTeeVector: RightDownTeeVector, + RightDownVectorBar: RightDownVectorBar, + RightDownVector: RightDownVector, + RightFloor: RightFloor, + rightharpoondown: rightharpoondown, + rightharpoonup: rightharpoonup, + rightleftarrows: rightleftarrows, + rightleftharpoons: rightleftharpoons, + rightrightarrows: rightrightarrows, + rightsquigarrow: rightsquigarrow, + RightTeeArrow: RightTeeArrow, + RightTee: RightTee, + RightTeeVector: RightTeeVector, + rightthreetimes: rightthreetimes, + RightTriangleBar: RightTriangleBar, + RightTriangle: RightTriangle, + RightTriangleEqual: RightTriangleEqual, + RightUpDownVector: RightUpDownVector, + RightUpTeeVector: RightUpTeeVector, + RightUpVectorBar: RightUpVectorBar, + RightUpVector: RightUpVector, + RightVectorBar: RightVectorBar, + RightVector: RightVector, + ring: ring, + risingdotseq: risingdotseq, + rlarr: rlarr, + rlhar: rlhar, + rlm: rlm, + rmoustache: rmoustache, + rmoust: rmoust, + rnmid: rnmid, + roang: roang, + roarr: roarr, + robrk: robrk, + ropar: ropar, + ropf: ropf, + Ropf: Ropf, + roplus: roplus, + rotimes: rotimes, + RoundImplies: RoundImplies, + rpar: rpar, + rpargt: rpargt, + rppolint: rppolint, + rrarr: rrarr, + Rrightarrow: Rrightarrow, + rsaquo: rsaquo, + rscr: rscr, + Rscr: Rscr, + rsh: rsh, + Rsh: Rsh, + rsqb: rsqb, + rsquo: rsquo, + rsquor: rsquor, + rthree: rthree, + rtimes: rtimes, + rtri: rtri, + rtrie: rtrie, + rtrif: rtrif, + rtriltri: rtriltri, + RuleDelayed: RuleDelayed, + ruluhar: ruluhar, + rx: rx, + Sacute: Sacute, + sacute: sacute, + sbquo: sbquo, + scap: scap, + Scaron: Scaron, + scaron: scaron, + Sc: Sc, + sc: sc, + sccue: sccue, + sce: sce, + scE: scE, + Scedil: Scedil, + scedil: scedil, + Scirc: Scirc, + scirc: scirc, + scnap: scnap, + scnE: scnE, + scnsim: scnsim, + scpolint: scpolint, + scsim: scsim, + Scy: Scy, + scy: scy, + sdotb: sdotb, + sdot: sdot, + sdote: sdote, + searhk: searhk, + searr: searr, + seArr: seArr, + searrow: searrow, + sect: sect, + semi: semi, + seswar: seswar, + setminus: setminus, + setmn: setmn, + sext: sext, + Sfr: Sfr, + sfr: sfr, + sfrown: sfrown, + sharp: sharp, + SHCHcy: SHCHcy, + shchcy: shchcy, + SHcy: SHcy, + shcy: shcy, + ShortDownArrow: ShortDownArrow, + ShortLeftArrow: ShortLeftArrow, + shortmid: shortmid, + shortparallel: shortparallel, + ShortRightArrow: ShortRightArrow, + ShortUpArrow: ShortUpArrow, + shy: shy, + Sigma: Sigma, + sigma: sigma, + sigmaf: sigmaf, + sigmav: sigmav, + sim: sim, + simdot: simdot, + sime: sime, + simeq: simeq, + simg: simg, + simgE: simgE, + siml: siml, + simlE: simlE, + simne: simne, + simplus: simplus, + simrarr: simrarr, + slarr: slarr, + SmallCircle: SmallCircle, + smallsetminus: smallsetminus, + smashp: smashp, + smeparsl: smeparsl, + smid: smid, + smile: smile, + smt: smt, + smte: smte, + smtes: smtes, + SOFTcy: SOFTcy, + softcy: softcy, + solbar: solbar, + solb: solb, + sol: sol, + Sopf: Sopf, + sopf: sopf, + spades: spades, + spadesuit: spadesuit, + spar: spar, + sqcap: sqcap, + sqcaps: sqcaps, + sqcup: sqcup, + sqcups: sqcups, + Sqrt: Sqrt, + sqsub: sqsub, + sqsube: sqsube, + sqsubset: sqsubset, + sqsubseteq: sqsubseteq, + sqsup: sqsup, + sqsupe: sqsupe, + sqsupset: sqsupset, + sqsupseteq: sqsupseteq, + square: square, + Square: Square, + SquareIntersection: SquareIntersection, + SquareSubset: SquareSubset, + SquareSubsetEqual: SquareSubsetEqual, + SquareSuperset: SquareSuperset, + SquareSupersetEqual: SquareSupersetEqual, + SquareUnion: SquareUnion, + squarf: squarf, + squ: squ, + squf: squf, + srarr: srarr, + Sscr: Sscr, + sscr: sscr, + ssetmn: ssetmn, + ssmile: ssmile, + sstarf: sstarf, + Star: Star, + star: star, + starf: starf, + straightepsilon: straightepsilon, + straightphi: straightphi, + strns: strns, + sub: sub, + Sub: Sub, + subdot: subdot, + subE: subE, + sube: sube, + subedot: subedot, + submult: submult, + subnE: subnE, + subne: subne, + subplus: subplus, + subrarr: subrarr, + subset: subset, + Subset: Subset, + subseteq: subseteq, + subseteqq: subseteqq, + SubsetEqual: SubsetEqual, + subsetneq: subsetneq, + subsetneqq: subsetneqq, + subsim: subsim, + subsub: subsub, + subsup: subsup, + succapprox: succapprox, + succ: succ, + succcurlyeq: succcurlyeq, + Succeeds: Succeeds, + SucceedsEqual: SucceedsEqual, + SucceedsSlantEqual: SucceedsSlantEqual, + SucceedsTilde: SucceedsTilde, + succeq: succeq, + succnapprox: succnapprox, + succneqq: succneqq, + succnsim: succnsim, + succsim: succsim, + SuchThat: SuchThat, + sum: sum, + Sum: Sum, + sung: sung, + sup1: sup1, + sup2: sup2, + sup3: sup3, + sup: sup, + Sup: Sup, + supdot: supdot, + supdsub: supdsub, + supE: supE, + supe: supe, + supedot: supedot, + Superset: Superset, + SupersetEqual: SupersetEqual, + suphsol: suphsol, + suphsub: suphsub, + suplarr: suplarr, + supmult: supmult, + supnE: supnE, + supne: supne, + supplus: supplus, + supset: supset, + Supset: Supset, + supseteq: supseteq, + supseteqq: supseteqq, + supsetneq: supsetneq, + supsetneqq: supsetneqq, + supsim: supsim, + supsub: supsub, + supsup: supsup, + swarhk: swarhk, + swarr: swarr, + swArr: swArr, + swarrow: swarrow, + swnwar: swnwar, + szlig: szlig, + Tab: Tab, + target: target, + Tau: Tau, + tau: tau, + tbrk: tbrk, + Tcaron: Tcaron, + tcaron: tcaron, + Tcedil: Tcedil, + tcedil: tcedil, + Tcy: Tcy, + tcy: tcy, + tdot: tdot, + telrec: telrec, + Tfr: Tfr, + tfr: tfr, + there4: there4, + therefore: therefore, + Therefore: Therefore, + Theta: Theta, + theta: theta, + thetasym: thetasym, + thetav: thetav, + thickapprox: thickapprox, + thicksim: thicksim, + ThickSpace: ThickSpace, + ThinSpace: ThinSpace, + thinsp: thinsp, + thkap: thkap, + thksim: thksim, + THORN: THORN, + thorn: thorn, + tilde: tilde, + Tilde: Tilde, + TildeEqual: TildeEqual, + TildeFullEqual: TildeFullEqual, + TildeTilde: TildeTilde, + timesbar: timesbar, + timesb: timesb, + times: times, + timesd: timesd, + tint: tint, + toea: toea, + topbot: topbot, + topcir: topcir, + top: top, + Topf: Topf, + topf: topf, + topfork: topfork, + tosa: tosa, + tprime: tprime, + trade: trade, + TRADE: TRADE, + triangle: triangle, + triangledown: triangledown, + triangleleft: triangleleft, + trianglelefteq: trianglelefteq, + triangleq: triangleq, + triangleright: triangleright, + trianglerighteq: trianglerighteq, + tridot: tridot, + trie: trie, + triminus: triminus, + TripleDot: TripleDot, + triplus: triplus, + trisb: trisb, + tritime: tritime, + trpezium: trpezium, + Tscr: Tscr, + tscr: tscr, + TScy: TScy, + tscy: tscy, + TSHcy: TSHcy, + tshcy: tshcy, + Tstrok: Tstrok, + tstrok: tstrok, + twixt: twixt, + twoheadleftarrow: twoheadleftarrow, + twoheadrightarrow: twoheadrightarrow, + Uacute: Uacute, + uacute: uacute, + uarr: uarr, + Uarr: Uarr, + uArr: uArr, + Uarrocir: Uarrocir, + Ubrcy: Ubrcy, + ubrcy: ubrcy, + Ubreve: Ubreve, + ubreve: ubreve, + Ucirc: Ucirc, + ucirc: ucirc, + Ucy: Ucy, + ucy: ucy, + udarr: udarr, + Udblac: Udblac, + udblac: udblac, + udhar: udhar, + ufisht: ufisht, + Ufr: Ufr, + ufr: ufr, + Ugrave: Ugrave, + ugrave: ugrave, + uHar: uHar, + uharl: uharl, + uharr: uharr, + uhblk: uhblk, + ulcorn: ulcorn, + ulcorner: ulcorner, + ulcrop: ulcrop, + ultri: ultri, + Umacr: Umacr, + umacr: umacr, + uml: uml, + UnderBar: UnderBar, + UnderBrace: UnderBrace, + UnderBracket: UnderBracket, + UnderParenthesis: UnderParenthesis, + Union: Union, + UnionPlus: UnionPlus, + Uogon: Uogon, + uogon: uogon, + Uopf: Uopf, + uopf: uopf, + UpArrowBar: UpArrowBar, + uparrow: uparrow, + UpArrow: UpArrow, + Uparrow: Uparrow, + UpArrowDownArrow: UpArrowDownArrow, + updownarrow: updownarrow, + UpDownArrow: UpDownArrow, + Updownarrow: Updownarrow, + UpEquilibrium: UpEquilibrium, + upharpoonleft: upharpoonleft, + upharpoonright: upharpoonright, + uplus: uplus, + UpperLeftArrow: UpperLeftArrow, + UpperRightArrow: UpperRightArrow, + upsi: upsi, + Upsi: Upsi, + upsih: upsih, + Upsilon: Upsilon, + upsilon: upsilon, + UpTeeArrow: UpTeeArrow, + UpTee: UpTee, + upuparrows: upuparrows, + urcorn: urcorn, + urcorner: urcorner, + urcrop: urcrop, + Uring: Uring, + uring: uring, + urtri: urtri, + Uscr: Uscr, + uscr: uscr, + utdot: utdot, + Utilde: Utilde, + utilde: utilde, + utri: utri, + utrif: utrif, + uuarr: uuarr, + Uuml: Uuml, + uuml: uuml, + uwangle: uwangle, + vangrt: vangrt, + varepsilon: varepsilon, + varkappa: varkappa, + varnothing: varnothing, + varphi: varphi, + varpi: varpi, + varpropto: varpropto, + varr: varr, + vArr: vArr, + varrho: varrho, + varsigma: varsigma, + varsubsetneq: varsubsetneq, + varsubsetneqq: varsubsetneqq, + varsupsetneq: varsupsetneq, + varsupsetneqq: varsupsetneqq, + vartheta: vartheta, + vartriangleleft: vartriangleleft, + vartriangleright: vartriangleright, + vBar: vBar, + Vbar: Vbar, + vBarv: vBarv, + Vcy: Vcy, + vcy: vcy, + vdash: vdash, + vDash: vDash, + Vdash: Vdash, + VDash: VDash, + Vdashl: Vdashl, + veebar: veebar, + vee: vee, + Vee: Vee, + veeeq: veeeq, + vellip: vellip, + verbar: verbar, + Verbar: Verbar, + vert: vert, + Vert: Vert, + VerticalBar: VerticalBar, + VerticalLine: VerticalLine, + VerticalSeparator: VerticalSeparator, + VerticalTilde: VerticalTilde, + VeryThinSpace: VeryThinSpace, + Vfr: Vfr, + vfr: vfr, + vltri: vltri, + vnsub: vnsub, + vnsup: vnsup, + Vopf: Vopf, + vopf: vopf, + vprop: vprop, + vrtri: vrtri, + Vscr: Vscr, + vscr: vscr, + vsubnE: vsubnE, + vsubne: vsubne, + vsupnE: vsupnE, + vsupne: vsupne, + Vvdash: Vvdash, + vzigzag: vzigzag, + Wcirc: Wcirc, + wcirc: wcirc, + wedbar: wedbar, + wedge: wedge, + Wedge: Wedge, + wedgeq: wedgeq, + weierp: weierp, + Wfr: Wfr, + wfr: wfr, + Wopf: Wopf, + wopf: wopf, + wp: wp, + wr: wr, + wreath: wreath, + Wscr: Wscr, + wscr: wscr, + xcap: xcap, + xcirc: xcirc, + xcup: xcup, + xdtri: xdtri, + Xfr: Xfr, + xfr: xfr, + xharr: xharr, + xhArr: xhArr, + Xi: Xi, + xi: xi, + xlarr: xlarr, + xlArr: xlArr, + xmap: xmap, + xnis: xnis, + xodot: xodot, + Xopf: Xopf, + xopf: xopf, + xoplus: xoplus, + xotime: xotime, + xrarr: xrarr, + xrArr: xrArr, + Xscr: Xscr, + xscr: xscr, + xsqcup: xsqcup, + xuplus: xuplus, + xutri: xutri, + xvee: xvee, + xwedge: xwedge, + Yacute: Yacute, + yacute: yacute, + YAcy: YAcy, + yacy: yacy, + Ycirc: Ycirc, + ycirc: ycirc, + Ycy: Ycy, + ycy: ycy, + yen: yen, + Yfr: Yfr, + yfr: yfr, + YIcy: YIcy, + yicy: yicy, + Yopf: Yopf, + yopf: yopf, + Yscr: Yscr, + yscr: yscr, + YUcy: YUcy, + yucy: yucy, + yuml: yuml, + Yuml: Yuml, + Zacute: Zacute, + zacute: zacute, + Zcaron: Zcaron, + zcaron: zcaron, + Zcy: Zcy, + zcy: zcy, + Zdot: Zdot, + zdot: zdot, + zeetrf: zeetrf, + ZeroWidthSpace: ZeroWidthSpace, + Zeta: Zeta, + zeta: zeta, + zfr: zfr, + Zfr: Zfr, + ZHcy: ZHcy, + zhcy: zhcy, + zigrarr: zigrarr, + zopf: zopf, + Zopf: Zopf, + Zscr: Zscr, + zscr: zscr, + zwj: zwj, + zwnj: zwnj + }; + + var entities$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + Aacute: Aacute, + aacute: aacute, + Abreve: Abreve, + abreve: abreve, + ac: ac, + acd: acd, + acE: acE, + Acirc: Acirc, + acirc: acirc, + acute: acute, + Acy: Acy, + acy: acy, + AElig: AElig, + aelig: aelig, + af: af, + Afr: Afr, + afr: afr, + Agrave: Agrave, + agrave: agrave, + alefsym: alefsym, + aleph: aleph, + Alpha: Alpha, + alpha: alpha, + Amacr: Amacr, + amacr: amacr, + amalg: amalg, + amp: amp, + AMP: AMP, + andand: andand, + And: And, + and: and, + andd: andd, + andslope: andslope, + andv: andv, + ang: ang, + ange: ange, + angle: angle, + angmsdaa: angmsdaa, + angmsdab: angmsdab, + angmsdac: angmsdac, + angmsdad: angmsdad, + angmsdae: angmsdae, + angmsdaf: angmsdaf, + angmsdag: angmsdag, + angmsdah: angmsdah, + angmsd: angmsd, + angrt: angrt, + angrtvb: angrtvb, + angrtvbd: angrtvbd, + angsph: angsph, + angst: angst, + angzarr: angzarr, + Aogon: Aogon, + aogon: aogon, + Aopf: Aopf, + aopf: aopf, + apacir: apacir, + ap: ap, + apE: apE, + ape: ape, + apid: apid, + apos: apos, + ApplyFunction: ApplyFunction, + approx: approx, + approxeq: approxeq, + Aring: Aring, + aring: aring, + Ascr: Ascr, + ascr: ascr, + Assign: Assign, + ast: ast, + asymp: asymp, + asympeq: asympeq, + Atilde: Atilde, + atilde: atilde, + Auml: Auml, + auml: auml, + awconint: awconint, + awint: awint, + backcong: backcong, + backepsilon: backepsilon, + backprime: backprime, + backsim: backsim, + backsimeq: backsimeq, + Backslash: Backslash, + Barv: Barv, + barvee: barvee, + barwed: barwed, + Barwed: Barwed, + barwedge: barwedge, + bbrk: bbrk, + bbrktbrk: bbrktbrk, + bcong: bcong, + Bcy: Bcy, + bcy: bcy, + bdquo: bdquo, + becaus: becaus, + because: because, + Because: Because, + bemptyv: bemptyv, + bepsi: bepsi, + bernou: bernou, + Bernoullis: Bernoullis, + Beta: Beta, + beta: beta, + beth: beth, + between: between, + Bfr: Bfr, + bfr: bfr, + bigcap: bigcap, + bigcirc: bigcirc, + bigcup: bigcup, + bigodot: bigodot, + bigoplus: bigoplus, + bigotimes: bigotimes, + bigsqcup: bigsqcup, + bigstar: bigstar, + bigtriangledown: bigtriangledown, + bigtriangleup: bigtriangleup, + biguplus: biguplus, + bigvee: bigvee, + bigwedge: bigwedge, + bkarow: bkarow, + blacklozenge: blacklozenge, + blacksquare: blacksquare, + blacktriangle: blacktriangle, + blacktriangledown: blacktriangledown, + blacktriangleleft: blacktriangleleft, + blacktriangleright: blacktriangleright, + blank: blank, + blk12: blk12, + blk14: blk14, + blk34: blk34, + block: block, + bne: bne, + bnequiv: bnequiv, + bNot: bNot, + bnot: bnot, + Bopf: Bopf, + bopf: bopf, + bot: bot, + bottom: bottom, + bowtie: bowtie, + boxbox: boxbox, + boxdl: boxdl, + boxdL: boxdL, + boxDl: boxDl, + boxDL: boxDL, + boxdr: boxdr, + boxdR: boxdR, + boxDr: boxDr, + boxDR: boxDR, + boxh: boxh, + boxH: boxH, + boxhd: boxhd, + boxHd: boxHd, + boxhD: boxhD, + boxHD: boxHD, + boxhu: boxhu, + boxHu: boxHu, + boxhU: boxhU, + boxHU: boxHU, + boxminus: boxminus, + boxplus: boxplus, + boxtimes: boxtimes, + boxul: boxul, + boxuL: boxuL, + boxUl: boxUl, + boxUL: boxUL, + boxur: boxur, + boxuR: boxuR, + boxUr: boxUr, + boxUR: boxUR, + boxv: boxv, + boxV: boxV, + boxvh: boxvh, + boxvH: boxvH, + boxVh: boxVh, + boxVH: boxVH, + boxvl: boxvl, + boxvL: boxvL, + boxVl: boxVl, + boxVL: boxVL, + boxvr: boxvr, + boxvR: boxvR, + boxVr: boxVr, + boxVR: boxVR, + bprime: bprime, + breve: breve, + Breve: Breve, + brvbar: brvbar, + bscr: bscr, + Bscr: Bscr, + bsemi: bsemi, + bsim: bsim, + bsime: bsime, + bsolb: bsolb, + bsol: bsol, + bsolhsub: bsolhsub, + bull: bull, + bullet: bullet, + bump: bump, + bumpE: bumpE, + bumpe: bumpe, + Bumpeq: Bumpeq, + bumpeq: bumpeq, + Cacute: Cacute, + cacute: cacute, + capand: capand, + capbrcup: capbrcup, + capcap: capcap, + cap: cap, + Cap: Cap, + capcup: capcup, + capdot: capdot, + CapitalDifferentialD: CapitalDifferentialD, + caps: caps, + caret: caret, + caron: caron, + Cayleys: Cayleys, + ccaps: ccaps, + Ccaron: Ccaron, + ccaron: ccaron, + Ccedil: Ccedil, + ccedil: ccedil, + Ccirc: Ccirc, + ccirc: ccirc, + Cconint: Cconint, + ccups: ccups, + ccupssm: ccupssm, + Cdot: Cdot, + cdot: cdot, + cedil: cedil, + Cedilla: Cedilla, + cemptyv: cemptyv, + cent: cent, + centerdot: centerdot, + CenterDot: CenterDot, + cfr: cfr, + Cfr: Cfr, + CHcy: CHcy, + chcy: chcy, + check: check, + checkmark: checkmark, + Chi: Chi, + chi: chi, + circ: circ, + circeq: circeq, + circlearrowleft: circlearrowleft, + circlearrowright: circlearrowright, + circledast: circledast, + circledcirc: circledcirc, + circleddash: circleddash, + CircleDot: CircleDot, + circledR: circledR, + circledS: circledS, + CircleMinus: CircleMinus, + CirclePlus: CirclePlus, + CircleTimes: CircleTimes, + cir: cir, + cirE: cirE, + cire: cire, + cirfnint: cirfnint, + cirmid: cirmid, + cirscir: cirscir, + ClockwiseContourIntegral: ClockwiseContourIntegral, + CloseCurlyDoubleQuote: CloseCurlyDoubleQuote, + CloseCurlyQuote: CloseCurlyQuote, + clubs: clubs, + clubsuit: clubsuit, + colon: colon, + Colon: Colon, + Colone: Colone, + colone: colone, + coloneq: coloneq, + comma: comma, + commat: commat, + comp: comp, + compfn: compfn, + complement: complement, + complexes: complexes, + cong: cong, + congdot: congdot, + Congruent: Congruent, + conint: conint, + Conint: Conint, + ContourIntegral: ContourIntegral, + copf: copf, + Copf: Copf, + coprod: coprod, + Coproduct: Coproduct, + copy: copy, + COPY: COPY, + copysr: copysr, + CounterClockwiseContourIntegral: CounterClockwiseContourIntegral, + crarr: crarr, + cross: cross, + Cross: Cross, + Cscr: Cscr, + cscr: cscr, + csub: csub, + csube: csube, + csup: csup, + csupe: csupe, + ctdot: ctdot, + cudarrl: cudarrl, + cudarrr: cudarrr, + cuepr: cuepr, + cuesc: cuesc, + cularr: cularr, + cularrp: cularrp, + cupbrcap: cupbrcap, + cupcap: cupcap, + CupCap: CupCap, + cup: cup, + Cup: Cup, + cupcup: cupcup, + cupdot: cupdot, + cupor: cupor, + cups: cups, + curarr: curarr, + curarrm: curarrm, + curlyeqprec: curlyeqprec, + curlyeqsucc: curlyeqsucc, + curlyvee: curlyvee, + curlywedge: curlywedge, + curren: curren, + curvearrowleft: curvearrowleft, + curvearrowright: curvearrowright, + cuvee: cuvee, + cuwed: cuwed, + cwconint: cwconint, + cwint: cwint, + cylcty: cylcty, + dagger: dagger, + Dagger: Dagger, + daleth: daleth, + darr: darr, + Darr: Darr, + dArr: dArr, + dash: dash, + Dashv: Dashv, + dashv: dashv, + dbkarow: dbkarow, + dblac: dblac, + Dcaron: Dcaron, + dcaron: dcaron, + Dcy: Dcy, + dcy: dcy, + ddagger: ddagger, + ddarr: ddarr, + DD: DD, + dd: dd, + DDotrahd: DDotrahd, + ddotseq: ddotseq, + deg: deg, + Del: Del, + Delta: Delta, + delta: delta, + demptyv: demptyv, + dfisht: dfisht, + Dfr: Dfr, + dfr: dfr, + dHar: dHar, + dharl: dharl, + dharr: dharr, + DiacriticalAcute: DiacriticalAcute, + DiacriticalDot: DiacriticalDot, + DiacriticalDoubleAcute: DiacriticalDoubleAcute, + DiacriticalGrave: DiacriticalGrave, + DiacriticalTilde: DiacriticalTilde, + diam: diam, + diamond: diamond, + Diamond: Diamond, + diamondsuit: diamondsuit, + diams: diams, + die: die, + DifferentialD: DifferentialD, + digamma: digamma, + disin: disin, + div: div, + divide: divide, + divideontimes: divideontimes, + divonx: divonx, + DJcy: DJcy, + djcy: djcy, + dlcorn: dlcorn, + dlcrop: dlcrop, + dollar: dollar, + Dopf: Dopf, + dopf: dopf, + Dot: Dot, + dot: dot, + DotDot: DotDot, + doteq: doteq, + doteqdot: doteqdot, + DotEqual: DotEqual, + dotminus: dotminus, + dotplus: dotplus, + dotsquare: dotsquare, + doublebarwedge: doublebarwedge, + DoubleContourIntegral: DoubleContourIntegral, + DoubleDot: DoubleDot, + DoubleDownArrow: DoubleDownArrow, + DoubleLeftArrow: DoubleLeftArrow, + DoubleLeftRightArrow: DoubleLeftRightArrow, + DoubleLeftTee: DoubleLeftTee, + DoubleLongLeftArrow: DoubleLongLeftArrow, + DoubleLongLeftRightArrow: DoubleLongLeftRightArrow, + DoubleLongRightArrow: DoubleLongRightArrow, + DoubleRightArrow: DoubleRightArrow, + DoubleRightTee: DoubleRightTee, + DoubleUpArrow: DoubleUpArrow, + DoubleUpDownArrow: DoubleUpDownArrow, + DoubleVerticalBar: DoubleVerticalBar, + DownArrowBar: DownArrowBar, + downarrow: downarrow, + DownArrow: DownArrow, + Downarrow: Downarrow, + DownArrowUpArrow: DownArrowUpArrow, + DownBreve: DownBreve, + downdownarrows: downdownarrows, + downharpoonleft: downharpoonleft, + downharpoonright: downharpoonright, + DownLeftRightVector: DownLeftRightVector, + DownLeftTeeVector: DownLeftTeeVector, + DownLeftVectorBar: DownLeftVectorBar, + DownLeftVector: DownLeftVector, + DownRightTeeVector: DownRightTeeVector, + DownRightVectorBar: DownRightVectorBar, + DownRightVector: DownRightVector, + DownTeeArrow: DownTeeArrow, + DownTee: DownTee, + drbkarow: drbkarow, + drcorn: drcorn, + drcrop: drcrop, + Dscr: Dscr, + dscr: dscr, + DScy: DScy, + dscy: dscy, + dsol: dsol, + Dstrok: Dstrok, + dstrok: dstrok, + dtdot: dtdot, + dtri: dtri, + dtrif: dtrif, + duarr: duarr, + duhar: duhar, + dwangle: dwangle, + DZcy: DZcy, + dzcy: dzcy, + dzigrarr: dzigrarr, + Eacute: Eacute, + eacute: eacute, + easter: easter, + Ecaron: Ecaron, + ecaron: ecaron, + Ecirc: Ecirc, + ecirc: ecirc, + ecir: ecir, + ecolon: ecolon, + Ecy: Ecy, + ecy: ecy, + eDDot: eDDot, + Edot: Edot, + edot: edot, + eDot: eDot, + ee: ee, + efDot: efDot, + Efr: Efr, + efr: efr, + eg: eg, + Egrave: Egrave, + egrave: egrave, + egs: egs, + egsdot: egsdot, + el: el, + Element: Element, + elinters: elinters, + ell: ell, + els: els, + elsdot: elsdot, + Emacr: Emacr, + emacr: emacr, + empty: empty, + emptyset: emptyset, + EmptySmallSquare: EmptySmallSquare, + emptyv: emptyv, + EmptyVerySmallSquare: EmptyVerySmallSquare, + emsp13: emsp13, + emsp14: emsp14, + emsp: emsp, + ENG: ENG, + eng: eng, + ensp: ensp, + Eogon: Eogon, + eogon: eogon, + Eopf: Eopf, + eopf: eopf, + epar: epar, + eparsl: eparsl, + eplus: eplus, + epsi: epsi, + Epsilon: Epsilon, + epsilon: epsilon, + epsiv: epsiv, + eqcirc: eqcirc, + eqcolon: eqcolon, + eqsim: eqsim, + eqslantgtr: eqslantgtr, + eqslantless: eqslantless, + Equal: Equal, + equals: equals, + EqualTilde: EqualTilde, + equest: equest, + Equilibrium: Equilibrium, + equiv: equiv, + equivDD: equivDD, + eqvparsl: eqvparsl, + erarr: erarr, + erDot: erDot, + escr: escr, + Escr: Escr, + esdot: esdot, + Esim: Esim, + esim: esim, + Eta: Eta, + eta: eta, + ETH: ETH, + eth: eth, + Euml: Euml, + euml: euml, + euro: euro, + excl: excl, + exist: exist, + Exists: Exists, + expectation: expectation, + exponentiale: exponentiale, + ExponentialE: ExponentialE, + fallingdotseq: fallingdotseq, + Fcy: Fcy, + fcy: fcy, + female: female, + ffilig: ffilig, + fflig: fflig, + ffllig: ffllig, + Ffr: Ffr, + ffr: ffr, + filig: filig, + FilledSmallSquare: FilledSmallSquare, + FilledVerySmallSquare: FilledVerySmallSquare, + fjlig: fjlig, + flat: flat, + fllig: fllig, + fltns: fltns, + fnof: fnof, + Fopf: Fopf, + fopf: fopf, + forall: forall, + ForAll: ForAll, + fork: fork, + forkv: forkv, + Fouriertrf: Fouriertrf, + fpartint: fpartint, + frac12: frac12, + frac13: frac13, + frac14: frac14, + frac15: frac15, + frac16: frac16, + frac18: frac18, + frac23: frac23, + frac25: frac25, + frac34: frac34, + frac35: frac35, + frac38: frac38, + frac45: frac45, + frac56: frac56, + frac58: frac58, + frac78: frac78, + frasl: frasl, + frown: frown, + fscr: fscr, + Fscr: Fscr, + gacute: gacute, + Gamma: Gamma, + gamma: gamma, + Gammad: Gammad, + gammad: gammad, + gap: gap, + Gbreve: Gbreve, + gbreve: gbreve, + Gcedil: Gcedil, + Gcirc: Gcirc, + gcirc: gcirc, + Gcy: Gcy, + gcy: gcy, + Gdot: Gdot, + gdot: gdot, + ge: ge, + gE: gE, + gEl: gEl, + gel: gel, + geq: geq, + geqq: geqq, + geqslant: geqslant, + gescc: gescc, + ges: ges, + gesdot: gesdot, + gesdoto: gesdoto, + gesdotol: gesdotol, + gesl: gesl, + gesles: gesles, + Gfr: Gfr, + gfr: gfr, + gg: gg, + Gg: Gg, + ggg: ggg, + gimel: gimel, + GJcy: GJcy, + gjcy: gjcy, + gla: gla, + gl: gl, + glE: glE, + glj: glj, + gnap: gnap, + gnapprox: gnapprox, + gne: gne, + gnE: gnE, + gneq: gneq, + gneqq: gneqq, + gnsim: gnsim, + Gopf: Gopf, + gopf: gopf, + grave: grave, + GreaterEqual: GreaterEqual, + GreaterEqualLess: GreaterEqualLess, + GreaterFullEqual: GreaterFullEqual, + GreaterGreater: GreaterGreater, + GreaterLess: GreaterLess, + GreaterSlantEqual: GreaterSlantEqual, + GreaterTilde: GreaterTilde, + Gscr: Gscr, + gscr: gscr, + gsim: gsim, + gsime: gsime, + gsiml: gsiml, + gtcc: gtcc, + gtcir: gtcir, + gt: gt, + GT: GT, + Gt: Gt, + gtdot: gtdot, + gtlPar: gtlPar, + gtquest: gtquest, + gtrapprox: gtrapprox, + gtrarr: gtrarr, + gtrdot: gtrdot, + gtreqless: gtreqless, + gtreqqless: gtreqqless, + gtrless: gtrless, + gtrsim: gtrsim, + gvertneqq: gvertneqq, + gvnE: gvnE, + Hacek: Hacek, + hairsp: hairsp, + half: half, + hamilt: hamilt, + HARDcy: HARDcy, + hardcy: hardcy, + harrcir: harrcir, + harr: harr, + hArr: hArr, + harrw: harrw, + Hat: Hat, + hbar: hbar, + Hcirc: Hcirc, + hcirc: hcirc, + hearts: hearts, + heartsuit: heartsuit, + hellip: hellip, + hercon: hercon, + hfr: hfr, + Hfr: Hfr, + HilbertSpace: HilbertSpace, + hksearow: hksearow, + hkswarow: hkswarow, + hoarr: hoarr, + homtht: homtht, + hookleftarrow: hookleftarrow, + hookrightarrow: hookrightarrow, + hopf: hopf, + Hopf: Hopf, + horbar: horbar, + HorizontalLine: HorizontalLine, + hscr: hscr, + Hscr: Hscr, + hslash: hslash, + Hstrok: Hstrok, + hstrok: hstrok, + HumpDownHump: HumpDownHump, + HumpEqual: HumpEqual, + hybull: hybull, + hyphen: hyphen, + Iacute: Iacute, + iacute: iacute, + ic: ic, + Icirc: Icirc, + icirc: icirc, + Icy: Icy, + icy: icy, + Idot: Idot, + IEcy: IEcy, + iecy: iecy, + iexcl: iexcl, + iff: iff, + ifr: ifr, + Ifr: Ifr, + Igrave: Igrave, + igrave: igrave, + ii: ii, + iiiint: iiiint, + iiint: iiint, + iinfin: iinfin, + iiota: iiota, + IJlig: IJlig, + ijlig: ijlig, + Imacr: Imacr, + imacr: imacr, + image: image, + ImaginaryI: ImaginaryI, + imagline: imagline, + imagpart: imagpart, + imath: imath, + Im: Im, + imof: imof, + imped: imped, + Implies: Implies, + incare: incare, + infin: infin, + infintie: infintie, + inodot: inodot, + intcal: intcal, + int: int, + Int: Int, + integers: integers, + Integral: Integral, + intercal: intercal, + Intersection: Intersection, + intlarhk: intlarhk, + intprod: intprod, + InvisibleComma: InvisibleComma, + InvisibleTimes: InvisibleTimes, + IOcy: IOcy, + iocy: iocy, + Iogon: Iogon, + iogon: iogon, + Iopf: Iopf, + iopf: iopf, + Iota: Iota, + iota: iota, + iprod: iprod, + iquest: iquest, + iscr: iscr, + Iscr: Iscr, + isin: isin, + isindot: isindot, + isinE: isinE, + isins: isins, + isinsv: isinsv, + isinv: isinv, + it: it, + Itilde: Itilde, + itilde: itilde, + Iukcy: Iukcy, + iukcy: iukcy, + Iuml: Iuml, + iuml: iuml, + Jcirc: Jcirc, + jcirc: jcirc, + Jcy: Jcy, + jcy: jcy, + Jfr: Jfr, + jfr: jfr, + jmath: jmath, + Jopf: Jopf, + jopf: jopf, + Jscr: Jscr, + jscr: jscr, + Jsercy: Jsercy, + jsercy: jsercy, + Jukcy: Jukcy, + jukcy: jukcy, + Kappa: Kappa, + kappa: kappa, + kappav: kappav, + Kcedil: Kcedil, + kcedil: kcedil, + Kcy: Kcy, + kcy: kcy, + Kfr: Kfr, + kfr: kfr, + kgreen: kgreen, + KHcy: KHcy, + khcy: khcy, + KJcy: KJcy, + kjcy: kjcy, + Kopf: Kopf, + kopf: kopf, + Kscr: Kscr, + kscr: kscr, + lAarr: lAarr, + Lacute: Lacute, + lacute: lacute, + laemptyv: laemptyv, + lagran: lagran, + Lambda: Lambda, + lambda: lambda, + lang: lang, + Lang: Lang, + langd: langd, + langle: langle, + lap: lap, + Laplacetrf: Laplacetrf, + laquo: laquo, + larrb: larrb, + larrbfs: larrbfs, + larr: larr, + Larr: Larr, + lArr: lArr, + larrfs: larrfs, + larrhk: larrhk, + larrlp: larrlp, + larrpl: larrpl, + larrsim: larrsim, + larrtl: larrtl, + latail: latail, + lAtail: lAtail, + lat: lat, + late: late, + lates: lates, + lbarr: lbarr, + lBarr: lBarr, + lbbrk: lbbrk, + lbrace: lbrace, + lbrack: lbrack, + lbrke: lbrke, + lbrksld: lbrksld, + lbrkslu: lbrkslu, + Lcaron: Lcaron, + lcaron: lcaron, + Lcedil: Lcedil, + lcedil: lcedil, + lceil: lceil, + lcub: lcub, + Lcy: Lcy, + lcy: lcy, + ldca: ldca, + ldquo: ldquo, + ldquor: ldquor, + ldrdhar: ldrdhar, + ldrushar: ldrushar, + ldsh: ldsh, + le: le, + lE: lE, + LeftAngleBracket: LeftAngleBracket, + LeftArrowBar: LeftArrowBar, + leftarrow: leftarrow, + LeftArrow: LeftArrow, + Leftarrow: Leftarrow, + LeftArrowRightArrow: LeftArrowRightArrow, + leftarrowtail: leftarrowtail, + LeftCeiling: LeftCeiling, + LeftDoubleBracket: LeftDoubleBracket, + LeftDownTeeVector: LeftDownTeeVector, + LeftDownVectorBar: LeftDownVectorBar, + LeftDownVector: LeftDownVector, + LeftFloor: LeftFloor, + leftharpoondown: leftharpoondown, + leftharpoonup: leftharpoonup, + leftleftarrows: leftleftarrows, + leftrightarrow: leftrightarrow, + LeftRightArrow: LeftRightArrow, + Leftrightarrow: Leftrightarrow, + leftrightarrows: leftrightarrows, + leftrightharpoons: leftrightharpoons, + leftrightsquigarrow: leftrightsquigarrow, + LeftRightVector: LeftRightVector, + LeftTeeArrow: LeftTeeArrow, + LeftTee: LeftTee, + LeftTeeVector: LeftTeeVector, + leftthreetimes: leftthreetimes, + LeftTriangleBar: LeftTriangleBar, + LeftTriangle: LeftTriangle, + LeftTriangleEqual: LeftTriangleEqual, + LeftUpDownVector: LeftUpDownVector, + LeftUpTeeVector: LeftUpTeeVector, + LeftUpVectorBar: LeftUpVectorBar, + LeftUpVector: LeftUpVector, + LeftVectorBar: LeftVectorBar, + LeftVector: LeftVector, + lEg: lEg, + leg: leg, + leq: leq, + leqq: leqq, + leqslant: leqslant, + lescc: lescc, + les: les, + lesdot: lesdot, + lesdoto: lesdoto, + lesdotor: lesdotor, + lesg: lesg, + lesges: lesges, + lessapprox: lessapprox, + lessdot: lessdot, + lesseqgtr: lesseqgtr, + lesseqqgtr: lesseqqgtr, + LessEqualGreater: LessEqualGreater, + LessFullEqual: LessFullEqual, + LessGreater: LessGreater, + lessgtr: lessgtr, + LessLess: LessLess, + lesssim: lesssim, + LessSlantEqual: LessSlantEqual, + LessTilde: LessTilde, + lfisht: lfisht, + lfloor: lfloor, + Lfr: Lfr, + lfr: lfr, + lg: lg, + lgE: lgE, + lHar: lHar, + lhard: lhard, + lharu: lharu, + lharul: lharul, + lhblk: lhblk, + LJcy: LJcy, + ljcy: ljcy, + llarr: llarr, + ll: ll, + Ll: Ll, + llcorner: llcorner, + Lleftarrow: Lleftarrow, + llhard: llhard, + lltri: lltri, + Lmidot: Lmidot, + lmidot: lmidot, + lmoustache: lmoustache, + lmoust: lmoust, + lnap: lnap, + lnapprox: lnapprox, + lne: lne, + lnE: lnE, + lneq: lneq, + lneqq: lneqq, + lnsim: lnsim, + loang: loang, + loarr: loarr, + lobrk: lobrk, + longleftarrow: longleftarrow, + LongLeftArrow: LongLeftArrow, + Longleftarrow: Longleftarrow, + longleftrightarrow: longleftrightarrow, + LongLeftRightArrow: LongLeftRightArrow, + Longleftrightarrow: Longleftrightarrow, + longmapsto: longmapsto, + longrightarrow: longrightarrow, + LongRightArrow: LongRightArrow, + Longrightarrow: Longrightarrow, + looparrowleft: looparrowleft, + looparrowright: looparrowright, + lopar: lopar, + Lopf: Lopf, + lopf: lopf, + loplus: loplus, + lotimes: lotimes, + lowast: lowast, + lowbar: lowbar, + LowerLeftArrow: LowerLeftArrow, + LowerRightArrow: LowerRightArrow, + loz: loz, + lozenge: lozenge, + lozf: lozf, + lpar: lpar, + lparlt: lparlt, + lrarr: lrarr, + lrcorner: lrcorner, + lrhar: lrhar, + lrhard: lrhard, + lrm: lrm, + lrtri: lrtri, + lsaquo: lsaquo, + lscr: lscr, + Lscr: Lscr, + lsh: lsh, + Lsh: Lsh, + lsim: lsim, + lsime: lsime, + lsimg: lsimg, + lsqb: lsqb, + lsquo: lsquo, + lsquor: lsquor, + Lstrok: Lstrok, + lstrok: lstrok, + ltcc: ltcc, + ltcir: ltcir, + lt: lt, + LT: LT, + Lt: Lt, + ltdot: ltdot, + lthree: lthree, + ltimes: ltimes, + ltlarr: ltlarr, + ltquest: ltquest, + ltri: ltri, + ltrie: ltrie, + ltrif: ltrif, + ltrPar: ltrPar, + lurdshar: lurdshar, + luruhar: luruhar, + lvertneqq: lvertneqq, + lvnE: lvnE, + macr: macr, + male: male, + malt: malt, + maltese: maltese, + map: map, + mapsto: mapsto, + mapstodown: mapstodown, + mapstoleft: mapstoleft, + mapstoup: mapstoup, + marker: marker, + mcomma: mcomma, + Mcy: Mcy, + mcy: mcy, + mdash: mdash, + mDDot: mDDot, + measuredangle: measuredangle, + MediumSpace: MediumSpace, + Mellintrf: Mellintrf, + Mfr: Mfr, + mfr: mfr, + mho: mho, + micro: micro, + midast: midast, + midcir: midcir, + mid: mid, + middot: middot, + minusb: minusb, + minus: minus, + minusd: minusd, + minusdu: minusdu, + MinusPlus: MinusPlus, + mlcp: mlcp, + mldr: mldr, + mnplus: mnplus, + models: models, + Mopf: Mopf, + mopf: mopf, + mp: mp, + mscr: mscr, + Mscr: Mscr, + mstpos: mstpos, + Mu: Mu, + mu: mu, + multimap: multimap, + mumap: mumap, + nabla: nabla, + Nacute: Nacute, + nacute: nacute, + nang: nang, + nap: nap, + napE: napE, + napid: napid, + napos: napos, + napprox: napprox, + natural: natural, + naturals: naturals, + natur: natur, + nbsp: nbsp, + nbump: nbump, + nbumpe: nbumpe, + ncap: ncap, + Ncaron: Ncaron, + ncaron: ncaron, + Ncedil: Ncedil, + ncedil: ncedil, + ncong: ncong, + ncongdot: ncongdot, + ncup: ncup, + Ncy: Ncy, + ncy: ncy, + ndash: ndash, + nearhk: nearhk, + nearr: nearr, + neArr: neArr, + nearrow: nearrow, + ne: ne, + nedot: nedot, + NegativeMediumSpace: NegativeMediumSpace, + NegativeThickSpace: NegativeThickSpace, + NegativeThinSpace: NegativeThinSpace, + NegativeVeryThinSpace: NegativeVeryThinSpace, + nequiv: nequiv, + nesear: nesear, + nesim: nesim, + NestedGreaterGreater: NestedGreaterGreater, + NestedLessLess: NestedLessLess, + NewLine: NewLine, + nexist: nexist, + nexists: nexists, + Nfr: Nfr, + nfr: nfr, + ngE: ngE, + nge: nge, + ngeq: ngeq, + ngeqq: ngeqq, + ngeqslant: ngeqslant, + nges: nges, + nGg: nGg, + ngsim: ngsim, + nGt: nGt, + ngt: ngt, + ngtr: ngtr, + nGtv: nGtv, + nharr: nharr, + nhArr: nhArr, + nhpar: nhpar, + ni: ni, + nis: nis, + nisd: nisd, + niv: niv, + NJcy: NJcy, + njcy: njcy, + nlarr: nlarr, + nlArr: nlArr, + nldr: nldr, + nlE: nlE, + nle: nle, + nleftarrow: nleftarrow, + nLeftarrow: nLeftarrow, + nleftrightarrow: nleftrightarrow, + nLeftrightarrow: nLeftrightarrow, + nleq: nleq, + nleqq: nleqq, + nleqslant: nleqslant, + nles: nles, + nless: nless, + nLl: nLl, + nlsim: nlsim, + nLt: nLt, + nlt: nlt, + nltri: nltri, + nltrie: nltrie, + nLtv: nLtv, + nmid: nmid, + NoBreak: NoBreak, + NonBreakingSpace: NonBreakingSpace, + nopf: nopf, + Nopf: Nopf, + Not: Not, + not: not, + NotCongruent: NotCongruent, + NotCupCap: NotCupCap, + NotDoubleVerticalBar: NotDoubleVerticalBar, + NotElement: NotElement, + NotEqual: NotEqual, + NotEqualTilde: NotEqualTilde, + NotExists: NotExists, + NotGreater: NotGreater, + NotGreaterEqual: NotGreaterEqual, + NotGreaterFullEqual: NotGreaterFullEqual, + NotGreaterGreater: NotGreaterGreater, + NotGreaterLess: NotGreaterLess, + NotGreaterSlantEqual: NotGreaterSlantEqual, + NotGreaterTilde: NotGreaterTilde, + NotHumpDownHump: NotHumpDownHump, + NotHumpEqual: NotHumpEqual, + notin: notin, + notindot: notindot, + notinE: notinE, + notinva: notinva, + notinvb: notinvb, + notinvc: notinvc, + NotLeftTriangleBar: NotLeftTriangleBar, + NotLeftTriangle: NotLeftTriangle, + NotLeftTriangleEqual: NotLeftTriangleEqual, + NotLess: NotLess, + NotLessEqual: NotLessEqual, + NotLessGreater: NotLessGreater, + NotLessLess: NotLessLess, + NotLessSlantEqual: NotLessSlantEqual, + NotLessTilde: NotLessTilde, + NotNestedGreaterGreater: NotNestedGreaterGreater, + NotNestedLessLess: NotNestedLessLess, + notni: notni, + notniva: notniva, + notnivb: notnivb, + notnivc: notnivc, + NotPrecedes: NotPrecedes, + NotPrecedesEqual: NotPrecedesEqual, + NotPrecedesSlantEqual: NotPrecedesSlantEqual, + NotReverseElement: NotReverseElement, + NotRightTriangleBar: NotRightTriangleBar, + NotRightTriangle: NotRightTriangle, + NotRightTriangleEqual: NotRightTriangleEqual, + NotSquareSubset: NotSquareSubset, + NotSquareSubsetEqual: NotSquareSubsetEqual, + NotSquareSuperset: NotSquareSuperset, + NotSquareSupersetEqual: NotSquareSupersetEqual, + NotSubset: NotSubset, + NotSubsetEqual: NotSubsetEqual, + NotSucceeds: NotSucceeds, + NotSucceedsEqual: NotSucceedsEqual, + NotSucceedsSlantEqual: NotSucceedsSlantEqual, + NotSucceedsTilde: NotSucceedsTilde, + NotSuperset: NotSuperset, + NotSupersetEqual: NotSupersetEqual, + NotTilde: NotTilde, + NotTildeEqual: NotTildeEqual, + NotTildeFullEqual: NotTildeFullEqual, + NotTildeTilde: NotTildeTilde, + NotVerticalBar: NotVerticalBar, + nparallel: nparallel, + npar: npar, + nparsl: nparsl, + npart: npart, + npolint: npolint, + npr: npr, + nprcue: nprcue, + nprec: nprec, + npreceq: npreceq, + npre: npre, + nrarrc: nrarrc, + nrarr: nrarr, + nrArr: nrArr, + nrarrw: nrarrw, + nrightarrow: nrightarrow, + nRightarrow: nRightarrow, + nrtri: nrtri, + nrtrie: nrtrie, + nsc: nsc, + nsccue: nsccue, + nsce: nsce, + Nscr: Nscr, + nscr: nscr, + nshortmid: nshortmid, + nshortparallel: nshortparallel, + nsim: nsim, + nsime: nsime, + nsimeq: nsimeq, + nsmid: nsmid, + nspar: nspar, + nsqsube: nsqsube, + nsqsupe: nsqsupe, + nsub: nsub, + nsubE: nsubE, + nsube: nsube, + nsubset: nsubset, + nsubseteq: nsubseteq, + nsubseteqq: nsubseteqq, + nsucc: nsucc, + nsucceq: nsucceq, + nsup: nsup, + nsupE: nsupE, + nsupe: nsupe, + nsupset: nsupset, + nsupseteq: nsupseteq, + nsupseteqq: nsupseteqq, + ntgl: ntgl, + Ntilde: Ntilde, + ntilde: ntilde, + ntlg: ntlg, + ntriangleleft: ntriangleleft, + ntrianglelefteq: ntrianglelefteq, + ntriangleright: ntriangleright, + ntrianglerighteq: ntrianglerighteq, + Nu: Nu, + nu: nu, + num: num, + numero: numero, + numsp: numsp, + nvap: nvap, + nvdash: nvdash, + nvDash: nvDash, + nVdash: nVdash, + nVDash: nVDash, + nvge: nvge, + nvgt: nvgt, + nvHarr: nvHarr, + nvinfin: nvinfin, + nvlArr: nvlArr, + nvle: nvle, + nvlt: nvlt, + nvltrie: nvltrie, + nvrArr: nvrArr, + nvrtrie: nvrtrie, + nvsim: nvsim, + nwarhk: nwarhk, + nwarr: nwarr, + nwArr: nwArr, + nwarrow: nwarrow, + nwnear: nwnear, + Oacute: Oacute, + oacute: oacute, + oast: oast, + Ocirc: Ocirc, + ocirc: ocirc, + ocir: ocir, + Ocy: Ocy, + ocy: ocy, + odash: odash, + Odblac: Odblac, + odblac: odblac, + odiv: odiv, + odot: odot, + odsold: odsold, + OElig: OElig, + oelig: oelig, + ofcir: ofcir, + Ofr: Ofr, + ofr: ofr, + ogon: ogon, + Ograve: Ograve, + ograve: ograve, + ogt: ogt, + ohbar: ohbar, + ohm: ohm, + oint: oint, + olarr: olarr, + olcir: olcir, + olcross: olcross, + oline: oline, + olt: olt, + Omacr: Omacr, + omacr: omacr, + Omega: Omega, + omega: omega, + Omicron: Omicron, + omicron: omicron, + omid: omid, + ominus: ominus, + Oopf: Oopf, + oopf: oopf, + opar: opar, + OpenCurlyDoubleQuote: OpenCurlyDoubleQuote, + OpenCurlyQuote: OpenCurlyQuote, + operp: operp, + oplus: oplus, + orarr: orarr, + Or: Or, + or: or, + ord: ord, + order: order, + orderof: orderof, + ordf: ordf, + ordm: ordm, + origof: origof, + oror: oror, + orslope: orslope, + orv: orv, + oS: oS, + Oscr: Oscr, + oscr: oscr, + Oslash: Oslash, + oslash: oslash, + osol: osol, + Otilde: Otilde, + otilde: otilde, + otimesas: otimesas, + Otimes: Otimes, + otimes: otimes, + Ouml: Ouml, + ouml: ouml, + ovbar: ovbar, + OverBar: OverBar, + OverBrace: OverBrace, + OverBracket: OverBracket, + OverParenthesis: OverParenthesis, + para: para, + parallel: parallel, + par: par, + parsim: parsim, + parsl: parsl, + part: part, + PartialD: PartialD, + Pcy: Pcy, + pcy: pcy, + percnt: percnt, + period: period, + permil: permil, + perp: perp, + pertenk: pertenk, + Pfr: Pfr, + pfr: pfr, + Phi: Phi, + phi: phi, + phiv: phiv, + phmmat: phmmat, + phone: phone, + Pi: Pi, + pi: pi, + pitchfork: pitchfork, + piv: piv, + planck: planck, + planckh: planckh, + plankv: plankv, + plusacir: plusacir, + plusb: plusb, + pluscir: pluscir, + plus: plus, + plusdo: plusdo, + plusdu: plusdu, + pluse: pluse, + PlusMinus: PlusMinus, + plusmn: plusmn, + plussim: plussim, + plustwo: plustwo, + pm: pm, + Poincareplane: Poincareplane, + pointint: pointint, + popf: popf, + Popf: Popf, + pound: pound, + prap: prap, + Pr: Pr, + pr: pr, + prcue: prcue, + precapprox: precapprox, + prec: prec, + preccurlyeq: preccurlyeq, + Precedes: Precedes, + PrecedesEqual: PrecedesEqual, + PrecedesSlantEqual: PrecedesSlantEqual, + PrecedesTilde: PrecedesTilde, + preceq: preceq, + precnapprox: precnapprox, + precneqq: precneqq, + precnsim: precnsim, + pre: pre, + prE: prE, + precsim: precsim, + prime: prime, + Prime: Prime, + primes: primes, + prnap: prnap, + prnE: prnE, + prnsim: prnsim, + prod: prod, + Product: Product, + profalar: profalar, + profline: profline, + profsurf: profsurf, + prop: prop, + Proportional: Proportional, + Proportion: Proportion, + propto: propto, + prsim: prsim, + prurel: prurel, + Pscr: Pscr, + pscr: pscr, + Psi: Psi, + psi: psi, + puncsp: puncsp, + Qfr: Qfr, + qfr: qfr, + qint: qint, + qopf: qopf, + Qopf: Qopf, + qprime: qprime, + Qscr: Qscr, + qscr: qscr, + quaternions: quaternions, + quatint: quatint, + quest: quest, + questeq: questeq, + quot: quot, + QUOT: QUOT, + rAarr: rAarr, + race: race, + Racute: Racute, + racute: racute, + radic: radic, + raemptyv: raemptyv, + rang: rang, + Rang: Rang, + rangd: rangd, + range: range, + rangle: rangle, + raquo: raquo, + rarrap: rarrap, + rarrb: rarrb, + rarrbfs: rarrbfs, + rarrc: rarrc, + rarr: rarr, + Rarr: Rarr, + rArr: rArr, + rarrfs: rarrfs, + rarrhk: rarrhk, + rarrlp: rarrlp, + rarrpl: rarrpl, + rarrsim: rarrsim, + Rarrtl: Rarrtl, + rarrtl: rarrtl, + rarrw: rarrw, + ratail: ratail, + rAtail: rAtail, + ratio: ratio, + rationals: rationals, + rbarr: rbarr, + rBarr: rBarr, + RBarr: RBarr, + rbbrk: rbbrk, + rbrace: rbrace, + rbrack: rbrack, + rbrke: rbrke, + rbrksld: rbrksld, + rbrkslu: rbrkslu, + Rcaron: Rcaron, + rcaron: rcaron, + Rcedil: Rcedil, + rcedil: rcedil, + rceil: rceil, + rcub: rcub, + Rcy: Rcy, + rcy: rcy, + rdca: rdca, + rdldhar: rdldhar, + rdquo: rdquo, + rdquor: rdquor, + rdsh: rdsh, + real: real, + realine: realine, + realpart: realpart, + reals: reals, + Re: Re, + rect: rect, + reg: reg, + REG: REG, + ReverseElement: ReverseElement, + ReverseEquilibrium: ReverseEquilibrium, + ReverseUpEquilibrium: ReverseUpEquilibrium, + rfisht: rfisht, + rfloor: rfloor, + rfr: rfr, + Rfr: Rfr, + rHar: rHar, + rhard: rhard, + rharu: rharu, + rharul: rharul, + Rho: Rho, + rho: rho, + rhov: rhov, + RightAngleBracket: RightAngleBracket, + RightArrowBar: RightArrowBar, + rightarrow: rightarrow, + RightArrow: RightArrow, + Rightarrow: Rightarrow, + RightArrowLeftArrow: RightArrowLeftArrow, + rightarrowtail: rightarrowtail, + RightCeiling: RightCeiling, + RightDoubleBracket: RightDoubleBracket, + RightDownTeeVector: RightDownTeeVector, + RightDownVectorBar: RightDownVectorBar, + RightDownVector: RightDownVector, + RightFloor: RightFloor, + rightharpoondown: rightharpoondown, + rightharpoonup: rightharpoonup, + rightleftarrows: rightleftarrows, + rightleftharpoons: rightleftharpoons, + rightrightarrows: rightrightarrows, + rightsquigarrow: rightsquigarrow, + RightTeeArrow: RightTeeArrow, + RightTee: RightTee, + RightTeeVector: RightTeeVector, + rightthreetimes: rightthreetimes, + RightTriangleBar: RightTriangleBar, + RightTriangle: RightTriangle, + RightTriangleEqual: RightTriangleEqual, + RightUpDownVector: RightUpDownVector, + RightUpTeeVector: RightUpTeeVector, + RightUpVectorBar: RightUpVectorBar, + RightUpVector: RightUpVector, + RightVectorBar: RightVectorBar, + RightVector: RightVector, + ring: ring, + risingdotseq: risingdotseq, + rlarr: rlarr, + rlhar: rlhar, + rlm: rlm, + rmoustache: rmoustache, + rmoust: rmoust, + rnmid: rnmid, + roang: roang, + roarr: roarr, + robrk: robrk, + ropar: ropar, + ropf: ropf, + Ropf: Ropf, + roplus: roplus, + rotimes: rotimes, + RoundImplies: RoundImplies, + rpar: rpar, + rpargt: rpargt, + rppolint: rppolint, + rrarr: rrarr, + Rrightarrow: Rrightarrow, + rsaquo: rsaquo, + rscr: rscr, + Rscr: Rscr, + rsh: rsh, + Rsh: Rsh, + rsqb: rsqb, + rsquo: rsquo, + rsquor: rsquor, + rthree: rthree, + rtimes: rtimes, + rtri: rtri, + rtrie: rtrie, + rtrif: rtrif, + rtriltri: rtriltri, + RuleDelayed: RuleDelayed, + ruluhar: ruluhar, + rx: rx, + Sacute: Sacute, + sacute: sacute, + sbquo: sbquo, + scap: scap, + Scaron: Scaron, + scaron: scaron, + Sc: Sc, + sc: sc, + sccue: sccue, + sce: sce, + scE: scE, + Scedil: Scedil, + scedil: scedil, + Scirc: Scirc, + scirc: scirc, + scnap: scnap, + scnE: scnE, + scnsim: scnsim, + scpolint: scpolint, + scsim: scsim, + Scy: Scy, + scy: scy, + sdotb: sdotb, + sdot: sdot, + sdote: sdote, + searhk: searhk, + searr: searr, + seArr: seArr, + searrow: searrow, + sect: sect, + semi: semi, + seswar: seswar, + setminus: setminus, + setmn: setmn, + sext: sext, + Sfr: Sfr, + sfr: sfr, + sfrown: sfrown, + sharp: sharp, + SHCHcy: SHCHcy, + shchcy: shchcy, + SHcy: SHcy, + shcy: shcy, + ShortDownArrow: ShortDownArrow, + ShortLeftArrow: ShortLeftArrow, + shortmid: shortmid, + shortparallel: shortparallel, + ShortRightArrow: ShortRightArrow, + ShortUpArrow: ShortUpArrow, + shy: shy, + Sigma: Sigma, + sigma: sigma, + sigmaf: sigmaf, + sigmav: sigmav, + sim: sim, + simdot: simdot, + sime: sime, + simeq: simeq, + simg: simg, + simgE: simgE, + siml: siml, + simlE: simlE, + simne: simne, + simplus: simplus, + simrarr: simrarr, + slarr: slarr, + SmallCircle: SmallCircle, + smallsetminus: smallsetminus, + smashp: smashp, + smeparsl: smeparsl, + smid: smid, + smile: smile, + smt: smt, + smte: smte, + smtes: smtes, + SOFTcy: SOFTcy, + softcy: softcy, + solbar: solbar, + solb: solb, + sol: sol, + Sopf: Sopf, + sopf: sopf, + spades: spades, + spadesuit: spadesuit, + spar: spar, + sqcap: sqcap, + sqcaps: sqcaps, + sqcup: sqcup, + sqcups: sqcups, + Sqrt: Sqrt, + sqsub: sqsub, + sqsube: sqsube, + sqsubset: sqsubset, + sqsubseteq: sqsubseteq, + sqsup: sqsup, + sqsupe: sqsupe, + sqsupset: sqsupset, + sqsupseteq: sqsupseteq, + square: square, + Square: Square, + SquareIntersection: SquareIntersection, + SquareSubset: SquareSubset, + SquareSubsetEqual: SquareSubsetEqual, + SquareSuperset: SquareSuperset, + SquareSupersetEqual: SquareSupersetEqual, + SquareUnion: SquareUnion, + squarf: squarf, + squ: squ, + squf: squf, + srarr: srarr, + Sscr: Sscr, + sscr: sscr, + ssetmn: ssetmn, + ssmile: ssmile, + sstarf: sstarf, + Star: Star, + star: star, + starf: starf, + straightepsilon: straightepsilon, + straightphi: straightphi, + strns: strns, + sub: sub, + Sub: Sub, + subdot: subdot, + subE: subE, + sube: sube, + subedot: subedot, + submult: submult, + subnE: subnE, + subne: subne, + subplus: subplus, + subrarr: subrarr, + subset: subset, + Subset: Subset, + subseteq: subseteq, + subseteqq: subseteqq, + SubsetEqual: SubsetEqual, + subsetneq: subsetneq, + subsetneqq: subsetneqq, + subsim: subsim, + subsub: subsub, + subsup: subsup, + succapprox: succapprox, + succ: succ, + succcurlyeq: succcurlyeq, + Succeeds: Succeeds, + SucceedsEqual: SucceedsEqual, + SucceedsSlantEqual: SucceedsSlantEqual, + SucceedsTilde: SucceedsTilde, + succeq: succeq, + succnapprox: succnapprox, + succneqq: succneqq, + succnsim: succnsim, + succsim: succsim, + SuchThat: SuchThat, + sum: sum, + Sum: Sum, + sung: sung, + sup1: sup1, + sup2: sup2, + sup3: sup3, + sup: sup, + Sup: Sup, + supdot: supdot, + supdsub: supdsub, + supE: supE, + supe: supe, + supedot: supedot, + Superset: Superset, + SupersetEqual: SupersetEqual, + suphsol: suphsol, + suphsub: suphsub, + suplarr: suplarr, + supmult: supmult, + supnE: supnE, + supne: supne, + supplus: supplus, + supset: supset, + Supset: Supset, + supseteq: supseteq, + supseteqq: supseteqq, + supsetneq: supsetneq, + supsetneqq: supsetneqq, + supsim: supsim, + supsub: supsub, + supsup: supsup, + swarhk: swarhk, + swarr: swarr, + swArr: swArr, + swarrow: swarrow, + swnwar: swnwar, + szlig: szlig, + Tab: Tab, + target: target, + Tau: Tau, + tau: tau, + tbrk: tbrk, + Tcaron: Tcaron, + tcaron: tcaron, + Tcedil: Tcedil, + tcedil: tcedil, + Tcy: Tcy, + tcy: tcy, + tdot: tdot, + telrec: telrec, + Tfr: Tfr, + tfr: tfr, + there4: there4, + therefore: therefore, + Therefore: Therefore, + Theta: Theta, + theta: theta, + thetasym: thetasym, + thetav: thetav, + thickapprox: thickapprox, + thicksim: thicksim, + ThickSpace: ThickSpace, + ThinSpace: ThinSpace, + thinsp: thinsp, + thkap: thkap, + thksim: thksim, + THORN: THORN, + thorn: thorn, + tilde: tilde, + Tilde: Tilde, + TildeEqual: TildeEqual, + TildeFullEqual: TildeFullEqual, + TildeTilde: TildeTilde, + timesbar: timesbar, + timesb: timesb, + times: times, + timesd: timesd, + tint: tint, + toea: toea, + topbot: topbot, + topcir: topcir, + top: top, + Topf: Topf, + topf: topf, + topfork: topfork, + tosa: tosa, + tprime: tprime, + trade: trade, + TRADE: TRADE, + triangle: triangle, + triangledown: triangledown, + triangleleft: triangleleft, + trianglelefteq: trianglelefteq, + triangleq: triangleq, + triangleright: triangleright, + trianglerighteq: trianglerighteq, + tridot: tridot, + trie: trie, + triminus: triminus, + TripleDot: TripleDot, + triplus: triplus, + trisb: trisb, + tritime: tritime, + trpezium: trpezium, + Tscr: Tscr, + tscr: tscr, + TScy: TScy, + tscy: tscy, + TSHcy: TSHcy, + tshcy: tshcy, + Tstrok: Tstrok, + tstrok: tstrok, + twixt: twixt, + twoheadleftarrow: twoheadleftarrow, + twoheadrightarrow: twoheadrightarrow, + Uacute: Uacute, + uacute: uacute, + uarr: uarr, + Uarr: Uarr, + uArr: uArr, + Uarrocir: Uarrocir, + Ubrcy: Ubrcy, + ubrcy: ubrcy, + Ubreve: Ubreve, + ubreve: ubreve, + Ucirc: Ucirc, + ucirc: ucirc, + Ucy: Ucy, + ucy: ucy, + udarr: udarr, + Udblac: Udblac, + udblac: udblac, + udhar: udhar, + ufisht: ufisht, + Ufr: Ufr, + ufr: ufr, + Ugrave: Ugrave, + ugrave: ugrave, + uHar: uHar, + uharl: uharl, + uharr: uharr, + uhblk: uhblk, + ulcorn: ulcorn, + ulcorner: ulcorner, + ulcrop: ulcrop, + ultri: ultri, + Umacr: Umacr, + umacr: umacr, + uml: uml, + UnderBar: UnderBar, + UnderBrace: UnderBrace, + UnderBracket: UnderBracket, + UnderParenthesis: UnderParenthesis, + Union: Union, + UnionPlus: UnionPlus, + Uogon: Uogon, + uogon: uogon, + Uopf: Uopf, + uopf: uopf, + UpArrowBar: UpArrowBar, + uparrow: uparrow, + UpArrow: UpArrow, + Uparrow: Uparrow, + UpArrowDownArrow: UpArrowDownArrow, + updownarrow: updownarrow, + UpDownArrow: UpDownArrow, + Updownarrow: Updownarrow, + UpEquilibrium: UpEquilibrium, + upharpoonleft: upharpoonleft, + upharpoonright: upharpoonright, + uplus: uplus, + UpperLeftArrow: UpperLeftArrow, + UpperRightArrow: UpperRightArrow, + upsi: upsi, + Upsi: Upsi, + upsih: upsih, + Upsilon: Upsilon, + upsilon: upsilon, + UpTeeArrow: UpTeeArrow, + UpTee: UpTee, + upuparrows: upuparrows, + urcorn: urcorn, + urcorner: urcorner, + urcrop: urcrop, + Uring: Uring, + uring: uring, + urtri: urtri, + Uscr: Uscr, + uscr: uscr, + utdot: utdot, + Utilde: Utilde, + utilde: utilde, + utri: utri, + utrif: utrif, + uuarr: uuarr, + Uuml: Uuml, + uuml: uuml, + uwangle: uwangle, + vangrt: vangrt, + varepsilon: varepsilon, + varkappa: varkappa, + varnothing: varnothing, + varphi: varphi, + varpi: varpi, + varpropto: varpropto, + varr: varr, + vArr: vArr, + varrho: varrho, + varsigma: varsigma, + varsubsetneq: varsubsetneq, + varsubsetneqq: varsubsetneqq, + varsupsetneq: varsupsetneq, + varsupsetneqq: varsupsetneqq, + vartheta: vartheta, + vartriangleleft: vartriangleleft, + vartriangleright: vartriangleright, + vBar: vBar, + Vbar: Vbar, + vBarv: vBarv, + Vcy: Vcy, + vcy: vcy, + vdash: vdash, + vDash: vDash, + Vdash: Vdash, + VDash: VDash, + Vdashl: Vdashl, + veebar: veebar, + vee: vee, + Vee: Vee, + veeeq: veeeq, + vellip: vellip, + verbar: verbar, + Verbar: Verbar, + vert: vert, + Vert: Vert, + VerticalBar: VerticalBar, + VerticalLine: VerticalLine, + VerticalSeparator: VerticalSeparator, + VerticalTilde: VerticalTilde, + VeryThinSpace: VeryThinSpace, + Vfr: Vfr, + vfr: vfr, + vltri: vltri, + vnsub: vnsub, + vnsup: vnsup, + Vopf: Vopf, + vopf: vopf, + vprop: vprop, + vrtri: vrtri, + Vscr: Vscr, + vscr: vscr, + vsubnE: vsubnE, + vsubne: vsubne, + vsupnE: vsupnE, + vsupne: vsupne, + Vvdash: Vvdash, + vzigzag: vzigzag, + Wcirc: Wcirc, + wcirc: wcirc, + wedbar: wedbar, + wedge: wedge, + Wedge: Wedge, + wedgeq: wedgeq, + weierp: weierp, + Wfr: Wfr, + wfr: wfr, + Wopf: Wopf, + wopf: wopf, + wp: wp, + wr: wr, + wreath: wreath, + Wscr: Wscr, + wscr: wscr, + xcap: xcap, + xcirc: xcirc, + xcup: xcup, + xdtri: xdtri, + Xfr: Xfr, + xfr: xfr, + xharr: xharr, + xhArr: xhArr, + Xi: Xi, + xi: xi, + xlarr: xlarr, + xlArr: xlArr, + xmap: xmap, + xnis: xnis, + xodot: xodot, + Xopf: Xopf, + xopf: xopf, + xoplus: xoplus, + xotime: xotime, + xrarr: xrarr, + xrArr: xrArr, + Xscr: Xscr, + xscr: xscr, + xsqcup: xsqcup, + xuplus: xuplus, + xutri: xutri, + xvee: xvee, + xwedge: xwedge, + Yacute: Yacute, + yacute: yacute, + YAcy: YAcy, + yacy: yacy, + Ycirc: Ycirc, + ycirc: ycirc, + Ycy: Ycy, + ycy: ycy, + yen: yen, + Yfr: Yfr, + yfr: yfr, + YIcy: YIcy, + yicy: yicy, + Yopf: Yopf, + yopf: yopf, + Yscr: Yscr, + yscr: yscr, + YUcy: YUcy, + yucy: yucy, + yuml: yuml, + Yuml: Yuml, + Zacute: Zacute, + zacute: zacute, + Zcaron: Zcaron, + zcaron: zcaron, + Zcy: Zcy, + zcy: zcy, + Zdot: Zdot, + zdot: zdot, + zeetrf: zeetrf, + ZeroWidthSpace: ZeroWidthSpace, + Zeta: Zeta, + zeta: zeta, + zfr: zfr, + Zfr: Zfr, + ZHcy: ZHcy, + zhcy: zhcy, + zigrarr: zigrarr, + zopf: zopf, + Zopf: Zopf, + Zscr: Zscr, + zscr: zscr, + zwj: zwj, + zwnj: zwnj, + 'default': entities + }); + + var Aacute$1 = "Á"; + var aacute$1 = "á"; + var Acirc$1 = "Â"; + var acirc$1 = "â"; + var acute$1 = "´"; + var AElig$1 = "Æ"; + var aelig$1 = "æ"; + var Agrave$1 = "À"; + var agrave$1 = "à"; + var amp$1 = "&"; + var AMP$1 = "&"; + var Aring$1 = "Å"; + var aring$1 = "å"; + var Atilde$1 = "Ã"; + var atilde$1 = "ã"; + var Auml$1 = "Ä"; + var auml$1 = "ä"; + var brvbar$1 = "¦"; + var Ccedil$1 = "Ç"; + var ccedil$1 = "ç"; + var cedil$1 = "¸"; + var cent$1 = "¢"; + var copy$1 = "©"; + var COPY$1 = "©"; + var curren$1 = "¤"; + var deg$1 = "°"; + var divide$1 = "÷"; + var Eacute$1 = "É"; + var eacute$1 = "é"; + var Ecirc$1 = "Ê"; + var ecirc$1 = "ê"; + var Egrave$1 = "È"; + var egrave$1 = "è"; + var ETH$1 = "Ð"; + var eth$1 = "ð"; + var Euml$1 = "Ë"; + var euml$1 = "ë"; + var frac12$1 = "½"; + var frac14$1 = "¼"; + var frac34$1 = "¾"; + var gt$1 = ">"; + var GT$1 = ">"; + var Iacute$1 = "Í"; + var iacute$1 = "í"; + var Icirc$1 = "Î"; + var icirc$1 = "î"; + var iexcl$1 = "¡"; + var Igrave$1 = "Ì"; + var igrave$1 = "ì"; + var iquest$1 = "¿"; + var Iuml$1 = "Ï"; + var iuml$1 = "ï"; + var laquo$1 = "«"; + var lt$1 = "<"; + var LT$1 = "<"; + var macr$1 = "¯"; + var micro$1 = "µ"; + var middot$1 = "·"; + var nbsp$1 = " "; + var not$1 = "¬"; + var Ntilde$1 = "Ñ"; + var ntilde$1 = "ñ"; + var Oacute$1 = "Ó"; + var oacute$1 = "ó"; + var Ocirc$1 = "Ô"; + var ocirc$1 = "ô"; + var Ograve$1 = "Ò"; + var ograve$1 = "ò"; + var ordf$1 = "ª"; + var ordm$1 = "º"; + var Oslash$1 = "Ø"; + var oslash$1 = "ø"; + var Otilde$1 = "Õ"; + var otilde$1 = "õ"; + var Ouml$1 = "Ö"; + var ouml$1 = "ö"; + var para$1 = "¶"; + var plusmn$1 = "±"; + var pound$1 = "£"; + var quot$1 = "\""; + var QUOT$1 = "\""; + var raquo$1 = "»"; + var reg$1 = "®"; + var REG$1 = "®"; + var sect$1 = "§"; + var shy$1 = "­"; + var sup1$1 = "¹"; + var sup2$1 = "²"; + var sup3$1 = "³"; + var szlig$1 = "ß"; + var THORN$1 = "Þ"; + var thorn$1 = "þ"; + var times$1 = "×"; + var Uacute$1 = "Ú"; + var uacute$1 = "ú"; + var Ucirc$1 = "Û"; + var ucirc$1 = "û"; + var Ugrave$1 = "Ù"; + var ugrave$1 = "ù"; + var uml$1 = "¨"; + var Uuml$1 = "Ü"; + var uuml$1 = "ü"; + var Yacute$1 = "Ý"; + var yacute$1 = "ý"; + var yen$1 = "¥"; + var yuml$1 = "ÿ"; + var legacy = { + Aacute: Aacute$1, + aacute: aacute$1, + Acirc: Acirc$1, + acirc: acirc$1, + acute: acute$1, + AElig: AElig$1, + aelig: aelig$1, + Agrave: Agrave$1, + agrave: agrave$1, + amp: amp$1, + AMP: AMP$1, + Aring: Aring$1, + aring: aring$1, + Atilde: Atilde$1, + atilde: atilde$1, + Auml: Auml$1, + auml: auml$1, + brvbar: brvbar$1, + Ccedil: Ccedil$1, + ccedil: ccedil$1, + cedil: cedil$1, + cent: cent$1, + copy: copy$1, + COPY: COPY$1, + curren: curren$1, + deg: deg$1, + divide: divide$1, + Eacute: Eacute$1, + eacute: eacute$1, + Ecirc: Ecirc$1, + ecirc: ecirc$1, + Egrave: Egrave$1, + egrave: egrave$1, + ETH: ETH$1, + eth: eth$1, + Euml: Euml$1, + euml: euml$1, + frac12: frac12$1, + frac14: frac14$1, + frac34: frac34$1, + gt: gt$1, + GT: GT$1, + Iacute: Iacute$1, + iacute: iacute$1, + Icirc: Icirc$1, + icirc: icirc$1, + iexcl: iexcl$1, + Igrave: Igrave$1, + igrave: igrave$1, + iquest: iquest$1, + Iuml: Iuml$1, + iuml: iuml$1, + laquo: laquo$1, + lt: lt$1, + LT: LT$1, + macr: macr$1, + micro: micro$1, + middot: middot$1, + nbsp: nbsp$1, + not: not$1, + Ntilde: Ntilde$1, + ntilde: ntilde$1, + Oacute: Oacute$1, + oacute: oacute$1, + Ocirc: Ocirc$1, + ocirc: ocirc$1, + Ograve: Ograve$1, + ograve: ograve$1, + ordf: ordf$1, + ordm: ordm$1, + Oslash: Oslash$1, + oslash: oslash$1, + Otilde: Otilde$1, + otilde: otilde$1, + Ouml: Ouml$1, + ouml: ouml$1, + para: para$1, + plusmn: plusmn$1, + pound: pound$1, + quot: quot$1, + QUOT: QUOT$1, + raquo: raquo$1, + reg: reg$1, + REG: REG$1, + sect: sect$1, + shy: shy$1, + sup1: sup1$1, + sup2: sup2$1, + sup3: sup3$1, + szlig: szlig$1, + THORN: THORN$1, + thorn: thorn$1, + times: times$1, + Uacute: Uacute$1, + uacute: uacute$1, + Ucirc: Ucirc$1, + ucirc: ucirc$1, + Ugrave: Ugrave$1, + ugrave: ugrave$1, + uml: uml$1, + Uuml: Uuml$1, + uuml: uuml$1, + Yacute: Yacute$1, + yacute: yacute$1, + yen: yen$1, + yuml: yuml$1 + }; + + var legacy$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + Aacute: Aacute$1, + aacute: aacute$1, + Acirc: Acirc$1, + acirc: acirc$1, + acute: acute$1, + AElig: AElig$1, + aelig: aelig$1, + Agrave: Agrave$1, + agrave: agrave$1, + amp: amp$1, + AMP: AMP$1, + Aring: Aring$1, + aring: aring$1, + Atilde: Atilde$1, + atilde: atilde$1, + Auml: Auml$1, + auml: auml$1, + brvbar: brvbar$1, + Ccedil: Ccedil$1, + ccedil: ccedil$1, + cedil: cedil$1, + cent: cent$1, + copy: copy$1, + COPY: COPY$1, + curren: curren$1, + deg: deg$1, + divide: divide$1, + Eacute: Eacute$1, + eacute: eacute$1, + Ecirc: Ecirc$1, + ecirc: ecirc$1, + Egrave: Egrave$1, + egrave: egrave$1, + ETH: ETH$1, + eth: eth$1, + Euml: Euml$1, + euml: euml$1, + frac12: frac12$1, + frac14: frac14$1, + frac34: frac34$1, + gt: gt$1, + GT: GT$1, + Iacute: Iacute$1, + iacute: iacute$1, + Icirc: Icirc$1, + icirc: icirc$1, + iexcl: iexcl$1, + Igrave: Igrave$1, + igrave: igrave$1, + iquest: iquest$1, + Iuml: Iuml$1, + iuml: iuml$1, + laquo: laquo$1, + lt: lt$1, + LT: LT$1, + macr: macr$1, + micro: micro$1, + middot: middot$1, + nbsp: nbsp$1, + not: not$1, + Ntilde: Ntilde$1, + ntilde: ntilde$1, + Oacute: Oacute$1, + oacute: oacute$1, + Ocirc: Ocirc$1, + ocirc: ocirc$1, + Ograve: Ograve$1, + ograve: ograve$1, + ordf: ordf$1, + ordm: ordm$1, + Oslash: Oslash$1, + oslash: oslash$1, + Otilde: Otilde$1, + otilde: otilde$1, + Ouml: Ouml$1, + ouml: ouml$1, + para: para$1, + plusmn: plusmn$1, + pound: pound$1, + quot: quot$1, + QUOT: QUOT$1, + raquo: raquo$1, + reg: reg$1, + REG: REG$1, + sect: sect$1, + shy: shy$1, + sup1: sup1$1, + sup2: sup2$1, + sup3: sup3$1, + szlig: szlig$1, + THORN: THORN$1, + thorn: thorn$1, + times: times$1, + Uacute: Uacute$1, + uacute: uacute$1, + Ucirc: Ucirc$1, + ucirc: ucirc$1, + Ugrave: Ugrave$1, + ugrave: ugrave$1, + uml: uml$1, + Uuml: Uuml$1, + uuml: uuml$1, + Yacute: Yacute$1, + yacute: yacute$1, + yen: yen$1, + yuml: yuml$1, + 'default': legacy + }); + + var amp$2 = "&"; + var apos$1 = "'"; + var gt$2 = ">"; + var lt$2 = "<"; + var quot$2 = "\""; + var xml = { + amp: amp$2, + apos: apos$1, + gt: gt$2, + lt: lt$2, + quot: quot$2 + }; + + var xml$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + amp: amp$2, + apos: apos$1, + gt: gt$2, + lt: lt$2, + quot: quot$2, + 'default': xml + }); + + var decode = { + "0": 65533, + "128": 8364, + "130": 8218, + "131": 402, + "132": 8222, + "133": 8230, + "134": 8224, + "135": 8225, + "136": 710, + "137": 8240, + "138": 352, + "139": 8249, + "140": 338, + "142": 381, + "145": 8216, + "146": 8217, + "147": 8220, + "148": 8221, + "149": 8226, + "150": 8211, + "151": 8212, + "152": 732, + "153": 8482, + "154": 353, + "155": 8250, + "156": 339, + "158": 382, + "159": 376 + }; + + var decode$1 = /*#__PURE__*/Object.freeze({ + __proto__: null, + 'default': decode + }); + + var require$$0 = getCjsExportFromNamespace(decode$1); + + var decode_codepoint = createCommonjsModule(function (module, exports) { + var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + var decode_json_1 = __importDefault(require$$0); + // modified version of https://github.com/mathiasbynens/he/blob/master/src/he.js#L94-L119 + function decodeCodePoint(codePoint) { + if ((codePoint >= 0xd800 && codePoint <= 0xdfff) || codePoint > 0x10ffff) { + return "\uFFFD"; + } + if (codePoint in decode_json_1.default) { + codePoint = decode_json_1.default[codePoint]; + } + var output = ""; + if (codePoint > 0xffff) { + codePoint -= 0x10000; + output += String.fromCharCode(((codePoint >>> 10) & 0x3ff) | 0xd800); + codePoint = 0xdc00 | (codePoint & 0x3ff); + } + output += String.fromCharCode(codePoint); + return output; + } + exports.default = decodeCodePoint; + }); + + unwrapExports(decode_codepoint); + + var require$$1 = getCjsExportFromNamespace(entities$1); + + var require$$1$1 = getCjsExportFromNamespace(legacy$1); + + var require$$0$1 = getCjsExportFromNamespace(xml$1); + + var decode$2 = createCommonjsModule(function (module, exports) { + var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.decodeHTML = exports.decodeHTMLStrict = exports.decodeXML = void 0; + var entities_json_1 = __importDefault(require$$1); + var legacy_json_1 = __importDefault(require$$1$1); + var xml_json_1 = __importDefault(require$$0$1); + var decode_codepoint_1 = __importDefault(decode_codepoint); + exports.decodeXML = getStrictDecoder(xml_json_1.default); + exports.decodeHTMLStrict = getStrictDecoder(entities_json_1.default); + function getStrictDecoder(map) { + var keys = Object.keys(map).join("|"); + var replace = getReplacer(map); + keys += "|#[xX][\\da-fA-F]+|#\\d+"; + var re = new RegExp("&(?:" + keys + ");", "g"); + return function (str) { return String(str).replace(re, replace); }; + } + var sorter = function (a, b) { return (a < b ? 1 : -1); }; + exports.decodeHTML = (function () { + var legacy = Object.keys(legacy_json_1.default).sort(sorter); + var keys = Object.keys(entities_json_1.default).sort(sorter); + for (var i = 0, j = 0; i < keys.length; i++) { + if (legacy[j] === keys[i]) { + keys[i] += ";?"; + j++; + } + else { + keys[i] += ";"; + } + } + var re = new RegExp("&(?:" + keys.join("|") + "|#[xX][\\da-fA-F]+;?|#\\d+;?)", "g"); + var replace = getReplacer(entities_json_1.default); + function replacer(str) { + if (str.substr(-1) !== ";") + str += ";"; + return replace(str); + } + //TODO consider creating a merged map + return function (str) { return String(str).replace(re, replacer); }; + })(); + function getReplacer(map) { + return function replace(str) { + if (str.charAt(1) === "#") { + var secondChar = str.charAt(2); + if (secondChar === "X" || secondChar === "x") { + return decode_codepoint_1.default(parseInt(str.substr(3), 16)); + } + return decode_codepoint_1.default(parseInt(str.substr(2), 10)); + } + return map[str.slice(1, -1)]; + }; + } + }); + + unwrapExports(decode$2); + var decode_1 = decode$2.decodeHTML; + var decode_2 = decode$2.decodeHTMLStrict; + var decode_3 = decode$2.decodeXML; + + var encode$1 = createCommonjsModule(function (module, exports) { + var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; + }; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.escape = exports.encodeHTML = exports.encodeXML = void 0; + var xml_json_1 = __importDefault(require$$0$1); + var inverseXML = getInverseObj(xml_json_1.default); + var xmlReplacer = getInverseReplacer(inverseXML); + exports.encodeXML = getInverse(inverseXML, xmlReplacer); + var entities_json_1 = __importDefault(require$$1); + var inverseHTML = getInverseObj(entities_json_1.default); + var htmlReplacer = getInverseReplacer(inverseHTML); + exports.encodeHTML = getInverse(inverseHTML, htmlReplacer); + function getInverseObj(obj) { + return Object.keys(obj) + .sort() + .reduce(function (inverse, name) { + inverse[obj[name]] = "&" + name + ";"; + return inverse; + }, {}); + } + function getInverseReplacer(inverse) { + var single = []; + var multiple = []; + for (var _i = 0, _a = Object.keys(inverse); _i < _a.length; _i++) { + var k = _a[_i]; + if (k.length === 1) { + // Add value to single array + single.push("\\" + k); + } + else { + // Add value to multiple array + multiple.push(k); + } + } + // Add ranges to single characters. + single.sort(); + for (var start = 0; start < single.length - 1; start++) { + // Find the end of a run of characters + var end = start; + while (end < single.length - 1 && + single[end].charCodeAt(1) + 1 === single[end + 1].charCodeAt(1)) { + end += 1; + } + var count = 1 + end - start; + // We want to replace at least three characters + if (count < 3) + continue; + single.splice(start, count, single[start] + "-" + single[end]); + } + multiple.unshift("[" + single.join("") + "]"); + return new RegExp(multiple.join("|"), "g"); + } + var reNonASCII = /(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g; + function singleCharReplacer(c) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return "&#x" + c.codePointAt(0).toString(16).toUpperCase() + ";"; + } + function getInverse(inverse, re) { + return function (data) { + return data + .replace(re, function (name) { return inverse[name]; }) + .replace(reNonASCII, singleCharReplacer); + }; + } + var reXmlChars = getInverseReplacer(inverseXML); + function escape(data) { + return data + .replace(reXmlChars, singleCharReplacer) + .replace(reNonASCII, singleCharReplacer); + } + exports.escape = escape; + }); + + unwrapExports(encode$1); + var encode_1$1 = encode$1.escape; + var encode_2 = encode$1.encodeHTML; + var encode_3 = encode$1.encodeXML; + + var lib = createCommonjsModule(function (module, exports) { + Object.defineProperty(exports, "__esModule", { value: true }); + exports.encode = exports.decodeStrict = exports.decode = void 0; + + + /** + * Decodes a string with entities. + * + * @param data String to decode. + * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0. + */ + function decode(data, level) { + return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTML)(data); + } + exports.decode = decode; + /** + * Decodes a string with entities. Does not allow missing trailing semicolons for entities. + * + * @param data String to decode. + * @param level Optional level to decode at. 0 = XML, 1 = HTML. Default is 0. + */ + function decodeStrict(data, level) { + return (!level || level <= 0 ? decode$2.decodeXML : decode$2.decodeHTMLStrict)(data); + } + exports.decodeStrict = decodeStrict; + /** + * Encodes a string with entities. + * + * @param data String to encode. + * @param level Optional level to encode at. 0 = XML, 1 = HTML. Default is 0. + */ + function encode(data, level) { + return (!level || level <= 0 ? encode$1.encodeXML : encode$1.encodeHTML)(data); + } + exports.encode = encode; + var encode_2 = encode$1; + Object.defineProperty(exports, "encodeXML", { enumerable: true, get: function () { return encode_2.encodeXML; } }); + Object.defineProperty(exports, "encodeHTML", { enumerable: true, get: function () { return encode_2.encodeHTML; } }); + Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return encode_2.escape; } }); + // Legacy aliases + Object.defineProperty(exports, "encodeHTML4", { enumerable: true, get: function () { return encode_2.encodeHTML; } }); + Object.defineProperty(exports, "encodeHTML5", { enumerable: true, get: function () { return encode_2.encodeHTML; } }); + var decode_2 = decode$2; + Object.defineProperty(exports, "decodeXML", { enumerable: true, get: function () { return decode_2.decodeXML; } }); + Object.defineProperty(exports, "decodeHTML", { enumerable: true, get: function () { return decode_2.decodeHTML; } }); + Object.defineProperty(exports, "decodeHTMLStrict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } }); + // Legacy aliases + Object.defineProperty(exports, "decodeHTML4", { enumerable: true, get: function () { return decode_2.decodeHTML; } }); + Object.defineProperty(exports, "decodeHTML5", { enumerable: true, get: function () { return decode_2.decodeHTML; } }); + Object.defineProperty(exports, "decodeHTML4Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } }); + Object.defineProperty(exports, "decodeHTML5Strict", { enumerable: true, get: function () { return decode_2.decodeHTMLStrict; } }); + Object.defineProperty(exports, "decodeXMLStrict", { enumerable: true, get: function () { return decode_2.decodeXML; } }); + }); + + unwrapExports(lib); + var lib_1 = lib.encode; + var lib_2 = lib.decodeStrict; + var lib_3 = lib.decode; + var lib_4 = lib.encodeXML; + var lib_5 = lib.encodeHTML; + var lib_6 = lib.encodeHTML4; + var lib_7 = lib.encodeHTML5; + var lib_8 = lib.decodeXML; + var lib_9 = lib.decodeHTML; + var lib_10 = lib.decodeHTMLStrict; + var lib_11 = lib.decodeHTML4; + var lib_12 = lib.decodeHTML5; + var lib_13 = lib.decodeHTML4Strict; + var lib_14 = lib.decodeHTML5Strict; + var lib_15 = lib.decodeXMLStrict; + + var C_BACKSLASH = 92; + + var ENTITY = "&(?:#x[a-f0-9]{1,6}|#[0-9]{1,7}|[a-z][a-z0-9]{1,31});"; + + var TAGNAME = "[A-Za-z][A-Za-z0-9-]*"; + var ATTRIBUTENAME = "[a-zA-Z_:][a-zA-Z0-9:._-]*"; + var UNQUOTEDVALUE = "[^\"'=<>`\\x00-\\x20]+"; + var SINGLEQUOTEDVALUE = "'[^']*'"; + var DOUBLEQUOTEDVALUE = '"[^"]*"'; + var ATTRIBUTEVALUE = + "(?:" + + UNQUOTEDVALUE + + "|" + + SINGLEQUOTEDVALUE + + "|" + + DOUBLEQUOTEDVALUE + + ")"; + var ATTRIBUTEVALUESPEC = "(?:" + "\\s*=" + "\\s*" + ATTRIBUTEVALUE + ")"; + var ATTRIBUTE = "(?:" + "\\s+" + ATTRIBUTENAME + ATTRIBUTEVALUESPEC + "?)"; + var OPENTAG = "<" + TAGNAME + ATTRIBUTE + "*" + "\\s*/?>"; + var CLOSETAG = "]"; + var HTMLCOMMENT = "|"; + var PROCESSINGINSTRUCTION = "[<][?][\\s\\S]*?[?][>]"; + var DECLARATION = "]*>"; + var CDATA = ""; + var HTMLTAG = + "(?:" + + OPENTAG + + "|" + + CLOSETAG + + "|" + + HTMLCOMMENT + + "|" + + PROCESSINGINSTRUCTION + + "|" + + DECLARATION + + "|" + + CDATA + + ")"; + var reHtmlTag = new RegExp("^" + HTMLTAG); + + var reBackslashOrAmp = /[\\&]/; + + var ESCAPABLE = "[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]"; + + var reEntityOrEscapedChar = new RegExp("\\\\" + ESCAPABLE + "|" + ENTITY, "gi"); + + var XMLSPECIAL = '[&<>"]'; + + var reXmlSpecial = new RegExp(XMLSPECIAL, "g"); + + var unescapeChar = function(s) { + if (s.charCodeAt(0) === C_BACKSLASH) { + return s.charAt(1); + } else { + return lib_9(s); + } + }; + + // Replace entities and backslash escapes with literal characters. + var unescapeString = function(s) { + if (reBackslashOrAmp.test(s)) { + return s.replace(reEntityOrEscapedChar, unescapeChar); + } else { + return s; + } + }; + + var normalizeURI = function(uri) { + try { + return encode_1(uri); + } catch (err) { + return uri; + } + }; + + var replaceUnsafeChar = function(s) { + switch (s) { + case "&": + return "&"; + case "<": + return "<"; + case ">": + return ">"; + case '"': + return """; + default: + return s; + } + }; + + var escapeXml = function(s) { + if (reXmlSpecial.test(s)) { + return s.replace(reXmlSpecial, replaceUnsafeChar); + } else { + return s; + } + }; + + // derived from https://github.com/mathiasbynens/String.fromCodePoint + /*! http://mths.be/fromcodepoint v0.2.1 by @mathias */ + + var _fromCodePoint; + + function fromCodePoint(_) { + return _fromCodePoint(_); + } + + if (String.fromCodePoint) { + _fromCodePoint = function(_) { + try { + return String.fromCodePoint(_); + } catch (e) { + if (e instanceof RangeError) { + return String.fromCharCode(0xfffd); + } + throw e; + } + }; + } else { + var stringFromCharCode = String.fromCharCode; + var floor = Math.floor; + _fromCodePoint = function() { + var MAX_SIZE = 0x4000; + var codeUnits = []; + var highSurrogate; + var lowSurrogate; + var index = -1; + var length = arguments.length; + if (!length) { + return ""; + } + var result = ""; + while (++index < length) { + var codePoint = Number(arguments[index]); + if ( + !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity` + codePoint < 0 || // not a valid Unicode code point + codePoint > 0x10ffff || // not a valid Unicode code point + floor(codePoint) !== codePoint // not an integer + ) { + return String.fromCharCode(0xfffd); + } + if (codePoint <= 0xffff) { + // BMP code point + codeUnits.push(codePoint); + } else { + // Astral code point; split in surrogate halves + // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + codePoint -= 0x10000; + highSurrogate = (codePoint >> 10) + 0xd800; + lowSurrogate = (codePoint % 0x400) + 0xdc00; + codeUnits.push(highSurrogate, lowSurrogate); + } + if (index + 1 === length || codeUnits.length > MAX_SIZE) { + result += stringFromCharCode.apply(null, codeUnits); + codeUnits.length = 0; + } + } + return result; + }; + } + + /*! http://mths.be/repeat v0.2.0 by @mathias */ + if (!String.prototype.repeat) { + (function() { + var defineProperty = (function() { + // IE 8 only supports `Object.defineProperty` on DOM elements + try { + var object = {}; + var $defineProperty = Object.defineProperty; + var result = $defineProperty(object, object, object) && $defineProperty; + } catch(error) {} + return result; + }()); + var repeat = function(count) { + if (this == null) { + throw TypeError(); + } + var string = String(this); + // `ToInteger` + var n = count ? Number(count) : 0; + if (n != n) { // better `isNaN` + n = 0; + } + // Account for out-of-bounds indices + if (n < 0 || n == Infinity) { + throw RangeError(); + } + var result = ''; + while (n) { + if (n % 2 == 1) { + result += string; + } + if (n > 1) { + string += string; + } + n >>= 1; + } + return result; + }; + if (defineProperty) { + defineProperty(String.prototype, 'repeat', { + 'value': repeat, + 'configurable': true, + 'writable': true + }); + } else { + String.prototype.repeat = repeat; + } + }()); + } + + var normalizeURI$1 = normalizeURI; + var unescapeString$1 = unescapeString; + + // Constants for character codes: + + var C_NEWLINE = 10; + var C_ASTERISK = 42; + var C_UNDERSCORE = 95; + var C_BACKTICK = 96; + var C_OPEN_BRACKET = 91; + var C_CLOSE_BRACKET = 93; + var C_LESSTHAN = 60; + var C_BANG = 33; + var C_BACKSLASH$1 = 92; + var C_AMPERSAND = 38; + var C_OPEN_PAREN = 40; + var C_CLOSE_PAREN = 41; + var C_COLON = 58; + var C_SINGLEQUOTE = 39; + var C_DOUBLEQUOTE = 34; + + // Some regexps used in inline parser: + + var ESCAPABLE$1 = ESCAPABLE; + var ESCAPED_CHAR = "\\\\" + ESCAPABLE$1; + + var ENTITY$1 = ENTITY; + var reHtmlTag$1 = reHtmlTag; + + var rePunctuation = new RegExp( + /^[!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDF3C-\uDF3E]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]/ + ); + + var reLinkTitle = new RegExp( + '^(?:"(' + + ESCAPED_CHAR + + '|[^"\\x00])*"' + + "|" + + "'(" + + ESCAPED_CHAR + + "|[^'\\x00])*'" + + "|" + + "\\((" + + ESCAPED_CHAR + + "|[^()\\x00])*\\))" + ); + + var reLinkDestinationBraces = /^(?:<(?:[^<>\n\\\x00]|\\.)*>)/; + + var reEscapable = new RegExp("^" + ESCAPABLE$1); + + var reEntityHere = new RegExp("^" + ENTITY$1, "i"); + + var reTicks = /`+/; + + var reTicksHere = /^`+/; + + var reEllipses = /\.\.\./g; + + var reDash = /--+/g; + + var reEmailAutolink = /^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/; + + var reAutolink = /^<[A-Za-z][A-Za-z0-9.+-]{1,31}:[^<>\x00-\x20]*>/i; + + var reSpnl = /^ *(?:\n *)?/; + + var reWhitespaceChar = /^[ \t\n\x0b\x0c\x0d]/; + + var reUnicodeWhitespaceChar = /^\s/; + + var reFinalSpace = / *$/; + + var reInitialSpace = /^ */; + + var reSpaceAtEndOfLine = /^ *(?:\n|$)/; + + var reLinkLabel = /^\[(?:[^\\\[\]]|\\.){0,1000}\]/s; + + // Matches a string of non-special characters. + var reMain = /^[^\n`\[\]\\!<&*_'"]+/m; + + var text = function(s) { + var node = new Node("text"); + node._literal = s; + return node; + }; + + // normalize a reference in reference link (remove []s, trim, + // collapse internal space, unicode case fold. + // See commonmark/commonmark.js#168. + var normalizeReference = function(string) { + return string + .slice(1, string.length - 1) + .trim() + .replace(/[ \t\r\n]+/, " ") + .toLowerCase() + .toUpperCase(); + }; + + // INLINE PARSER + + // These are methods of an InlineParser object, defined below. + // An InlineParser keeps track of a subject (a string to be + // parsed) and a position in that subject. + + // If re matches at current position in the subject, advance + // position in subject and return the match; otherwise return null. + var match = function(re) { + var m = re.exec(this.subject.slice(this.pos)); + if (m === null) { + return null; + } else { + this.pos += m.index + m[0].length; + return m[0]; + } + }; + + // Returns the code for the character at the current subject position, or -1 + // there are no more characters. + var peek = function() { + if (this.pos < this.subject.length) { + return this.subject.charCodeAt(this.pos); + } else { + return -1; + } + }; + + // Parse zero or more space characters, including at most one newline + var spnl = function() { + this.match(reSpnl); + return true; + }; + + // All of the parsers below try to match something at the current position + // in the subject. If they succeed in matching anything, they + // return the inline matched, advancing the subject. + + // Attempt to parse backticks, adding either a backtick code span or a + // literal sequence of backticks. + var parseBackticks = function(block) { + var ticks = this.match(reTicksHere); + if (ticks === null) { + return false; + } + var afterOpenTicks = this.pos; + var matched; + var node; + var contents; + while ((matched = this.match(reTicks)) !== null) { + if (matched === ticks) { + node = new Node("code"); + contents = this.subject + .slice(afterOpenTicks, this.pos - ticks.length) + .replace(/\n/gm, " "); + if ( + contents.length > 0 && + contents.match(/[^ ]/) !== null && + contents[0] == " " && + contents[contents.length - 1] == " " + ) { + node._literal = contents.slice(1, contents.length - 1); + } else { + node._literal = contents; + } + block.appendChild(node); + return true; + } + } + // If we got here, we didn't match a closing backtick sequence. + this.pos = afterOpenTicks; + block.appendChild(text(ticks)); + return true; + }; + + // Parse a backslash-escaped special character, adding either the escaped + // character, a hard line break (if the backslash is followed by a newline), + // or a literal backslash to the block's children. Assumes current character + // is a backslash. + var parseBackslash = function(block) { + var subj = this.subject; + var node; + this.pos += 1; + if (this.peek() === C_NEWLINE) { + this.pos += 1; + node = new Node("linebreak"); + block.appendChild(node); + } else if (reEscapable.test(subj.charAt(this.pos))) { + block.appendChild(text(subj.charAt(this.pos))); + this.pos += 1; + } else { + block.appendChild(text("\\")); + } + return true; + }; + + // Attempt to parse an autolink (URL or email in pointy brackets). + var parseAutolink = function(block) { + var m; + var dest; + var node; + if ((m = this.match(reEmailAutolink))) { + dest = m.slice(1, m.length - 1); + node = new Node("link"); + node._destination = normalizeURI$1("mailto:" + dest); + node._title = ""; + node.appendChild(text(dest)); + block.appendChild(node); + return true; + } else if ((m = this.match(reAutolink))) { + dest = m.slice(1, m.length - 1); + node = new Node("link"); + node._destination = normalizeURI$1(dest); + node._title = ""; + node.appendChild(text(dest)); + block.appendChild(node); + return true; + } else { + return false; + } + }; + + // Attempt to parse a raw HTML tag. + var parseHtmlTag = function(block) { + var m = this.match(reHtmlTag$1); + if (m === null) { + return false; + } else { + var node = new Node("html_inline"); + node._literal = m; + block.appendChild(node); + return true; + } + }; + + // Scan a sequence of characters with code cc, and return information about + // the number of delimiters and whether they are positioned such that + // they can open and/or close emphasis or strong emphasis. A utility + // function for strong/emph parsing. + var scanDelims = function(cc) { + var numdelims = 0; + var char_before, char_after, cc_after; + var startpos = this.pos; + var left_flanking, right_flanking, can_open, can_close; + var after_is_whitespace, + after_is_punctuation, + before_is_whitespace, + before_is_punctuation; + + if (cc === C_SINGLEQUOTE || cc === C_DOUBLEQUOTE) { + numdelims++; + this.pos++; + } else { + while (this.peek() === cc) { + numdelims++; + this.pos++; + } + } + + if (numdelims === 0) { + return null; + } + + char_before = startpos === 0 ? "\n" : this.subject.charAt(startpos - 1); + + cc_after = this.peek(); + if (cc_after === -1) { + char_after = "\n"; + } else { + char_after = fromCodePoint(cc_after); + } + + after_is_whitespace = reUnicodeWhitespaceChar.test(char_after); + after_is_punctuation = rePunctuation.test(char_after); + before_is_whitespace = reUnicodeWhitespaceChar.test(char_before); + before_is_punctuation = rePunctuation.test(char_before); + + left_flanking = + !after_is_whitespace && + (!after_is_punctuation || + before_is_whitespace || + before_is_punctuation); + right_flanking = + !before_is_whitespace && + (!before_is_punctuation || after_is_whitespace || after_is_punctuation); + if (cc === C_UNDERSCORE) { + can_open = left_flanking && (!right_flanking || before_is_punctuation); + can_close = right_flanking && (!left_flanking || after_is_punctuation); + } else if (cc === C_SINGLEQUOTE || cc === C_DOUBLEQUOTE) { + can_open = left_flanking && !right_flanking; + can_close = right_flanking; + } else { + can_open = left_flanking; + can_close = right_flanking; + } + this.pos = startpos; + return { numdelims: numdelims, can_open: can_open, can_close: can_close }; + }; + + // Handle a delimiter marker for emphasis or a quote. + var handleDelim = function(cc, block) { + var res = this.scanDelims(cc); + if (!res) { + return false; + } + var numdelims = res.numdelims; + var startpos = this.pos; + var contents; + + this.pos += numdelims; + if (cc === C_SINGLEQUOTE) { + contents = "\u2019"; + } else if (cc === C_DOUBLEQUOTE) { + contents = "\u201C"; + } else { + contents = this.subject.slice(startpos, this.pos); + } + var node = text(contents); + block.appendChild(node); + + // Add entry to stack for this opener + if ( + (res.can_open || res.can_close) && + (this.options.smart || (cc !== C_SINGLEQUOTE && cc !== C_DOUBLEQUOTE)) + ) { + this.delimiters = { + cc: cc, + numdelims: numdelims, + origdelims: numdelims, + node: node, + previous: this.delimiters, + next: null, + can_open: res.can_open, + can_close: res.can_close + }; + if (this.delimiters.previous !== null) { + this.delimiters.previous.next = this.delimiters; + } + } + + return true; + }; + + var removeDelimiter = function(delim) { + if (delim.previous !== null) { + delim.previous.next = delim.next; + } + if (delim.next === null) { + // top of stack + this.delimiters = delim.previous; + } else { + delim.next.previous = delim.previous; + } + }; + + var removeDelimitersBetween = function(bottom, top) { + if (bottom.next !== top) { + bottom.next = top; + top.previous = bottom; + } + }; + + var processEmphasis = function(stack_bottom) { + var opener, closer, old_closer; + var opener_inl, closer_inl; + var tempstack; + var use_delims; + var tmp, next; + var opener_found; + var openers_bottom = []; + var openers_bottom_index; + var odd_match = false; + + for (var i = 0; i < 8; i++) { + openers_bottom[i] = stack_bottom; + } + // find first closer above stack_bottom: + closer = this.delimiters; + while (closer !== null && closer.previous !== stack_bottom) { + closer = closer.previous; + } + // move forward, looking for closers, and handling each + while (closer !== null) { + var closercc = closer.cc; + if (!closer.can_close) { + closer = closer.next; + } else { + // found emphasis closer. now look back for first matching opener: + opener = closer.previous; + opener_found = false; + switch (closercc) { + case C_SINGLEQUOTE: + openers_bottom_index = 0; + break; + case C_DOUBLEQUOTE: + openers_bottom_index = 1; + break; + case C_UNDERSCORE: + openers_bottom_index = 2; + break; + case C_ASTERISK: + openers_bottom_index = 3 + (closer.can_open ? 3 : 0) + + (closer.origdelims % 3); + break; + } + while ( + opener !== null && + opener !== stack_bottom && + opener !== openers_bottom[openers_bottom_index] + ) { + odd_match = + (closer.can_open || opener.can_close) && + closer.origdelims % 3 !== 0 && + (opener.origdelims + closer.origdelims) % 3 === 0; + if (opener.cc === closer.cc && opener.can_open && !odd_match) { + opener_found = true; + break; + } + opener = opener.previous; + } + old_closer = closer; + + if (closercc === C_ASTERISK || closercc === C_UNDERSCORE) { + if (!opener_found) { + closer = closer.next; + } else { + // calculate actual number of delimiters used from closer + use_delims = + closer.numdelims >= 2 && opener.numdelims >= 2 ? 2 : 1; + + opener_inl = opener.node; + closer_inl = closer.node; + + // remove used delimiters from stack elts and inlines + opener.numdelims -= use_delims; + closer.numdelims -= use_delims; + opener_inl._literal = opener_inl._literal.slice( + 0, + opener_inl._literal.length - use_delims + ); + closer_inl._literal = closer_inl._literal.slice( + 0, + closer_inl._literal.length - use_delims + ); + + // build contents for new emph element + var emph = new Node(use_delims === 1 ? "emph" : "strong"); + + tmp = opener_inl._next; + while (tmp && tmp !== closer_inl) { + next = tmp._next; + tmp.unlink(); + emph.appendChild(tmp); + tmp = next; + } + + opener_inl.insertAfter(emph); + + // remove elts between opener and closer in delimiters stack + removeDelimitersBetween(opener, closer); + + // if opener has 0 delims, remove it and the inline + if (opener.numdelims === 0) { + opener_inl.unlink(); + this.removeDelimiter(opener); + } + + if (closer.numdelims === 0) { + closer_inl.unlink(); + tempstack = closer.next; + this.removeDelimiter(closer); + closer = tempstack; + } + } + } else if (closercc === C_SINGLEQUOTE) { + closer.node._literal = "\u2019"; + if (opener_found) { + opener.node._literal = "\u2018"; + } + closer = closer.next; + } else if (closercc === C_DOUBLEQUOTE) { + closer.node._literal = "\u201D"; + if (opener_found) { + opener.node.literal = "\u201C"; + } + closer = closer.next; + } + if (!opener_found) { + // Set lower bound for future searches for openers: + openers_bottom[openers_bottom_index] = + old_closer.previous; + if (!old_closer.can_open) { + // We can remove a closer that can't be an opener, + // once we've seen there's no matching opener: + this.removeDelimiter(old_closer); + } + } + } + } + + // remove all delimiters + while (this.delimiters !== null && this.delimiters !== stack_bottom) { + this.removeDelimiter(this.delimiters); + } + }; + + // Attempt to parse link title (sans quotes), returning the string + // or null if no match. + var parseLinkTitle = function() { + var title = this.match(reLinkTitle); + if (title === null) { + return null; + } else { + // chop off quotes from title and unescape: + return unescapeString$1(title.substr(1, title.length - 2)); + } + }; + + // Attempt to parse link destination, returning the string or + // null if no match. + var parseLinkDestination = function() { + var res = this.match(reLinkDestinationBraces); + if (res === null) { + if (this.peek() === C_LESSTHAN) { + return null; + } + // TODO handrolled parser; res should be null or the string + var savepos = this.pos; + var openparens = 0; + var c; + while ((c = this.peek()) !== -1) { + if ( + c === C_BACKSLASH$1 && + reEscapable.test(this.subject.charAt(this.pos + 1)) + ) { + this.pos += 1; + if (this.peek() !== -1) { + this.pos += 1; + } + } else if (c === C_OPEN_PAREN) { + this.pos += 1; + openparens += 1; + } else if (c === C_CLOSE_PAREN) { + if (openparens < 1) { + break; + } else { + this.pos += 1; + openparens -= 1; + } + } else if (reWhitespaceChar.exec(fromCodePoint(c)) !== null) { + break; + } else { + this.pos += 1; + } + } + if (this.pos === savepos && c !== C_CLOSE_PAREN) { + return null; + } + if (openparens !== 0) { + return null; + } + res = this.subject.substr(savepos, this.pos - savepos); + return normalizeURI$1(unescapeString$1(res)); + } else { + // chop off surrounding <..>: + return normalizeURI$1(unescapeString$1(res.substr(1, res.length - 2))); + } + }; + + // Attempt to parse a link label, returning number of characters parsed. + var parseLinkLabel = function() { + var m = this.match(reLinkLabel); + if (m === null || m.length > 1001) { + return 0; + } else { + return m.length; + } + }; + + // Add open bracket to delimiter stack and add a text node to block's children. + var parseOpenBracket = function(block) { + var startpos = this.pos; + this.pos += 1; + + var node = text("["); + block.appendChild(node); + + // Add entry to stack for this opener + this.addBracket(node, startpos, false); + return true; + }; + + // IF next character is [, and ! delimiter to delimiter stack and + // add a text node to block's children. Otherwise just add a text node. + var parseBang = function(block) { + var startpos = this.pos; + this.pos += 1; + if (this.peek() === C_OPEN_BRACKET) { + this.pos += 1; + + var node = text("!["); + block.appendChild(node); + + // Add entry to stack for this opener + this.addBracket(node, startpos + 1, true); + } else { + block.appendChild(text("!")); + } + return true; + }; + + // Try to match close bracket against an opening in the delimiter + // stack. Add either a link or image, or a plain [ character, + // to block's children. If there is a matching delimiter, + // remove it from the delimiter stack. + var parseCloseBracket = function(block) { + var startpos; + var is_image; + var dest; + var title; + var matched = false; + var reflabel; + var opener; + + this.pos += 1; + startpos = this.pos; + + // get last [ or ![ + opener = this.brackets; + + if (opener === null) { + // no matched opener, just return a literal + block.appendChild(text("]")); + return true; + } + + if (!opener.active) { + // no matched opener, just return a literal + block.appendChild(text("]")); + // take opener off brackets stack + this.removeBracket(); + return true; + } + + // If we got here, open is a potential opener + is_image = opener.image; + + // Check to see if we have a link/image + + var savepos = this.pos; + + // Inline link? + if (this.peek() === C_OPEN_PAREN) { + this.pos++; + if ( + this.spnl() && + (dest = this.parseLinkDestination()) !== null && + this.spnl() && + // make sure there's a space before the title: + ((reWhitespaceChar.test(this.subject.charAt(this.pos - 1)) && + (title = this.parseLinkTitle())) || + true) && + this.spnl() && + this.peek() === C_CLOSE_PAREN + ) { + this.pos += 1; + matched = true; + } else { + this.pos = savepos; + } + } + + if (!matched) { + // Next, see if there's a link label + var beforelabel = this.pos; + var n = this.parseLinkLabel(); + if (n > 2) { + reflabel = this.subject.slice(beforelabel, beforelabel + n); + } else if (!opener.bracketAfter) { + // Empty or missing second label means to use the first label as the reference. + // The reference must not contain a bracket. If we know there's a bracket, we don't even bother checking it. + reflabel = this.subject.slice(opener.index, startpos); + } + if (n === 0) { + // If shortcut reference link, rewind before spaces we skipped. + this.pos = savepos; + } + + if (reflabel) { + // lookup rawlabel in refmap + var link = this.refmap[normalizeReference(reflabel)]; + if (link) { + dest = link.destination; + title = link.title; + matched = true; + } + } + } + + if (matched) { + var node = new Node(is_image ? "image" : "link"); + node._destination = dest; + node._title = title || ""; + + var tmp, next; + tmp = opener.node._next; + while (tmp) { + next = tmp._next; + tmp.unlink(); + node.appendChild(tmp); + tmp = next; + } + block.appendChild(node); + this.processEmphasis(opener.previousDelimiter); + this.removeBracket(); + opener.node.unlink(); + + // We remove this bracket and processEmphasis will remove later delimiters. + // Now, for a link, we also deactivate earlier link openers. + // (no links in links) + if (!is_image) { + opener = this.brackets; + while (opener !== null) { + if (!opener.image) { + opener.active = false; // deactivate this opener + } + opener = opener.previous; + } + } + + return true; + } else { + // no match + + this.removeBracket(); // remove this opener from stack + this.pos = startpos; + block.appendChild(text("]")); + return true; + } + }; + + var addBracket = function(node, index, image) { + if (this.brackets !== null) { + this.brackets.bracketAfter = true; + } + this.brackets = { + node: node, + previous: this.brackets, + previousDelimiter: this.delimiters, + index: index, + image: image, + active: true + }; + }; + + var removeBracket = function() { + this.brackets = this.brackets.previous; + }; + + // Attempt to parse an entity. + var parseEntity = function(block) { + var m; + if ((m = this.match(reEntityHere))) { + block.appendChild(text(lib_9(m))); + return true; + } else { + return false; + } + }; + + // Parse a run of ordinary characters, or a single character with + // a special meaning in markdown, as a plain string. + var parseString = function(block) { + var m; + if ((m = this.match(reMain))) { + if (this.options.smart) { + block.appendChild( + text( + m + .replace(reEllipses, "\u2026") + .replace(reDash, function(chars) { + var enCount = 0; + var emCount = 0; + if (chars.length % 3 === 0) { + // If divisible by 3, use all em dashes + emCount = chars.length / 3; + } else if (chars.length % 2 === 0) { + // If divisible by 2, use all en dashes + enCount = chars.length / 2; + } else if (chars.length % 3 === 2) { + // If 2 extra dashes, use en dash for last 2; em dashes for rest + enCount = 1; + emCount = (chars.length - 2) / 3; + } else { + // Use en dashes for last 4 hyphens; em dashes for rest + enCount = 2; + emCount = (chars.length - 4) / 3; + } + return ( + "\u2014".repeat(emCount) + + "\u2013".repeat(enCount) + ); + }) + ) + ); + } else { + block.appendChild(text(m)); + } + return true; + } else { + return false; + } + }; + + // Parse a newline. If it was preceded by two spaces, return a hard + // line break; otherwise a soft line break. + var parseNewline = function(block) { + this.pos += 1; // assume we're at a \n + // check previous node for trailing spaces + var lastc = block._lastChild; + if ( + lastc && + lastc.type === "text" && + lastc._literal[lastc._literal.length - 1] === " " + ) { + var hardbreak = lastc._literal[lastc._literal.length - 2] === " "; + lastc._literal = lastc._literal.replace(reFinalSpace, ""); + block.appendChild(new Node(hardbreak ? "linebreak" : "softbreak")); + } else { + block.appendChild(new Node("softbreak")); + } + this.match(reInitialSpace); // gobble leading spaces in next line + return true; + }; + + // Attempt to parse a link reference, modifying refmap. + var parseReference = function(s, refmap) { + this.subject = s; + this.pos = 0; + var rawlabel; + var dest; + var title; + var matchChars; + var startpos = this.pos; + + // label: + matchChars = this.parseLinkLabel(); + if (matchChars === 0) { + return 0; + } else { + rawlabel = this.subject.substr(0, matchChars); + } + + // colon: + if (this.peek() === C_COLON) { + this.pos++; + } else { + this.pos = startpos; + return 0; + } + + // link url + this.spnl(); + + dest = this.parseLinkDestination(); + if (dest === null) { + this.pos = startpos; + return 0; + } + + var beforetitle = this.pos; + this.spnl(); + if (this.pos !== beforetitle) { + title = this.parseLinkTitle(); + } + if (title === null) { + title = ""; + // rewind before spaces + this.pos = beforetitle; + } + + // make sure we're at line end: + var atLineEnd = true; + if (this.match(reSpaceAtEndOfLine) === null) { + if (title === "") { + atLineEnd = false; + } else { + // the potential title we found is not at the line end, + // but it could still be a legal link reference if we + // discard the title + title = ""; + // rewind before spaces + this.pos = beforetitle; + // and instead check if the link URL is at the line end + atLineEnd = this.match(reSpaceAtEndOfLine) !== null; + } + } + + if (!atLineEnd) { + this.pos = startpos; + return 0; + } + + var normlabel = normalizeReference(rawlabel); + if (normlabel === "") { + // label must contain non-whitespace characters + this.pos = startpos; + return 0; + } + + if (!refmap[normlabel]) { + refmap[normlabel] = { destination: dest, title: title }; + } + return this.pos - startpos; + }; + + // Parse the next inline element in subject, advancing subject position. + // On success, add the result to block's children and return true. + // On failure, return false. + var parseInline = function(block) { + var res = false; + var c = this.peek(); + if (c === -1) { + return false; + } + switch (c) { + case C_NEWLINE: + res = this.parseNewline(block); + break; + case C_BACKSLASH$1: + res = this.parseBackslash(block); + break; + case C_BACKTICK: + res = this.parseBackticks(block); + break; + case C_ASTERISK: + case C_UNDERSCORE: + res = this.handleDelim(c, block); + break; + case C_SINGLEQUOTE: + case C_DOUBLEQUOTE: + res = this.options.smart && this.handleDelim(c, block); + break; + case C_OPEN_BRACKET: + res = this.parseOpenBracket(block); + break; + case C_BANG: + res = this.parseBang(block); + break; + case C_CLOSE_BRACKET: + res = this.parseCloseBracket(block); + break; + case C_LESSTHAN: + res = this.parseAutolink(block) || this.parseHtmlTag(block); + break; + case C_AMPERSAND: + res = this.parseEntity(block); + break; + default: + res = this.parseString(block); + break; + } + if (!res) { + this.pos += 1; + block.appendChild(text(fromCodePoint(c))); + } + + return true; + }; + + // Parse string content in block into inline children, + // using refmap to resolve references. + var parseInlines = function(block) { + this.subject = block._string_content.trim(); + this.pos = 0; + this.delimiters = null; + this.brackets = null; + while (this.parseInline(block)) {} + block._string_content = null; // allow raw string to be garbage collected + this.processEmphasis(null); + }; + + // The InlineParser object. + function InlineParser(options) { + return { + subject: "", + delimiters: null, // used by handleDelim method + brackets: null, + pos: 0, + refmap: {}, + match: match, + peek: peek, + spnl: spnl, + parseBackticks: parseBackticks, + parseBackslash: parseBackslash, + parseAutolink: parseAutolink, + parseHtmlTag: parseHtmlTag, + scanDelims: scanDelims, + handleDelim: handleDelim, + parseLinkTitle: parseLinkTitle, + parseLinkDestination: parseLinkDestination, + parseLinkLabel: parseLinkLabel, + parseOpenBracket: parseOpenBracket, + parseBang: parseBang, + parseCloseBracket: parseCloseBracket, + addBracket: addBracket, + removeBracket: removeBracket, + parseEntity: parseEntity, + parseString: parseString, + parseNewline: parseNewline, + parseReference: parseReference, + parseInline: parseInline, + processEmphasis: processEmphasis, + removeDelimiter: removeDelimiter, + options: options || {}, + parse: parseInlines + }; + } + + var CODE_INDENT = 4; + + var C_TAB = 9; + var C_NEWLINE$1 = 10; + var C_GREATERTHAN = 62; + var C_LESSTHAN$1 = 60; + var C_SPACE = 32; + var C_OPEN_BRACKET$1 = 91; + + var reHtmlBlockOpen = [ + /./, // dummy for 0 + /^<(?:script|pre|textarea|style)(?:\s|>|$)/i, + /^/, + /\?>/, + />/, + /\]\]>/ + ]; + + var reThematicBreak = /^(?:\*[ \t]*){3,}$|^(?:_[ \t]*){3,}$|^(?:-[ \t]*){3,}$/; + + var reMaybeSpecial = /^[#`~*+_=<>0-9-]/; + + var reNonSpace = /[^ \t\f\v\r\n]/; + + var reBulletListMarker = /^[*+-]/; + + var reOrderedListMarker = /^(\d{1,9})([.)])/; + + var reATXHeadingMarker = /^#{1,6}(?:[ \t]+|$)/; + + var reCodeFence = /^`{3,}(?!.*`)|^~{3,}/; + + var reClosingCodeFence = /^(?:`{3,}|~{3,})(?= *$)/; + + var reSetextHeadingLine = /^(?:=+|-+)[ \t]*$/; + + var reLineEnding = /\r\n|\n|\r/; + + // Returns true if string contains only space characters. + var isBlank = function(s) { + return !reNonSpace.test(s); + }; + + var isSpaceOrTab = function(c) { + return c === C_SPACE || c === C_TAB; + }; + + var peek$1 = function(ln, pos) { + if (pos < ln.length) { + return ln.charCodeAt(pos); + } else { + return -1; + } + }; + + // DOC PARSER + + // These are methods of a Parser object, defined below. + + // Returns true if block ends with a blank line, descending if needed + // into lists and sublists. + var endsWithBlankLine = function(block) { + while (block) { + if (block._lastLineBlank) { + return true; + } + var t = block.type; + if (!block._lastLineChecked && (t === "list" || t === "item")) { + block._lastLineChecked = true; + block = block._lastChild; + } else { + block._lastLineChecked = true; + break; + } + } + return false; + }; + + // Add a line to the block at the tip. We assume the tip + // can accept lines -- that check should be done before calling this. + var addLine = function() { + if (this.partiallyConsumedTab) { + this.offset += 1; // skip over tab + // add space characters: + var charsToTab = 4 - (this.column % 4); + this.tip._string_content += " ".repeat(charsToTab); + } + this.tip._string_content += this.currentLine.slice(this.offset) + "\n"; + }; + + // Add block of type tag as a child of the tip. If the tip can't + // accept children, close and finalize it and try its parent, + // and so on til we find a block that can accept children. + var addChild = function(tag, offset) { + while (!this.blocks[this.tip.type].canContain(tag)) { + this.finalize(this.tip, this.lineNumber - 1); + } + + var column_number = offset + 1; // offset 0 = column 1 + var newBlock = new Node(tag, [ + [this.lineNumber, column_number], + [0, 0] + ]); + newBlock._string_content = ""; + this.tip.appendChild(newBlock); + this.tip = newBlock; + return newBlock; + }; + + // Parse a list marker and return data on the marker (type, + // start, delimiter, bullet character, padding) or null. + var parseListMarker = function(parser, container) { + var rest = parser.currentLine.slice(parser.nextNonspace); + var match; + var nextc; + var spacesStartCol; + var spacesStartOffset; + var data = { + type: null, + tight: true, // lists are tight by default + bulletChar: null, + start: null, + delimiter: null, + padding: null, + markerOffset: parser.indent + }; + if (parser.indent >= 4) { + return null; + } + if ((match = rest.match(reBulletListMarker))) { + data.type = "bullet"; + data.bulletChar = match[0][0]; + } else if ( + (match = rest.match(reOrderedListMarker)) && + (container.type !== "paragraph" || match[1] == 1) + ) { + data.type = "ordered"; + data.start = parseInt(match[1]); + data.delimiter = match[2]; + } else { + return null; + } + // make sure we have spaces after + nextc = peek$1(parser.currentLine, parser.nextNonspace + match[0].length); + if (!(nextc === -1 || nextc === C_TAB || nextc === C_SPACE)) { + return null; + } + + // if it interrupts paragraph, make sure first line isn't blank + if ( + container.type === "paragraph" && + !parser.currentLine + .slice(parser.nextNonspace + match[0].length) + .match(reNonSpace) + ) { + return null; + } + + // we've got a match! advance offset and calculate padding + parser.advanceNextNonspace(); // to start of marker + parser.advanceOffset(match[0].length, true); // to end of marker + spacesStartCol = parser.column; + spacesStartOffset = parser.offset; + do { + parser.advanceOffset(1, true); + nextc = peek$1(parser.currentLine, parser.offset); + } while (parser.column - spacesStartCol < 5 && isSpaceOrTab(nextc)); + var blank_item = peek$1(parser.currentLine, parser.offset) === -1; + var spaces_after_marker = parser.column - spacesStartCol; + if (spaces_after_marker >= 5 || spaces_after_marker < 1 || blank_item) { + data.padding = match[0].length + 1; + parser.column = spacesStartCol; + parser.offset = spacesStartOffset; + if (isSpaceOrTab(peek$1(parser.currentLine, parser.offset))) { + parser.advanceOffset(1, true); + } + } else { + data.padding = match[0].length + spaces_after_marker; + } + return data; + }; + + // Returns true if the two list items are of the same type, + // with the same delimiter and bullet character. This is used + // in agglomerating list items into lists. + var listsMatch = function(list_data, item_data) { + return ( + list_data.type === item_data.type && + list_data.delimiter === item_data.delimiter && + list_data.bulletChar === item_data.bulletChar + ); + }; + + // Finalize and close any unmatched blocks. + var closeUnmatchedBlocks = function() { + if (!this.allClosed) { + // finalize any blocks not matched + while (this.oldtip !== this.lastMatchedContainer) { + var parent = this.oldtip._parent; + this.finalize(this.oldtip, this.lineNumber - 1); + this.oldtip = parent; + } + this.allClosed = true; + } + }; + + // 'finalize' is run when the block is closed. + // 'continue' is run to check whether the block is continuing + // at a certain line and offset (e.g. whether a block quote + // contains a `>`. It returns 0 for matched, 1 for not matched, + // and 2 for "we've dealt with this line completely, go to next." + var blocks = { + document: { + continue: function() { + return 0; + }, + finalize: function() { + return; + }, + canContain: function(t) { + return t !== "item"; + }, + acceptsLines: false + }, + list: { + continue: function() { + return 0; + }, + finalize: function(parser, block) { + var item = block._firstChild; + while (item) { + // check for non-final list item ending with blank line: + if (endsWithBlankLine(item) && item._next) { + block._listData.tight = false; + break; + } + // recurse into children of list item, to see if there are + // spaces between any of them: + var subitem = item._firstChild; + while (subitem) { + if ( + endsWithBlankLine(subitem) && + (item._next || subitem._next) + ) { + block._listData.tight = false; + break; + } + subitem = subitem._next; + } + item = item._next; + } + }, + canContain: function(t) { + return t === "item"; + }, + acceptsLines: false + }, + block_quote: { + continue: function(parser) { + var ln = parser.currentLine; + if ( + !parser.indented && + peek$1(ln, parser.nextNonspace) === C_GREATERTHAN + ) { + parser.advanceNextNonspace(); + parser.advanceOffset(1, false); + if (isSpaceOrTab(peek$1(ln, parser.offset))) { + parser.advanceOffset(1, true); + } + } else { + return 1; + } + return 0; + }, + finalize: function() { + return; + }, + canContain: function(t) { + return t !== "item"; + }, + acceptsLines: false + }, + item: { + continue: function(parser, container) { + if (parser.blank) { + if (container._firstChild == null) { + // Blank line after empty list item + return 1; + } else { + parser.advanceNextNonspace(); + } + } else if ( + parser.indent >= + container._listData.markerOffset + container._listData.padding + ) { + parser.advanceOffset( + container._listData.markerOffset + + container._listData.padding, + true + ); + } else { + return 1; + } + return 0; + }, + finalize: function() { + return; + }, + canContain: function(t) { + return t !== "item"; + }, + acceptsLines: false + }, + heading: { + continue: function() { + // a heading can never container > 1 line, so fail to match: + return 1; + }, + finalize: function() { + return; + }, + canContain: function() { + return false; + }, + acceptsLines: false + }, + thematic_break: { + continue: function() { + // a thematic break can never container > 1 line, so fail to match: + return 1; + }, + finalize: function() { + return; + }, + canContain: function() { + return false; + }, + acceptsLines: false + }, + code_block: { + continue: function(parser, container) { + var ln = parser.currentLine; + var indent = parser.indent; + if (container._isFenced) { + // fenced + var match = + indent <= 3 && + ln.charAt(parser.nextNonspace) === container._fenceChar && + ln.slice(parser.nextNonspace).match(reClosingCodeFence); + if (match && match[0].length >= container._fenceLength) { + // closing fence - we're at end of line, so we can return + parser.lastLineLength = + parser.offset + indent + match[0].length; + parser.finalize(container, parser.lineNumber); + return 2; + } else { + // skip optional spaces of fence offset + var i = container._fenceOffset; + while (i > 0 && isSpaceOrTab(peek$1(ln, parser.offset))) { + parser.advanceOffset(1, true); + i--; + } + } + } else { + // indented + if (indent >= CODE_INDENT) { + parser.advanceOffset(CODE_INDENT, true); + } else if (parser.blank) { + parser.advanceNextNonspace(); + } else { + return 1; + } + } + return 0; + }, + finalize: function(parser, block) { + if (block._isFenced) { + // fenced + // first line becomes info string + var content = block._string_content; + var newlinePos = content.indexOf("\n"); + var firstLine = content.slice(0, newlinePos); + var rest = content.slice(newlinePos + 1); + block.info = unescapeString(firstLine.trim()); + block._literal = rest; + } else { + // indented + block._literal = block._string_content.replace( + /(\n *)+$/, + "\n" + ); + } + block._string_content = null; // allow GC + }, + canContain: function() { + return false; + }, + acceptsLines: true + }, + html_block: { + continue: function(parser, container) { + return parser.blank && + (container._htmlBlockType === 6 || + container._htmlBlockType === 7) + ? 1 + : 0; + }, + finalize: function(parser, block) { + block._literal = block._string_content.replace(/(\n *)+$/, ""); + block._string_content = null; // allow GC + }, + canContain: function() { + return false; + }, + acceptsLines: true + }, + paragraph: { + continue: function(parser) { + return parser.blank ? 1 : 0; + }, + finalize: function(parser, block) { + var pos; + var hasReferenceDefs = false; + + // try parsing the beginning as link reference definitions: + while ( + peek$1(block._string_content, 0) === C_OPEN_BRACKET$1 && + (pos = parser.inlineParser.parseReference( + block._string_content, + parser.refmap + )) + ) { + block._string_content = block._string_content.slice(pos); + hasReferenceDefs = true; + } + if (hasReferenceDefs && isBlank(block._string_content)) { + block.unlink(); + } + }, + canContain: function() { + return false; + }, + acceptsLines: true + } + }; + + // block start functions. Return values: + // 0 = no match + // 1 = matched container, keep going + // 2 = matched leaf, no more block starts + var blockStarts = [ + // block quote + function(parser) { + if ( + !parser.indented && + peek$1(parser.currentLine, parser.nextNonspace) === C_GREATERTHAN + ) { + parser.advanceNextNonspace(); + parser.advanceOffset(1, false); + // optional following space + if (isSpaceOrTab(peek$1(parser.currentLine, parser.offset))) { + parser.advanceOffset(1, true); + } + parser.closeUnmatchedBlocks(); + parser.addChild("block_quote", parser.nextNonspace); + return 1; + } else { + return 0; + } + }, + + // ATX heading + function(parser) { + var match; + if ( + !parser.indented && + (match = parser.currentLine + .slice(parser.nextNonspace) + .match(reATXHeadingMarker)) + ) { + parser.advanceNextNonspace(); + parser.advanceOffset(match[0].length, false); + parser.closeUnmatchedBlocks(); + var container = parser.addChild("heading", parser.nextNonspace); + container.level = match[0].trim().length; // number of #s + // remove trailing ###s: + container._string_content = parser.currentLine + .slice(parser.offset) + .replace(/^[ \t]*#+[ \t]*$/, "") + .replace(/[ \t]+#+[ \t]*$/, ""); + parser.advanceOffset(parser.currentLine.length - parser.offset); + return 2; + } else { + return 0; + } + }, + + // Fenced code block + function(parser) { + var match; + if ( + !parser.indented && + (match = parser.currentLine + .slice(parser.nextNonspace) + .match(reCodeFence)) + ) { + var fenceLength = match[0].length; + parser.closeUnmatchedBlocks(); + var container = parser.addChild("code_block", parser.nextNonspace); + container._isFenced = true; + container._fenceLength = fenceLength; + container._fenceChar = match[0][0]; + container._fenceOffset = parser.indent; + parser.advanceNextNonspace(); + parser.advanceOffset(fenceLength, false); + return 2; + } else { + return 0; + } + }, + + // HTML block + function(parser, container) { + if ( + !parser.indented && + peek$1(parser.currentLine, parser.nextNonspace) === C_LESSTHAN$1 + ) { + var s = parser.currentLine.slice(parser.nextNonspace); + var blockType; + + for (blockType = 1; blockType <= 7; blockType++) { + if ( + reHtmlBlockOpen[blockType].test(s) && + (blockType < 7 || (container.type !== "paragraph" && + !(!parser.allClosed && !parser.blank && + parser.tip.type === "paragraph") // maybe lazy + )) + ) { + parser.closeUnmatchedBlocks(); + // We don't adjust parser.offset; + // spaces are part of the HTML block: + var b = parser.addChild("html_block", parser.offset); + b._htmlBlockType = blockType; + return 2; + } + } + } + + return 0; + }, + + // Setext heading + function(parser, container) { + var match; + if ( + !parser.indented && + container.type === "paragraph" && + (match = parser.currentLine + .slice(parser.nextNonspace) + .match(reSetextHeadingLine)) + ) { + parser.closeUnmatchedBlocks(); + // resolve reference link definitiosn + var pos; + while ( + peek$1(container._string_content, 0) === C_OPEN_BRACKET$1 && + (pos = parser.inlineParser.parseReference( + container._string_content, + parser.refmap + )) + ) { + container._string_content = container._string_content.slice( + pos + ); + } + if (container._string_content.length > 0) { + var heading = new Node("heading", container.sourcepos); + heading.level = match[0][0] === "=" ? 1 : 2; + heading._string_content = container._string_content; + container.insertAfter(heading); + container.unlink(); + parser.tip = heading; + parser.advanceOffset( + parser.currentLine.length - parser.offset, + false + ); + return 2; + } else { + return 0; + } + } else { + return 0; + } + }, + + // thematic break + function(parser) { + if ( + !parser.indented && + reThematicBreak.test(parser.currentLine.slice(parser.nextNonspace)) + ) { + parser.closeUnmatchedBlocks(); + parser.addChild("thematic_break", parser.nextNonspace); + parser.advanceOffset( + parser.currentLine.length - parser.offset, + false + ); + return 2; + } else { + return 0; + } + }, + + // list item + function(parser, container) { + var data; + + if ( + (!parser.indented || container.type === "list") && + (data = parseListMarker(parser, container)) + ) { + parser.closeUnmatchedBlocks(); + + // add the list if needed + if ( + parser.tip.type !== "list" || + !listsMatch(container._listData, data) + ) { + container = parser.addChild("list", parser.nextNonspace); + container._listData = data; + } + + // add the list item + container = parser.addChild("item", parser.nextNonspace); + container._listData = data; + return 1; + } else { + return 0; + } + }, + + // indented code block + function(parser) { + if ( + parser.indented && + parser.tip.type !== "paragraph" && + !parser.blank + ) { + // indented code + parser.advanceOffset(CODE_INDENT, true); + parser.closeUnmatchedBlocks(); + parser.addChild("code_block", parser.offset); + return 2; + } else { + return 0; + } + } + ]; + + var advanceOffset = function(count, columns) { + var currentLine = this.currentLine; + var charsToTab, charsToAdvance; + var c; + while (count > 0 && (c = currentLine[this.offset])) { + if (c === "\t") { + charsToTab = 4 - (this.column % 4); + if (columns) { + this.partiallyConsumedTab = charsToTab > count; + charsToAdvance = charsToTab > count ? count : charsToTab; + this.column += charsToAdvance; + this.offset += this.partiallyConsumedTab ? 0 : 1; + count -= charsToAdvance; + } else { + this.partiallyConsumedTab = false; + this.column += charsToTab; + this.offset += 1; + count -= 1; + } + } else { + this.partiallyConsumedTab = false; + this.offset += 1; + this.column += 1; // assume ascii; block starts are ascii + count -= 1; + } + } + }; + + var advanceNextNonspace = function() { + this.offset = this.nextNonspace; + this.column = this.nextNonspaceColumn; + this.partiallyConsumedTab = false; + }; + + var findNextNonspace = function() { + var currentLine = this.currentLine; + var i = this.offset; + var cols = this.column; + var c; + + while ((c = currentLine.charAt(i)) !== "") { + if (c === " ") { + i++; + cols++; + } else if (c === "\t") { + i++; + cols += 4 - (cols % 4); + } else { + break; + } + } + this.blank = c === "\n" || c === "\r" || c === ""; + this.nextNonspace = i; + this.nextNonspaceColumn = cols; + this.indent = this.nextNonspaceColumn - this.column; + this.indented = this.indent >= CODE_INDENT; + }; + + // Analyze a line of text and update the document appropriately. + // We parse markdown text by calling this on each line of input, + // then finalizing the document. + var incorporateLine = function(ln) { + var all_matched = true; + var t; + + var container = this.doc; + this.oldtip = this.tip; + this.offset = 0; + this.column = 0; + this.blank = false; + this.partiallyConsumedTab = false; + this.lineNumber += 1; + + // replace NUL characters for security + if (ln.indexOf("\u0000") !== -1) { + ln = ln.replace(/\0/g, "\uFFFD"); + } + + this.currentLine = ln; + + // For each containing block, try to parse the associated line start. + // Bail out on failure: container will point to the last matching block. + // Set all_matched to false if not all containers match. + var lastChild; + while ((lastChild = container._lastChild) && lastChild._open) { + container = lastChild; + + this.findNextNonspace(); + + switch (this.blocks[container.type].continue(this, container)) { + case 0: // we've matched, keep going + break; + case 1: // we've failed to match a block + all_matched = false; + break; + case 2: // we've hit end of line for fenced code close and can return + return; + default: + throw "continue returned illegal value, must be 0, 1, or 2"; + } + if (!all_matched) { + container = container._parent; // back up to last matching block + break; + } + } + + this.allClosed = container === this.oldtip; + this.lastMatchedContainer = container; + + var matchedLeaf = + container.type !== "paragraph" && blocks[container.type].acceptsLines; + var starts = this.blockStarts; + var startsLen = starts.length; + // Unless last matched container is a code block, try new container starts, + // adding children to the last matched container: + while (!matchedLeaf) { + this.findNextNonspace(); + + // this is a little performance optimization: + if ( + !this.indented && + !reMaybeSpecial.test(ln.slice(this.nextNonspace)) + ) { + this.advanceNextNonspace(); + break; + } + + var i = 0; + while (i < startsLen) { + var res = starts[i](this, container); + if (res === 1) { + container = this.tip; + break; + } else if (res === 2) { + container = this.tip; + matchedLeaf = true; + break; + } else { + i++; + } + } + + if (i === startsLen) { + // nothing matched + this.advanceNextNonspace(); + break; + } + } + + // What remains at the offset is a text line. Add the text to the + // appropriate container. + + // First check for a lazy paragraph continuation: + if (!this.allClosed && !this.blank && this.tip.type === "paragraph") { + // lazy paragraph continuation + this.addLine(); + } else { + // not a lazy continuation + + // finalize any blocks not matched + this.closeUnmatchedBlocks(); + if (this.blank && container.lastChild) { + container.lastChild._lastLineBlank = true; + } + + t = container.type; + + // Block quote lines are never blank as they start with > + // and we don't count blanks in fenced code for purposes of tight/loose + // lists or breaking out of lists. We also don't set _lastLineBlank + // on an empty list item, or if we just closed a fenced block. + var lastLineBlank = + this.blank && + !( + t === "block_quote" || + (t === "code_block" && container._isFenced) || + (t === "item" && + !container._firstChild && + container.sourcepos[0][0] === this.lineNumber) + ); + + // propagate lastLineBlank up through parents: + var cont = container; + while (cont) { + cont._lastLineBlank = lastLineBlank; + cont = cont._parent; + } + + if (this.blocks[t].acceptsLines) { + this.addLine(); + // if HtmlBlock, check for end condition + if ( + t === "html_block" && + container._htmlBlockType >= 1 && + container._htmlBlockType <= 5 && + reHtmlBlockClose[container._htmlBlockType].test( + this.currentLine.slice(this.offset) + ) + ) { + this.lastLineLength = ln.length; + this.finalize(container, this.lineNumber); + } + } else if (this.offset < ln.length && !this.blank) { + // create paragraph container for line + container = this.addChild("paragraph", this.offset); + this.advanceNextNonspace(); + this.addLine(); + } + } + this.lastLineLength = ln.length; + }; + + // Finalize a block. Close it and do any necessary postprocessing, + // e.g. creating string_content from strings, setting the 'tight' + // or 'loose' status of a list, and parsing the beginnings + // of paragraphs for reference definitions. Reset the tip to the + // parent of the closed block. + var finalize = function(block, lineNumber) { + var above = block._parent; + block._open = false; + block.sourcepos[1] = [lineNumber, this.lastLineLength]; + + this.blocks[block.type].finalize(this, block); + + this.tip = above; + }; + + // Walk through a block & children recursively, parsing string content + // into inline content where appropriate. + var processInlines = function(block) { + var node, event, t; + var walker = block.walker(); + this.inlineParser.refmap = this.refmap; + this.inlineParser.options = this.options; + while ((event = walker.next())) { + node = event.node; + t = node.type; + if (!event.entering && (t === "paragraph" || t === "heading")) { + this.inlineParser.parse(node); + } + } + }; + + var Document = function() { + var doc = new Node("document", [ + [1, 1], + [0, 0] + ]); + return doc; + }; + + // The main parsing function. Returns a parsed document AST. + var parse = function(input) { + this.doc = new Document(); + this.tip = this.doc; + this.refmap = {}; + this.lineNumber = 0; + this.lastLineLength = 0; + this.offset = 0; + this.column = 0; + this.lastMatchedContainer = this.doc; + this.currentLine = ""; + if (this.options.time) { + console.time("preparing input"); + } + var lines = input.split(reLineEnding); + var len = lines.length; + if (input.charCodeAt(input.length - 1) === C_NEWLINE$1) { + // ignore last blank line created by final newline + len -= 1; + } + if (this.options.time) { + console.timeEnd("preparing input"); + } + if (this.options.time) { + console.time("block parsing"); + } + for (var i = 0; i < len; i++) { + this.incorporateLine(lines[i]); + } + while (this.tip) { + this.finalize(this.tip, len); + } + if (this.options.time) { + console.timeEnd("block parsing"); + } + if (this.options.time) { + console.time("inline parsing"); + } + this.processInlines(this.doc); + if (this.options.time) { + console.timeEnd("inline parsing"); + } + return this.doc; + }; + + // The Parser object. + function Parser(options) { + return { + doc: new Document(), + blocks: blocks, + blockStarts: blockStarts, + tip: this.doc, + oldtip: this.doc, + currentLine: "", + lineNumber: 0, + offset: 0, + column: 0, + nextNonspace: 0, + nextNonspaceColumn: 0, + indent: 0, + indented: false, + blank: false, + partiallyConsumedTab: false, + allClosed: true, + lastMatchedContainer: this.doc, + refmap: {}, + lastLineLength: 0, + inlineParser: new InlineParser(options), + findNextNonspace: findNextNonspace, + advanceOffset: advanceOffset, + advanceNextNonspace: advanceNextNonspace, + addLine: addLine, + addChild: addChild, + incorporateLine: incorporateLine, + finalize: finalize, + processInlines: processInlines, + closeUnmatchedBlocks: closeUnmatchedBlocks, + parse: parse, + options: options || {} + }; + } + + function Renderer() {} + + /** + * Walks the AST and calls member methods for each Node type. + * + * @param ast {Node} The root of the abstract syntax tree. + */ + function render(ast) { + var walker = ast.walker(), + event, + type; + + this.buffer = ""; + this.lastOut = "\n"; + + while ((event = walker.next())) { + type = event.node.type; + if (this[type]) { + this[type](event.node, event.entering); + } + } + return this.buffer; + } + + /** + * Concatenate a literal string to the buffer. + * + * @param str {String} The string to concatenate. + */ + function lit(str) { + this.buffer += str; + this.lastOut = str; + } + + /** + * Output a newline to the buffer. + */ + function cr() { + if (this.lastOut !== "\n") { + this.lit("\n"); + } + } + + /** + * Concatenate a string to the buffer possibly escaping the content. + * + * Concrete renderer implementations should override this method. + * + * @param str {String} The string to concatenate. + */ + function out(str) { + this.lit(str); + } + + /** + * Escape a string for the target renderer. + * + * Abstract function that should be implemented by concrete + * renderer implementations. + * + * @param str {String} The string to escape. + */ + function esc(str) { + return str; + } + + Renderer.prototype.render = render; + Renderer.prototype.out = out; + Renderer.prototype.lit = lit; + Renderer.prototype.cr = cr; + Renderer.prototype.esc = esc; + + var reUnsafeProtocol = /^javascript:|vbscript:|file:|data:/i; + var reSafeDataProtocol = /^data:image\/(?:png|gif|jpeg|webp)/i; + + var potentiallyUnsafe = function(url) { + return reUnsafeProtocol.test(url) && !reSafeDataProtocol.test(url); + }; + + // Helper function to produce an HTML tag. + function tag(name, attrs, selfclosing) { + if (this.disableTags > 0) { + return; + } + this.buffer += "<" + name; + if (attrs && attrs.length > 0) { + var i = 0; + var attrib; + while ((attrib = attrs[i]) !== undefined) { + this.buffer += " " + attrib[0] + '="' + attrib[1] + '"'; + i++; + } + } + if (selfclosing) { + this.buffer += " /"; + } + this.buffer += ">"; + this.lastOut = ">"; + } + + function HtmlRenderer(options) { + options = options || {}; + // by default, soft breaks are rendered as newlines in HTML + options.softbreak = options.softbreak || "\n"; + // set to "
" to make them hard breaks + // set to " " if you want to ignore line wrapping in source + this.esc = options.esc || escapeXml; + // escape html with a custom function + // else use escapeXml + + this.disableTags = 0; + this.lastOut = "\n"; + this.options = options; + } + + /* Node methods */ + + function text$1(node) { + this.out(node.literal); + } + + function softbreak() { + this.lit(this.options.softbreak); + } + + function linebreak() { + this.tag("br", [], true); + this.cr(); + } + + function link(node, entering) { + var attrs = this.attrs(node); + if (entering) { + if (!(this.options.safe && potentiallyUnsafe(node.destination))) { + attrs.push(["href", this.esc(node.destination)]); + } + if (node.title) { + attrs.push(["title", this.esc(node.title)]); + } + this.tag("a", attrs); + } else { + this.tag("/a"); + } + } + + function image$1(node, entering) { + if (entering) { + if (this.disableTags === 0) { + if (this.options.safe && potentiallyUnsafe(node.destination)) { + this.lit('');
+                } else {
+                    this.lit('<img src='); + } + } + } + + function emph(node, entering) { + this.tag(entering ? "em" : "/em"); + } + + function strong(node, entering) { + this.tag(entering ? "strong" : "/strong"); + } + + function paragraph(node, entering) { + var grandparent = node.parent.parent, + attrs = this.attrs(node); + if (grandparent !== null && grandparent.type === "list") { + if (grandparent.listTight) { + return; + } + } + if (entering) { + this.cr(); + this.tag("p", attrs); + } else { + this.tag("/p"); + this.cr(); + } + } + + function heading(node, entering) { + var tagname = "h" + node.level, + attrs = this.attrs(node); + if (entering) { + this.cr(); + this.tag(tagname, attrs); + } else { + this.tag("/" + tagname); + this.cr(); + } + } + + function code(node) { + this.tag("code"); + this.out(node.literal); + this.tag("/code"); + } + + function code_block(node) { + var info_words = node.info ? node.info.split(/\s+/) : [], + attrs = this.attrs(node); + if (info_words.length > 0 && info_words[0].length > 0) { + attrs.push(["class", "language-" + this.esc(info_words[0])]); + } + this.cr(); + this.tag("pre"); + this.tag("code", attrs); + this.out(node.literal); + this.tag("/code"); + this.tag("/pre"); + this.cr(); + } + + function thematic_break(node) { + var attrs = this.attrs(node); + this.cr(); + this.tag("hr", attrs, true); + this.cr(); + } + + function block_quote(node, entering) { + var attrs = this.attrs(node); + if (entering) { + this.cr(); + this.tag("blockquote", attrs); + this.cr(); + } else { + this.cr(); + this.tag("/blockquote"); + this.cr(); + } + } + + function list(node, entering) { + var tagname = node.listType === "bullet" ? "ul" : "ol", + attrs = this.attrs(node); + + if (entering) { + var start = node.listStart; + if (start !== null && start !== 1) { + attrs.push(["start", start.toString()]); + } + this.cr(); + this.tag(tagname, attrs); + this.cr(); + } else { + this.cr(); + this.tag("/" + tagname); + this.cr(); + } + } + + function item(node, entering) { + var attrs = this.attrs(node); + if (entering) { + this.tag("li", attrs); + } else { + this.tag("/li"); + this.cr(); + } + } + + function html_inline(node) { + if (this.options.safe) { + this.lit(""); + } else { + this.lit(node.literal); + } + } + + function html_block(node) { + this.cr(); + if (this.options.safe) { + this.lit(""); + } else { + this.lit(node.literal); + } + this.cr(); + } + + function custom_inline(node, entering) { + if (entering && node.onEnter) { + this.lit(node.onEnter); + } else if (!entering && node.onExit) { + this.lit(node.onExit); + } + } + + function custom_block(node, entering) { + this.cr(); + if (entering && node.onEnter) { + this.lit(node.onEnter); + } else if (!entering && node.onExit) { + this.lit(node.onExit); + } + this.cr(); + } + + /* Helper methods */ + + function out$1(s) { + this.lit(this.esc(s)); + } + + function attrs(node) { + var att = []; + if (this.options.sourcepos) { + var pos = node.sourcepos; + if (pos) { + att.push([ + "data-sourcepos", + String(pos[0][0]) + + ":" + + String(pos[0][1]) + + "-" + + String(pos[1][0]) + + ":" + + String(pos[1][1]) + ]); + } + } + return att; + } + + // quick browser-compatible inheritance + HtmlRenderer.prototype = Object.create(Renderer.prototype); + + HtmlRenderer.prototype.text = text$1; + HtmlRenderer.prototype.html_inline = html_inline; + HtmlRenderer.prototype.html_block = html_block; + HtmlRenderer.prototype.softbreak = softbreak; + HtmlRenderer.prototype.linebreak = linebreak; + HtmlRenderer.prototype.link = link; + HtmlRenderer.prototype.image = image$1; + HtmlRenderer.prototype.emph = emph; + HtmlRenderer.prototype.strong = strong; + HtmlRenderer.prototype.paragraph = paragraph; + HtmlRenderer.prototype.heading = heading; + HtmlRenderer.prototype.code = code; + HtmlRenderer.prototype.code_block = code_block; + HtmlRenderer.prototype.thematic_break = thematic_break; + HtmlRenderer.prototype.block_quote = block_quote; + HtmlRenderer.prototype.list = list; + HtmlRenderer.prototype.item = item; + HtmlRenderer.prototype.custom_inline = custom_inline; + HtmlRenderer.prototype.custom_block = custom_block; + + HtmlRenderer.prototype.esc = escapeXml; + + HtmlRenderer.prototype.out = out$1; + HtmlRenderer.prototype.tag = tag; + HtmlRenderer.prototype.attrs = attrs; + + var reXMLTag = /\<[^>]*\>/; + + function toTagName(s) { + return s.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase(); + } + + function XmlRenderer(options) { + options = options || {}; + + this.disableTags = 0; + this.lastOut = "\n"; + + this.indentLevel = 0; + this.indent = " "; + + this.esc = options.esc || escapeXml; + // escape html with a custom function + // else use escapeXml + + this.options = options; + } + + function render$1(ast) { + this.buffer = ""; + + var attrs; + var tagname; + var walker = ast.walker(); + var event, node, entering; + var container; + var selfClosing; + var nodetype; + + var options = this.options; + + if (options.time) { + console.time("rendering"); + } + + this.buffer += '\n'; + this.buffer += '\n'; + + while ((event = walker.next())) { + entering = event.entering; + node = event.node; + nodetype = node.type; + + container = node.isContainer; + + selfClosing = + nodetype === "thematic_break" || + nodetype === "linebreak" || + nodetype === "softbreak"; + + tagname = toTagName(nodetype); + + if (entering) { + attrs = []; + + switch (nodetype) { + case "document": + attrs.push(["xmlns", "http://commonmark.org/xml/1.0"]); + break; + case "list": + if (node.listType !== null) { + attrs.push(["type", node.listType.toLowerCase()]); + } + if (node.listStart !== null) { + attrs.push(["start", String(node.listStart)]); + } + if (node.listTight !== null) { + attrs.push([ + "tight", + node.listTight ? "true" : "false" + ]); + } + var delim = node.listDelimiter; + if (delim !== null) { + var delimword = ""; + if (delim === ".") { + delimword = "period"; + } else { + delimword = "paren"; + } + attrs.push(["delimiter", delimword]); + } + break; + case "code_block": + if (node.info) { + attrs.push(["info", node.info]); + } + break; + case "heading": + attrs.push(["level", String(node.level)]); + break; + case "link": + case "image": + attrs.push(["destination", node.destination]); + attrs.push(["title", node.title]); + break; + case "custom_inline": + case "custom_block": + attrs.push(["on_enter", node.onEnter]); + attrs.push(["on_exit", node.onExit]); + break; + } + if (options.sourcepos) { + var pos = node.sourcepos; + if (pos) { + attrs.push([ + "sourcepos", + String(pos[0][0]) + + ":" + + String(pos[0][1]) + + "-" + + String(pos[1][0]) + + ":" + + String(pos[1][1]) + ]); + } + } + + this.cr(); + this.out(this.tag(tagname, attrs, selfClosing)); + if (container) { + this.indentLevel += 1; + } else if (!container && !selfClosing) { + var lit = node.literal; + if (lit) { + this.out(this.esc(lit)); + } + this.out(this.tag("/" + tagname)); + } + } else { + this.indentLevel -= 1; + this.cr(); + this.out(this.tag("/" + tagname)); + } + } + if (options.time) { + console.timeEnd("rendering"); + } + this.buffer += "\n"; + return this.buffer; + } + + function out$2(s) { + if (this.disableTags > 0) { + this.buffer += s.replace(reXMLTag, ""); + } else { + this.buffer += s; + } + this.lastOut = s; + } + + function cr$1() { + if (this.lastOut !== "\n") { + this.buffer += "\n"; + this.lastOut = "\n"; + for (var i = this.indentLevel; i > 0; i--) { + this.buffer += this.indent; + } + } + } + + // Helper function to produce an XML tag. + function tag$1(name, attrs, selfclosing) { + var result = "<" + name; + if (attrs && attrs.length > 0) { + var i = 0; + var attrib; + while ((attrib = attrs[i]) !== undefined) { + result += " " + attrib[0] + '="' + this.esc(attrib[1]) + '"'; + i++; + } + } + if (selfclosing) { + result += " /"; + } + result += ">"; + return result; + } + + // quick browser-compatible inheritance + XmlRenderer.prototype = Object.create(Renderer.prototype); + + XmlRenderer.prototype.render = render$1; + XmlRenderer.prototype.out = out$2; + XmlRenderer.prototype.cr = cr$1; + XmlRenderer.prototype.tag = tag$1; + XmlRenderer.prototype.esc = escapeXml; + + exports.HtmlRenderer = HtmlRenderer; + exports.Node = Node; + exports.Parser = Parser; + exports.Renderer = Renderer; + exports.XmlRenderer = XmlRenderer; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/lib/docs/index.html b/lib/docs/index.html index e2c0d79e23..6b9f95a7d0 100644 --- a/lib/docs/index.html +++ b/lib/docs/index.html @@ -24,6 +24,7 @@ --search-bg-color: #f3f3f3; --search-bg-color-focus: #ffffff; --search-sh-color: rgba(0, 0, 0, 0.18); + --search-other-results-color: rgb(100, 100, 100); --help-sh-color: rgba(0, 0, 0, 0.75); --help-bg-color: #aaa; } @@ -83,6 +84,7 @@ .flex-right { display: flex; + flex-direction: column; overflow: auto; -webkit-overflow-scrolling: touch; flex-grow: 1; @@ -200,7 +202,7 @@ } #guides { - padding: 1rem 0.7rem 2.4rem 1.4rem; + padding: 0rem 0.7rem 2.4rem 1.4rem; box-sizing: border-box; font-size: 1rem; background-color: var(--bg-color); @@ -209,7 +211,7 @@ /* docs section */ .docs { - padding: 1rem 0.7rem 2.4rem 1.4rem; + padding: 0rem 0.7rem 2.4rem 1.4rem; font-size: 1rem; background-color: var(--bg-color); overflow-wrap: break-word; @@ -247,7 +249,38 @@ top: 5px; left: 5px; } - + + .other-results { + line-height: 1em; + position: relative; + outline: 0; + border: 0; + color: var(--search-other-results-color); + text-align: center; + height: 1.5em; + opacity: .5; + } + .other-results:before { + content: ''; + background: var(--search-other-results-color); + position: absolute; + left: 0; + top: 50%; + width: 100%; + height: 1px; + } + + .other-results:after { + content: "other results"; + position: relative; + display: inline-block; + padding: 0 .5em; + line-height: 1.5em; + color: var(--search-other-results-color); + background-color: var(--bg-color); + } + + .docs a { color: var(--link-color); } @@ -505,6 +538,7 @@ --search-bg-color: #3c3c3c; --search-bg-color-focus: #000; --search-sh-color: rgba(255, 255, 255, 0.28); + --search-other-results-color: rgba(255, 255, 255, 0.28); --help-sh-color: rgba(142, 142, 142, 0.5); --help-bg-color: #333; } @@ -717,22 +751,38 @@

Zig Version

-
- - -
+
+
+
+ s to search, ? for more options + +
+
+
+ + - -
+ diff --git a/lib/docs/main.js b/lib/docs/main.js index b19c8bf238..88a4c08a6e 100644 --- a/lib/docs/main.js +++ b/lib/docs/main.js @@ -4,7 +4,6 @@ var zigAnalysis; const NAV_MODES = { API: "#A;", - API_INTERNAL: "#a;", GUIDES: "#G;", }; @@ -56,12 +55,13 @@ const NAV_MODES = { const domSectSearchResults = document.getElementById("sectSearchResults"); const domSectSearchAllResultsLink = document.getElementById("sectSearchAllResultsLink"); const domDocs = document.getElementById("docs"); - const domGuides = document.getElementById("guides"); + const domGuidesSection = document.getElementById("guides"); + const domActiveGuide = document.getElementById("activeGuide"); + const domListSearchResults = document.getElementById("listSearchResults"); const domSectSearchNoResults = document.getElementById("sectSearchNoResults"); const domSectInfo = document.getElementById("sectInfo"); // const domTdTarget = (document.getElementById("tdTarget")); - const domPrivDeclsBox = document.getElementById("privDeclsBox"); const domTdZigVer = document.getElementById("tdZigVer"); const domHdrName = document.getElementById("hdrName"); const domHelpModal = document.getElementById("helpModal"); @@ -83,15 +83,16 @@ const NAV_MODES = { let typeTypeId = findTypeTypeId(); let pointerSizeEnum = { One: 0, Many: 1, Slice: 2, C: 3 }; + let declSearchIndex = new RadixTree(); + window.search = declSearchIndex; + // for each module, is an array with modules to get to this one let canonModPaths = computeCanonicalModulePaths(); // for each decl, is an array with {declNames, modNames} to get to this one - let canonDeclPaths = null; // lazy; use getCanonDeclPath // for each type, is an array with {declNames, modNames} to get to this one - let canonTypeDecls = null; // lazy; use getCanonTypeDecl let curNav = { @@ -122,6 +123,12 @@ const NAV_MODES = { // map of decl index to list of comptime fn calls // let nodesToCallsMap = indexNodesToCalls(); + let guidesSearchIndex = {}; + window.guideSearch = guidesSearchIndex; + parseGuides(); + + + domSearch.disabled = false; domSearch.addEventListener("keydown", onSearchKeyDown, false); domSearch.addEventListener("focus", ev => { @@ -139,31 +146,6 @@ const NAV_MODES = { onHashChange(); } - domPrivDeclsBox.addEventListener( - "change", - function () { - if (this.checked != curNav.showPrivDecls) { - if ( - this.checked && - location.hash.length > 1 && - location.hash[1] != "*" - ) { - location.hash = "#*" + location.hash.substring(1); - return; - } - if ( - !this.checked && - location.hash.length > 1 && - location.hash[1] == "*" - ) { - location.hash = "#" + location.hash.substring(2); - return; - } - } - }, - false - ); - if (location.hash == "") { location.hash = "#A;"; } @@ -189,7 +171,6 @@ const NAV_MODES = { let suffix = " - Zig"; switch (curNav.mode) { case NAV_MODES.API: - case NAV_MODES.API_INTERNAL: let list = curNav.modNames.concat(curNav.declNames); if (list.length === 0) { document.title = zigAnalysis.modules[zigAnalysis.rootMod].name + suffix; @@ -284,8 +265,11 @@ const NAV_MODES = { function resolveValue(value) { let i = 0; - while (i < 1000) { + while (true) { i += 1; + if (i >= 10000) { + throw "resolveValue quota exceeded" + } if ("refPath" in value.expr) { value = { expr: value.expr.refPath[value.expr.refPath.length - 1] }; @@ -307,8 +291,31 @@ const NAV_MODES = { return value; } - console.assert(false); - return {}; + } + + function resolveGenericRet(genericFunc) { + if (genericFunc.generic_ret == null) return null; + let result = resolveValue({expr: genericFunc.generic_ret}); + + let i = 0; + while (true) { + i += 1; + if (i >= 10000) { + throw "resolveGenericRet quota exceeded" + } + + if ("call" in result.expr) { + let call = zigAnalysis.calls[result.expr.call]; + let resolvedFunc = resolveValue({ expr: call.func }); + if (!("type" in resolvedFunc.expr)) return null; + let callee = getType(resolvedFunc.expr.type); + if (!callee.generic_ret) return null; + result = resolveValue({ expr: callee.generic_ret }); + continue; + } + + return result; + } } // function typeOfDecl(decl){ @@ -401,8 +408,12 @@ const NAV_MODES = { domGuideSwitch.classList.add("active"); domApiSwitch.classList.remove("active"); domDocs.classList.add("hidden"); - domGuides.classList.remove("hidden"); + domGuidesSection.classList.remove("hidden"); + domActiveGuide.classList.add("hidden"); domApiMenu.classList.add("hidden"); + domSectSearchResults.classList.add("hidden"); + domSectSearchAllResultsLink.classList.add("hidden"); + domSectSearchNoResults.classList.add("hidden"); // sidebar guides list const section_list = zigAnalysis.guide_sections; @@ -417,7 +428,7 @@ const NAV_MODES = { const guide = section.guides[i]; let liDom = domGuides.children[i]; let aDom = liDom.children[0]; - aDom.textContent = guide.name; + aDom.textContent = guide.title; aDom.setAttribute("href", NAV_MODES.GUIDES + guide.name); if (guide.name === curNav.activeGuide) { aDom.classList.add("active"); @@ -431,6 +442,11 @@ const NAV_MODES = { domGuidesMenu.classList.remove("hidden"); } + + if (curNavSearch !== "") { + return renderSearchGuides(); + } + // main content let activeGuide = undefined; outer: for (let i = 0; i < zigAnalysis.guide_sections.length; i += 1) { @@ -447,7 +463,7 @@ const NAV_MODES = { if (activeGuide == undefined) { const root_file_idx = zigAnalysis.modules[zigAnalysis.rootMod].file; const root_file_name = getFile(root_file_idx).name; - domGuides.innerHTML = markdown(` + domActiveGuide.innerHTML = markdown(` # Zig Guides These autodocs don't contain any guide. @@ -461,13 +477,21 @@ const NAV_MODES = { You can add guides by specifying which markdown files to include in the top level doc comment of your root file, like so: - (At the top of \`${root_file_name}\`) + (At the top of *${root_file_name}*) \`\`\` //!zig-autodoc-guide: intro.md //!zig-autodoc-guide: quickstart.md - //!zig-autodoc-section: Advanced topics - //!zig-autodoc-guide: ../advanced-docs/advanced-stuff.md + //!zig-autodoc-guide: advanced-docs/advanced-stuff.md \`\`\` + + You can also create sections to group guides together: + + \`\`\` + //!zig-autodoc-section: CLI Usage + //!zig-autodoc-guide: cli-basics.md + //!zig-autodoc-guide: cli-advanced.md + \`\`\` + **Note that this feature is still under heavy development so expect bugs** **and missing features!** @@ -475,15 +499,16 @@ const NAV_MODES = { Happy writing! `); } else { - domGuides.innerHTML = markdown(activeGuide.body); + domActiveGuide.innerHTML = markdown(activeGuide.body); } + domActiveGuide.classList.remove("hidden"); } function renderApi() { // set Api mode domApiSwitch.classList.add("active"); domGuideSwitch.classList.remove("active"); - domGuides.classList.add("hidden"); + domGuidesSection.classList.add("hidden"); domDocs.classList.remove("hidden"); domApiMenu.classList.remove("hidden"); domGuidesMenu.classList.add("hidden"); @@ -520,10 +545,8 @@ const NAV_MODES = { renderInfo(); renderModList(); - domPrivDeclsBox.checked = curNav.mode == NAV_MODES.API_INTERNAL; - if (curNavSearch !== "") { - return renderSearch(); + return renderSearchAPI(); } let rootMod = zigAnalysis.modules[zigAnalysis.rootMod]; @@ -542,6 +565,7 @@ const NAV_MODES = { curNav.declObjs = [currentType]; for (let i = 0; i < curNav.declNames.length; i += 1) { let childDecl = findSubDecl(currentType, curNav.declNames[i]); + window.last_decl = childDecl; if (childDecl == null) { return render404(); } @@ -605,7 +629,6 @@ const NAV_MODES = { function render() { switch (curNav.mode) { case NAV_MODES.API: - case NAV_MODES.API_INTERNAL: return renderApi(); case NAV_MODES.GUIDES: return renderGuides(); @@ -3123,22 +3146,21 @@ const NAV_MODES = { const mode = location.hash.substring(0, 3); let query = location.hash.substring(3); + let qpos = query.indexOf("?"); + let nonSearchPart; + if (qpos === -1) { + nonSearchPart = query; + } else { + nonSearchPart = query.substring(0, qpos); + curNavSearch = decodeURIComponent(query.substring(qpos + 1)); + } + const DEFAULT_HASH = NAV_MODES.API + zigAnalysis.modules[zigAnalysis.rootMod].name; switch (mode) { case NAV_MODES.API: - case NAV_MODES.API_INTERNAL: - // #A;MODULE:decl.decl.decl?search-term + // #A;MODULE:decl.decl.decl?search-term curNav.mode = mode; - let qpos = query.indexOf("?"); - let nonSearchPart; - if (qpos === -1) { - nonSearchPart = query; - } else { - nonSearchPart = query.substring(0, qpos); - curNavSearch = decodeURIComponent(query.substring(qpos + 1)); - } - let parts = nonSearchPart.split(":"); if (parts[0] == "") { location.hash = DEFAULT_HASH; @@ -3152,14 +3174,18 @@ const NAV_MODES = { return; case NAV_MODES.GUIDES: + const sections = zigAnalysis.guide_sections; - if (sections.length != 0 && sections[0].guides.length != 0 && query == "") { + if (sections.length != 0 && sections[0].guides.length != 0 && nonSearchPart == "") { location.hash = NAV_MODES.GUIDES + sections[0].guides[0].name; + if (qpos != -1) { + location.hash += query.substring(qpos); + } return; } curNav.mode = mode; - curNav.activeGuide = query; + curNav.activeGuide = nonSearchPart; return; default: @@ -3230,22 +3256,6 @@ const NAV_MODES = { } } - if (parentType.privDecls) { - for (let i = 0; i < parentType.privDecls.length; i += 1) { - let declIndex = parentType.privDecls[i]; - let childDecl = getDecl(declIndex); - if (childDecl.name === childName) { - childDecl.find_subdecl_idx = declIndex; - return childDecl; - } else if (childDecl.is_uns) { - let declValue = resolveValue(childDecl.value); - if (!("type" in declValue.expr)) continue; - let uns_container = getType(declValue.expr.type); - let uns_res = findSubDecl(uns_container, childName); - if (uns_res !== null) return uns_res; - } - } - } return null; } @@ -3276,6 +3286,12 @@ const NAV_MODES = { }); } } + + for (let i = 0; i < zigAnalysis.modules.length; i += 1) { + const p = zigAnalysis.modules[i]; + // TODO + // declSearchIndex.add(p.name, {moduleId: i}); + } return list; } @@ -3291,6 +3307,7 @@ const NAV_MODES = { let stack = [ { declNames: [], + declIndexes: [], type: getType(mod.main), }, ]; @@ -3334,18 +3351,27 @@ const NAV_MODES = { } } } + window.cdp = list; return list; } function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) { let declVal = resolveValue(decl.value); let declNames = item.declNames.concat([decl.name]); + let declIndexes = item.declIndexes.concat([declIndex]); if (list[declIndex] != null) return; list[declIndex] = { modNames: modNames, declNames: declNames, + declIndexes: declIndexes, }; + + // add to search index + { + declSearchIndex.add(decl.name, {declIndex}); + } + if ("type" in declVal.expr) { let value = getType(declVal.expr.type); @@ -3356,18 +3382,20 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) { if (isContainerType(value)) { stack.push({ declNames: declNames, + declIndexes: declIndexes, type: value, }); } // Generic function - if (value.kind == typeKinds.Fn && value.generic_ret != null) { - let resolvedVal = resolveValue({ expr: value.generic_ret }); - if ("type" in resolvedVal.expr) { - let generic_type = getType(resolvedVal.expr.type); + if (typeIsGenericFn(declVal.expr.type)) { + let ret = resolveGenericRet(value); + if (ret != null && "type" in ret.expr) { + let generic_type = getType(ret.expr.type); if (isContainerType(generic_type)) { stack.push({ declNames: declNames, + declIndexes: declIndexes, type: generic_type, }); } @@ -3419,6 +3447,53 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) { return markdown(shortDesc(docs)); } + function parseGuides() { + for (let j = 0; j < zigAnalysis.guide_sections.length; j+=1){ + const section = zigAnalysis.guide_sections[j]; + for (let i = 0; i < section.guides.length; i+=1){ + let reader = new commonmark.Parser({smart: true}); + const guide = section.guides[i]; + const ast = reader.parse(guide.body); + + // Find the first text thing to use as a sidebar title + guide.title = "[empty guide]"; + { + let walker = ast.walker(); + let event, node; + while ((event = walker.next())) { + node = event.node; + if (node.type === 'text') { + guide.title = node.literal; + break; + } + } + } + // Index this guide + { + let walker = ast.walker(); + let event, node; + while ((event = walker.next())) { + node = event.node; + if (event.entering == true && node.type === 'text') { + indexTextForGuide(j, i, node); + } + } + } + } + } + } + + function indexTextForGuide(section_idx, guide_idx, node){ + const terms = node.literal.split(" "); + for (let i = 0; i < terms.length; i += 1){ + const t = terms[i]; + if (!guidesSearchIndex[t]) guidesSearchIndex[t] = new Set(); + node.guide = {section_idx, guide_idx}; + guidesSearchIndex[t].add(node); + } + } + + function markdown(input, contextType) { const raw_lines = input.split("\n"); // zig allows no '\r', so we don't need to split on CR @@ -3841,6 +3916,7 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) { startSearch(); } } + function onSearchKeyDown(ev) { switch (getKeyString(ev)) { @@ -3982,16 +4058,207 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) { clearAsyncSearch(); let oldHash = location.hash; let parts = oldHash.split("?"); - let newPart2 = domSearch.value === "" ? "" : "?" + domSearch.value; + // TODO: make a tooltip that shows the user that we've replaced their dots + let box_text = domSearch.value.replaceAll(".", " "); + let newPart2 = box_text === "" ? "" : "?" + box_text; location.replace(parts.length === 1 ? oldHash + newPart2 : parts[0] + newPart2); } function getSearchTerms() { let list = curNavSearch.trim().split(/[ \r\n\t]+/); - list.sort(); return list; } - function renderSearch() { + function renderSearchGuides() { + const searchTrimmed = false; + let ignoreCase = curNavSearch.toLowerCase() === curNavSearch; + + let terms = getSearchTerms(); + let matchedItems = new Set(); + + for (let i = 0; i < terms.length; i += 1) { + const nodes = guidesSearchIndex[terms[i]]; + if (nodes) { + for (const n of nodes) { + matchedItems.add(n); + } + } + } + + + + if (matchedItems.size !== 0) { + // Build up the list of search results + let matchedItemsHTML = ""; + + for (const node of matchedItems) { + const text = node.literal; + const href = ""; + + matchedItemsHTML += "
  • " + text + "
  • "; + } + + // Replace the search results using our newly constructed HTML string + domListSearchResults.innerHTML = matchedItemsHTML; + if (searchTrimmed) { + domSectSearchAllResultsLink.classList.remove("hidden"); + } + renderSearchCursor(); + + domSectSearchResults.classList.remove("hidden"); + } else { + domSectSearchNoResults.classList.remove("hidden"); + } + } + + function renderSearchAPI(){ + if (canonDeclPaths == null) { + canonDeclPaths = computeCanonDeclPaths(); + } + let declSet = new Set(); + let otherDeclSet = new Set(); // for low quality results + let declScores = {}; + + let ignoreCase = curNavSearch.toLowerCase() === curNavSearch; + let term_list = getSearchTerms(); + for (let i = 0; i < term_list.length; i += 1) { + let term = term_list[i]; + let result = declSearchIndex.search(term.toLowerCase()); + if (result == null) { + domSectSearchNoResults.classList.remove("hidden"); + domSectSearchResults.classList.add("hidden"); + return; + } + + let termSet = new Set(); + let termOtherSet = new Set(); + + for (let list of [result.full, result.partial]) { + for (let r of list) { + const d = r.declIndex; + const decl = getDecl(d); + const canonPath = getCanonDeclPath(d); + + // collect unconditionally for the first term + if (i == 0) { + declSet.add(d); + } else { + // path intersection for subsequent terms + let found = false; + for (let p of canonPath.declIndexes) { + if (declSet.has(p)) { + found = true; + break; + } + } + if (!found) { + otherDeclSet.add(d); + } else { + termSet.add(d); + } + } + + if (declScores[d] == undefined) declScores[d] = 0; + + // scores (lower is better) + let decl_name = decl.name; + if (ignoreCase) decl_name = decl_name.toLowerCase(); + + // shallow path are preferable + const path_depth = canonPath.declNames.length * 50; + // matching the start of a decl name is good + const match_from_start = decl_name.startsWith(term) ? -term.length * (1 -ignoreCase) : (decl_name.length - term.length) + 1; + // being a perfect match is good + const is_full_match = (list == result.full) ? -decl_name.length * (2 - ignoreCase) : decl_name.length - term.length; + // matching the end of a decl name is good + const matches_the_end = decl_name.endsWith(term) ? -term.length * (1 - ignoreCase) : (decl_name.length - term.length) + 1; + // explicitly penalizing scream case decls + const decl_is_scream_case = decl.name.toUpperCase() != decl.name ? 0 : decl.name.length; + + const score = path_depth + + match_from_start + + is_full_match + + matches_the_end + + decl_is_scream_case; + + declScores[d] += score; + } + } + if (i != 0) { + for (let d of declSet) { + if (termSet.has(d)) continue; + let found = false; + for (let p of getCanonDeclPath(d).declIndexes) { + if (termSet.has(p) || otherDeclSet.has(p)) { + found = true; + break; + } + } + if (found) { + declScores[d] = declScores[d] / term_list.length; + } + + termOtherSet.add(d); + } + declSet = termSet; + for (let d of termOtherSet) { + otherDeclSet.add(d); + } + + } + } + + let matchedItems = { + high_quality: [], + low_quality: [], + }; + for (let idx of declSet) { + matchedItems.high_quality.push({points: declScores[idx], declIndex: idx}) + } + for (let idx of otherDeclSet) { + matchedItems.low_quality.push({points: declScores[idx], declIndex: idx}) + } + + matchedItems.high_quality.sort(function (a, b) { + let cmp = operatorCompare(a.points, b.points); + return cmp; + }); + matchedItems.low_quality.sort(function (a, b) { + let cmp = operatorCompare(a.points, b.points); + return cmp; + }); + + // Build up the list of search results + let matchedItemsHTML = ""; + + for (let list of [matchedItems.high_quality, matchedItems.low_quality]) { + if (list == matchedItems.low_quality && list.length > 0) { + matchedItemsHTML += "
    " + } + for (let result of list) { + const points = result.points; + const match = result.declIndex; + + let canonPath = getCanonDeclPath(match); + if (canonPath == null) continue; + + let lastModName = canonPath.modNames[canonPath.modNames.length - 1]; + let text = lastModName + "." + canonPath.declNames.join("."); + + + const href = navLink(canonPath.modNames, canonPath.declNames); + + matchedItemsHTML += "
  • " + text + "
  • "; + } + } + + // Replace the search results using our newly constructed HTML string + domListSearchResults.innerHTML = matchedItemsHTML; + renderSearchCursor(); + + domSectSearchResults.classList.remove("hidden"); + } + + function renderSearchAPIOld() { let matchedItems = []; let ignoreCase = curNavSearch.toLowerCase() === curNavSearch; let terms = getSearchTerms(); @@ -4063,7 +4330,7 @@ function addDeclToSearchResults(decl, declIndex, modNames, item, list, stack) { }); let searchTrimmed = false; - const searchTrimResultsMaxItems = 200; + const searchTrimResultsMaxItems = 60; if (searchTrimResults && matchedItems.length > searchTrimResultsMaxItems) { matchedItems = matchedItems.slice(0, searchTrimResultsMaxItems); searchTrimmed = true; @@ -4314,3 +4581,255 @@ function toggleExpand(event) { parent.parentElement.parentElement.scrollIntoView(true); } } + +function RadixTree() { + this.root = null; + + RadixTree.prototype.search = function (query) { + return this.root.search(query); + + } + + RadixTree.prototype.add = function (declName, value) { + if (this.root == null) { + this.root = new Node(declName.toLowerCase(), null, [value]); + } else { + this.root.add(declName.toLowerCase(), value); + } + + const not_scream_case = declName.toUpperCase() != declName; + let found_separator = false; + for (let i = 1; i < declName.length; i +=1) { + if (declName[i] == '_' || declName[i] == '.') { + found_separator = true; + continue; + } + + + if (found_separator || (declName[i].toLowerCase() !== declName[i])) { + if (declName.length > i+1 + && declName[i+1].toLowerCase() != declName[i+1]) continue; + let suffix = declName.slice(i); + this.root.add(suffix.toLowerCase(), value); + found_separator = false; + } + } + } + + function Node(labels, next, values) { + this.labels = labels; + this.next = next; + this.values = values; + } + + Node.prototype.isCompressed = function () { + return !Array.isArray(this.next); + } + + Node.prototype.search = function (word) { + let full_matches = []; + let partial_matches = []; + let subtree_root = null; + + let cn = this; + char_loop: for (let i = 0; i < word.length;) { + if (cn.isCompressed()) { + for (let j = 0; j < cn.labels.length; j += 1) { + let current_idx = i+j; + + if (current_idx == word.length) { + partial_matches = cn.values; + subtree_root = cn.next; + break char_loop; + } + + if (word[current_idx] != cn.labels[j]) return null; + } + + // the full label matched + let new_idx = i + cn.labels.length; + if (new_idx == word.length) { + full_matches = cn.values; + subtree_root = cn.next; + break char_loop; + } + + + i = new_idx; + cn = cn.next; + continue; + } else { + for (let j = 0; j < cn.labels.length; j += 1) { + if (word[i] == cn.labels[j]) { + if (i == word.length - 1) { + full_matches = cn.values[j]; + subtree_root = cn.next[j]; + break char_loop; + } + + let next = cn.next[j]; + if (next == null) return null; + cn = next; + i += 1; + continue char_loop; + } + } + + // didn't find a match + return null; + } + } + + // Match was found, let's collect all other + // partial matches from the subtree + let stack = [subtree_root]; + let node; + while (node = stack.pop()) { + if (node.isCompressed()) { + partial_matches = partial_matches.concat(node.values); + if (node.next != null) { + stack.push(node.next); + } + } else { + for (let v of node.values) { + partial_matches = partial_matches.concat(v); + } + + for (let n of node.next) { + if (n != null) stack.push(n); + } + } + } + + return {full: full_matches, partial: partial_matches}; + } + + Node.prototype.add = function (word, value) { + let cn = this; + char_loop: for (let i = 0; i < word.length;) { + if (cn.isCompressed()) { + for(let j = 0; j < cn.labels.length; j += 1) { + let current_idx = i+j; + + if (current_idx == word.length) { + if (j < cn.labels.length - 1) { + let node = new Node(cn.labels.slice(j), cn.next, cn.values); + cn.labels = cn.labels.slice(0, j); + cn.next = node; + cn.values = []; + } + cn.values.push(value); + return; + } + + if (word[current_idx] == cn.labels[j]) continue; + + // if we're here, a mismatch was found + if (j != cn.labels.length - 1) { + // create a suffix node + const label_suffix = cn.labels.slice(j+1); + let node = new Node(label_suffix, cn.next, [...cn.values]); + cn.next = node; + cn.values = []; + } + + // turn current node into a split node + let node = null; + let word_values = []; + if (current_idx == word.length - 1) { + // mismatch happened in the last character of word + // meaning that the current node should hold its value + word_values.push(value); + } else { + node = new Node(word.slice(current_idx+1), null, [value]); + } + + cn.labels = cn.labels[j] + word[current_idx]; + cn.next = [cn.next, node]; + cn.values = [cn.values, word_values]; + + if (j != 0) { + // current node must be turned into a prefix node + let splitNode = new Node(cn.labels, cn.next, cn.values); + cn.labels = word.slice(i, current_idx); + cn.next = splitNode; + cn.values = []; + } + + return; + } + // label matched fully with word, are there any more chars? + const new_idx = i + cn.labels.length; + if (new_idx == word.length) { + cn.values.push(value); + return; + } else { + if (cn.next == null) { + let node = new Node(word.slice(new_idx), null, [value]); + cn.next = node; + return; + } else { + cn = cn.next; + i = new_idx; + continue; + } + } + } else { // node is not compressed + let letter = word[i]; + for (let j = 0; j < cn.labels.length; j += 1) { + if (letter == cn.labels[j]) { + if (i == word.length - 1) { + cn.values[j].push(value); + return; + } + if (cn.next[j] == null) { + let node = new Node(word.slice(i+1), null, [value]); + cn.next[j] = node; + return; + } else { + cn = cn.next[j]; + i += 1; + continue char_loop; + } + } + } + + // if we're here we didn't find a match + cn.labels += letter; + if (i == word.length - 1) { + cn.next.push(null); + cn.values.push([value]); + } else { + let node = new Node(word.slice(i+1), null, [value]); + cn.next.push(node); + cn.values.push([]); + } + return; + } + } + } +} + +// RADIX TREE: + +// apple +// appliance + +// "appl" => [ +// 'e', => $ +// 'i' => "ance" => $ +// ] + +// OUR STUFF: + +// AutoHashMap +// AutoArrayHashMap + +// "Auto" => [ +// 'A', => "rrayHashMap" => $ +// 'H' => "ashMap" => $ +// ] + +// BUT! + +// We want to be able to search "Hash", for example! \ No newline at end of file diff --git a/src/Autodoc.zig b/src/Autodoc.zig index 3c1beda74a..91e252a3f8 100644 --- a/src/Autodoc.zig +++ b/src/Autodoc.zig @@ -234,12 +234,13 @@ pub fn generateZirData(self: *Autodoc) !void { }; const tldoc_comment = try self.getTLDocComment(file); + const cleaned_tldoc_comment = try self.findGuidePaths(file, tldoc_comment); + defer self.arena.free(cleaned_tldoc_comment); try self.ast_nodes.append(self.arena, .{ .name = "(root)", - .docs = tldoc_comment, + .docs = cleaned_tldoc_comment, }); try self.files.put(self.arena, file, main_type_index); - try self.findGuidePaths(file, tldoc_comment); _ = try self.walkInstruction(file, &root_scope, .{}, Zir.main_struct_inst, false); @@ -349,6 +350,7 @@ pub fn generateZirData(self: *Autodoc) !void { var docs_dir = try self.comp_module.comp.zig_lib_directory.handle.openDir("docs", .{}); defer docs_dir.close(); try docs_dir.copyFile("main.js", output_dir, "main.js", .{}); + try docs_dir.copyFile("commonmark.js", output_dir, "commonmark.js", .{}); try docs_dir.copyFile("index.html", output_dir, "index.html", .{}); } @@ -4754,14 +4756,20 @@ fn getTLDocComment(self: *Autodoc, file: *File) ![]const u8 { return comment.items; } -fn findGuidePaths(self: *Autodoc, file: *File, str: []const u8) !void { +/// Returns the doc comment cleared of autodoc directives. +fn findGuidePaths(self: *Autodoc, file: *File, str: []const u8) ![]const u8 { const guide_prefix = "zig-autodoc-guide:"; const section_prefix = "zig-autodoc-section:"; try self.guide_sections.append(self.arena, .{}); // add a default section var current_section = &self.guide_sections.items[self.guide_sections.items.len - 1]; - var it = std.mem.tokenize(u8, str, "\n"); + var clean_docs: std.ArrayListUnmanaged(u8) = .{}; + errdefer clean_docs.deinit(self.arena); + + // TODO: this algo is kinda inefficient + + var it = std.mem.split(u8, str, "\n"); while (it.next()) |line| { const trimmed_line = std.mem.trim(u8, line, " "); if (std.mem.startsWith(u8, trimmed_line, guide_prefix)) { @@ -4775,8 +4783,13 @@ fn findGuidePaths(self: *Autodoc, file: *File, str: []const u8) !void { .name = trimmed_section_name, }); current_section = &self.guide_sections.items[self.guide_sections.items.len - 1]; + } else { + try clean_docs.appendSlice(self.arena, line); + try clean_docs.append(self.arena, '\n'); } } + + return clean_docs.toOwnedSlice(self.arena); } fn addGuide(self: *Autodoc, file: *File, guide_path: []const u8, section: *Section) !void {