aboutsummaryrefslogtreecommitdiffstats
path: root/src/util
diff options
context:
space:
mode:
authorLibravatar Titus Wormer <tituswormer@gmail.com>2022-08-19 17:09:16 +0200
committerLibravatar Titus Wormer <tituswormer@gmail.com>2022-08-19 17:09:16 +0200
commit5e6829c2fb79c2b7f59e38f924e2b2900c52b5d5 (patch)
treed5725002bd5b28b91edb9e6e41ce90c9f3d5063d /src/util
parentdc6b4ac40a715d724ee597c995eb05ab30baa6e2 (diff)
downloadmarkdown-rs-5e6829c2fb79c2b7f59e38f924e2b2900c52b5d5.tar.gz
markdown-rs-5e6829c2fb79c2b7f59e38f924e2b2900c52b5d5.tar.bz2
markdown-rs-5e6829c2fb79c2b7f59e38f924e2b2900c52b5d5.zip
Refactor to move more things to `util/`
Diffstat (limited to 'src/util')
-rw-r--r--src/util/classify_character.rs2
-rw-r--r--src/util/constant.rs2449
-rw-r--r--src/util/decode_character_reference.rs2
-rw-r--r--src/util/mod.rs2
-rw-r--r--src/util/slice.rs2
-rw-r--r--src/util/unicode.rs838
6 files changed, 3292 insertions, 3 deletions
diff --git a/src/util/classify_character.rs b/src/util/classify_character.rs
index b938502..79ed46a 100644
--- a/src/util/classify_character.rs
+++ b/src/util/classify_character.rs
@@ -1,6 +1,6 @@
//! Utilities to classify characters as whitespace, punctuation, or rest.
-use crate::unicode::PUNCTUATION;
+use crate::util::unicode::PUNCTUATION;
/// Character kinds.
#[derive(Debug, PartialEq, Eq)]
diff --git a/src/util/constant.rs b/src/util/constant.rs
new file mode 100644
index 0000000..0c82378
--- /dev/null
+++ b/src/util/constant.rs
@@ -0,0 +1,2449 @@
+//! Constants needed to parse markdown.
+//!
+//! Most of these constants are magic numbers, such as the number of markers
+//! needed to parse [code (fenced)][code_fenced]
+//! ([`CODE_FENCED_SEQUENCE_SIZE_MIN`][]) or the max number of allowed markers
+//! in a [heading (atx)][heading_atx]
+//! ([`HEADING_ATX_OPENING_FENCE_SIZE_MAX`][]).
+//!
+//! Some constants are instead lists of things, such as the list of tag names
+//! considered in the **raw** production of [HTML (flow)][html_flow]
+//! ([`HTML_RAW_NAMES`][]), or the list of named character references
+//! ([`CHARACTER_REFERENCES`][]).
+//!
+//! [code_fenced]: crate::construct::code_fenced
+//! [heading_atx]: crate::construct::heading_atx
+//! [html_flow]: crate::construct::html_flow
+
+/// The number of characters allowed in a protocol of an [autolink][].
+///
+/// The protocol part is the `xxx` in `<xxx://example.com>`.
+/// 32 characters is fine, 33 is too many.
+///
+/// [autolink]: crate::construct::autolink
+pub const AUTOLINK_SCHEME_SIZE_MAX: usize = 32;
+
+/// The number of characters allowed in a domain of an email [autolink][].
+///
+/// There can be multiple “domains”.
+/// A domain part is each `xxx` in `<example@xxx.xxx.xxx>`.
+/// 63 characters is fine, 64 is too many.
+///
+/// [autolink]: crate::construct::autolink
+pub const AUTOLINK_DOMAIN_SIZE_MAX: usize = 63;
+
+/// The max number of characters in a decimal numeric
+/// [character reference][character_reference].
+///
+/// To illustrate, this allows `&#9999999;` and disallows `&#99999990;`.
+/// This limit is imposed because all bigger numbers are invalid.
+///
+/// [character_reference]: crate::construct::character_reference
+pub const CHARACTER_REFERENCE_DECIMAL_SIZE_MAX: usize = 7;
+
+/// The max number of characters in a hexadecimal numeric
+/// [character reference][character_reference].
+///
+/// To illustrate, this allows `&#xff9999;` and disallows `&#xff99990;`.
+/// This limit is imposed because all bigger numbers are invalid.
+///
+/// [character_reference]: crate::construct::character_reference
+pub const CHARACTER_REFERENCE_HEXADECIMAL_SIZE_MAX: usize = 6;
+
+/// The max number of characters in a named
+/// [character reference][character_reference].
+///
+/// This is the number of the longest name in [`CHARACTER_REFERENCES`][].
+/// It allows `&CounterClockwiseContourIntegral;` and prevents the parser from
+/// continuing for eons.
+///
+/// [character_reference]: crate::construct::character_reference
+pub const CHARACTER_REFERENCE_NAMED_SIZE_MAX: usize = 31;
+
+/// The number of markers needed for [code (fenced)][code_fenced] to form.
+///
+/// Like many things in markdown, the number is `3`.
+///
+/// [code_fenced]: crate::construct::code_fenced
+pub const CODE_FENCED_SEQUENCE_SIZE_MIN: usize = 3;
+
+/// The number of markers needed for [frontmatter][] to form.
+///
+/// Like many things in markdown, the number is `3`.
+///
+/// [frontmatter]: crate::construct::frontmatter
+pub const FRONTMATTER_SEQUENCE_SIZE: usize = 3;
+
+/// The number of preceding spaces needed for a [hard break
+/// (trailing)][whitespace] to form.
+///
+/// [whitespace]: crate::construct::partial_whitespace
+pub const HARD_BREAK_PREFIX_SIZE_MIN: usize = 2;
+
+/// The max number of markers allowed to form a [heading (atx)][heading_atx].
+///
+/// This limitation is imposed by HTML, which imposes a max heading rank of
+/// `6`.
+///
+/// [heading_atx]: crate::construct::heading_atx
+pub const HEADING_ATX_OPENING_FENCE_SIZE_MAX: usize = 6;
+
+/// List of HTML tag names that form the **basic** production of
+/// [HTML (flow)][html_flow].
+///
+/// The **basic** production allows interleaving HTML and markdown with blank
+/// lines and allows flow (block) elements to interrupt definitions, paragraphs,
+/// and heading (setext).
+/// Tag name matching must be performed insensitive to case, and thus this list
+/// includes lowercase tag names.
+///
+/// Tag names not on this list result in the **complete** production.
+///
+/// > 👉 **Note**: `source` was removed on `main` of the `CommonMark` spec and
+/// > is slated to be released in `CommonMark@0.31`.
+///
+/// ## References
+///
+/// * [*§ 4.6 HTML blocks* in `CommonMark`](https://spec.commonmark.org/0.30/#html-blocks)
+/// * [*Remove source element as HTML block start condition* as `commonmark/commonmark-spec#710`](https://github.com/commonmark/commonmark-spec/pull/710)
+///
+/// [html_flow]: crate::construct::html_flow
+pub const HTML_BLOCK_NAMES: [&str; 61] = [
+ "address",
+ "article",
+ "aside",
+ "base",
+ "basefont",
+ "blockquote",
+ "body",
+ "caption",
+ "center",
+ "col",
+ "colgroup",
+ "dd",
+ "details",
+ "dialog",
+ "dir",
+ "div",
+ "dl",
+ "dt",
+ "fieldset",
+ "figcaption",
+ "figure",
+ "footer",
+ "form",
+ "frame",
+ "frameset",
+ "h1",
+ "h2",
+ "h3",
+ "h4",
+ "h5",
+ "h6",
+ "head",
+ "header",
+ "hr",
+ "html",
+ "iframe",
+ "legend",
+ "li",
+ "link",
+ "main",
+ "menu",
+ "menuitem",
+ "nav",
+ "noframes",
+ "ol",
+ "optgroup",
+ "option",
+ "p",
+ "param",
+ "section",
+ "summary",
+ "table",
+ "tbody",
+ "td",
+ "tfoot",
+ "th",
+ "thead",
+ "title",
+ "tr",
+ "track",
+ "ul",
+];
+
+/// Magic string of CDATA (after `<![`).
+///
+/// Used in the **cdata** production of [HTML (flow)][html_flow] and
+/// [HTML (text)][html_text].
+///
+/// [html_flow]: crate::construct::html_flow
+/// [html_text]: crate::construct::html_text
+pub const HTML_CDATA_PREFIX: [u8; 6] = [b'C', b'D', b'A', b'T', b'A', b'['];
+
+/// List of HTML tag names that form the **raw** production of
+/// [HTML (flow)][html_flow].
+///
+/// The **raw** production allows blank lines and thus no interleaving with
+/// markdown.
+/// Tag name matching must be performed insensitive to case, and thus this list
+/// includes lowercase tag names.
+///
+/// The number of the longest tag name is also stored as a constant in
+/// [`HTML_RAW_SIZE_MAX`][].
+///
+/// > 👉 **Note**: `textarea` was added in `CommonMark@0.30`.
+///
+/// ## References
+///
+/// * [*§ 4.6 HTML blocks* in `CommonMark`](https://spec.commonmark.org/0.30/#html-blocks)
+///
+/// [html_flow]: crate::construct::html_flow
+pub const HTML_RAW_NAMES: [&str; 4] = ["pre", "script", "style", "textarea"];
+
+/// The number of the longest tag name in [`HTML_RAW_NAMES`][].
+///
+/// This is currently the size of `textarea`.
+pub const HTML_RAW_SIZE_MAX: usize = 8;
+
+/// To safeguard performance, labels are capped at a large number: `999`.
+pub const LINK_REFERENCE_SIZE_MAX: usize = 999;
+
+/// The max number of decimals allowed to form an (ordered)
+/// [list item][list-item].
+///
+/// `CommonMark` caps this at 10 digits (9 is fine, 10 not).
+/// This limit is imposed because bigger numbers result in integer overflows
+/// in some browsers.
+///
+/// ## References
+///
+/// * [*§ 5.2 List items* in `CommonMark`](https://spec.commonmark.org/0.30/#ordered-list-marker)
+///
+/// [list-item]: crate::construct::list_item
+pub const LIST_ITEM_VALUE_SIZE_MAX: usize = 10;
+
+/// Maximum allowed unbalanced parens in destination.
+///
+/// There can be many balanced parens, but if there are 33 opens that were not
+/// yet closed, the destination does not parse.
+/// `CommonMark` requires that at least 3 opening parens are allowed.
+/// See: <https://spec.commonmark.org/0.30/#link-destination>,
+/// In practice, this is quite low, and several places instead cap it at 32.
+/// See: <https://github.com/remarkjs/react-markdown/issues/658#issuecomment-984345577>.
+pub const RESOURCE_DESTINATION_BALANCE_MAX: usize = 32;
+
+/// List of protocols allowed, when operating safely, as `href` on `a`.
+///
+/// This list is based on what is allowed by GitHub.
+pub const SAFE_PROTOCOL_HREF: [&str; 6] = ["http", "https", "irc", "ircs", "mailto", "xmpp"];
+
+/// List of protocols allowed, when operating safely, as `src` on `img`.
+///
+/// This list is based on what is allowed by GitHub.
+pub const SAFE_PROTOCOL_SRC: [&str; 2] = ["http", "https"];
+
+/// The number of characters that form a tab stop.
+///
+/// This relates to the number of whitespace characters needed to form certain
+/// constructs in markdown, most notable the whitespace required to form
+/// [code (indented)][code_indented].
+///
+/// [code_indented]: crate::construct::code_indented
+pub const TAB_SIZE: usize = 4;
+
+/// The number of markers needed for a [thematic break][thematic_break] to form.
+///
+/// Like many things in markdown, the number is `3`.
+///
+/// [thematic_break]: crate::construct::thematic_break
+pub const THEMATIC_BREAK_MARKER_COUNT_MIN: usize = 3;
+
+// Important: please touch the below lists as few times as possible to keep Git small.
+
+/// List of names and values that form named [character reference][character_reference]s.
+///
+/// This list is sensitive to casing.
+///
+/// The number of the longest name (`CounterClockwiseContourIntegral`) is also
+/// stored as a constant in [`CHARACTER_REFERENCE_NAMED_SIZE_MAX`][].
+///
+/// ## References
+///
+/// * [*§ 2.5 Entity and numeric character references* in `CommonMark`](https://spec.commonmark.org/0.30/#entity-and-numeric-character-references)
+///
+/// [character_reference]: crate::construct::character_reference
+pub const CHARACTER_REFERENCES: [(&str, &str); 2125] = [
+ ("AElig", "Æ"),
+ ("AMP", "&"),
+ ("Aacute", "Á"),
+ ("Abreve", "Ă"),
+ ("Acirc", "Â"),
+ ("Acy", "А"),
+ ("Afr", "𝔄"),
+ ("Agrave", "À"),
+ ("Alpha", "Α"),
+ ("Amacr", "Ā"),
+ ("And", "⩓"),
+ ("Aogon", "Ą"),
+ ("Aopf", "𝔸"),
+ ("ApplyFunction", "⁡"),
+ ("Aring", "Å"),
+ ("Ascr", "𝒜"),
+ ("Assign", "≔"),
+ ("Atilde", "Ã"),
+ ("Auml", "Ä"),
+ ("Backslash", "∖"),
+ ("Barv", "⫧"),
+ ("Barwed", "⌆"),
+ ("Bcy", "Б"),
+ ("Because", "∵"),
+ ("Bernoullis", "ℬ"),
+ ("Beta", "Β"),
+ ("Bfr", "𝔅"),
+ ("Bopf", "𝔹"),
+ ("Breve", "˘"),
+ ("Bscr", "ℬ"),
+ ("Bumpeq", "≎"),
+ ("CHcy", "Ч"),
+ ("COPY", "©"),
+ ("Cacute", "Ć"),
+ ("Cap", "⋒"),
+ ("CapitalDifferentialD", "ⅅ"),
+ ("Cayleys", "ℭ"),
+ ("Ccaron", "Č"),
+ ("Ccedil", "Ç"),
+ ("Ccirc", "Ĉ"),
+ ("Cconint", "∰"),
+ ("Cdot", "Ċ"),
+ ("Cedilla", "¸"),
+ ("CenterDot", "·"),
+ ("Cfr", "ℭ"),
+ ("Chi", "Χ"),
+ ("CircleDot", "⊙"),
+ ("CircleMinus", "⊖"),
+ ("CirclePlus", "⊕"),
+ ("CircleTimes", "⊗"),
+ ("ClockwiseContourIntegral", "∲"),
+ ("CloseCurlyDoubleQuote", "”"),
+ ("CloseCurlyQuote", "’"),
+ ("Colon", "∷"),
+ ("Colone", "⩴"),
+ ("Congruent", "≡"),
+ ("Conint", "∯"),
+ ("ContourIntegral", "∮"),
+ ("Copf", "ℂ"),
+ ("Coproduct", "∐"),
+ ("CounterClockwiseContourIntegral", "∳"),
+ ("Cross", "⨯"),
+ ("Cscr", "𝒞"),
+ ("Cup", "⋓"),
+ ("CupCap", "≍"),
+ ("DD", "ⅅ"),
+ ("DDotrahd", "⤑"),
+ ("DJcy", "Ђ"),
+ ("DScy", "Ѕ"),
+ ("DZcy", "Џ"),
+ ("Dagger", "‡"),
+ ("Darr", "↡"),
+ ("Dashv", "⫤"),
+ ("Dcaron", "Ď"),
+ ("Dcy", "Д"),
+ ("Del", "∇"),
+ ("Delta", "Δ"),
+ ("Dfr", "𝔇"),
+ ("DiacriticalAcute", "´"),
+ ("DiacriticalDot", "˙"),
+ ("DiacriticalDoubleAcute", "˝"),
+ ("DiacriticalGrave", "`"),
+ ("DiacriticalTilde", "˜"),
+ ("Diamond", "⋄"),
+ ("DifferentialD", "ⅆ"),
+ ("Dopf", "𝔻"),
+ ("Dot", "¨"),
+ ("DotDot", "⃜"),
+ ("DotEqual", "≐"),
+ ("DoubleContourIntegral", "∯"),
+ ("DoubleDot", "¨"),
+ ("DoubleDownArrow", "⇓"),
+ ("DoubleLeftArrow", "⇐"),
+ ("DoubleLeftRightArrow", "⇔"),
+ ("DoubleLeftTee", "⫤"),
+ ("DoubleLongLeftArrow", "⟸"),
+ ("DoubleLongLeftRightArrow", "⟺"),
+ ("DoubleLongRightArrow", "⟹"),
+ ("DoubleRightArrow", "⇒"),
+ ("DoubleRightTee", "⊨"),
+ ("DoubleUpArrow", "⇑"),
+ ("DoubleUpDownArrow", "⇕"),
+ ("DoubleVerticalBar", "∥"),
+ ("DownArrow", "↓"),
+ ("DownArrowBar", "⤓"),
+ ("DownArrowUpArrow", "⇵"),
+ ("DownBreve", "̑"),
+ ("DownLeftRightVector", "⥐"),
+ ("DownLeftTeeVector", "⥞"),
+ ("DownLeftVector", "↽"),
+ ("DownLeftVectorBar", "⥖"),
+ ("DownRightTeeVector", "⥟"),
+ ("DownRightVector", "⇁"),
+ ("DownRightVectorBar", "⥗"),
+ ("DownTee", "⊤"),
+ ("DownTeeArrow", "↧"),
+ ("Downarrow", "⇓"),
+ ("Dscr", "𝒟"),
+ ("Dstrok", "Đ"),
+ ("ENG", "Ŋ"),
+ ("ETH", "Ð"),
+ ("Eacute", "É"),
+ ("Ecaron", "Ě"),
+ ("Ecirc", "Ê"),
+ ("Ecy", "Э"),
+ ("Edot", "Ė"),
+ ("Efr", "𝔈"),
+ ("Egrave", "È"),
+ ("Element", "∈"),
+ ("Emacr", "Ē"),
+ ("EmptySmallSquare", "◻"),
+ ("EmptyVerySmallSquare", "▫"),
+ ("Eogon", "Ę"),
+ ("Eopf", "𝔼"),
+ ("Epsilon", "Ε"),
+ ("Equal", "⩵"),
+ ("EqualTilde", "≂"),
+ ("Equilibrium", "⇌"),
+ ("Escr", "ℰ"),
+ ("Esim", "⩳"),
+ ("Eta", "Η"),
+ ("Euml", "Ë"),
+ ("Exists", "∃"),
+ ("ExponentialE", "ⅇ"),
+ ("Fcy", "Ф"),
+ ("Ffr", "𝔉"),
+ ("FilledSmallSquare", "◼"),
+ ("FilledVerySmallSquare", "▪"),
+ ("Fopf", "𝔽"),
+ ("ForAll", "∀"),
+ ("Fouriertrf", "ℱ"),
+ ("Fscr", "ℱ"),
+ ("GJcy", "Ѓ"),
+ ("GT", ">"),
+ ("Gamma", "Γ"),
+ ("Gammad", "Ϝ"),
+ ("Gbreve", "Ğ"),
+ ("Gcedil", "Ģ"),
+ ("Gcirc", "Ĝ"),
+ ("Gcy", "Г"),
+ ("Gdot", "Ġ"),
+ ("Gfr", "𝔊"),
+ ("Gg", "⋙"),
+ ("Gopf", "𝔾"),
+ ("GreaterEqual", "≥"),
+ ("GreaterEqualLess", "⋛"),
+ ("GreaterFullEqual", "≧"),
+ ("GreaterGreater", "⪢"),
+ ("GreaterLess", "≷"),
+ ("GreaterSlantEqual", "⩾"),
+ ("GreaterTilde", "≳"),
+ ("Gscr", "𝒢"),
+ ("Gt", "≫"),
+ ("HARDcy", "Ъ"),
+ ("Hacek", "ˇ"),
+ ("Hat", "^"),
+ ("Hcirc", "Ĥ"),
+ ("Hfr", "ℌ"),
+ ("HilbertSpace", "ℋ"),
+ ("Hopf", "ℍ"),
+ ("HorizontalLine", "─"),
+ ("Hscr", "ℋ"),
+ ("Hstrok", "Ħ"),
+ ("HumpDownHump", "≎"),
+ ("HumpEqual", "≏"),
+ ("IEcy", "Е"),
+ ("IJlig", "IJ"),
+ ("IOcy", "Ё"),
+ ("Iacute", "Í"),
+ ("Icirc", "Î"),
+ ("Icy", "И"),
+ ("Idot", "İ"),
+ ("Ifr", "ℑ"),
+ ("Igrave", "Ì"),
+ ("Im", "ℑ"),
+ ("Imacr", "Ī"),
+ ("ImaginaryI", "ⅈ"),
+ ("Implies", "⇒"),
+ ("Int", "∬"),
+ ("Integral", "∫"),
+ ("Intersection", "⋂"),
+ ("InvisibleComma", "⁣"),
+ ("InvisibleTimes", "⁢"),
+ ("Iogon", "Į"),
+ ("Iopf", "𝕀"),
+ ("Iota", "Ι"),
+ ("Iscr", "ℐ"),
+ ("Itilde", "Ĩ"),
+ ("Iukcy", "І"),
+ ("Iuml", "Ï"),
+ ("Jcirc", "Ĵ"),
+ ("Jcy", "Й"),
+ ("Jfr", "𝔍"),
+ ("Jopf", "𝕁"),
+ ("Jscr", "𝒥"),
+ ("Jsercy", "Ј"),
+ ("Jukcy", "Є"),
+ ("KHcy", "Х"),
+ ("KJcy", "Ќ"),
+ ("Kappa", "Κ"),
+ ("Kcedil", "Ķ"),
+ ("Kcy", "К"),
+ ("Kfr", "𝔎"),
+ ("Kopf", "𝕂"),
+ ("Kscr", "𝒦"),
+ ("LJcy", "Љ"),
+ ("LT", "<"),
+ ("Lacute", "Ĺ"),
+ ("Lambda", "Λ"),
+ ("Lang", "⟪"),
+ ("Laplacetrf", "ℒ"),
+ ("Larr", "↞"),
+ ("Lcaron", "Ľ"),
+ ("Lcedil", "Ļ"),
+ ("Lcy", "Л"),
+ ("LeftAngleBracket", "⟨"),
+ ("LeftArrow", "←"),
+ ("LeftArrowBar", "⇤"),
+ ("LeftArrowRightArrow", "⇆"),
+ ("LeftCeiling", "⌈"),
+ ("LeftDoubleBracket", "⟦"),
+ ("LeftDownTeeVector", "⥡"),
+ ("LeftDownVector", "⇃"),
+ ("LeftDownVectorBar", "⥙"),
+ ("LeftFloor", "⌊"),
+ ("LeftRightArrow", "↔"),
+ ("LeftRightVector", "⥎"),
+ ("LeftTee", "⊣"),
+ ("LeftTeeArrow", "↤"),
+ ("LeftTeeVector", "⥚"),
+ ("LeftTriangle", "⊲"),
+ ("LeftTriangleBar", "⧏"),
+ ("LeftTriangleEqual", "⊴"),
+ ("LeftUpDownVector", "⥑"),
+ ("LeftUpTeeVector", "⥠"),
+ ("LeftUpVector", "↿"),
+ ("LeftUpVectorBar", "⥘"),
+ ("LeftVector", "↼"),
+ ("LeftVectorBar", "⥒"),
+ ("Leftarrow", "⇐"),
+ ("Leftrightarrow", "⇔"),
+ ("LessEqualGreater", "⋚"),
+ ("LessFullEqual", "≦"),
+ ("LessGreater", "≶"),
+ ("LessLess", "⪡"),
+ ("LessSlantEqual", "⩽"),
+ ("LessTilde", "≲"),
+ ("Lfr", "𝔏"),
+ ("Ll", "⋘"),
+ ("Lleftarrow", "⇚"),
+ ("Lmidot", "Ŀ"),
+ ("LongLeftArrow", "⟵"),
+ ("LongLeftRightArrow", "⟷"),
+ ("LongRightArrow", "⟶"),
+ ("Longleftarrow", "⟸"),
+ ("Longleftrightarrow", "⟺"),
+ ("Longrightarrow", "⟹"),
+ ("Lopf", "𝕃"),
+ ("LowerLeftArrow", "↙"),
+ ("LowerRightArrow", "↘"),
+ ("Lscr", "ℒ"),
+ ("Lsh", "↰"),
+ ("Lstrok", "Ł"),
+ ("Lt", "≪"),
+ ("Map", "⤅"),
+ ("Mcy", "М"),
+ ("MediumSpace", " "),
+ ("Mellintrf", "ℳ"),
+ ("Mfr", "𝔐"),
+ ("MinusPlus", "∓"),
+ ("Mopf", "𝕄"),
+ ("Mscr", "ℳ"),
+ ("Mu", "Μ"),
+ ("NJcy", "Њ"),
+ ("Nacute", "Ń"),
+ ("Ncaron", "Ň"),
+ ("Ncedil", "Ņ"),
+ ("Ncy", "Н"),
+ ("NegativeMediumSpace", "\u{200B}"),
+ ("NegativeThickSpace", "\u{200B}"),
+ ("NegativeThinSpace", "\u{200B}"),
+ ("NegativeVeryThinSpace", "\u{200B}"),
+ ("NestedGreaterGreater", "≫"),
+ ("NestedLessLess", "≪"),
+ ("NewLine", "\n"),
+ ("Nfr", "𝔑"),
+ ("NoBreak", "\u{2060}"),
+ ("NonBreakingSpace", " "),
+ ("Nopf", "ℕ"),
+ ("Not", "⫬"),
+ ("NotCongruent", "≢"),
+ ("NotCupCap", "≭"),
+ ("NotDoubleVerticalBar", "∦"),
+ ("NotElement", "∉"),
+ ("NotEqual", "≠"),
+ ("NotEqualTilde", "≂̸"),
+ ("NotExists", "∄"),
+ ("NotGreater", "≯"),
+ ("NotGreaterEqual", "≱"),
+ ("NotGreaterFullEqual", "≧̸"),
+ ("NotGreaterGreater", "≫̸"),
+ ("NotGreaterLess", "≹"),
+ ("NotGreaterSlantEqual", "⩾̸"),
+ ("NotGreaterTilde", "≵"),
+ ("NotHumpDownHump", "≎̸"),
+ ("NotHumpEqual", "≏̸"),
+ ("NotLeftTriangle", "⋪"),
+ ("NotLeftTriangleBar", "⧏̸"),
+ ("NotLeftTriangleEqual", "⋬"),
+ ("NotLess", "≮"),
+ ("NotLessEqual", "≰"),
+ ("NotLessGreater", "≸"),
+ ("NotLessLess", "≪̸"),
+ ("NotLessSlantEqual", "⩽̸"),
+ ("NotLessTilde", "≴"),
+ ("NotNestedGreaterGreater", "⪢̸"),
+ ("NotNestedLessLess", "⪡̸"),
+ ("NotPrecedes", "⊀"),
+ ("NotPrecedesEqual", "⪯̸"),
+ ("NotPrecedesSlantEqual", "⋠"),
+ ("NotReverseElement", "∌"),
+ ("NotRightTriangle", "⋫"),
+ ("NotRightTriangleBar", "⧐̸"),
+ ("NotRightTriangleEqual", "⋭"),
+ ("NotSquareSubset", "⊏̸"),
+ ("NotSquareSubsetEqual", "⋢"),
+ ("NotSquareSuperset", "⊐̸"),
+ ("NotSquareSupersetEqual", "⋣"),
+ ("NotSubset", "⊂⃒"),
+ ("NotSubsetEqual", "⊈"),
+ ("NotSucceeds", "⊁"),
+ ("NotSucceedsEqual", "⪰̸"),
+ ("NotSucceedsSlantEqual", "⋡"),
+ ("NotSucceedsTilde", "≿̸"),
+ ("NotSuperset", "⊃⃒"),
+ ("NotSupersetEqual", "⊉"),
+ ("NotTilde", "≁"),
+ ("NotTildeEqual", "≄"),
+ ("NotTildeFullEqual", "≇"),
+ ("NotTildeTilde", "≉"),
+ ("NotVerticalBar", "∤"),
+ ("Nscr", "𝒩"),
+ ("Ntilde", "Ñ"),
+ ("Nu", "Ν"),
+ ("OElig", "Œ"),
+ ("Oacute", "Ó"),
+ ("Ocirc", "Ô"),
+ ("Ocy", "О"),
+ ("Odblac", "Ő"),
+ ("Ofr", "𝔒"),
+ ("Ograve", "Ò"),
+ ("Omacr", "Ō"),
+ ("Omega", "Ω"),
+ ("Omicron", "Ο"),
+ ("Oopf", "𝕆"),
+ ("OpenCurlyDoubleQuote", "“"),
+ ("OpenCurlyQuote", "‘"),
+ ("Or", "⩔"),
+ ("Oscr", "𝒪"),
+ ("Oslash", "Ø"),
+ ("Otilde", "Õ"),
+ ("Otimes", "⨷"),
+ ("Ouml", "Ö"),
+ ("OverBar", "‾"),
+ ("OverBrace", "⏞"),
+ ("OverBracket", "⎴"),
+ ("OverParenthesis", "⏜"),
+ ("PartialD", "∂"),
+ ("Pcy", "П"),
+ ("Pfr", "𝔓"),
+ ("Phi", "Φ"),
+ ("Pi", "Π"),
+ ("PlusMinus", "±"),
+ ("Poincareplane", "ℌ"),
+ ("Popf", "ℙ"),
+ ("Pr", "⪻"),
+ ("Precedes", "≺"),
+ ("PrecedesEqual", "⪯"),
+ ("PrecedesSlantEqual", "≼"),
+ ("PrecedesTilde", "≾"),
+ ("Prime", "″"),
+ ("Product", "∏"),
+ ("Proportion", "∷"),
+ ("Proportional", "∝"),
+ ("Pscr", "𝒫"),
+ ("Psi", "Ψ"),
+ ("QUOT", "\""),
+ ("Qfr", "𝔔"),
+ ("Qopf", "ℚ"),
+ ("Qscr", "𝒬"),
+ ("RBarr", "⤐"),
+ ("REG", "®"),
+ ("Racute", "Ŕ"),
+ ("Rang", "⟫"),
+ ("Rarr", "↠"),
+ ("Rarrtl", "⤖"),
+ ("Rcaron", "Ř"),
+ ("Rcedil", "Ŗ"),
+ ("Rcy", "Р"),
+ ("Re", "ℜ"),
+ ("ReverseElement", "∋"),
+ ("ReverseEquilibrium", "⇋"),
+ ("ReverseUpEquilibrium", "⥯"),
+ ("Rfr", "ℜ"),
+ ("Rho", "Ρ"),
+ ("RightAngleBracket", "⟩"),
+ ("RightArrow", "→"),
+ ("RightArrowBar", "⇥"),
+ ("RightArrowLeftArrow", "⇄"),
+ ("RightCeiling", "⌉"),
+ ("RightDoubleBracket", "⟧"),
+ ("RightDownTeeVector", "⥝"),
+ ("RightDownVector", "⇂"),
+ ("RightDownVectorBar", "⥕"),
+ ("RightFloor", "⌋"),
+ ("RightTee", "⊢"),
+ ("RightTeeArrow", "↦"),
+ ("RightTeeVector", "⥛"),
+ ("RightTriangle", "⊳"),
+ ("RightTriangleBar", "⧐"),
+ ("RightTriangleEqual", "⊵"),
+ ("RightUpDownVector", "⥏"),
+ ("RightUpTeeVector", "⥜"),
+ ("RightUpVector", "↾"),
+ ("RightUpVectorBar", "⥔"),
+ ("RightVector", "⇀"),
+ ("RightVectorBar", "⥓"),
+ ("Rightarrow", "⇒"),
+ ("Ropf", "ℝ"),
+ ("RoundImplies", "⥰"),
+ ("Rrightarrow", "⇛"),
+ ("Rscr", "ℛ"),
+ ("Rsh", "↱"),
+ ("RuleDelayed", "⧴"),
+ ("SHCHcy", "Щ"),
+ ("SHcy", "Ш"),
+ ("SOFTcy", "Ь"),
+ ("Sacute", "Ś"),
+ ("Sc", "⪼"),
+ ("Scaron", "Š"),
+ ("Scedil", "Ş"),
+ ("Scirc", "Ŝ"),
+ ("Scy", "С"),
+ ("Sfr", "𝔖"),
+ ("ShortDownArrow", "↓"),
+ ("ShortLeftArrow", "←"),
+ ("ShortRightArrow", "→"),
+ ("ShortUpArrow", "↑"),
+ ("Sigma", "Σ"),
+ ("SmallCircle", "∘"),
+ ("Sopf", "𝕊"),
+ ("Sqrt", "√"),
+ ("Square", "□"),
+ ("SquareIntersection", "⊓"),
+ ("SquareSubset", "⊏"),
+ ("SquareSubsetEqual", "⊑"),
+ ("SquareSuperset", "⊐"),
+ ("SquareSupersetEqual", "⊒"),
+ ("SquareUnion", "⊔"),
+ ("Sscr", "𝒮"),
+ ("Star", "⋆"),
+ ("Sub", "⋐"),
+ ("Subset", "⋐"),
+ ("SubsetEqual", "⊆"),
+ ("Succeeds", "≻"),
+ ("SucceedsEqual", "⪰"),
+ ("SucceedsSlantEqual", "≽"),
+ ("SucceedsTilde", "≿"),
+ ("SuchThat", "∋"),
+ ("Sum", "∑"),
+ ("Sup", "⋑"),
+ ("Superset", "⊃"),
+ ("SupersetEqual", "⊇"),
+ ("Supset", "⋑"),
+ ("THORN", "Þ"),
+ ("TRADE", "™"),
+ ("TSHcy", "Ћ"),
+ ("TScy", "Ц"),
+ ("Tab", "\t"),
+ ("Tau", "Τ"),
+ ("Tcaron", "Ť"),
+ ("Tcedil", "Ţ"),
+ ("Tcy", "Т"),
+ ("Tfr", "𝔗"),
+ ("Therefore", "∴"),
+ ("Theta", "Θ"),
+ ("ThickSpace", "  "),
+ ("ThinSpace", " "),
+ ("Tilde", "∼"),
+ ("TildeEqual", "≃"),
+ ("TildeFullEqual", "≅"),
+ ("TildeTilde", "≈"),
+ ("Topf", "𝕋"),
+ ("TripleDot", "⃛"),
+ ("Tscr", "𝒯"),
+ ("Tstrok", "Ŧ"),
+ ("Uacute", "Ú"),
+ ("Uarr", "↟"),
+ ("Uarrocir", "⥉"),
+ ("Ubrcy", "Ў"),
+ ("Ubreve", "Ŭ"),
+ ("Ucirc", "Û"),
+ ("Ucy", "У"),
+ ("Udblac", "Ű"),
+ ("Ufr", "𝔘"),
+ ("Ugrave", "Ù"),
+ ("Umacr", "Ū"),
+ ("UnderBar", "_"),
+ ("UnderBrace", "⏟"),
+ ("UnderBracket", "⎵"),
+ ("UnderParenthesis", "⏝"),
+ ("Union", "⋃"),
+ ("UnionPlus", "⊎"),
+ ("Uogon", "Ų"),
+ ("Uopf", "𝕌"),
+ ("UpArrow", "↑"),
+ ("UpArrowBar", "⤒"),
+ ("UpArrowDownArrow", "⇅"),
+ ("UpDownArrow", "↕"),
+ ("UpEquilibrium", "⥮"),
+ ("UpTee", "⊥"),
+ ("UpTeeArrow", "↥"),
+ ("Uparrow", "⇑"),
+ ("Updownarrow", "⇕"),
+ ("UpperLeftArrow", "↖"),
+ ("UpperRightArrow", "↗"),
+ ("Upsi", "ϒ"),
+ ("Upsilon", "Υ"),
+ ("Uring", "Ů"),
+ ("Uscr", "𝒰"),
+ ("Utilde", "Ũ"),
+ ("Uuml", "Ü"),
+ ("VDash", "⊫"),
+ ("Vbar", "⫫"),
+ ("Vcy", "В"),
+ ("Vdash", "⊩"),
+ ("Vdashl", "⫦"),
+ ("Vee", "⋁"),
+ ("Verbar", "‖"),
+ ("Vert", "‖"),
+ ("VerticalBar", "∣"),
+ ("VerticalLine", "|"),
+ ("VerticalSeparator", "❘"),
+ ("VerticalTilde", "≀"),
+ ("VeryThinSpace", " "),
+ ("Vfr", "𝔙"),
+ ("Vopf", "𝕍"),
+ ("Vscr", "𝒱"),
+ ("Vvdash", "⊪"),
+ ("Wcirc", "Ŵ"),
+ ("Wedge", "⋀"),
+ ("Wfr", "𝔚"),
+ ("Wopf", "𝕎"),
+ ("Wscr", "𝒲"),
+ ("Xfr", "𝔛"),
+ ("Xi", "Ξ"),
+ ("Xopf", "𝕏"),
+ ("Xscr", "𝒳"),
+ ("YAcy", "Я"),
+ ("YIcy", "Ї"),
+ ("YUcy", "Ю"),
+ ("Yacute", "Ý"),
+ ("Ycirc", "Ŷ"),
+ ("Ycy", "Ы"),
+ ("Yfr", "𝔜"),
+ ("Yopf", "𝕐"),
+ ("Yscr", "𝒴"),
+ ("Yuml", "Ÿ"),
+ ("ZHcy", "Ж"),
+ ("Zacute", "Ź"),
+ ("Zcaron", "Ž"),
+ ("Zcy", "З"),
+ ("Zdot", "Ż"),
+ ("ZeroWidthSpace", "\u{200B}"),
+ ("Zeta", "Ζ"),
+ ("Zfr", "ℨ"),
+ ("Zopf", "ℤ"),
+ ("Zscr", "𝒵"),
+ ("aacute", "á"),
+ ("abreve", "ă"),
+ ("ac", "∾"),
+ ("acE", "∾̳"),
+ ("acd", "∿"),
+ ("acirc", "â"),
+ ("acute", "´"),
+ ("acy", "а"),
+ ("aelig", "æ"),
+ ("af", "⁡"),
+ ("afr", "𝔞"),
+ ("agrave", "à"),
+ ("alefsym", "ℵ"),
+ ("aleph", "ℵ"),
+ ("alpha", "α"),
+ ("amacr", "ā"),
+ ("amalg", "⨿"),
+ ("amp", "&"),
+ ("and", "∧"),
+ ("andand", "⩕"),
+ ("andd", "⩜"),
+ ("andslope", "⩘"),
+ ("andv", "⩚"),
+ ("ang", "∠"),
+ ("ange", "⦤"),
+ ("angle", "∠"),
+ ("angmsd", "∡"),
+ ("angmsdaa", "⦨"),
+ ("angmsdab", "⦩"),
+ ("angmsdac", "⦪"),
+ ("angmsdad", "⦫"),
+ ("angmsdae", "⦬"),
+ ("angmsdaf", "⦭"),
+ ("angmsdag", "⦮"),
+ ("angmsdah", "⦯"),
+ ("angrt", "∟"),
+ ("angrtvb", "⊾"),
+ ("angrtvbd", "⦝"),
+ ("angsph", "∢"),
+ ("angst", "Å"),
+ ("angzarr", "⍼"),
+ ("aogon", "ą"),
+ ("aopf", "𝕒"),
+ ("ap", "≈"),
+ ("apE", "⩰"),
+ ("apacir", "⩯"),
+ ("ape", "≊"),
+ ("apid", "≋"),
+ ("apos", "'"),
+ ("approx", "≈"),
+ ("approxeq", "≊"),
+ ("aring", "å"),
+ ("ascr", "𝒶"),
+ ("ast", "*"),
+ ("asymp", "≈"),
+ ("asympeq", "≍"),
+ ("atilde", "ã"),
+ ("auml", "ä"),
+ ("awconint", "∳"),
+ ("awint", "⨑"),
+ ("bNot", "⫭"),
+ ("backcong", "≌"),
+ ("backepsilon", "϶"),
+ ("backprime", "‵"),
+ ("backsim", "∽"),
+ ("backsimeq", "⋍"),
+ ("barvee", "⊽"),
+ ("barwed", "⌅"),
+ ("barwedge", "⌅"),
+ ("bbrk", "⎵"),
+ ("bbrktbrk", "⎶"),
+ ("bcong", "≌"),
+ ("bcy", "б"),
+ ("bdquo", "„"),
+ ("becaus", "∵"),
+ ("because", "∵"),
+ ("bemptyv", "⦰"),
+ ("bepsi", "϶"),
+ ("bernou", "ℬ"),
+ ("beta", "β"),
+ ("beth", "ℶ"),
+ ("between", "≬"),
+ ("bfr", "𝔟"),
+ ("bigcap", "⋂"),
+ ("bigcirc", "◯"),
+ ("bigcup", "⋃"),
+ ("bigodot", "⨀"),
+ ("bigoplus", "⨁"),
+ ("bigotimes", "⨂"),
+ ("bigsqcup", "⨆"),
+ ("bigstar", "★"),
+ ("bigtriangledown", "▽"),
+ ("bigtriangleup", "△"),
+ ("biguplus", "⨄"),
+ ("bigvee", "⋁"),
+ ("bigwedge", "⋀"),
+ ("bkarow", "⤍"),
+ ("blacklozenge", "⧫"),
+ ("blacksquare", "▪"),
+ ("blacktriangle", "▴"),
+ ("blacktriangledown", "▾"),
+ ("blacktriangleleft", "◂"),
+ ("blacktriangleright", "▸"),
+ ("blank", "␣"),
+ ("blk12", "▒"),
+ ("blk14", "░"),
+ ("blk34", "▓"),
+ ("block", "█"),
+ ("bne", "=⃥"),
+ ("bnequiv", "≡⃥"),
+ ("bnot", "⌐"),
+ ("bopf", "𝕓"),
+ ("bot", "⊥"),
+ ("bottom", "⊥"),
+ ("bowtie", "⋈"),
+ ("boxDL", "╗"),
+ ("boxDR", "╔"),
+ ("boxDl", "╖"),
+ ("boxDr", "╓"),
+ ("boxH", "═"),
+ ("boxHD", "╦"),
+ ("boxHU", "╩"),
+ ("boxHd", "╤"),
+ ("boxHu", "╧"),
+ ("boxUL", "╝"),
+ ("boxUR", "╚"),
+ ("boxUl", "╜"),
+ ("boxUr", "╙"),
+ ("boxV", "║"),
+ ("boxVH", "╬"),
+ ("boxVL", "╣"),
+ ("boxVR", "╠"),
+ ("boxVh", "╫"),
+ ("boxVl", "╢"),
+ ("boxVr", "╟"),
+ ("boxbox", "⧉"),
+ ("boxdL", "╕"),
+ ("boxdR", "╒"),
+ ("boxdl", "┐"),
+ ("boxdr", "┌"),
+ ("boxh", "─"),
+ ("boxhD", "╥"),
+ ("boxhU", "╨"),
+ ("boxhd", "┬"),
+ ("boxhu", "┴"),
+ ("boxminus", "⊟"),
+ ("boxplus", "⊞"),
+ ("boxtimes", "⊠"),
+ ("boxuL", "╛"),
+ ("boxuR", "╘"),
+ ("boxul", "┘"),
+ ("boxur", "└"),
+ ("boxv", "│"),
+ ("boxvH", "╪"),
+ ("boxvL", "╡"),
+ ("boxvR", "╞"),
+ ("boxvh", "┼"),
+ ("boxvl", "┤"),
+ ("boxvr", "├"),
+ ("bprime", "‵"),
+ ("breve", "˘"),
+ ("brvbar", "¦"),
+ ("bscr", "𝒷"),
+ ("bsemi", "⁏"),
+ ("bsim", "∽"),
+ ("bsime", "⋍"),
+ ("bsol", "\\"),
+ ("bsolb", "⧅"),
+ ("bsolhsub", "⟈"),
+ ("bull", "•"),
+ ("bullet", "•"),
+ ("bump", "≎"),
+ ("bumpE", "⪮"),
+ ("bumpe", "≏"),
+ ("bumpeq", "≏"),
+ ("cacute", "ć"),
+ ("cap", "∩"),
+ ("capand", "⩄"),
+ ("capbrcup", "⩉"),
+ ("capcap", "⩋"),
+ ("capcup", "⩇"),
+ ("capdot", "⩀"),
+ ("caps", "∩︀"),
+ ("caret", "⁁"),
+ ("caron", "ˇ"),
+ ("ccaps", "⩍"),
+ ("ccaron", "č"),
+ ("ccedil", "ç"),
+ ("ccirc", "ĉ"),
+ ("ccups", "⩌"),
+ ("ccupssm", "⩐"),
+ ("cdot", "ċ"),
+ ("cedil", "¸"),
+ ("cemptyv", "⦲"),
+ ("cent", "¢"),
+ ("centerdot", "·"),
+ ("cfr", "𝔠"),
+ ("chcy", "ч"),
+ ("check", "✓"),
+ ("checkmark", "✓"),
+ ("chi", "χ"),
+ ("cir", "○"),
+ ("cirE", "⧃"),
+ ("circ", "ˆ"),
+ ("circeq", "≗"),
+ ("circlearrowleft", "↺"),
+ ("circlearrowright", "↻"),
+ ("circledR", "®"),
+ ("circledS", "Ⓢ"),
+ ("circledast", "⊛"),
+ ("circledcirc", "⊚"),
+ ("circleddash", "⊝"),
+ ("cire", "≗"),
+ ("cirfnint", "⨐"),
+ ("cirmid", "⫯"),
+ ("cirscir", "⧂"),
+ ("clubs", "♣"),
+ ("clubsuit", "♣"),
+ ("colon", ":"),
+ ("colone", "≔"),
+ ("coloneq", "≔"),
+ ("comma", ","),
+ ("commat", "@"),
+ ("comp", "∁"),
+ ("compfn", "∘"),
+ ("complement", "∁"),
+ ("complexes", "ℂ"),
+ ("cong", "≅"),
+ ("congdot", "⩭"),
+ ("conint", "∮"),
+ ("copf", "𝕔"),
+ ("coprod", "∐"),
+ ("copy", "©"),
+ ("copysr", "℗"),
+ ("crarr", "↵"),
+ ("cross", "✗"),
+ ("cscr", "𝒸"),
+ ("csub", "⫏"),
+ ("csube", "⫑"),
+ ("csup", "⫐"),
+ ("csupe", "⫒"),
+ ("ctdot", "⋯"),
+ ("cudarrl", "⤸"),
+ ("cudarrr", "⤵"),
+ ("cuepr", "⋞"),
+ ("cuesc", "⋟"),
+ ("cularr", "↶"),
+ ("cularrp", "⤽"),
+ ("cup", "∪"),
+ ("cupbrcap", "⩈"),
+ ("cupcap", "⩆"),
+ ("cupcup", "⩊"),
+ ("cupdot", "⊍"),
+ ("cupor", "⩅"),
+ ("cups", "∪︀"),
+ ("curarr", "↷"),
+ ("curarrm", "⤼"),
+ ("curlyeqprec", "⋞"),
+ ("curlyeqsucc", "⋟"),
+ ("curlyvee", "⋎"),
+ ("curlywedge", "⋏"),
+ ("curren", "¤"),
+ ("curvearrowleft", "↶"),
+ ("curvearrowright", "↷"),
+ ("cuvee", "⋎"),
+ ("cuwed", "⋏"),
+ ("cwconint", "∲"),
+ ("cwint", "∱"),
+ ("cylcty", "⌭"),
+ ("dArr", "⇓"),
+ ("dHar", "⥥"),
+ ("dagger", "†"),
+ ("daleth", "ℸ"),
+ ("darr", "↓"),
+ ("dash", "‐"),
+ ("dashv", "⊣"),
+ ("dbkarow", "⤏"),
+ ("dblac", "˝"),
+ ("dcaron", "ď"),
+ ("dcy", "д"),
+ ("dd", "ⅆ"),
+ ("ddagger", "‡"),
+ ("ddarr", "⇊"),
+ ("ddotseq", "⩷"),
+ ("deg", "°"),
+ ("delta", "δ"),
+ ("demptyv", "⦱"),
+ ("dfisht", "⥿"),
+ ("dfr", "𝔡"),
+ ("dharl", "⇃"),
+ ("dharr", "⇂"),
+ ("diam", "⋄"),
+ ("diamond", "⋄"),
+ ("diamondsuit", "♦"),
+ ("diams", "♦"),
+ ("die", "¨"),
+ ("digamma", "ϝ"),
+ ("disin", "⋲"),
+ ("div", "÷"),
+ ("divide", "÷"),
+ ("divideontimes", "⋇"),
+ ("divonx", "⋇"),
+ ("djcy", "ђ"),
+ ("dlcorn", "⌞"),
+ ("dlcrop", "⌍"),
+ ("dollar", "$"),
+ ("dopf", "𝕕"),
+ ("dot", "˙"),
+ ("doteq", "≐"),
+ ("doteqdot", "≑"),
+ ("dotminus", "∸"),
+ ("dotplus", "∔"),
+ ("dotsquare", "⊡"),
+ ("doublebarwedge", "⌆"),
+ ("downarrow", "↓"),
+ ("downdownarrows", "⇊"),
+ ("downharpoonleft", "⇃"),
+ ("downharpoonright", "⇂"),
+ ("drbkarow", "⤐"),
+ ("drcorn", "⌟"),
+ ("drcrop", "⌌"),
+ ("dscr", "𝒹"),
+ ("dscy", "ѕ"),
+ ("dsol", "⧶"),
+ ("dstrok", "đ"),
+ ("dtdot", "⋱"),
+ ("dtri", "▿"),
+ ("dtrif", "▾"),
+ ("duarr", "⇵"),
+ ("duhar", "⥯"),
+ ("dwangle", "⦦"),
+ ("dzcy", "џ"),
+ ("dzigrarr", "⟿"),
+ ("eDDot", "⩷"),
+ ("eDot", "≑"),
+ ("eacute", "é"),
+ ("easter", "⩮"),
+ ("ecaron", "ě"),
+ ("ecir", "≖"),
+ ("ecirc", "ê"),
+ ("ecolon", "≕"),
+ ("ecy", "э"),
+ ("edot", "ė"),
+ ("ee", "ⅇ"),
+ ("efDot", "≒"),
+ ("efr", "𝔢"),
+ ("eg", "⪚"),
+ ("egrave", "è"),
+ ("egs", "⪖"),
+ ("egsdot", "⪘"),
+ ("el", "⪙"),
+ ("elinters", "⏧"),
+ ("ell", "ℓ"),
+ ("els", "⪕"),
+ ("elsdot", "⪗"),
+ ("emacr", "ē"),
+ ("empty", "∅"),
+ ("emptyset", "∅"),
+ ("emptyv", "∅"),
+ ("emsp13", " "),
+ ("emsp14", " "),
+ ("emsp", " "),
+ ("eng", "ŋ"),
+ ("ensp", " "),
+ ("eogon", "ę"),
+ ("eopf", "𝕖"),
+ ("epar", "⋕"),
+ ("eparsl", "⧣"),
+ ("eplus", "⩱"),
+ ("epsi", "ε"),
+ ("epsilon", "ε"),
+ ("epsiv", "ϵ"),
+ ("eqcirc", "≖"),
+ ("eqcolon", "≕"),
+ ("eqsim", "≂"),
+ ("eqslantgtr", "⪖"),
+ ("eqslantless", "⪕"),
+ ("equals", "="),
+ ("equest", "≟"),
+ ("equiv", "≡"),
+ ("equivDD", "⩸"),
+ ("eqvparsl", "⧥"),
+ ("erDot", "≓"),
+ ("erarr", "⥱"),
+ ("escr", "ℯ"),
+ ("esdot", "≐"),
+ ("esim", "≂"),
+ ("eta", "η"),
+ ("eth", "ð"),
+ ("euml", "ë"),
+ ("euro", "€"),
+ ("excl", "!"),
+ ("exist", "∃"),
+ ("expectation", "ℰ"),
+ ("exponentiale", "ⅇ"),
+ ("fallingdotseq", "≒"),
+ ("fcy", "ф"),
+ ("female", "♀"),
+ ("ffilig", "ffi"),
+ ("fflig", "ff"),
+ ("ffllig", "ffl"),
+ ("ffr", "𝔣"),
+ ("filig", "fi"),
+ ("fjlig", "fj"),
+ ("flat", "♭"),
+ ("fllig", "fl"),
+ ("fltns", "▱"),
+ ("fnof", "ƒ"),
+ ("fopf", "𝕗"),
+ ("forall", "∀"),
+ ("fork", "⋔"),
+ ("forkv", "⫙"),
+ ("fpartint", "⨍"),
+ ("frac12", "½"),
+ ("frac13", "⅓"),
+ ("frac14", "¼"),
+ ("frac15", "⅕"),
+ ("frac16", "⅙"),
+ ("frac18", "⅛"),
+ ("frac23", "⅔"),
+ ("frac25", "⅖"),
+ ("frac34", "¾"),
+ ("frac35", "⅗"),
+ ("frac38", "⅜"),
+ ("frac45", "⅘"),
+ ("frac56", "⅚"),
+ ("frac58", "⅝"),
+ ("frac78", "⅞"),
+ ("frasl", "⁄"),
+ ("frown", "⌢"),
+ ("fscr", "𝒻"),
+ ("gE", "≧"),
+ ("gEl", "⪌"),
+ ("gacute", "ǵ"),
+ ("gamma", "γ"),
+ ("gammad", "ϝ"),
+ ("gap", "⪆"),
+ ("gbreve", "ğ"),
+ ("gcirc", "ĝ"),
+ ("gcy", "г"),
+ ("gdot", "ġ"),
+ ("ge", "≥"),
+ ("gel", "⋛"),
+ ("geq", "≥"),
+ ("geqq", "≧"),
+ ("geqslant", "⩾"),
+ ("ges", "⩾"),
+ ("gescc", "⪩"),
+ ("gesdot", "⪀"),
+ ("gesdoto", "⪂"),
+ ("gesdotol", "⪄"),
+ ("gesl", "⋛︀"),
+ ("gesles", "⪔"),
+ ("gfr", "𝔤"),
+ ("gg", "≫"),
+ ("ggg", "⋙"),
+ ("gimel", "ℷ"),
+ ("gjcy", "ѓ"),
+ ("gl", "≷"),
+ ("glE", "⪒"),
+ ("gla", "⪥"),
+ ("glj", "⪤"),
+ ("gnE", "≩"),
+ ("gnap", "⪊"),
+ ("gnapprox", "⪊"),
+ ("gne", "⪈"),
+ ("gneq", "⪈"),
+ ("gneqq", "≩"),
+ ("gnsim", "⋧"),
+ ("gopf", "𝕘"),
+ ("grave", "`"),
+ ("gscr", "ℊ"),
+ ("gsim", "≳"),
+ ("gsime", "⪎"),
+ ("gsiml", "⪐"),
+ ("gt", ">"),
+ ("gtcc", "⪧"),
+ ("gtcir", "⩺"),
+ ("gtdot", "⋗"),
+ ("gtlPar", "⦕"),
+ ("gtquest", "⩼"),
+ ("gtrapprox", "⪆"),
+ ("gtrarr", "⥸"),
+ ("gtrdot", "⋗"),
+ ("gtreqless", "⋛"),
+ ("gtreqqless", "⪌"),
+ ("gtrless", "≷"),
+ ("gtrsim", "≳"),
+ ("gvertneqq", "≩︀"),
+ ("gvnE", "≩︀"),
+ ("hArr", "⇔"),
+ ("hairsp", " "),
+ ("half", "½"),
+ ("hamilt", "ℋ"),
+ ("hardcy", "ъ"),
+ ("harr", "↔"),
+ ("harrcir", "⥈"),
+ ("harrw", "↭"),
+ ("hbar", "ℏ"),
+ ("hcirc", "ĥ"),
+ ("hearts", "♥"),
+ ("heartsuit", "♥"),
+ ("hellip", "…"),
+ ("hercon", "⊹"),
+ ("hfr", "𝔥"),
+ ("hksearow", "⤥"),
+ ("hkswarow", "⤦"),
+ ("hoarr", "⇿"),
+ ("homtht", "∻"),
+ ("hookleftarrow", "↩"),
+ ("hookrightarrow", "↪"),
+ ("hopf", "𝕙"),
+ ("horbar", "―"),
+ ("hscr", "𝒽"),
+ ("hslash", "ℏ"),
+ ("hstrok", "ħ"),
+ ("hybull", "⁃"),
+ ("hyphen", "‐"),
+ ("iacute", "í"),
+ ("ic", "⁣"),
+ ("icirc", "î"),
+ ("icy", "и"),
+ ("iecy", "е"),
+ ("iexcl", "¡"),
+ ("iff", "⇔"),
+ ("ifr", "𝔦"),
+ ("igrave", "ì"),
+ ("ii", "ⅈ"),
+ ("iiiint", "⨌"),
+ ("iiint", "∭"),
+ ("iinfin", "⧜"),
+ ("iiota", "℩"),
+ ("ijlig", "ij"),
+ ("imacr", "ī"),
+ ("image", "ℑ"),
+ ("imagline", "ℐ"),
+ ("imagpart", "ℑ"),
+ ("imath", "ı"),
+ ("imof", "⊷"),
+ ("imped", "Ƶ"),
+ ("in", "∈"),
+ ("incare", "℅"),
+ ("infin", "∞"),
+ ("infintie", "⧝"),
+ ("inodot", "ı"),
+ ("int", "∫"),
+ ("intcal", "⊺"),
+ ("integers", "ℤ"),
+ ("intercal", "⊺"),
+ ("intlarhk", "⨗"),
+ ("intprod", "⨼"),
+ ("iocy", "ё"),
+ ("iogon", "į"),
+ ("iopf", "𝕚"),
+ ("iota", "ι"),
+ ("iprod", "⨼"),
+ ("iquest", "¿"),
+ ("iscr", "𝒾"),
+ ("isin", "∈"),
+ ("isinE", "⋹"),
+ ("isindot", "⋵"),
+ ("isins", "⋴"),
+ ("isinsv", "⋳"),
+ ("isinv", "∈"),
+ ("it", "⁢"),
+ ("itilde", "ĩ"),
+ ("iukcy", "і"),
+ ("iuml", "ï"),
+ ("jcirc", "ĵ"),
+ ("jcy", "й"),
+ ("jfr", "𝔧"),
+ ("jmath", "ȷ"),
+ ("jopf", "𝕛"),
+ ("jscr", "𝒿"),
+ ("jsercy", "ј"),
+ ("jukcy", "є"),
+ ("kappa", "κ"),
+ ("kappav", "ϰ"),
+ ("kcedil", "ķ"),
+ ("kcy", "к"),
+ ("kfr", "𝔨"),
+ ("kgreen", "ĸ"),
+ ("khcy", "х"),
+ ("kjcy", "ќ"),
+ ("kopf", "𝕜"),
+ ("kscr", "𝓀"),
+ ("lAarr", "⇚"),
+ ("lArr", "⇐"),
+ ("lAtail", "⤛"),
+ ("lBarr", "⤎"),
+ ("lE", "≦"),
+ ("lEg", "⪋"),
+ ("lHar", "⥢"),
+ ("lacute", "ĺ"),
+ ("laemptyv", "⦴"),
+ ("lagran", "ℒ"),
+ ("lambda", "λ"),
+ ("lang", "⟨"),
+ ("langd", "⦑"),
+ ("langle", "⟨"),
+ ("lap", "⪅"),
+ ("laquo", "«"),
+ ("larr", "←"),
+ ("larrb", "⇤"),
+ ("larrbfs", "⤟"),
+ ("larrfs", "⤝"),
+ ("larrhk", "↩"),
+ ("larrlp", "↫"),
+ ("larrpl", "⤹"),
+ ("larrsim", "⥳"),
+ ("larrtl", "↢"),
+ ("lat", "⪫"),
+ ("latail", "⤙"),
+ ("late", "⪭"),
+ ("lates", "⪭︀"),
+ ("lbarr", "⤌"),
+ ("lbbrk", "❲"),
+ ("lbrace", "{"),
+ ("lbrack", "["),
+ ("lbrke", "⦋"),
+ ("lbrksld", "⦏"),
+ ("lbrkslu", "⦍"),
+ ("lcaron", "ľ"),
+ ("lcedil", "ļ"),
+ ("lceil", "⌈"),
+ ("lcub", "{"),
+ ("lcy", "л"),
+ ("ldca", "⤶"),
+ ("ldquo", "“"),
+ ("ldquor", "„"),
+ ("ldrdhar", "⥧"),
+ ("ldrushar", "⥋"),
+ ("ldsh", "↲"),
+ ("le", "≤"),
+ ("leftarrow", "←"),
+ ("leftarrowtail", "↢"),
+ ("leftharpoondown", "↽"),
+ ("leftharpoonup", "↼"),
+ ("leftleftarrows", "⇇"),
+ ("leftrightarrow", "↔"),
+ ("leftrightarrows", "⇆"),
+ ("leftrightharpoons", "⇋"),
+ ("leftrightsquigarrow", "↭"),
+ ("leftthreetimes", "⋋"),
+ ("leg", "⋚"),
+ ("leq", "≤"),
+ ("leqq", "≦"),
+ ("leqslant", "⩽"),
+ ("les", "⩽"),
+ ("lescc", "⪨"),
+ ("lesdot", "⩿"),
+ ("lesdoto", "⪁"),
+ ("lesdotor", "⪃"),
+ ("lesg", "⋚︀"),
+ ("lesges", "⪓"),
+ ("lessapprox", "⪅"),
+ ("lessdot", "⋖"),
+ ("lesseqgtr", "⋚"),
+ ("lesseqqgtr", "⪋"),
+ ("lessgtr", "≶"),
+ ("lesssim", "≲"),
+ ("lfisht", "⥼"),
+ ("lfloor", "⌊"),
+ ("lfr", "𝔩"),
+ ("lg", "≶"),
+ ("lgE", "⪑"),
+ ("lhard", "↽"),
+ ("lharu", "↼"),
+ ("lharul", "⥪"),
+ ("lhblk", "▄"),
+ ("ljcy", "љ"),
+ ("ll", "≪"),
+ ("llarr", "⇇"),
+ ("llcorner", "⌞"),
+ ("llhard", "⥫"),
+ ("lltri", "◺"),
+ ("lmidot", "ŀ"),
+ ("lmoust", "⎰"),
+ ("lmoustache", "⎰"),
+ ("lnE", "≨"),
+ ("lnap", "⪉"),
+ ("lnapprox", "⪉"),
+ ("lne", "⪇"),
+ ("lneq", "⪇"),
+ ("lneqq", "≨"),
+ ("lnsim", "⋦"),
+ ("loang", "⟬"),
+ ("loarr", "⇽"),
+ ("lobrk", "⟦"),
+ ("longleftarrow", "⟵"),
+ ("longleftrightarrow", "⟷"),
+ ("longmapsto", "⟼"),
+ ("longrightarrow", "⟶"),
+ ("looparrowleft", "↫"),
+ ("looparrowright", "↬"),
+ ("lopar", "⦅"),
+ ("lopf", "𝕝"),
+ ("loplus", "⨭"),
+ ("lotimes", "⨴"),
+ ("lowast", "∗"),
+ ("lowbar", "_"),
+ ("loz", "◊"),
+ ("lozenge", "◊"),
+ ("lozf", "⧫"),
+ ("lpar", "("),
+ ("lparlt", "⦓"),
+ ("lrarr", "⇆"),
+ ("lrcorner", "⌟"),
+ ("lrhar", "⇋"),
+ ("lrhard", "⥭"),
+ ("lrm", "‎"),
+ ("lrtri", "⊿"),
+ ("lsaquo", "‹"),
+ ("lscr", "𝓁"),
+ ("lsh", "↰"),
+ ("lsim", "≲"),
+ ("lsime", "⪍"),
+ ("lsimg", "⪏"),
+ ("lsqb", "["),
+ ("lsquo", "‘"),
+ ("lsquor", "‚"),
+ ("lstrok", "ł"),
+ ("lt", "<"),
+ ("ltcc", "⪦"),
+ ("ltcir", "⩹"),
+ ("ltdot", "⋖"),
+ ("lthree", "⋋"),
+ ("ltimes", "⋉"),
+ ("ltlarr", "⥶"),
+ ("ltquest", "⩻"),
+ ("ltrPar", "⦖"),
+ ("ltri", "◃"),
+ ("ltrie", "⊴"),
+ ("ltrif", "◂"),
+ ("lurdshar", "⥊"),
+ ("luruhar", "⥦"),
+ ("lvertneqq", "≨︀"),
+ ("lvnE", "≨︀"),
+ ("mDDot", "∺"),
+ ("macr", "¯"),
+ ("male", "♂"),
+ ("malt", "✠"),
+ ("maltese", "✠"),
+ ("map", "↦"),
+ ("mapsto", "↦"),
+ ("mapstodown", "↧"),
+ ("mapstoleft", "↤"),
+ ("mapstoup", "↥"),
+ ("marker", "▮"),
+ ("mcomma", "⨩"),
+ ("mcy", "м"),
+ ("mdash", "—"),
+ ("measuredangle", "∡"),
+ ("mfr", "𝔪"),
+ ("mho", "℧"),
+ ("micro", "µ"),
+ ("mid", "∣"),
+ ("midast", "*"),
+ ("midcir", "⫰"),
+ ("middot", "·"),
+ ("minus", "−"),
+ ("minusb", "⊟"),
+ ("minusd", "∸"),
+ ("minusdu", "⨪"),
+ ("mlcp", "⫛"),
+ ("mldr", "…"),
+ ("mnplus", "∓"),
+ ("models", "⊧"),
+ ("mopf", "𝕞"),
+ ("mp", "∓"),
+ ("mscr", "𝓂"),
+ ("mstpos", "∾"),
+ ("mu", "μ"),
+ ("multimap", "⊸"),
+ ("mumap", "⊸"),
+ ("nGg", "⋙̸"),
+ ("nGt", "≫⃒"),
+ ("nGtv", "≫̸"),
+ ("nLeftarrow", "⇍"),
+ ("nLeftrightarrow", "⇎"),
+ ("nLl", "⋘̸"),
+ ("nLt", "≪⃒"),
+ ("nLtv", "≪̸"),
+ ("nRightarrow", "⇏"),
+ ("nVDash", "⊯"),
+ ("nVdash", "⊮"),
+ ("nabla", "∇"),
+ ("nacute", "ń"),
+ ("nang", "∠⃒"),
+ ("nap", "≉"),
+ ("napE", "⩰̸"),
+ ("napid", "≋̸"),
+ ("napos", "ʼn"),
+ ("napprox", "≉"),
+ ("natur", "♮"),
+ ("natural", "♮"),
+ ("naturals", "ℕ"),
+ ("nbsp", " "),
+ ("nbump", "≎̸"),
+ ("nbumpe", "≏̸"),
+ ("ncap", "⩃"),
+ ("ncaron", "ň"),
+ ("ncedil", "ņ"),
+ ("ncong", "≇"),
+ ("ncongdot", "⩭̸"),
+ ("ncup", "⩂"),
+ ("ncy", "н"),
+ ("ndash", "–"),
+ ("ne", "≠"),
+ ("neArr", "⇗"),
+ ("nearhk", "⤤"),
+ ("nearr", "↗"),
+ ("nearrow", "↗"),
+ ("nedot", "≐̸"),
+ ("nequiv", "≢"),
+ ("nesear", "⤨"),
+ ("nesim", "≂̸"),
+ ("nexist", "∄"),
+ ("nexists", "∄"),
+ ("nfr", "𝔫"),
+ ("ngE", "≧̸"),
+ ("nge", "≱"),
+ ("ngeq", "≱"),
+ ("ngeqq", "≧̸"),
+ ("ngeqslant", "⩾̸"),
+ ("nges", "⩾̸"),
+ ("ngsim", "≵"),
+ ("ngt", "≯"),
+ ("ngtr", "≯"),
+ ("nhArr", "⇎"),
+ ("nharr", "↮"),
+ ("nhpar", "⫲"),
+ ("ni", "∋"),
+ ("nis", "⋼"),
+ ("nisd", "⋺"),
+ ("niv", "∋"),
+ ("njcy", "њ"),
+ ("nlArr", "⇍"),
+ ("nlE", "≦̸"),
+ ("nlarr", "↚"),
+ ("nldr", "‥"),
+ ("nle", "≰"),
+ ("nleftarrow", "↚"),
+ ("nleftrightarrow", "↮"),
+ ("nleq", "≰"),
+ ("nleqq", "≦̸"),
+ ("nleqslant", "⩽̸"),
+ ("nles", "⩽̸"),
+ ("nless", "≮"),
+ ("nlsim", "≴"),
+ ("nlt", "≮"),
+ ("nltri", "⋪"),
+ ("nltrie", "⋬"),
+ ("nmid", "∤"),
+ ("nopf", "𝕟"),
+ ("not", "¬"),
+ ("notin", "∉"),
+ ("notinE", "⋹̸"),
+ ("notindot", "⋵̸"),
+ ("notinva", "∉"),
+ ("notinvb", "⋷"),
+ ("notinvc", "⋶"),
+ ("notni", "∌"),
+ ("notniva", "∌"),
+ ("notnivb", "⋾"),
+ ("notnivc", "⋽"),
+ ("npar", "∦"),
+ ("nparallel", "∦"),
+ ("nparsl", "⫽⃥"),
+ ("npart", "∂̸"),
+ ("npolint", "⨔"),
+ ("npr", "⊀"),
+ ("nprcue", "⋠"),
+ ("npre", "⪯̸"),
+ ("nprec", "⊀"),
+ ("npreceq", "⪯̸"),
+ ("nrArr", "⇏"),
+ ("nrarr", "↛"),
+ ("nrarrc", "⤳̸"),
+ ("nrarrw", "↝̸"),
+ ("nrightarrow", "↛"),
+ ("nrtri", "⋫"),
+ ("nrtrie", "⋭"),
+ ("nsc", "⊁"),
+ ("nsccue", "⋡"),
+ ("nsce", "⪰̸"),
+ ("nscr", "𝓃"),
+ ("nshortmid", "∤"),
+ ("nshortparallel", "∦"),
+ ("nsim", "≁"),
+ ("nsime", "≄"),
+ ("nsimeq", "≄"),
+ ("nsmid", "∤"),
+ ("nspar", "∦"),
+ ("nsqsube", "⋢"),
+ ("nsqsupe", "⋣"),
+ ("nsub", "⊄"),
+ ("nsubE", "⫅̸"),
+ ("nsube", "⊈"),
+ ("nsubset", "⊂⃒"),
+ ("nsubseteq", "⊈"),
+ ("nsubseteqq", "⫅̸"),
+ ("nsucc", "⊁"),
+ ("nsucceq", "⪰̸"),
+ ("nsup", "⊅"),
+ ("nsupE", "⫆̸"),
+ ("nsupe", "⊉"),
+ ("nsupset", "⊃⃒"),
+ ("nsupseteq", "⊉"),
+ ("nsupseteqq", "⫆̸"),
+ ("ntgl", "≹"),
+ ("ntilde", "ñ"),
+ ("ntlg", "≸"),
+ ("ntriangleleft", "⋪"),
+ ("ntrianglelefteq", "⋬"),
+ ("ntriangleright", "⋫"),
+ ("ntrianglerighteq", "⋭"),
+ ("nu", "ν"),
+ ("num", "#"),
+ ("numero", "№"),
+ ("numsp", " "),
+ ("nvDash", "⊭"),
+ ("nvHarr", "⤄"),
+ ("nvap", "≍⃒"),
+ ("nvdash", "⊬"),
+ ("nvge", "≥⃒"),
+ ("nvgt", ">⃒"),
+ ("nvinfin", "⧞"),
+ ("nvlArr", "⤂"),
+ ("nvle", "≤⃒"),
+ ("nvlt", "<⃒"),
+ ("nvltrie", "⊴⃒"),
+ ("nvrArr", "⤃"),
+ ("nvrtrie", "⊵⃒"),
+ ("nvsim", "∼⃒"),
+ ("nwArr", "⇖"),
+ ("nwarhk", "⤣"),
+ ("nwarr", "↖"),
+ ("nwarrow", "↖"),
+ ("nwnear", "⤧"),
+ ("oS", "Ⓢ"),
+ ("oacute", "ó"),
+ ("oast", "⊛"),
+ ("ocir", "⊚"),
+ ("ocirc", "ô"),
+ ("ocy", "о"),
+ ("odash", "⊝"),
+ ("odblac", "ő"),
+ ("odiv", "⨸"),
+ ("odot", "⊙"),
+ ("odsold", "⦼"),
+ ("oelig", "œ"),
+ ("ofcir", "⦿"),
+ ("ofr", "𝔬"),
+ ("ogon", "˛"),
+ ("ograve", "ò"),
+ ("ogt", "⧁"),
+ ("ohbar", "⦵"),
+ ("ohm", "Ω"),
+ ("oint", "∮"),
+ ("olarr", "↺"),
+ ("olcir", "⦾"),
+ ("olcross", "⦻"),
+ ("oline", "‾"),
+ ("olt", "⧀"),
+ ("omacr", "ō"),
+ ("omega", "ω"),
+ ("omicron", "ο"),
+ ("omid", "⦶"),
+ ("ominus", "⊖"),
+ ("oopf", "𝕠"),
+ ("opar", "⦷"),
+ ("operp", "⦹"),
+ ("oplus", "⊕"),
+ ("or", "∨"),
+ ("orarr", "↻"),
+ ("ord", "⩝"),
+ ("order", "ℴ"),
+ ("orderof", "ℴ"),
+ ("ordf", "ª"),
+ ("ordm", "º"),
+ ("origof", "⊶"),
+ ("oror", "⩖"),
+ ("orslope", "⩗"),
+ ("orv", "⩛"),
+ ("oscr", "ℴ"),
+ ("oslash", "ø"),
+ ("osol", "⊘"),
+ ("otilde", "õ"),
+ ("otimes", "⊗"),
+ ("otimesas", "⨶"),
+ ("ouml", "ö"),
+ ("ovbar", "⌽"),
+ ("par", "∥"),
+ ("para", "¶"),
+ ("parallel", "∥"),
+ ("parsim", "⫳"),
+ ("parsl", "⫽"),
+ ("part", "∂"),
+ ("pcy", "п"),
+ ("percnt", "%"),
+ ("period", "."),
+ ("permil", "‰"),
+ ("perp", "⊥"),
+ ("pertenk", "‱"),
+ ("pfr", "𝔭"),
+ ("phi", "φ"),
+ ("phiv", "ϕ"),
+ ("phmmat", "ℳ"),
+ ("phone", "☎"),
+ ("pi", "π"),
+ ("pitchfork", "⋔"),
+ ("piv", "ϖ"),
+ ("planck", "ℏ"),
+ ("planckh", "ℎ"),
+ ("plankv", "ℏ"),
+ ("plus", "+"),
+ ("plusacir", "⨣"),
+ ("plusb", "⊞"),
+ ("pluscir", "⨢"),
+ ("plusdo", "∔"),
+ ("plusdu", "⨥"),
+ ("pluse", "⩲"),
+ ("plusmn", "±"),
+ ("plussim", "⨦"),
+ ("plustwo", "⨧"),
+ ("pm", "±"),
+ ("pointint", "⨕"),
+ ("popf", "𝕡"),
+ ("pound", "£"),
+ ("pr", "≺"),
+ ("prE", "⪳"),
+ ("prap", "⪷"),
+ ("prcue", "≼"),
+ ("pre", "⪯"),
+ ("prec", "≺"),
+ ("precapprox", "⪷"),
+ ("preccurlyeq", "≼"),
+ ("preceq", "⪯"),
+ ("precnapprox", "⪹"),
+ ("precneqq", "⪵"),
+ ("precnsim", "⋨"),
+ ("precsim", "≾"),
+ ("prime", "′"),
+ ("primes", "ℙ"),
+ ("prnE", "⪵"),
+ ("prnap", "⪹"),
+ ("prnsim", "⋨"),
+ ("prod", "∏"),
+ ("profalar", "⌮"),
+ ("profline", "⌒"),
+ ("profsurf", "⌓"),
+ ("prop", "∝"),
+ ("propto", "∝"),
+ ("prsim", "≾"),
+ ("prurel", "⊰"),
+ ("pscr", "𝓅"),
+ ("psi", "ψ"),
+ ("puncsp", " "),
+ ("qfr", "𝔮"),
+ ("qint", "⨌"),
+ ("qopf", "𝕢"),
+ ("qprime", "⁗"),
+ ("qscr", "𝓆"),
+ ("quaternions", "ℍ"),
+ ("quatint", "⨖"),
+ ("quest", "?"),
+ ("questeq", "≟"),
+ ("quot", "\""),
+ ("rAarr", "⇛"),
+ ("rArr", "⇒"),
+ ("rAtail", "⤜"),
+ ("rBarr", "⤏"),
+ ("rHar", "⥤"),
+ ("race", "∽̱"),
+ ("racute", "ŕ"),
+ ("radic", "√"),
+ ("raemptyv", "⦳"),
+ ("rang", "⟩"),
+ ("rangd", "⦒"),
+ ("range", "⦥"),
+ ("rangle", "⟩"),
+ ("raquo", "»"),
+ ("rarr", "→"),
+ ("rarrap", "⥵"),
+ ("rarrb", "⇥"),
+ ("rarrbfs", "⤠"),
+ ("rarrc", "⤳"),
+ ("rarrfs", "⤞"),
+ ("rarrhk", "↪"),
+ ("rarrlp", "↬"),
+ ("rarrpl", "⥅"),
+ ("rarrsim", "⥴"),
+ ("rarrtl", "↣"),
+ ("rarrw", "↝"),
+ ("ratail", "⤚"),
+ ("ratio", "∶"),
+ ("rationals", "ℚ"),
+ ("rbarr", "⤍"),
+ ("rbbrk", "❳"),
+ ("rbrace", "}"),
+ ("rbrack", "]"),
+ ("rbrke", "⦌"),
+ ("rbrksld", "⦎"),
+ ("rbrkslu", "⦐"),
+ ("rcaron", "ř"),
+ ("rcedil", "ŗ"),
+ ("rceil", "⌉"),
+ ("rcub", "}"),
+ ("rcy", "р"),
+ ("rdca", "⤷"),
+ ("rdldhar", "⥩"),
+ ("rdquo", "”"),
+ ("rdquor", "”"),
+ ("rdsh", "↳"),
+ ("real", "ℜ"),
+ ("realine", "ℛ"),
+ ("realpart", "ℜ"),
+ ("reals", "ℝ"),
+ ("rect", "▭"),
+ ("reg", "®"),
+ ("rfisht", "⥽"),
+ ("rfloor", "⌋"),
+ ("rfr", "𝔯"),
+ ("rhard", "⇁"),
+ ("rharu", "⇀"),
+ ("rharul", "⥬"),
+ ("rho", "ρ"),
+ ("rhov", "ϱ"),
+ ("rightarrow", "→"),
+ ("rightarrowtail", "↣"),
+ ("rightharpoondown", "⇁"),
+ ("rightharpoonup", "⇀"),
+ ("rightleftarrows", "⇄"),
+ ("rightleftharpoons", "⇌"),
+ ("rightrightarrows", "⇉"),
+ ("rightsquigarrow", "↝"),
+ ("rightthreetimes", "⋌"),
+ ("ring", "˚"),
+ ("risingdotseq", "≓"),
+ ("rlarr", "⇄"),
+ ("rlhar", "⇌"),
+ ("rlm", "‏"),
+ ("rmoust", "⎱"),
+ ("rmoustache", "⎱"),
+ ("rnmid", "⫮"),
+ ("roang", "⟭"),
+ ("roarr", "⇾"),
+ ("robrk", "⟧"),
+ ("ropar", "⦆"),
+ ("ropf", "𝕣"),
+ ("roplus", "⨮"),
+ ("rotimes", "⨵"),
+ ("rpar", ")"),
+ ("rpargt", "⦔"),
+ ("rppolint", "⨒"),
+ ("rrarr", "⇉"),
+ ("rsaquo", "›"),
+ ("rscr", "𝓇"),
+ ("rsh", "↱"),
+ ("rsqb", "]"),
+ ("rsquo", "’"),
+ ("rsquor", "’"),
+ ("rthree", "⋌"),
+ ("rtimes", "⋊"),
+ ("rtri", "▹"),
+ ("rtrie", "⊵"),
+ ("rtrif", "▸"),
+ ("rtriltri", "⧎"),
+ ("ruluhar", "⥨"),
+ ("rx", "℞"),
+ ("sacute", "ś"),
+ ("sbquo", "‚"),
+ ("sc", "≻"),
+ ("scE", "⪴"),
+ ("scap", "⪸"),
+ ("scaron", "š"),
+ ("sccue", "≽"),
+ ("sce", "⪰"),
+ ("scedil", "ş"),
+ ("scirc", "ŝ"),
+ ("scnE", "⪶"),
+ ("scnap", "⪺"),
+ ("scnsim", "⋩"),
+ ("scpolint", "⨓"),
+ ("scsim", "≿"),
+ ("scy", "с"),
+ ("sdot", "⋅"),
+ ("sdotb", "⊡"),
+ ("sdote", "⩦"),
+ ("seArr", "⇘"),
+ ("searhk", "⤥"),
+ ("searr", "↘"),
+ ("searrow", "↘"),
+ ("sect", "§"),
+ ("semi", ";"),
+ ("seswar", "⤩"),
+ ("setminus", "∖"),
+ ("setmn", "∖"),
+ ("sext", "✶"),
+ ("sfr", "𝔰"),
+ ("sfrown", "⌢"),
+ ("sharp", "♯"),
+ ("shchcy", "щ"),
+ ("shcy", "ш"),
+ ("shortmid", "∣"),
+ ("shortparallel", "∥"),
+ ("shy", "\u{AD}"),
+ ("sigma", "σ"),
+ ("sigmaf", "ς"),
+ ("sigmav", "ς"),
+ ("sim", "∼"),
+ ("simdot", "⩪"),
+ ("sime", "≃"),
+ ("simeq", "≃"),
+ ("simg", "⪞"),
+ ("simgE", "⪠"),
+ ("siml", "⪝"),
+ ("simlE", "⪟"),
+ ("simne", "≆"),
+ ("simplus", "⨤"),
+ ("simrarr", "⥲"),
+ ("slarr", "←"),
+ ("smallsetminus", "∖"),
+ ("smashp", "⨳"),
+ ("smeparsl", "⧤"),
+ ("smid", "∣"),
+ ("smile", "⌣"),
+ ("smt", "⪪"),
+ ("smte", "⪬"),
+ ("smtes", "⪬︀"),
+ ("softcy", "ь"),
+ ("sol", "/"),
+ ("solb", "⧄"),
+ ("solbar", "⌿"),
+ ("sopf", "𝕤"),
+ ("spades", "♠"),
+ ("spadesuit", "♠"),
+ ("spar", "∥"),
+ ("sqcap", "⊓"),
+ ("sqcaps", "⊓︀"),
+ ("sqcup", "⊔"),
+ ("sqcups", "⊔︀"),
+ ("sqsub", "⊏"),
+ ("sqsube", "⊑"),
+ ("sqsubset", "⊏"),
+ ("sqsubseteq", "⊑"),
+ ("sqsup", "⊐"),
+ ("sqsupe", "⊒"),
+ ("sqsupset", "⊐"),
+ ("sqsupseteq", "⊒"),
+ ("squ", "□"),
+ ("square", "□"),
+ ("squarf", "▪"),
+ ("squf", "▪"),
+ ("srarr", "→"),
+ ("sscr", "𝓈"),
+ ("ssetmn", "∖"),
+ ("ssmile", "⌣"),
+ ("sstarf", "⋆"),
+ ("star", "☆"),
+ ("starf", "★"),
+ ("straightepsilon", "ϵ"),
+ ("straightphi", "ϕ"),
+ ("strns", "¯"),
+ ("sub", "⊂"),
+ ("subE", "⫅"),
+ ("subdot", "⪽"),
+ ("sube", "⊆"),
+ ("subedot", "⫃"),
+ ("submult", "⫁"),
+ ("subnE", "⫋"),
+ ("subne", "⊊"),
+ ("subplus", "⪿"),
+ ("subrarr", "⥹"),
+ ("subset", "⊂"),
+ ("subseteq", "⊆"),
+ ("subseteqq", "⫅"),
+ ("subsetneq", "⊊"),
+ ("subsetneqq", "⫋"),
+ ("subsim", "⫇"),
+ ("subsub", "⫕"),
+ ("subsup", "⫓"),
+ ("succ", "≻"),
+ ("succapprox", "⪸"),
+ ("succcurlyeq", "≽"),
+ ("succeq", "⪰"),
+ ("succnapprox", "⪺"),
+ ("succneqq", "⪶"),
+ ("succnsim", "⋩"),
+ ("succsim", "≿"),
+ ("sum", "∑"),
+ ("sung", "♪"),
+ ("sup1", "¹"),
+ ("sup2", "²"),
+ ("sup3", "³"),
+ ("sup", "⊃"),
+ ("supE", "⫆"),
+ ("supdot", "⪾"),
+ ("supdsub", "⫘"),
+ ("supe", "⊇"),
+ ("supedot", "⫄"),
+ ("suphsol", "⟉"),
+ ("suphsub", "⫗"),
+ ("suplarr", "⥻"),
+ ("supmult", "⫂"),
+ ("supnE", "⫌"),
+ ("supne", "⊋"),
+ ("supplus", "⫀"),
+ ("supset", "⊃"),
+ ("supseteq", "⊇"),
+ ("supseteqq", "⫆"),
+ ("supsetneq", "⊋"),
+ ("supsetneqq", "⫌"),
+ ("supsim", "⫈"),
+ ("supsub", "⫔"),
+ ("supsup", "⫖"),
+ ("swArr", "⇙"),
+ ("swarhk", "⤦"),
+ ("swarr", "↙"),
+ ("swarrow", "↙"),
+ ("swnwar", "⤪"),
+ ("szlig", "ß"),
+ ("target", "⌖"),
+ ("tau", "τ"),
+ ("tbrk", "⎴"),
+ ("tcaron", "ť"),
+ ("tcedil", "ţ"),
+ ("tcy", "т"),
+ ("tdot", "⃛"),
+ ("telrec", "⌕"),
+ ("tfr", "𝔱"),
+ ("there4", "∴"),
+ ("therefore", "∴"),
+ ("theta", "θ"),
+ ("thetasym", "ϑ"),
+ ("thetav", "ϑ"),
+ ("thickapprox", "≈"),
+ ("thicksim", "∼"),
+ ("thinsp", " "),
+ ("thkap", "≈"),
+ ("thksim", "∼"),
+ ("thorn", "þ"),
+ ("tilde", "˜"),
+ ("times", "×"),
+ ("timesb", "⊠"),
+ ("timesbar", "⨱"),
+ ("timesd", "⨰"),
+ ("tint", "∭"),
+ ("toea", "⤨"),
+ ("top", "⊤"),
+ ("topbot", "⌶"),
+ ("topcir", "⫱"),
+ ("topf", "𝕥"),
+ ("topfork", "⫚"),
+ ("tosa", "⤩"),
+ ("tprime", "‴"),
+ ("trade", "™"),
+ ("triangle", "▵"),
+ ("triangledown", "▿"),
+ ("triangleleft", "◃"),
+ ("trianglelefteq", "⊴"),
+ ("triangleq", "≜"),
+ ("triangleright", "▹"),
+ ("trianglerighteq", "⊵"),
+ ("tridot", "◬"),
+ ("trie", "≜"),
+ ("triminus", "⨺"),
+ ("triplus", "⨹"),
+ ("trisb", "⧍"),
+ ("tritime", "⨻"),
+ ("trpezium", "⏢"),
+ ("tscr", "𝓉"),
+ ("tscy", "ц"),
+ ("tshcy", "ћ"),
+ ("tstrok", "ŧ"),
+ ("twixt", "≬"),
+ ("twoheadleftarrow", "↞"),
+ ("twoheadrightarrow", "↠"),
+ ("uArr", "⇑"),
+ ("uHar", "⥣"),
+ ("uacute", "ú"),
+ ("uarr", "↑"),
+ ("ubrcy", "ў"),
+ ("ubreve", "ŭ"),
+ ("ucirc", "û"),
+ ("ucy", "у"),
+ ("udarr", "⇅"),
+ ("udblac", "ű"),
+ ("udhar", "⥮"),
+ ("ufisht", "⥾"),
+ ("ufr", "𝔲"),
+ ("ugrave", "ù"),
+ ("uharl", "↿"),
+ ("uharr", "↾"),
+ ("uhblk", "▀"),
+ ("ulcorn", "⌜"),
+ ("ulcorner", "⌜"),
+ ("ulcrop", "⌏"),
+ ("ultri", "◸"),
+ ("umacr", "ū"),
+ ("uml", "¨"),
+ ("uogon", "ų"),
+ ("uopf", "𝕦"),
+ ("uparrow", "↑"),
+ ("updownarrow", "↕"),
+ ("upharpoonleft", "↿"),
+ ("upharpoonright", "↾"),
+ ("uplus", "⊎"),
+ ("upsi", "υ"),
+ ("upsih", "ϒ"),
+ ("upsilon", "υ"),
+ ("upuparrows", "⇈"),
+ ("urcorn", "⌝"),
+ ("urcorner", "⌝"),
+ ("urcrop", "⌎"),
+ ("uring", "ů"),
+ ("urtri", "◹"),
+ ("uscr", "𝓊"),
+ ("utdot", "⋰"),
+ ("utilde", "ũ"),
+ ("utri", "▵"),
+ ("utrif", "▴"),
+ ("uuarr", "⇈"),
+ ("uuml", "ü"),
+ ("uwangle", "⦧"),
+ ("vArr", "⇕"),
+ ("vBar", "⫨"),
+ ("vBarv", "⫩"),
+ ("vDash", "⊨"),
+ ("vangrt", "⦜"),
+ ("varepsilon", "ϵ"),
+ ("varkappa", "ϰ"),
+ ("varnothing", "∅"),
+ ("varphi", "ϕ"),
+ ("varpi", "ϖ"),
+ ("varpropto", "∝"),
+ ("varr", "↕"),
+ ("varrho", "ϱ"),
+ ("varsigma", "ς"),
+ ("varsubsetneq", "⊊︀"),
+ ("varsubsetneqq", "⫋︀"),
+ ("varsupsetneq", "⊋︀"),
+ ("varsupsetneqq", "⫌︀"),
+ ("vartheta", "ϑ"),
+ ("vartriangleleft", "⊲"),
+ ("vartriangleright", "⊳"),
+ ("vcy", "в"),
+ ("vdash", "⊢"),
+ ("vee", "∨"),
+ ("veebar", "⊻"),
+ ("veeeq", "≚"),
+ ("vellip", "⋮"),
+ ("verbar", "|"),
+ ("vert", "|"),
+ ("vfr", "𝔳"),
+ ("vltri", "⊲"),
+ ("vnsub", "⊂⃒"),
+ ("vnsup", "⊃⃒"),
+ ("vopf", "𝕧"),
+ ("vprop", "∝"),
+ ("vrtri", "⊳"),
+ ("vscr", "𝓋"),
+ ("vsubnE", "⫋︀"),
+ ("vsubne", "⊊︀"),
+ ("vsupnE", "⫌︀"),
+ ("vsupne", "⊋︀"),
+ ("vzigzag", "⦚"),
+ ("wcirc", "ŵ"),
+ ("wedbar", "⩟"),
+ ("wedge", "∧"),
+ ("wedgeq", "≙"),
+ ("weierp", "℘"),
+ ("wfr", "𝔴"),
+ ("wopf", "𝕨"),
+ ("wp", "℘"),
+ ("wr", "≀"),
+ ("wreath", "≀"),
+ ("wscr", "𝓌"),
+ ("xcap", "⋂"),
+ ("xcirc", "◯"),
+ ("xcup", "⋃"),
+ ("xdtri", "▽"),
+ ("xfr", "𝔵"),
+ ("xhArr", "⟺"),
+ ("xharr", "⟷"),
+ ("xi", "ξ"),
+ ("xlArr", "⟸"),
+ ("xlarr", "⟵"),
+ ("xmap", "⟼"),
+ ("xnis", "⋻"),
+ ("xodot", "⨀"),
+ ("xopf", "𝕩"),
+ ("xoplus", "⨁"),
+ ("xotime", "⨂"),
+ ("xrArr", "⟹"),
+ ("xrarr", "⟶"),
+ ("xscr", "𝓍"),
+ ("xsqcup", "⨆"),
+ ("xuplus", "⨄"),
+ ("xutri", "△"),
+ ("xvee", "⋁"),
+ ("xwedge", "⋀"),
+ ("yacute", "ý"),
+ ("yacy", "я"),
+ ("ycirc", "ŷ"),
+ ("ycy", "ы"),
+ ("yen", "¥"),
+ ("yfr", "𝔶"),
+ ("yicy", "ї"),
+ ("yopf", "𝕪"),
+ ("yscr", "𝓎"),
+ ("yucy", "ю"),
+ ("yuml", "ÿ"),
+ ("zacute", "ź"),
+ ("zcaron", "ž"),
+ ("zcy", "з"),
+ ("zdot", "ż"),
+ ("zeetrf", "ℨ"),
+ ("zeta", "ζ"),
+ ("zfr", "𝔷"),
+ ("zhcy", "ж"),
+ ("zigrarr", "⇝"),
+ ("zopf", "𝕫"),
+ ("zscr", "𝓏"),
+ ("zwj", "‍"),
+ ("zwnj", "‌"),
+];
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use alloc::format;
+
+ #[test]
+ fn constants() {
+ assert_eq!(
+ CHARACTER_REFERENCE_DECIMAL_SIZE_MAX,
+ format!("{}", 0x10ffff).len(),
+ "`CHARACTER_REFERENCE_DECIMAL_SIZE_MAX`"
+ );
+
+ assert_eq!(
+ CHARACTER_REFERENCE_HEXADECIMAL_SIZE_MAX,
+ format!("{:x}", 0x10ffff).len(),
+ "`CHARACTER_REFERENCE_HEXADECIMAL_SIZE_MAX`"
+ );
+
+ assert_eq!(
+ CHARACTER_REFERENCE_NAMED_SIZE_MAX,
+ longest(&CHARACTER_REFERENCES.map(|d| d.0)).unwrap().len(),
+ "`CHARACTER_REFERENCE_NAMED_SIZE_MAX`"
+ );
+
+ assert_eq!(
+ HTML_RAW_SIZE_MAX,
+ longest(&HTML_RAW_NAMES).unwrap().len(),
+ "`HTML_RAW_SIZE_MAX`"
+ );
+ }
+
+ fn longest<'a>(list: &[&'a str]) -> Option<&'a str> {
+ let mut max = 0;
+ let mut result = None;
+ for name in list.iter() {
+ let len = name.len();
+ if len > max {
+ max = len;
+ result = Some(*name);
+ }
+ }
+
+ result
+ }
+}
diff --git a/src/util/decode_character_reference.rs b/src/util/decode_character_reference.rs
index 30b7853..d4c983a 100644
--- a/src/util/decode_character_reference.rs
+++ b/src/util/decode_character_reference.rs
@@ -1,6 +1,6 @@
//! Decode character references.
-use crate::constant::CHARACTER_REFERENCES;
+use crate::util::constant::CHARACTER_REFERENCES;
use alloc::string::{String, ToString};
/// Decode named character references.
diff --git a/src/util/mod.rs b/src/util/mod.rs
index 022c7d6..d2ec0ed 100644
--- a/src/util/mod.rs
+++ b/src/util/mod.rs
@@ -1,6 +1,7 @@
//! Utilities used when processing markdown.
pub mod classify_character;
+pub mod constant;
pub mod decode_character_reference;
pub mod edit_map;
pub mod encode;
@@ -8,3 +9,4 @@ pub mod normalize_identifier;
pub mod sanitize_uri;
pub mod skip;
pub mod slice;
+pub mod unicode;
diff --git a/src/util/slice.rs b/src/util/slice.rs
index 5dcc352..0734d78 100644
--- a/src/util/slice.rs
+++ b/src/util/slice.rs
@@ -1,7 +1,7 @@
//! Deal with bytes.
-use crate::constant::TAB_SIZE;
use crate::event::{Event, Kind, Point};
+use crate::util::constant::TAB_SIZE;
use alloc::string::String;
use core::str;
diff --git a/src/util/unicode.rs b/src/util/unicode.rs
new file mode 100644
index 0000000..2b79a88
--- /dev/null
+++ b/src/util/unicode.rs
@@ -0,0 +1,838 @@
+//! Info on Unicode.
+
+/// List of characters that are considered punctuation.
+///
+/// > 👉 **Important**: this module is generated by `build.rs`.
+/// > It is generate from the latest Unicode data.
+///
+/// Rust does not contain an `is_punctuation` method on `char`, while it does
+/// support [`is_ascii_alphanumeric`](char::is_ascii_alphanumeric).
+///
+/// `CommonMark` handles attention (emphasis, strong) markers based on what
+/// comes before or after them.
+/// One such difference is if those characters are Unicode punctuation.
+///
+/// ## References
+///
+/// * [*§ 2.1 Characters and lines* in `CommonMark`](https://spec.commonmark.org/0.30/#unicode-punctuation-character)
+pub const PUNCTUATION: [char; 819] = [
+ '\u{0021}',
+ '\u{0022}',
+ '\u{0023}',
+ '\u{0025}',
+ '\u{0026}',
+ '\u{0027}',
+ '\u{0028}',
+ '\u{0029}',
+ '\u{002A}',
+ '\u{002C}',
+ '\u{002D}',
+ '\u{002E}',
+ '\u{002F}',
+ '\u{003A}',
+ '\u{003B}',
+ '\u{003F}',
+ '\u{0040}',
+ '\u{005B}',
+ '\u{005C}',
+ '\u{005D}',
+ '\u{005F}',
+ '\u{007B}',
+ '\u{007D}',
+ '\u{00A1}',
+ '\u{00A7}',
+ '\u{00AB}',
+ '\u{00B6}',
+ '\u{00B7}',
+ '\u{00BB}',
+ '\u{00BF}',
+ '\u{037E}',
+ '\u{0387}',
+ '\u{055A}',
+ '\u{055B}',
+ '\u{055C}',
+ '\u{055D}',
+ '\u{055E}',
+ '\u{055F}',
+ '\u{0589}',
+ '\u{058A}',
+ '\u{05BE}',
+ '\u{05C0}',
+ '\u{05C3}',
+ '\u{05C6}',
+ '\u{05F3}',
+ '\u{05F4}',
+ '\u{0609}',
+ '\u{060A}',
+ '\u{060C}',
+ '\u{060D}',
+ '\u{061B}',
+ '\u{061D}',
+ '\u{061E}',
+ '\u{061F}',
+ '\u{066A}',
+ '\u{066B}',
+ '\u{066C}',
+ '\u{066D}',
+ '\u{06D4}',
+ '\u{0700}',
+ '\u{0701}',
+ '\u{0702}',
+ '\u{0703}',
+ '\u{0704}',
+ '\u{0705}',
+ '\u{0706}',
+ '\u{0707}',
+ '\u{0708}',
+ '\u{0709}',
+ '\u{070A}',
+ '\u{070B}',
+ '\u{070C}',
+ '\u{070D}',
+ '\u{07F7}',
+ '\u{07F8}',
+ '\u{07F9}',
+ '\u{0830}',
+ '\u{0831}',
+ '\u{0832}',
+ '\u{0833}',
+ '\u{0834}',
+ '\u{0835}',
+ '\u{0836}',
+ '\u{0837}',
+ '\u{0838}',
+ '\u{0839}',
+ '\u{083A}',
+ '\u{083B}',
+ '\u{083C}',
+ '\u{083D}',
+ '\u{083E}',
+ '\u{085E}',
+ '\u{0964}',
+ '\u{0965}',
+ '\u{0970}',
+ '\u{09FD}',
+ '\u{0A76}',
+ '\u{0AF0}',
+ '\u{0C77}',
+ '\u{0C84}',
+ '\u{0DF4}',
+ '\u{0E4F}',
+ '\u{0E5A}',
+ '\u{0E5B}',
+ '\u{0F04}',
+ '\u{0F05}',
+ '\u{0F06}',
+ '\u{0F07}',
+ '\u{0F08}',
+ '\u{0F09}',
+ '\u{0F0A}',
+ '\u{0F0B}',
+ '\u{0F0C}',
+ '\u{0F0D}',
+ '\u{0F0E}',
+ '\u{0F0F}',
+ '\u{0F10}',
+ '\u{0F11}',
+ '\u{0F12}',
+ '\u{0F14}',
+ '\u{0F3A}',
+ '\u{0F3B}',
+ '\u{0F3C}',
+ '\u{0F3D}',
+ '\u{0F85}',
+ '\u{0FD0}',
+ '\u{0FD1}',
+ '\u{0FD2}',
+ '\u{0FD3}',
+ '\u{0FD4}',
+ '\u{0FD9}',
+ '\u{0FDA}',
+ '\u{104A}',
+ '\u{104B}',
+ '\u{104C}',
+ '\u{104D}',
+ '\u{104E}',
+ '\u{104F}',
+ '\u{10FB}',
+ '\u{1360}',
+ '\u{1361}',
+ '\u{1362}',
+ '\u{1363}',
+ '\u{1364}',
+ '\u{1365}',
+ '\u{1366}',
+ '\u{1367}',
+ '\u{1368}',
+ '\u{1400}',
+ '\u{166E}',
+ '\u{169B}',
+ '\u{169C}',
+ '\u{16EB}',
+ '\u{16EC}',
+ '\u{16ED}',
+ '\u{1735}',
+ '\u{1736}',
+ '\u{17D4}',
+ '\u{17D5}',
+ '\u{17D6}',
+ '\u{17D8}',
+ '\u{17D9}',
+ '\u{17DA}',
+ '\u{1800}',
+ '\u{1801}',
+ '\u{1802}',
+ '\u{1803}',
+ '\u{1804}',
+ '\u{1805}',
+ '\u{1806}',
+ '\u{1807}',
+ '\u{1808}',
+ '\u{1809}',
+ '\u{180A}',
+ '\u{1944}',
+ '\u{1945}',
+ '\u{1A1E}',
+ '\u{1A1F}',
+ '\u{1AA0}',
+ '\u{1AA1}',
+ '\u{1AA2}',
+ '\u{1AA3}',
+ '\u{1AA4}',
+ '\u{1AA5}',
+ '\u{1AA6}',
+ '\u{1AA8}',
+ '\u{1AA9}',
+ '\u{1AAA}',
+ '\u{1AAB}',
+ '\u{1AAC}',
+ '\u{1AAD}',
+ '\u{1B5A}',
+ '\u{1B5B}',
+ '\u{1B5C}',
+ '\u{1B5D}',
+ '\u{1B5E}',
+ '\u{1B5F}',
+ '\u{1B60}',
+ '\u{1B7D}',
+ '\u{1B7E}',
+ '\u{1BFC}',
+ '\u{1BFD}',
+ '\u{1BFE}',
+ '\u{1BFF}',
+ '\u{1C3B}',
+ '\u{1C3C}',
+ '\u{1C3D}',
+ '\u{1C3E}',
+ '\u{1C3F}',
+ '\u{1C7E}',
+ '\u{1C7F}',
+ '\u{1CC0}',
+ '\u{1CC1}',
+ '\u{1CC2}',
+ '\u{1CC3}',
+ '\u{1CC4}',
+ '\u{1CC5}',
+ '\u{1CC6}',
+ '\u{1CC7}',
+ '\u{1CD3}',
+ '\u{2010}',
+ '\u{2011}',
+ '\u{2012}',
+ '\u{2013}',
+ '\u{2014}',
+ '\u{2015}',
+ '\u{2016}',
+ '\u{2017}',
+ '\u{2018}',
+ '\u{2019}',
+ '\u{201A}',
+ '\u{201B}',
+ '\u{201C}',
+ '\u{201D}',
+ '\u{201E}',
+ '\u{201F}',
+ '\u{2020}',
+ '\u{2021}',
+ '\u{2022}',
+ '\u{2023}',
+ '\u{2024}',
+ '\u{2025}',
+ '\u{2026}',
+ '\u{2027}',
+ '\u{2030}',
+ '\u{2031}',
+ '\u{2032}',
+ '\u{2033}',
+ '\u{2034}',
+ '\u{2035}',
+ '\u{2036}',
+ '\u{2037}',
+ '\u{2038}',
+ '\u{2039}',
+ '\u{203A}',
+ '\u{203B}',
+ '\u{203C}',
+ '\u{203D}',
+ '\u{203E}',
+ '\u{203F}',
+ '\u{2040}',
+ '\u{2041}',
+ '\u{2042}',
+ '\u{2043}',
+ '\u{2045}',
+ '\u{2046}',
+ '\u{2047}',
+ '\u{2048}',
+ '\u{2049}',
+ '\u{204A}',
+ '\u{204B}',
+ '\u{204C}',
+ '\u{204D}',
+ '\u{204E}',
+ '\u{204F}',
+ '\u{2050}',
+ '\u{2051}',
+ '\u{2053}',
+ '\u{2054}',
+ '\u{2055}',
+ '\u{2056}',
+ '\u{2057}',
+ '\u{2058}',
+ '\u{2059}',
+ '\u{205A}',
+ '\u{205B}',
+ '\u{205C}',
+ '\u{205D}',
+ '\u{205E}',
+ '\u{207D}',
+ '\u{207E}',
+ '\u{208D}',
+ '\u{208E}',
+ '\u{2308}',
+ '\u{2309}',
+ '\u{230A}',
+ '\u{230B}',
+ '\u{2329}',
+ '\u{232A}',
+ '\u{2768}',
+ '\u{2769}',
+ '\u{276A}',
+ '\u{276B}',
+ '\u{276C}',
+ '\u{276D}',
+ '\u{276E}',
+ '\u{276F}',
+ '\u{2770}',
+ '\u{2771}',
+ '\u{2772}',
+ '\u{2773}',
+ '\u{2774}',
+ '\u{2775}',
+ '\u{27C5}',
+ '\u{27C6}',
+ '\u{27E6}',
+ '\u{27E7}',
+ '\u{27E8}',
+ '\u{27E9}',
+ '\u{27EA}',
+ '\u{27EB}',
+ '\u{27EC}',
+ '\u{27ED}',
+ '\u{27EE}',
+ '\u{27EF}',
+ '\u{2983}',
+ '\u{2984}',
+ '\u{2985}',
+ '\u{2986}',
+ '\u{2987}',
+ '\u{2988}',
+ '\u{2989}',
+ '\u{298A}',
+ '\u{298B}',
+ '\u{298C}',
+ '\u{298D}',
+ '\u{298E}',
+ '\u{298F}',
+ '\u{2990}',
+ '\u{2991}',
+ '\u{2992}',
+ '\u{2993}',
+ '\u{2994}',
+ '\u{2995}',
+ '\u{2996}',
+ '\u{2997}',
+ '\u{2998}',
+ '\u{29D8}',
+ '\u{29D9}',
+ '\u{29DA}',
+ '\u{29DB}',
+ '\u{29FC}',
+ '\u{29FD}',
+ '\u{2CF9}',
+ '\u{2CFA}',
+ '\u{2CFB}',
+ '\u{2CFC}',
+ '\u{2CFE}',
+ '\u{2CFF}',
+ '\u{2D70}',
+ '\u{2E00}',
+ '\u{2E01}',
+ '\u{2E02}',
+ '\u{2E03}',
+ '\u{2E04}',
+ '\u{2E05}',
+ '\u{2E06}',
+ '\u{2E07}',
+ '\u{2E08}',
+ '\u{2E09}',
+ '\u{2E0A}',
+ '\u{2E0B}',
+ '\u{2E0C}',
+ '\u{2E0D}',
+ '\u{2E0E}',
+ '\u{2E0F}',
+ '\u{2E10}',
+ '\u{2E11}',
+ '\u{2E12}',
+ '\u{2E13}',
+ '\u{2E14}',
+ '\u{2E15}',
+ '\u{2E16}',
+ '\u{2E17}',
+ '\u{2E18}',
+ '\u{2E19}',
+ '\u{2E1A}',
+ '\u{2E1B}',
+ '\u{2E1C}',
+ '\u{2E1D}',
+ '\u{2E1E}',
+ '\u{2E1F}',
+ '\u{2E20}',
+ '\u{2E21}',
+ '\u{2E22}',
+ '\u{2E23}',
+ '\u{2E24}',
+ '\u{2E25}',
+ '\u{2E26}',
+ '\u{2E27}',
+ '\u{2E28}',
+ '\u{2E29}',
+ '\u{2E2A}',
+ '\u{2E2B}',
+ '\u{2E2C}',
+ '\u{2E2D}',
+ '\u{2E2E}',
+ '\u{2E30}',
+ '\u{2E31}',
+ '\u{2E32}',
+ '\u{2E33}',
+ '\u{2E34}',
+ '\u{2E35}',
+ '\u{2E36}',
+ '\u{2E37}',
+ '\u{2E38}',
+ '\u{2E39}',
+ '\u{2E3A}',
+ '\u{2E3B}',
+ '\u{2E3C}',
+ '\u{2E3D}',
+ '\u{2E3E}',
+ '\u{2E3F}',
+ '\u{2E40}',
+ '\u{2E41}',
+ '\u{2E42}',
+ '\u{2E43}',
+ '\u{2E44}',
+ '\u{2E45}',
+ '\u{2E46}',
+ '\u{2E47}',
+ '\u{2E48}',
+ '\u{2E49}',
+ '\u{2E4A}',
+ '\u{2E4B}',
+ '\u{2E4C}',
+ '\u{2E4D}',
+ '\u{2E4E}',
+ '\u{2E4F}',
+ '\u{2E52}',
+ '\u{2E53}',
+ '\u{2E54}',
+ '\u{2E55}',
+ '\u{2E56}',
+ '\u{2E57}',
+ '\u{2E58}',
+ '\u{2E59}',
+ '\u{2E5A}',
+ '\u{2E5B}',
+ '\u{2E5C}',
+ '\u{2E5D}',
+ '\u{3001}',
+ '\u{3002}',
+ '\u{3003}',
+ '\u{3008}',
+ '\u{3009}',
+ '\u{300A}',
+ '\u{300B}',
+ '\u{300C}',
+ '\u{300D}',
+ '\u{300E}',
+ '\u{300F}',
+ '\u{3010}',
+ '\u{3011}',
+ '\u{3014}',
+ '\u{3015}',
+ '\u{3016}',
+ '\u{3017}',
+ '\u{3018}',
+ '\u{3019}',
+ '\u{301A}',
+ '\u{301B}',
+ '\u{301C}',
+ '\u{301D}',
+ '\u{301E}',
+ '\u{301F}',
+ '\u{3030}',
+ '\u{303D}',
+ '\u{30A0}',
+ '\u{30FB}',
+ '\u{A4FE}',
+ '\u{A4FF}',
+ '\u{A60D}',
+ '\u{A60E}',
+ '\u{A60F}',
+ '\u{A673}',
+ '\u{A67E}',
+ '\u{A6F2}',
+ '\u{A6F3}',
+ '\u{A6F4}',
+ '\u{A6F5}',
+ '\u{A6F6}',
+ '\u{A6F7}',
+ '\u{A874}',
+ '\u{A875}',
+ '\u{A876}',
+ '\u{A877}',
+ '\u{A8CE}',
+ '\u{A8CF}',
+ '\u{A8F8}',
+ '\u{A8F9}',
+ '\u{A8FA}',
+ '\u{A8FC}',
+ '\u{A92E}',
+ '\u{A92F}',
+ '\u{A95F}',
+ '\u{A9C1}',
+ '\u{A9C2}',
+ '\u{A9C3}',
+ '\u{A9C4}',
+ '\u{A9C5}',
+ '\u{A9C6}',
+ '\u{A9C7}',
+ '\u{A9C8}',
+ '\u{A9C9}',
+ '\u{A9CA}',
+ '\u{A9CB}',
+ '\u{A9CC}',
+ '\u{A9CD}',
+ '\u{A9DE}',
+ '\u{A9DF}',
+ '\u{AA5C}',
+ '\u{AA5D}',
+ '\u{AA5E}',
+ '\u{AA5F}',
+ '\u{AADE}',
+ '\u{AADF}',
+ '\u{AAF0}',
+ '\u{AAF1}',
+ '\u{ABEB}',
+ '\u{FD3E}',
+ '\u{FD3F}',
+ '\u{FE10}',
+ '\u{FE11}',
+ '\u{FE12}',
+ '\u{FE13}',
+ '\u{FE14}',
+ '\u{FE15}',
+ '\u{FE16}',
+ '\u{FE17}',
+ '\u{FE18}',
+ '\u{FE19}',
+ '\u{FE30}',
+ '\u{FE31}',
+ '\u{FE32}',
+ '\u{FE33}',
+ '\u{FE34}',
+ '\u{FE35}',
+ '\u{FE36}',
+ '\u{FE37}',
+ '\u{FE38}',
+ '\u{FE39}',
+ '\u{FE3A}',
+ '\u{FE3B}',
+ '\u{FE3C}',
+ '\u{FE3D}',
+ '\u{FE3E}',
+ '\u{FE3F}',
+ '\u{FE40}',
+ '\u{FE41}',
+ '\u{FE42}',
+ '\u{FE43}',
+ '\u{FE44}',
+ '\u{FE45}',
+ '\u{FE46}',
+ '\u{FE47}',
+ '\u{FE48}',
+ '\u{FE49}',
+ '\u{FE4A}',
+ '\u{FE4B}',
+ '\u{FE4C}',
+ '\u{FE4D}',
+ '\u{FE4E}',
+ '\u{FE4F}',
+ '\u{FE50}',
+ '\u{FE51}',
+ '\u{FE52}',
+ '\u{FE54}',
+ '\u{FE55}',
+ '\u{FE56}',
+ '\u{FE57}',
+ '\u{FE58}',
+ '\u{FE59}',
+ '\u{FE5A}',
+ '\u{FE5B}',
+ '\u{FE5C}',
+ '\u{FE5D}',
+ '\u{FE5E}',
+ '\u{FE5F}',
+ '\u{FE60}',
+ '\u{FE61}',
+ '\u{FE63}',
+ '\u{FE68}',
+ '\u{FE6A}',
+ '\u{FE6B}',
+ '\u{FF01}',
+ '\u{FF02}',
+ '\u{FF03}',
+ '\u{FF05}',
+ '\u{FF06}',
+ '\u{FF07}',
+ '\u{FF08}',
+ '\u{FF09}',
+ '\u{FF0A}',
+ '\u{FF0C}',
+ '\u{FF0D}',
+ '\u{FF0E}',
+ '\u{FF0F}',
+ '\u{FF1A}',
+ '\u{FF1B}',
+ '\u{FF1F}',
+ '\u{FF20}',
+ '\u{FF3B}',
+ '\u{FF3C}',
+ '\u{FF3D}',
+ '\u{FF3F}',
+ '\u{FF5B}',
+ '\u{FF5D}',
+ '\u{FF5F}',
+ '\u{FF60}',
+ '\u{FF61}',
+ '\u{FF62}',
+ '\u{FF63}',
+ '\u{FF64}',
+ '\u{FF65}',
+ '\u{10100}',
+ '\u{10101}',
+ '\u{10102}',
+ '\u{1039F}',
+ '\u{103D0}',
+ '\u{1056F}',
+ '\u{10857}',
+ '\u{1091F}',
+ '\u{1093F}',
+ '\u{10A50}',
+ '\u{10A51}',
+ '\u{10A52}',
+ '\u{10A53}',
+ '\u{10A54}',
+ '\u{10A55}',
+ '\u{10A56}',
+ '\u{10A57}',
+ '\u{10A58}',
+ '\u{10A7F}',
+ '\u{10AF0}',
+ '\u{10AF1}',
+ '\u{10AF2}',
+ '\u{10AF3}',
+ '\u{10AF4}',
+ '\u{10AF5}',
+ '\u{10AF6}',
+ '\u{10B39}',
+ '\u{10B3A}',
+ '\u{10B3B}',
+ '\u{10B3C}',
+ '\u{10B3D}',
+ '\u{10B3E}',
+ '\u{10B3F}',
+ '\u{10B99}',
+ '\u{10B9A}',
+ '\u{10B9B}',
+ '\u{10B9C}',
+ '\u{10EAD}',
+ '\u{10F55}',
+ '\u{10F56}',
+ '\u{10F57}',
+ '\u{10F58}',
+ '\u{10F59}',
+ '\u{10F86}',
+ '\u{10F87}',
+ '\u{10F88}',
+ '\u{10F89}',
+ '\u{11047}',
+ '\u{11048}',
+ '\u{11049}',
+ '\u{1104A}',
+ '\u{1104B}',
+ '\u{1104C}',
+ '\u{1104D}',
+ '\u{110BB}',
+ '\u{110BC}',
+ '\u{110BE}',
+ '\u{110BF}',
+ '\u{110C0}',
+ '\u{110C1}',
+ '\u{11140}',
+ '\u{11141}',
+ '\u{11142}',
+ '\u{11143}',
+ '\u{11174}',
+ '\u{11175}',
+ '\u{111C5}',
+ '\u{111C6}',
+ '\u{111C7}',
+ '\u{111C8}',
+ '\u{111CD}',
+ '\u{111DB}',
+ '\u{111DD}',
+ '\u{111DE}',
+ '\u{111DF}',
+ '\u{11238}',
+ '\u{11239}',
+ '\u{1123A}',
+ '\u{1123B}',
+ '\u{1123C}',
+ '\u{1123D}',
+ '\u{112A9}',
+ '\u{1144B}',
+ '\u{1144C}',
+ '\u{1144D}',
+ '\u{1144E}',
+ '\u{1144F}',
+ '\u{1145A}',
+ '\u{1145B}',
+ '\u{1145D}',
+ '\u{114C6}',
+ '\u{115C1}',
+ '\u{115C2}',
+ '\u{115C3}',
+ '\u{115C4}',
+ '\u{115C5}',
+ '\u{115C6}',
+ '\u{115C7}',
+ '\u{115C8}',
+ '\u{115C9}',
+ '\u{115CA}',
+ '\u{115CB}',
+ '\u{115CC}',
+ '\u{115CD}',
+ '\u{115CE}',
+ '\u{115CF}',
+ '\u{115D0}',
+ '\u{115D1}',
+ '\u{115D2}',
+ '\u{115D3}',
+ '\u{115D4}',
+ '\u{115D5}',
+ '\u{115D6}',
+ '\u{115D7}',
+ '\u{11641}',
+ '\u{11642}',
+ '\u{11643}',
+ '\u{11660}',
+ '\u{11661}',
+ '\u{11662}',
+ '\u{11663}',
+ '\u{11664}',
+ '\u{11665}',
+ '\u{11666}',
+ '\u{11667}',
+ '\u{11668}',
+ '\u{11669}',
+ '\u{1166A}',
+ '\u{1166B}',
+ '\u{1166C}',
+ '\u{116B9}',
+ '\u{1173C}',
+ '\u{1173D}',
+ '\u{1173E}',
+ '\u{1183B}',
+ '\u{11944}',
+ '\u{11945}',
+ '\u{11946}',
+ '\u{119E2}',
+ '\u{11A3F}',
+ '\u{11A40}',
+ '\u{11A41}',
+ '\u{11A42}',
+ '\u{11A43}',
+ '\u{11A44}',
+ '\u{11A45}',
+ '\u{11A46}',
+ '\u{11A9A}',
+ '\u{11A9B}',
+ '\u{11A9C}',
+ '\u{11A9E}',
+ '\u{11A9F}',
+ '\u{11AA0}',
+ '\u{11AA1}',
+ '\u{11AA2}',
+ '\u{11C41}',
+ '\u{11C42}',
+ '\u{11C43}',
+ '\u{11C44}',
+ '\u{11C45}',
+ '\u{11C70}',
+ '\u{11C71}',
+ '\u{11EF7}',
+ '\u{11EF8}',
+ '\u{11FFF}',
+ '\u{12470}',
+ '\u{12471}',
+ '\u{12472}',
+ '\u{12473}',
+ '\u{12474}',
+ '\u{12FF1}',
+ '\u{12FF2}',
+ '\u{16A6E}',
+ '\u{16A6F}',
+ '\u{16AF5}',
+ '\u{16B37}',
+ '\u{16B38}',
+ '\u{16B39}',
+ '\u{16B3A}',
+ '\u{16B3B}',
+ '\u{16B44}',
+ '\u{16E97}',
+ '\u{16E98}',
+ '\u{16E99}',
+ '\u{16E9A}',
+ '\u{16FE2}',
+ '\u{1BC9F}',
+ '\u{1DA87}',
+ '\u{1DA88}',
+ '\u{1DA89}',
+ '\u{1DA8A}',
+ '\u{1DA8B}',
+ '\u{1E95E}',
+ '\u{1E95F}',
+];