package pdf // The standard 14 fonts' metrics, the built-in encodings, and the Adobe Glyph // List (ISO 32000-2, 9.6.2.2 and Annex D). // // A font dictionary is allowed to name Helvetica, Times, Courier, Symbol or // ZapfDingbats and then supply neither a font program nor a /Widths array: the // reader is expected to know the metrics already. Getting a width wrong here is // not a cosmetic problem -- every glyph after it on the line is displaced -- so // none of the numbers below were typed by hand. // // WHERE THE NUMBERS CAME FROM // // Widths the Adobe Core 14 AFM files (Adobe Systems, 1997, AFM 4.1), // taken verbatim from their redistribution in Apache PDFBox. // Cross-checked glyph by glyph against two independent sources: // reportlab's built-in width tables (0 differences over the 229 // glyphs it carries) and the URW++ metric-compatible AFMs shipped // with Ghostscript (0 differences for Courier, Symbol and // ZapfDingbats; the handful for Helvetica and Times -- fraction, // summation, Delta, lessequal, greaterequal, lozenge, dcaron, // lcaron -- are URW drawing those glyphs differently, and Adobe's // value is the one PDF means). // Encodings ISO 32000-2 Annex D, via reportlab's tables, checked against // pdf.js's encodings.js and, for StandardEncoding and the two // built-in symbol encodings, against the C column of the AFMs // themselves. // Glyph names Adobe Glyph List 2.0 (glyphlist.txt), Adobe Glyph List For New // Fonts 1.7 (aglfn.txt, used for the Unicode -> name direction) // and Adobe's zapfdingbats.txt. // // All fourteen are 1000 units per em, so a width here is already in the glyph // space the rest of the font code expects. // --------------------------------------------------------------------------- // The fourteen fonts // --------------------------------------------------------------------------- // Indices into the metric tables, and what std_font_lookup returns. The order // within a family is regular, bold, italic, bold-italic, so a style can be // added to a family's base index. @(private) STD_COURIER :: 0 @(private) STD_COURIER_BOLD :: 1 @(private) STD_COURIER_OBLIQUE :: 2 @(private) STD_COURIER_BOLD_OBLIQUE :: 3 @(private) STD_HELVETICA :: 4 @(private) STD_HELVETICA_BOLD :: 5 @(private) STD_HELVETICA_OBLIQUE :: 6 @(private) STD_HELVETICA_BOLD_OBLIQUE :: 7 @(private) STD_TIMES_ROMAN :: 8 @(private) STD_TIMES_BOLD :: 9 @(private) STD_TIMES_ITALIC :: 10 @(private) STD_TIMES_BOLD_ITALIC :: 11 @(private) STD_SYMBOL :: 12 @(private) STD_ZAPF_DINGBATS :: 13 @(private) STD_FONT_COUNT :: 14 // The canonical PostScript name of each, in index order. @(private, rodata) STD_FONT_NAMES := [STD_FONT_COUNT]string{ "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique", "Helvetica", "Helvetica-Bold", "Helvetica-Oblique", "Helvetica-BoldOblique", "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic", "Symbol", "ZapfDingbats", } // --------------------------------------------------------------------------- // Tables, generated mechanically from the sources named at the top of this file // -- the AFMs, glyphlist.txt, aglfn.txt and zapfdingbats.txt -- so that no // number below was typed by a person. Do not hand-edit one: correct the source // and regenerate, or the next regeneration silently undoes the fix. // --------------------------------------------------------------------------- // The 315 glyph names Adobe's AFMs give for every one of the twelve text // fonts. All twelve carry exactly this set, so one sorted name table serves // them all and a width lookup is a binary search over it. @(private, rodata) STD_TEXT_GLYPHS := [315]string{ "A", "AE", "Aacute", "Abreve", "Acircumflex", "Adieresis", "Agrave", "Amacron", "Aogonek", "Aring", "Atilde", "B", "C", "Cacute", "Ccaron", "Ccedilla", "D", "Dcaron", "Dcroat", "Delta", "E", "Eacute", "Ecaron", "Ecircumflex", "Edieresis", "Edotaccent", "Egrave", "Emacron", "Eogonek", "Eth", "Euro", "F", "G", "Gbreve", "Gcommaaccent", "H", "I", "Iacute", "Icircumflex", "Idieresis", "Idotaccent", "Igrave", "Imacron", "Iogonek", "J", "K", "Kcommaaccent", "L", "Lacute", "Lcaron", "Lcommaaccent", "Lslash", "M", "N", "Nacute", "Ncaron", "Ncommaaccent", "Ntilde", "O", "OE", "Oacute", "Ocircumflex", "Odieresis", "Ograve", "Ohungarumlaut", "Omacron", "Oslash", "Otilde", "P", "Q", "R", "Racute", "Rcaron", "Rcommaaccent", "S", "Sacute", "Scaron", "Scedilla", "Scommaaccent", "T", "Tcaron", "Tcommaaccent", "Thorn", "U", "Uacute", "Ucircumflex", "Udieresis", "Ugrave", "Uhungarumlaut", "Umacron", "Uogonek", "Uring", "V", "W", "X", "Y", "Yacute", "Ydieresis", "Z", "Zacute", "Zcaron", "Zdotaccent", "a", "aacute", "abreve", "acircumflex", "acute", "adieresis", "ae", "agrave", "amacron", "ampersand", "aogonek", "aring", "asciicircum", "asciitilde", "asterisk", "at", "atilde", "b", "backslash", "bar", "braceleft", "braceright", "bracketleft", "bracketright", "breve", "brokenbar", "bullet", "c", "cacute", "caron", "ccaron", "ccedilla", "cedilla", "cent", "circumflex", "colon", "comma", "commaaccent", "copyright", "currency", "d", "dagger", "daggerdbl", "dcaron", "dcroat", "degree", "dieresis", "divide", "dollar", "dotaccent", "dotlessi", "e", "eacute", "ecaron", "ecircumflex", "edieresis", "edotaccent", "egrave", "eight", "ellipsis", "emacron", "emdash", "endash", "eogonek", "equal", "eth", "exclam", "exclamdown", "f", "fi", "five", "fl", "florin", "four", "fraction", "g", "gbreve", "gcommaaccent", "germandbls", "grave", "greater", "greaterequal", "guillemotleft", "guillemotright", "guilsinglleft", "guilsinglright", "h", "hungarumlaut", "hyphen", "i", "iacute", "icircumflex", "idieresis", "igrave", "imacron", "iogonek", "j", "k", "kcommaaccent", "l", "lacute", "lcaron", "lcommaaccent", "less", "lessequal", "logicalnot", "lozenge", "lslash", "m", "macron", "minus", "mu", "multiply", "n", "nacute", "ncaron", "ncommaaccent", "nine", "notequal", "ntilde", "numbersign", "o", "oacute", "ocircumflex", "odieresis", "oe", "ogonek", "ograve", "ohungarumlaut", "omacron", "one", "onehalf", "onequarter", "onesuperior", "ordfeminine", "ordmasculine", "oslash", "otilde", "p", "paragraph", "parenleft", "parenright", "partialdiff", "percent", "period", "periodcentered", "perthousand", "plus", "plusminus", "q", "question", "questiondown", "quotedbl", "quotedblbase", "quotedblleft", "quotedblright", "quoteleft", "quoteright", "quotesinglbase", "quotesingle", "r", "racute", "radical", "rcaron", "rcommaaccent", "registered", "ring", "s", "sacute", "scaron", "scedilla", "scommaaccent", "section", "semicolon", "seven", "six", "slash", "space", "sterling", "summation", "t", "tcaron", "tcommaaccent", "thorn", "three", "threequarters", "threesuperior", "tilde", "trademark", "two", "twosuperior", "u", "uacute", "ucircumflex", "udieresis", "ugrave", "uhungarumlaut", "umacron", "underscore", "uogonek", "uring", "v", "w", "x", "y", "yacute", "ydieresis", "yen", "z", "zacute", "zcaron", "zdotaccent", "zero", } // Widths in glyph space (1/1000 em) for the eight proportional fonts, // parallel to STD_TEXT_GLYPHS. Courier is not here: all four of its faces // are 600 for every glyph, which is what std_font_width returns directly. @(private, rodata) STD_TEXT_WIDTHS := [8][315]u16{ { // Helvetica 667, 1000, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 722, 722, 722, 722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 556, 611, 778, 778, 778, 722, 278, 278, 278, 278, 278, 278, 278, 278, 500, 667, 667, 556, 556, 556, 556, 556, 833, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778, 778, 778, 778, 778, 667, 778, 722, 722, 722, 722, 667, 667, 667, 667, 667, 611, 611, 611, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 944, 667, 667, 667, 667, 611, 611, 611, 611, 556, 556, 556, 556, 333, 556, 889, 556, 556, 667, 556, 556, 469, 584, 389, 1015, 556, 556, 278, 260, 334, 334, 278, 278, 333, 260, 350, 500, 500, 333, 500, 500, 333, 556, 333, 278, 278, 250, 737, 556, 556, 556, 556, 643, 556, 400, 333, 584, 556, 333, 278, 556, 556, 556, 556, 556, 556, 556, 556, 1000, 556, 1000, 556, 556, 584, 556, 278, 333, 278, 500, 556, 500, 556, 556, 167, 556, 556, 556, 611, 333, 584, 549, 556, 556, 333, 333, 556, 333, 333, 222, 278, 278, 278, 278, 278, 222, 222, 500, 500, 222, 222, 299, 222, 584, 549, 584, 471, 222, 833, 333, 584, 556, 584, 556, 556, 556, 556, 556, 549, 556, 556, 556, 556, 556, 556, 944, 333, 556, 556, 556, 556, 834, 834, 333, 370, 365, 611, 556, 556, 537, 333, 333, 476, 889, 278, 278, 1000, 584, 584, 556, 556, 611, 355, 333, 333, 333, 222, 222, 222, 191, 333, 333, 453, 333, 333, 737, 333, 500, 500, 500, 500, 500, 556, 278, 556, 556, 278, 278, 556, 600, 278, 317, 278, 556, 556, 834, 333, 333, 1000, 556, 333, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 500, 722, 500, 500, 500, 500, 556, 500, 500, 500, 500, 556, }, { // Helvetica-Bold 722, 1000, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 556, 611, 778, 778, 778, 722, 278, 278, 278, 278, 278, 278, 278, 278, 556, 722, 722, 611, 611, 611, 611, 611, 833, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778, 778, 778, 778, 778, 667, 778, 722, 722, 722, 722, 667, 667, 667, 667, 667, 611, 611, 611, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 944, 667, 667, 667, 667, 611, 611, 611, 611, 556, 556, 556, 556, 333, 556, 889, 556, 556, 722, 556, 556, 584, 584, 389, 975, 556, 611, 278, 280, 389, 389, 333, 333, 333, 280, 350, 556, 556, 333, 556, 556, 333, 556, 333, 333, 278, 250, 737, 556, 611, 556, 556, 743, 611, 400, 333, 584, 556, 333, 278, 556, 556, 556, 556, 556, 556, 556, 556, 1000, 556, 1000, 556, 556, 584, 611, 333, 333, 333, 611, 556, 611, 556, 556, 167, 611, 611, 611, 611, 333, 584, 549, 556, 556, 333, 333, 611, 333, 333, 278, 278, 278, 278, 278, 278, 278, 278, 556, 556, 278, 278, 400, 278, 584, 549, 584, 494, 278, 889, 333, 584, 611, 584, 611, 611, 611, 611, 556, 549, 611, 556, 611, 611, 611, 611, 944, 333, 611, 611, 611, 556, 834, 834, 333, 370, 365, 611, 611, 611, 556, 333, 333, 494, 889, 278, 278, 1000, 584, 584, 611, 611, 611, 474, 500, 500, 500, 278, 278, 278, 238, 389, 389, 549, 389, 389, 737, 333, 556, 556, 556, 556, 556, 556, 333, 556, 556, 278, 278, 556, 600, 333, 389, 333, 611, 556, 834, 333, 333, 1000, 556, 333, 611, 611, 611, 611, 611, 611, 611, 556, 611, 611, 556, 778, 556, 556, 556, 556, 556, 500, 500, 500, 500, 556, }, { // Helvetica-Oblique 667, 1000, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 722, 722, 722, 722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 556, 611, 778, 778, 778, 722, 278, 278, 278, 278, 278, 278, 278, 278, 500, 667, 667, 556, 556, 556, 556, 556, 833, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778, 778, 778, 778, 778, 667, 778, 722, 722, 722, 722, 667, 667, 667, 667, 667, 611, 611, 611, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 944, 667, 667, 667, 667, 611, 611, 611, 611, 556, 556, 556, 556, 333, 556, 889, 556, 556, 667, 556, 556, 469, 584, 389, 1015, 556, 556, 278, 260, 334, 334, 278, 278, 333, 260, 350, 500, 500, 333, 500, 500, 333, 556, 333, 278, 278, 250, 737, 556, 556, 556, 556, 643, 556, 400, 333, 584, 556, 333, 278, 556, 556, 556, 556, 556, 556, 556, 556, 1000, 556, 1000, 556, 556, 584, 556, 278, 333, 278, 500, 556, 500, 556, 556, 167, 556, 556, 556, 611, 333, 584, 549, 556, 556, 333, 333, 556, 333, 333, 222, 278, 278, 278, 278, 278, 222, 222, 500, 500, 222, 222, 299, 222, 584, 549, 584, 471, 222, 833, 333, 584, 556, 584, 556, 556, 556, 556, 556, 549, 556, 556, 556, 556, 556, 556, 944, 333, 556, 556, 556, 556, 834, 834, 333, 370, 365, 611, 556, 556, 537, 333, 333, 476, 889, 278, 278, 1000, 584, 584, 556, 556, 611, 355, 333, 333, 333, 222, 222, 222, 191, 333, 333, 453, 333, 333, 737, 333, 500, 500, 500, 500, 500, 556, 278, 556, 556, 278, 278, 556, 600, 278, 317, 278, 556, 556, 834, 333, 333, 1000, 556, 333, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 500, 722, 500, 500, 500, 500, 556, 500, 500, 500, 500, 556, }, { // Helvetica-BoldOblique 722, 1000, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 556, 611, 778, 778, 778, 722, 278, 278, 278, 278, 278, 278, 278, 278, 556, 722, 722, 611, 611, 611, 611, 611, 833, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778, 778, 778, 778, 778, 667, 778, 722, 722, 722, 722, 667, 667, 667, 667, 667, 611, 611, 611, 667, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 944, 667, 667, 667, 667, 611, 611, 611, 611, 556, 556, 556, 556, 333, 556, 889, 556, 556, 722, 556, 556, 584, 584, 389, 975, 556, 611, 278, 280, 389, 389, 333, 333, 333, 280, 350, 556, 556, 333, 556, 556, 333, 556, 333, 333, 278, 250, 737, 556, 611, 556, 556, 743, 611, 400, 333, 584, 556, 333, 278, 556, 556, 556, 556, 556, 556, 556, 556, 1000, 556, 1000, 556, 556, 584, 611, 333, 333, 333, 611, 556, 611, 556, 556, 167, 611, 611, 611, 611, 333, 584, 549, 556, 556, 333, 333, 611, 333, 333, 278, 278, 278, 278, 278, 278, 278, 278, 556, 556, 278, 278, 400, 278, 584, 549, 584, 494, 278, 889, 333, 584, 611, 584, 611, 611, 611, 611, 556, 549, 611, 556, 611, 611, 611, 611, 944, 333, 611, 611, 611, 556, 834, 834, 333, 370, 365, 611, 611, 611, 556, 333, 333, 494, 889, 278, 278, 1000, 584, 584, 611, 611, 611, 474, 500, 500, 500, 278, 278, 278, 238, 389, 389, 549, 389, 389, 737, 333, 556, 556, 556, 556, 556, 556, 333, 556, 556, 278, 278, 556, 600, 333, 389, 333, 611, 556, 834, 333, 333, 1000, 556, 333, 611, 611, 611, 611, 611, 611, 611, 556, 611, 611, 556, 778, 556, 556, 556, 556, 556, 500, 500, 500, 500, 556, }, { // Times-Roman 722, 889, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 667, 667, 667, 667, 722, 722, 722, 612, 611, 611, 611, 611, 611, 611, 611, 611, 611, 722, 500, 556, 722, 722, 722, 722, 333, 333, 333, 333, 333, 333, 333, 333, 389, 722, 722, 611, 611, 611, 611, 611, 889, 722, 722, 722, 722, 722, 722, 889, 722, 722, 722, 722, 722, 722, 722, 722, 556, 722, 667, 667, 667, 667, 556, 556, 556, 556, 556, 611, 611, 611, 556, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 944, 722, 722, 722, 722, 611, 611, 611, 611, 444, 444, 444, 444, 333, 444, 667, 444, 444, 778, 444, 444, 469, 541, 500, 921, 444, 500, 278, 200, 480, 480, 333, 333, 333, 200, 350, 444, 444, 333, 444, 444, 333, 500, 333, 278, 250, 250, 760, 500, 500, 500, 500, 588, 500, 400, 333, 564, 500, 333, 278, 444, 444, 444, 444, 444, 444, 444, 500, 1000, 444, 1000, 500, 444, 564, 500, 333, 333, 333, 556, 500, 556, 500, 500, 167, 500, 500, 500, 500, 333, 564, 549, 500, 500, 333, 333, 500, 333, 333, 278, 278, 278, 278, 278, 278, 278, 278, 500, 500, 278, 278, 344, 278, 564, 549, 564, 471, 278, 778, 333, 564, 500, 564, 500, 500, 500, 500, 500, 549, 500, 500, 500, 500, 500, 500, 722, 333, 500, 500, 500, 500, 750, 750, 300, 276, 310, 500, 500, 500, 453, 333, 333, 476, 833, 250, 250, 1000, 564, 564, 500, 444, 444, 408, 444, 444, 444, 333, 333, 333, 180, 333, 333, 453, 333, 333, 760, 333, 389, 389, 389, 389, 389, 500, 278, 500, 500, 278, 250, 500, 600, 278, 326, 278, 500, 500, 750, 300, 333, 980, 500, 300, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 722, 500, 500, 500, 500, 500, 444, 444, 444, 444, 500, }, { // Times-Bold 722, 1000, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 722, 722, 722, 722, 722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 500, 611, 778, 778, 778, 778, 389, 389, 389, 389, 389, 389, 389, 389, 500, 778, 778, 667, 667, 667, 667, 667, 944, 722, 722, 722, 722, 722, 778, 1000, 778, 778, 778, 778, 778, 778, 778, 778, 611, 778, 722, 722, 722, 722, 556, 556, 556, 556, 556, 667, 667, 667, 611, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 1000, 722, 722, 722, 722, 667, 667, 667, 667, 500, 500, 500, 500, 333, 500, 722, 500, 500, 833, 500, 500, 581, 520, 500, 930, 500, 556, 278, 220, 394, 394, 333, 333, 333, 220, 350, 444, 444, 333, 444, 444, 333, 500, 333, 333, 250, 250, 747, 500, 556, 500, 500, 672, 556, 400, 333, 570, 500, 333, 278, 444, 444, 444, 444, 444, 444, 444, 500, 1000, 444, 1000, 500, 444, 570, 500, 333, 333, 333, 556, 500, 556, 500, 500, 167, 500, 500, 500, 556, 333, 570, 549, 500, 500, 333, 333, 556, 333, 333, 278, 278, 278, 278, 278, 278, 278, 333, 556, 556, 278, 278, 394, 278, 570, 549, 570, 494, 278, 833, 333, 570, 556, 570, 556, 556, 556, 556, 500, 549, 556, 500, 500, 500, 500, 500, 722, 333, 500, 500, 500, 500, 750, 750, 300, 300, 330, 500, 500, 556, 540, 333, 333, 494, 1000, 250, 250, 1000, 570, 570, 556, 500, 500, 555, 500, 500, 500, 333, 333, 333, 278, 444, 444, 549, 444, 444, 747, 333, 389, 389, 389, 389, 389, 500, 333, 500, 500, 278, 250, 500, 600, 333, 416, 333, 556, 500, 750, 300, 333, 1000, 500, 300, 556, 556, 556, 556, 556, 556, 556, 500, 556, 556, 500, 722, 500, 500, 500, 500, 500, 444, 444, 444, 444, 500, }, { // Times-Italic 611, 889, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 667, 667, 667, 667, 722, 722, 722, 612, 611, 611, 611, 611, 611, 611, 611, 611, 611, 722, 500, 611, 722, 722, 722, 722, 333, 333, 333, 333, 333, 333, 333, 333, 444, 667, 667, 556, 556, 611, 556, 556, 833, 667, 667, 667, 667, 667, 722, 944, 722, 722, 722, 722, 722, 722, 722, 722, 611, 722, 611, 611, 611, 611, 500, 500, 500, 500, 500, 556, 556, 556, 611, 722, 722, 722, 722, 722, 722, 722, 722, 722, 611, 833, 611, 556, 556, 556, 556, 556, 556, 556, 500, 500, 500, 500, 333, 500, 667, 500, 500, 778, 500, 500, 422, 541, 500, 920, 500, 500, 278, 275, 400, 400, 389, 389, 333, 275, 350, 444, 444, 333, 444, 444, 333, 500, 333, 333, 250, 250, 760, 500, 500, 500, 500, 544, 500, 400, 333, 675, 500, 333, 278, 444, 444, 444, 444, 444, 444, 444, 500, 889, 444, 889, 500, 444, 675, 500, 333, 389, 278, 500, 500, 500, 500, 500, 167, 500, 500, 500, 500, 333, 675, 549, 500, 500, 333, 333, 500, 333, 333, 278, 278, 278, 278, 278, 278, 278, 278, 444, 444, 278, 278, 300, 278, 675, 549, 675, 471, 278, 722, 333, 675, 500, 675, 500, 500, 500, 500, 500, 549, 500, 500, 500, 500, 500, 500, 667, 333, 500, 500, 500, 500, 750, 750, 300, 276, 310, 500, 500, 500, 523, 333, 333, 476, 833, 250, 250, 1000, 675, 675, 500, 500, 500, 420, 556, 556, 556, 333, 333, 333, 214, 389, 389, 453, 389, 389, 760, 333, 389, 389, 389, 389, 389, 500, 333, 500, 500, 278, 250, 500, 600, 278, 300, 278, 500, 500, 750, 300, 333, 980, 500, 300, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 444, 667, 444, 444, 444, 444, 500, 389, 389, 389, 389, 500, }, { // Times-BoldItalic 667, 944, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 722, 722, 612, 667, 667, 667, 667, 667, 667, 667, 667, 667, 722, 500, 667, 722, 722, 722, 778, 389, 389, 389, 389, 389, 389, 389, 389, 500, 667, 667, 611, 611, 611, 611, 611, 889, 722, 722, 722, 722, 722, 722, 944, 722, 722, 722, 722, 722, 722, 722, 722, 611, 722, 667, 667, 667, 667, 556, 556, 556, 556, 556, 611, 611, 611, 611, 722, 722, 722, 722, 722, 722, 722, 722, 722, 667, 889, 667, 611, 611, 611, 611, 611, 611, 611, 500, 500, 500, 500, 333, 500, 722, 500, 500, 778, 500, 500, 570, 570, 500, 832, 500, 500, 278, 220, 348, 348, 333, 333, 333, 220, 350, 444, 444, 333, 444, 444, 333, 500, 333, 333, 250, 250, 747, 500, 500, 500, 500, 608, 500, 400, 333, 570, 500, 333, 278, 444, 444, 444, 444, 444, 444, 444, 500, 1000, 444, 1000, 500, 444, 570, 500, 389, 389, 333, 556, 500, 556, 500, 500, 167, 500, 500, 500, 500, 333, 570, 549, 500, 500, 333, 333, 556, 333, 333, 278, 278, 278, 278, 278, 278, 278, 278, 500, 500, 278, 278, 382, 278, 570, 549, 606, 494, 278, 778, 333, 606, 576, 570, 556, 556, 556, 556, 500, 549, 556, 500, 500, 500, 500, 500, 722, 333, 500, 500, 500, 500, 750, 750, 300, 266, 300, 500, 500, 500, 500, 333, 333, 494, 833, 250, 250, 1000, 570, 570, 500, 500, 500, 555, 500, 500, 500, 333, 333, 333, 278, 389, 389, 549, 389, 389, 747, 333, 389, 389, 389, 389, 389, 500, 333, 500, 500, 278, 250, 500, 600, 278, 366, 278, 500, 500, 750, 300, 333, 1000, 500, 300, 556, 556, 556, 556, 556, 556, 556, 500, 556, 556, 444, 667, 500, 444, 444, 444, 500, 389, 389, 389, 389, 500, }, } // Symbol.afm, sorted by glyph name. @(private, rodata) STD_SYMBOL_GLYPHS := [190]string{ "Alpha", "Beta", "Chi", "Delta", "Epsilon", "Eta", "Euro", "Gamma", "Ifraktur", "Iota", "Kappa", "Lambda", "Mu", "Nu", "Omega", "Omicron", "Phi", "Pi", "Psi", "Rfraktur", "Rho", "Sigma", "Tau", "Theta", "Upsilon", "Upsilon1", "Xi", "Zeta", "aleph", "alpha", "ampersand", "angle", "angleleft", "angleright", "apple", "approxequal", "arrowboth", "arrowdblboth", "arrowdbldown", "arrowdblleft", "arrowdblright", "arrowdblup", "arrowdown", "arrowhorizex", "arrowleft", "arrowright", "arrowup", "arrowvertex", "asteriskmath", "bar", "beta", "braceex", "braceleft", "braceleftbt", "braceleftmid", "bracelefttp", "braceright", "bracerightbt", "bracerightmid", "bracerighttp", "bracketleft", "bracketleftbt", "bracketleftex", "bracketlefttp", "bracketright", "bracketrightbt", "bracketrightex", "bracketrighttp", "bullet", "carriagereturn", "chi", "circlemultiply", "circleplus", "club", "colon", "comma", "congruent", "copyrightsans", "copyrightserif", "degree", "delta", "diamond", "divide", "dotmath", "eight", "element", "ellipsis", "emptyset", "epsilon", "equal", "equivalence", "eta", "exclam", "existential", "five", "florin", "four", "fraction", "gamma", "gradient", "greater", "greaterequal", "heart", "infinity", "integral", "integralbt", "integralex", "integraltp", "intersection", "iota", "kappa", "lambda", "less", "lessequal", "logicaland", "logicalnot", "logicalor", "lozenge", "minus", "minute", "mu", "multiply", "nine", "notelement", "notequal", "notsubset", "nu", "numbersign", "omega", "omega1", "omicron", "one", "parenleft", "parenleftbt", "parenleftex", "parenlefttp", "parenright", "parenrightbt", "parenrightex", "parenrighttp", "partialdiff", "percent", "period", "perpendicular", "phi", "phi1", "pi", "plus", "plusminus", "product", "propersubset", "propersuperset", "proportional", "psi", "question", "radical", "radicalex", "reflexsubset", "reflexsuperset", "registersans", "registerserif", "rho", "second", "semicolon", "seven", "sigma", "sigma1", "similar", "six", "slash", "space", "spade", "suchthat", "summation", "tau", "therefore", "theta", "theta1", "three", "trademarksans", "trademarkserif", "two", "underscore", "union", "universal", "upsilon", "weierstrass", "xi", "zero", "zeta", } @(private, rodata) STD_SYMBOL_WIDTHS := [190]u16{ 722, 667, 722, 612, 611, 722, 750, 603, 686, 333, 722, 686, 889, 722, 768, 722, 763, 768, 795, 795, 556, 592, 611, 741, 690, 620, 645, 611, 823, 631, 778, 768, 329, 329, 790, 549, 1042, 1042, 603, 987, 987, 603, 603, 1000, 987, 987, 603, 603, 500, 200, 549, 494, 480, 494, 494, 494, 480, 494, 494, 494, 333, 384, 384, 384, 333, 384, 384, 384, 460, 658, 549, 768, 768, 753, 278, 250, 549, 790, 790, 400, 494, 753, 549, 250, 500, 713, 1000, 823, 439, 549, 549, 603, 333, 549, 500, 500, 500, 167, 411, 713, 549, 549, 753, 713, 274, 686, 686, 686, 768, 329, 549, 549, 549, 549, 603, 713, 603, 494, 549, 247, 576, 549, 500, 713, 549, 713, 521, 500, 686, 713, 549, 500, 333, 384, 384, 384, 333, 384, 384, 384, 494, 833, 250, 658, 521, 603, 549, 549, 549, 823, 713, 713, 713, 686, 444, 549, 500, 713, 713, 790, 790, 549, 411, 278, 500, 603, 439, 549, 500, 278, 250, 753, 439, 713, 439, 863, 521, 631, 500, 786, 890, 500, 500, 768, 713, 576, 987, 493, 500, 494, } // ZapfDingbats.afm, sorted by glyph name. @(private, rodata) STD_ZAPF_GLYPHS := [202]string{ "a1", "a10", "a100", "a101", "a102", "a103", "a104", "a105", "a106", "a107", "a108", "a109", "a11", "a110", "a111", "a112", "a117", "a118", "a119", "a12", "a120", "a121", "a122", "a123", "a124", "a125", "a126", "a127", "a128", "a129", "a13", "a130", "a131", "a132", "a133", "a134", "a135", "a136", "a137", "a138", "a139", "a14", "a140", "a141", "a142", "a143", "a144", "a145", "a146", "a147", "a148", "a149", "a15", "a150", "a151", "a152", "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a16", "a160", "a161", "a162", "a163", "a164", "a165", "a166", "a167", "a168", "a169", "a17", "a170", "a171", "a172", "a173", "a174", "a175", "a176", "a177", "a178", "a179", "a18", "a180", "a181", "a182", "a183", "a184", "a185", "a186", "a187", "a188", "a189", "a19", "a190", "a191", "a192", "a193", "a194", "a195", "a196", "a197", "a198", "a199", "a2", "a20", "a200", "a201", "a202", "a203", "a204", "a205", "a206", "a21", "a22", "a23", "a24", "a25", "a26", "a27", "a28", "a29", "a3", "a30", "a31", "a32", "a33", "a34", "a35", "a36", "a37", "a38", "a39", "a4", "a40", "a41", "a42", "a43", "a44", "a45", "a46", "a47", "a48", "a49", "a5", "a50", "a51", "a52", "a53", "a54", "a55", "a56", "a57", "a58", "a59", "a6", "a60", "a61", "a62", "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a7", "a70", "a71", "a72", "a73", "a74", "a75", "a76", "a77", "a78", "a79", "a8", "a81", "a82", "a83", "a84", "a85", "a86", "a87", "a88", "a89", "a9", "a90", "a91", "a92", "a93", "a94", "a95", "a96", "a97", "a98", "a99", "space", } @(private, rodata) STD_ZAPF_WIDTHS := [202]u16{ 974, 692, 668, 732, 544, 544, 910, 911, 667, 760, 760, 626, 960, 694, 595, 776, 690, 791, 790, 939, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 549, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 855, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 911, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 933, 894, 838, 924, 1016, 458, 924, 918, 927, 928, 928, 945, 834, 873, 828, 924, 917, 930, 931, 463, 883, 836, 974, 867, 696, 874, 760, 946, 865, 967, 831, 873, 927, 755, 970, 918, 748, 836, 771, 888, 748, 771, 888, 867, 961, 846, 696, 874, 974, 762, 759, 509, 410, 762, 761, 571, 677, 763, 760, 759, 754, 786, 980, 788, 788, 790, 793, 794, 816, 823, 789, 841, 823, 719, 833, 816, 831, 923, 744, 723, 749, 790, 792, 695, 789, 776, 768, 792, 759, 707, 708, 682, 701, 826, 815, 494, 789, 789, 707, 687, 696, 689, 786, 787, 713, 791, 552, 785, 791, 873, 761, 762, 759, 892, 892, 788, 784, 537, 438, 138, 277, 415, 509, 410, 234, 234, 390, 577, 390, 276, 276, 317, 317, 334, 334, 392, 392, 668, 278, } // StandardEncoding (ISO 32000-2, Annex D.2). Note quoteright at 0x27 and // quotesingle at 0xA9 -- the reverse of WinAnsi, and the reason a document // that gets its /Encoding wrong shows curly apostrophes as straight ones. @(private, rodata) ENC_STANDARD := [256]string{ 32 = "space", 33 = "exclam", 34 = "quotedbl", 35 = "numbersign", 36 = "dollar", 37 = "percent", 38 = "ampersand", 39 = "quoteright", 40 = "parenleft", 41 = "parenright", 42 = "asterisk", 43 = "plus", 44 = "comma", 45 = "hyphen", 46 = "period", 47 = "slash", 48 = "zero", 49 = "one", 50 = "two", 51 = "three", 52 = "four", 53 = "five", 54 = "six", 55 = "seven", 56 = "eight", 57 = "nine", 58 = "colon", 59 = "semicolon", 60 = "less", 61 = "equal", 62 = "greater", 63 = "question", 64 = "at", 65 = "A", 66 = "B", 67 = "C", 68 = "D", 69 = "E", 70 = "F", 71 = "G", 72 = "H", 73 = "I", 74 = "J", 75 = "K", 76 = "L", 77 = "M", 78 = "N", 79 = "O", 80 = "P", 81 = "Q", 82 = "R", 83 = "S", 84 = "T", 85 = "U", 86 = "V", 87 = "W", 88 = "X", 89 = "Y", 90 = "Z", 91 = "bracketleft", 92 = "backslash", 93 = "bracketright", 94 = "asciicircum", 95 = "underscore", 96 = "quoteleft", 97 = "a", 98 = "b", 99 = "c", 100 = "d", 101 = "e", 102 = "f", 103 = "g", 104 = "h", 105 = "i", 106 = "j", 107 = "k", 108 = "l", 109 = "m", 110 = "n", 111 = "o", 112 = "p", 113 = "q", 114 = "r", 115 = "s", 116 = "t", 117 = "u", 118 = "v", 119 = "w", 120 = "x", 121 = "y", 122 = "z", 123 = "braceleft", 124 = "bar", 125 = "braceright", 126 = "asciitilde", 161 = "exclamdown", 162 = "cent", 163 = "sterling", 164 = "fraction", 165 = "yen", 166 = "florin", 167 = "section", 168 = "currency", 169 = "quotesingle", 170 = "quotedblleft", 171 = "guillemotleft", 172 = "guilsinglleft", 173 = "guilsinglright", 174 = "fi", 175 = "fl", 177 = "endash", 178 = "dagger", 179 = "daggerdbl", 180 = "periodcentered", 182 = "paragraph", 183 = "bullet", 184 = "quotesinglbase", 185 = "quotedblbase", 186 = "quotedblright", 187 = "guillemotright", 188 = "ellipsis", 189 = "perthousand", 191 = "questiondown", 193 = "grave", 194 = "acute", 195 = "circumflex", 196 = "tilde", 197 = "macron", 198 = "breve", 199 = "dotaccent", 200 = "dieresis", 202 = "ring", 203 = "cedilla", 205 = "hungarumlaut", 206 = "ogonek", 207 = "caron", 208 = "emdash", 225 = "AE", 227 = "ordfeminine", 232 = "Lslash", 233 = "Oslash", 234 = "OE", 235 = "ordmasculine", 241 = "ae", 245 = "dotlessi", 248 = "lslash", 249 = "oslash", 250 = "oe", 251 = "germandbls", } // WinAnsiEncoding (ISO 32000-2, Annex D.2). Latin-1 except for 0x80-0x9F, // which hold the CP1252 typographic characters; every code above 0x20 that // CP1252 leaves undefined maps to bullet, as the annex requires. 0xA0 is a // no-break space and 0xAD a soft hyphen, both drawn as their plain forms. @(private, rodata) ENC_WINANSI := [256]string{ 32 = "space", 33 = "exclam", 34 = "quotedbl", 35 = "numbersign", 36 = "dollar", 37 = "percent", 38 = "ampersand", 39 = "quotesingle", 40 = "parenleft", 41 = "parenright", 42 = "asterisk", 43 = "plus", 44 = "comma", 45 = "hyphen", 46 = "period", 47 = "slash", 48 = "zero", 49 = "one", 50 = "two", 51 = "three", 52 = "four", 53 = "five", 54 = "six", 55 = "seven", 56 = "eight", 57 = "nine", 58 = "colon", 59 = "semicolon", 60 = "less", 61 = "equal", 62 = "greater", 63 = "question", 64 = "at", 65 = "A", 66 = "B", 67 = "C", 68 = "D", 69 = "E", 70 = "F", 71 = "G", 72 = "H", 73 = "I", 74 = "J", 75 = "K", 76 = "L", 77 = "M", 78 = "N", 79 = "O", 80 = "P", 81 = "Q", 82 = "R", 83 = "S", 84 = "T", 85 = "U", 86 = "V", 87 = "W", 88 = "X", 89 = "Y", 90 = "Z", 91 = "bracketleft", 92 = "backslash", 93 = "bracketright", 94 = "asciicircum", 95 = "underscore", 96 = "grave", 97 = "a", 98 = "b", 99 = "c", 100 = "d", 101 = "e", 102 = "f", 103 = "g", 104 = "h", 105 = "i", 106 = "j", 107 = "k", 108 = "l", 109 = "m", 110 = "n", 111 = "o", 112 = "p", 113 = "q", 114 = "r", 115 = "s", 116 = "t", 117 = "u", 118 = "v", 119 = "w", 120 = "x", 121 = "y", 122 = "z", 123 = "braceleft", 124 = "bar", 125 = "braceright", 126 = "asciitilde", 127 = "bullet", 128 = "Euro", 129 = "bullet", 130 = "quotesinglbase", 131 = "florin", 132 = "quotedblbase", 133 = "ellipsis", 134 = "dagger", 135 = "daggerdbl", 136 = "circumflex", 137 = "perthousand", 138 = "Scaron", 139 = "guilsinglleft", 140 = "OE", 141 = "bullet", 142 = "Zcaron", 143 = "bullet", 144 = "bullet", 145 = "quoteleft", 146 = "quoteright", 147 = "quotedblleft", 148 = "quotedblright", 149 = "bullet", 150 = "endash", 151 = "emdash", 152 = "tilde", 153 = "trademark", 154 = "scaron", 155 = "guilsinglright", 156 = "oe", 157 = "bullet", 158 = "zcaron", 159 = "Ydieresis", 160 = "space", 161 = "exclamdown", 162 = "cent", 163 = "sterling", 164 = "currency", 165 = "yen", 166 = "brokenbar", 167 = "section", 168 = "dieresis", 169 = "copyright", 170 = "ordfeminine", 171 = "guillemotleft", 172 = "logicalnot", 173 = "hyphen", 174 = "registered", 175 = "macron", 176 = "degree", 177 = "plusminus", 178 = "twosuperior", 179 = "threesuperior", 180 = "acute", 181 = "mu", 182 = "paragraph", 183 = "periodcentered", 184 = "cedilla", 185 = "onesuperior", 186 = "ordmasculine", 187 = "guillemotright", 188 = "onequarter", 189 = "onehalf", 190 = "threequarters", 191 = "questiondown", 192 = "Agrave", 193 = "Aacute", 194 = "Acircumflex", 195 = "Atilde", 196 = "Adieresis", 197 = "Aring", 198 = "AE", 199 = "Ccedilla", 200 = "Egrave", 201 = "Eacute", 202 = "Ecircumflex", 203 = "Edieresis", 204 = "Igrave", 205 = "Iacute", 206 = "Icircumflex", 207 = "Idieresis", 208 = "Eth", 209 = "Ntilde", 210 = "Ograve", 211 = "Oacute", 212 = "Ocircumflex", 213 = "Otilde", 214 = "Odieresis", 215 = "multiply", 216 = "Oslash", 217 = "Ugrave", 218 = "Uacute", 219 = "Ucircumflex", 220 = "Udieresis", 221 = "Yacute", 222 = "Thorn", 223 = "germandbls", 224 = "agrave", 225 = "aacute", 226 = "acircumflex", 227 = "atilde", 228 = "adieresis", 229 = "aring", 230 = "ae", 231 = "ccedilla", 232 = "egrave", 233 = "eacute", 234 = "ecircumflex", 235 = "edieresis", 236 = "igrave", 237 = "iacute", 238 = "icircumflex", 239 = "idieresis", 240 = "eth", 241 = "ntilde", 242 = "ograve", 243 = "oacute", 244 = "ocircumflex", 245 = "otilde", 246 = "odieresis", 247 = "divide", 248 = "oslash", 249 = "ugrave", 250 = "uacute", 251 = "ucircumflex", 252 = "udieresis", 253 = "yacute", 254 = "thorn", 255 = "ydieresis", } // MacRomanEncoding (ISO 32000-2, Annex D.2), plus the fifteen positions the // annex leaves blank but Mac OS Roman itself defines (0xAD notequal, 0xB0 // infinity, ... 0xF0 apple). Producers on the Mac emitted those codes, and // every other reader fills them in the same way; a blank there would drop a // character that the file plainly meant. @(private, rodata) ENC_MACROMAN := [256]string{ 32 = "space", 33 = "exclam", 34 = "quotedbl", 35 = "numbersign", 36 = "dollar", 37 = "percent", 38 = "ampersand", 39 = "quotesingle", 40 = "parenleft", 41 = "parenright", 42 = "asterisk", 43 = "plus", 44 = "comma", 45 = "hyphen", 46 = "period", 47 = "slash", 48 = "zero", 49 = "one", 50 = "two", 51 = "three", 52 = "four", 53 = "five", 54 = "six", 55 = "seven", 56 = "eight", 57 = "nine", 58 = "colon", 59 = "semicolon", 60 = "less", 61 = "equal", 62 = "greater", 63 = "question", 64 = "at", 65 = "A", 66 = "B", 67 = "C", 68 = "D", 69 = "E", 70 = "F", 71 = "G", 72 = "H", 73 = "I", 74 = "J", 75 = "K", 76 = "L", 77 = "M", 78 = "N", 79 = "O", 80 = "P", 81 = "Q", 82 = "R", 83 = "S", 84 = "T", 85 = "U", 86 = "V", 87 = "W", 88 = "X", 89 = "Y", 90 = "Z", 91 = "bracketleft", 92 = "backslash", 93 = "bracketright", 94 = "asciicircum", 95 = "underscore", 96 = "grave", 97 = "a", 98 = "b", 99 = "c", 100 = "d", 101 = "e", 102 = "f", 103 = "g", 104 = "h", 105 = "i", 106 = "j", 107 = "k", 108 = "l", 109 = "m", 110 = "n", 111 = "o", 112 = "p", 113 = "q", 114 = "r", 115 = "s", 116 = "t", 117 = "u", 118 = "v", 119 = "w", 120 = "x", 121 = "y", 122 = "z", 123 = "braceleft", 124 = "bar", 125 = "braceright", 126 = "asciitilde", 128 = "Adieresis", 129 = "Aring", 130 = "Ccedilla", 131 = "Eacute", 132 = "Ntilde", 133 = "Odieresis", 134 = "Udieresis", 135 = "aacute", 136 = "agrave", 137 = "acircumflex", 138 = "adieresis", 139 = "atilde", 140 = "aring", 141 = "ccedilla", 142 = "eacute", 143 = "egrave", 144 = "ecircumflex", 145 = "edieresis", 146 = "iacute", 147 = "igrave", 148 = "icircumflex", 149 = "idieresis", 150 = "ntilde", 151 = "oacute", 152 = "ograve", 153 = "ocircumflex", 154 = "odieresis", 155 = "otilde", 156 = "uacute", 157 = "ugrave", 158 = "ucircumflex", 159 = "udieresis", 160 = "dagger", 161 = "degree", 162 = "cent", 163 = "sterling", 164 = "section", 165 = "bullet", 166 = "paragraph", 167 = "germandbls", 168 = "registered", 169 = "copyright", 170 = "trademark", 171 = "acute", 172 = "dieresis", 173 = "notequal", 174 = "AE", 175 = "Oslash", 176 = "infinity", 177 = "plusminus", 178 = "lessequal", 179 = "greaterequal", 180 = "yen", 181 = "mu", 182 = "partialdiff", 183 = "summation", 184 = "product", 185 = "pi", 186 = "integral", 187 = "ordfeminine", 188 = "ordmasculine", 189 = "Omega", 190 = "ae", 191 = "oslash", 192 = "questiondown", 193 = "exclamdown", 194 = "logicalnot", 195 = "radical", 196 = "florin", 197 = "approxequal", 198 = "Delta", 199 = "guillemotleft", 200 = "guillemotright", 201 = "ellipsis", 202 = "space", 203 = "Agrave", 204 = "Atilde", 205 = "Otilde", 206 = "OE", 207 = "oe", 208 = "endash", 209 = "emdash", 210 = "quotedblleft", 211 = "quotedblright", 212 = "quoteleft", 213 = "quoteright", 214 = "divide", 215 = "lozenge", 216 = "ydieresis", 217 = "Ydieresis", 218 = "fraction", 219 = "currency", 220 = "guilsinglleft", 221 = "guilsinglright", 222 = "fi", 223 = "fl", 224 = "daggerdbl", 225 = "periodcentered", 226 = "quotesinglbase", 227 = "quotedblbase", 228 = "perthousand", 229 = "Acircumflex", 230 = "Ecircumflex", 231 = "Aacute", 232 = "Edieresis", 233 = "Egrave", 234 = "Iacute", 235 = "Icircumflex", 236 = "Idieresis", 237 = "Igrave", 238 = "Oacute", 239 = "Ocircumflex", 240 = "apple", 241 = "Ograve", 242 = "Uacute", 243 = "Ucircumflex", 244 = "Ugrave", 245 = "dotlessi", 246 = "circumflex", 247 = "tilde", 248 = "macron", 249 = "breve", 250 = "dotaccent", 251 = "ring", 252 = "cedilla", 253 = "hungarumlaut", 254 = "ogonek", 255 = "caron", } // MacExpertEncoding (ISO 32000-2, Annex D.4). None of the standard 14 fonts // contains these glyphs; it is here for embedded expert fonts. @(private, rodata) ENC_MACEXPERT := [256]string{ 32 = "space", 33 = "exclamsmall", 34 = "Hungarumlautsmall", 35 = "centoldstyle", 36 = "dollaroldstyle", 37 = "dollarsuperior", 38 = "ampersandsmall", 39 = "Acutesmall", 40 = "parenleftsuperior", 41 = "parenrightsuperior", 42 = "twodotenleader", 43 = "onedotenleader", 44 = "comma", 45 = "hyphen", 46 = "period", 47 = "fraction", 48 = "zerooldstyle", 49 = "oneoldstyle", 50 = "twooldstyle", 51 = "threeoldstyle", 52 = "fouroldstyle", 53 = "fiveoldstyle", 54 = "sixoldstyle", 55 = "sevenoldstyle", 56 = "eightoldstyle", 57 = "nineoldstyle", 58 = "colon", 59 = "semicolon", 61 = "threequartersemdash", 63 = "questionsmall", 68 = "Ethsmall", 71 = "onequarter", 72 = "onehalf", 73 = "threequarters", 74 = "oneeighth", 75 = "threeeighths", 76 = "fiveeighths", 77 = "seveneighths", 78 = "onethird", 79 = "twothirds", 86 = "ff", 87 = "fi", 88 = "fl", 89 = "ffi", 90 = "ffl", 91 = "parenleftinferior", 93 = "parenrightinferior", 94 = "Circumflexsmall", 95 = "hypheninferior", 96 = "Gravesmall", 97 = "Asmall", 98 = "Bsmall", 99 = "Csmall", 100 = "Dsmall", 101 = "Esmall", 102 = "Fsmall", 103 = "Gsmall", 104 = "Hsmall", 105 = "Ismall", 106 = "Jsmall", 107 = "Ksmall", 108 = "Lsmall", 109 = "Msmall", 110 = "Nsmall", 111 = "Osmall", 112 = "Psmall", 113 = "Qsmall", 114 = "Rsmall", 115 = "Ssmall", 116 = "Tsmall", 117 = "Usmall", 118 = "Vsmall", 119 = "Wsmall", 120 = "Xsmall", 121 = "Ysmall", 122 = "Zsmall", 123 = "colonmonetary", 124 = "onefitted", 125 = "rupiah", 126 = "Tildesmall", 129 = "asuperior", 130 = "centsuperior", 135 = "Aacutesmall", 136 = "Agravesmall", 137 = "Acircumflexsmall", 138 = "Adieresissmall", 139 = "Atildesmall", 140 = "Aringsmall", 141 = "Ccedillasmall", 142 = "Eacutesmall", 143 = "Egravesmall", 144 = "Ecircumflexsmall", 145 = "Edieresissmall", 146 = "Iacutesmall", 147 = "Igravesmall", 148 = "Icircumflexsmall", 149 = "Idieresissmall", 150 = "Ntildesmall", 151 = "Oacutesmall", 152 = "Ogravesmall", 153 = "Ocircumflexsmall", 154 = "Odieresissmall", 155 = "Otildesmall", 156 = "Uacutesmall", 157 = "Ugravesmall", 158 = "Ucircumflexsmall", 159 = "Udieresissmall", 161 = "eightsuperior", 162 = "fourinferior", 163 = "threeinferior", 164 = "sixinferior", 165 = "eightinferior", 166 = "seveninferior", 167 = "Scaronsmall", 169 = "centinferior", 170 = "twoinferior", 172 = "Dieresissmall", 174 = "Caronsmall", 175 = "osuperior", 176 = "fiveinferior", 178 = "commainferior", 179 = "periodinferior", 180 = "Yacutesmall", 182 = "dollarinferior", 185 = "Thornsmall", 187 = "nineinferior", 188 = "zeroinferior", 189 = "Zcaronsmall", 190 = "AEsmall", 191 = "Oslashsmall", 192 = "questiondownsmall", 193 = "oneinferior", 194 = "Lslashsmall", 201 = "Cedillasmall", 207 = "OEsmall", 208 = "figuredash", 209 = "hyphensuperior", 214 = "exclamdownsmall", 216 = "Ydieresissmall", 218 = "onesuperior", 219 = "twosuperior", 220 = "threesuperior", 221 = "foursuperior", 222 = "fivesuperior", 223 = "sixsuperior", 224 = "sevensuperior", 225 = "ninesuperior", 226 = "zerosuperior", 228 = "esuperior", 229 = "rsuperior", 230 = "tsuperior", 233 = "isuperior", 234 = "ssuperior", 235 = "dsuperior", 241 = "lsuperior", 242 = "Ogoneksmall", 243 = "Brevesmall", 244 = "Macronsmall", 245 = "bsuperior", 246 = "nsuperior", 247 = "msuperior", 248 = "commasuperior", 249 = "periodsuperior", 250 = "Dotaccentsmall", 251 = "Ringsmall", } // Symbol's built-in encoding, taken from the C column of Symbol.afm. @(private, rodata) ENC_SYMBOL := [256]string{ 32 = "space", 33 = "exclam", 34 = "universal", 35 = "numbersign", 36 = "existential", 37 = "percent", 38 = "ampersand", 39 = "suchthat", 40 = "parenleft", 41 = "parenright", 42 = "asteriskmath", 43 = "plus", 44 = "comma", 45 = "minus", 46 = "period", 47 = "slash", 48 = "zero", 49 = "one", 50 = "two", 51 = "three", 52 = "four", 53 = "five", 54 = "six", 55 = "seven", 56 = "eight", 57 = "nine", 58 = "colon", 59 = "semicolon", 60 = "less", 61 = "equal", 62 = "greater", 63 = "question", 64 = "congruent", 65 = "Alpha", 66 = "Beta", 67 = "Chi", 68 = "Delta", 69 = "Epsilon", 70 = "Phi", 71 = "Gamma", 72 = "Eta", 73 = "Iota", 74 = "theta1", 75 = "Kappa", 76 = "Lambda", 77 = "Mu", 78 = "Nu", 79 = "Omicron", 80 = "Pi", 81 = "Theta", 82 = "Rho", 83 = "Sigma", 84 = "Tau", 85 = "Upsilon", 86 = "sigma1", 87 = "Omega", 88 = "Xi", 89 = "Psi", 90 = "Zeta", 91 = "bracketleft", 92 = "therefore", 93 = "bracketright", 94 = "perpendicular", 95 = "underscore", 96 = "radicalex", 97 = "alpha", 98 = "beta", 99 = "chi", 100 = "delta", 101 = "epsilon", 102 = "phi", 103 = "gamma", 104 = "eta", 105 = "iota", 106 = "phi1", 107 = "kappa", 108 = "lambda", 109 = "mu", 110 = "nu", 111 = "omicron", 112 = "pi", 113 = "theta", 114 = "rho", 115 = "sigma", 116 = "tau", 117 = "upsilon", 118 = "omega1", 119 = "omega", 120 = "xi", 121 = "psi", 122 = "zeta", 123 = "braceleft", 124 = "bar", 125 = "braceright", 126 = "similar", 160 = "Euro", 161 = "Upsilon1", 162 = "minute", 163 = "lessequal", 164 = "fraction", 165 = "infinity", 166 = "florin", 167 = "club", 168 = "diamond", 169 = "heart", 170 = "spade", 171 = "arrowboth", 172 = "arrowleft", 173 = "arrowup", 174 = "arrowright", 175 = "arrowdown", 176 = "degree", 177 = "plusminus", 178 = "second", 179 = "greaterequal", 180 = "multiply", 181 = "proportional", 182 = "partialdiff", 183 = "bullet", 184 = "divide", 185 = "notequal", 186 = "equivalence", 187 = "approxequal", 188 = "ellipsis", 189 = "arrowvertex", 190 = "arrowhorizex", 191 = "carriagereturn", 192 = "aleph", 193 = "Ifraktur", 194 = "Rfraktur", 195 = "weierstrass", 196 = "circlemultiply", 197 = "circleplus", 198 = "emptyset", 199 = "intersection", 200 = "union", 201 = "propersuperset", 202 = "reflexsuperset", 203 = "notsubset", 204 = "propersubset", 205 = "reflexsubset", 206 = "element", 207 = "notelement", 208 = "angle", 209 = "gradient", 210 = "registerserif", 211 = "copyrightserif", 212 = "trademarkserif", 213 = "product", 214 = "radical", 215 = "dotmath", 216 = "logicalnot", 217 = "logicaland", 218 = "logicalor", 219 = "arrowdblboth", 220 = "arrowdblleft", 221 = "arrowdblup", 222 = "arrowdblright", 223 = "arrowdbldown", 224 = "lozenge", 225 = "angleleft", 226 = "registersans", 227 = "copyrightsans", 228 = "trademarksans", 229 = "summation", 230 = "parenlefttp", 231 = "parenleftex", 232 = "parenleftbt", 233 = "bracketlefttp", 234 = "bracketleftex", 235 = "bracketleftbt", 236 = "bracelefttp", 237 = "braceleftmid", 238 = "braceleftbt", 239 = "braceex", 241 = "angleright", 242 = "integral", 243 = "integraltp", 244 = "integralex", 245 = "integralbt", 246 = "parenrighttp", 247 = "parenrightex", 248 = "parenrightbt", 249 = "bracketrighttp", 250 = "bracketrightex", 251 = "bracketrightbt", 252 = "bracerighttp", 253 = "bracerightmid", 254 = "bracerightbt", } // ZapfDingbats' built-in encoding, from the C column of ZapfDingbats.afm. @(private, rodata) ENC_ZAPF := [256]string{ 32 = "space", 33 = "a1", 34 = "a2", 35 = "a202", 36 = "a3", 37 = "a4", 38 = "a5", 39 = "a119", 40 = "a118", 41 = "a117", 42 = "a11", 43 = "a12", 44 = "a13", 45 = "a14", 46 = "a15", 47 = "a16", 48 = "a105", 49 = "a17", 50 = "a18", 51 = "a19", 52 = "a20", 53 = "a21", 54 = "a22", 55 = "a23", 56 = "a24", 57 = "a25", 58 = "a26", 59 = "a27", 60 = "a28", 61 = "a6", 62 = "a7", 63 = "a8", 64 = "a9", 65 = "a10", 66 = "a29", 67 = "a30", 68 = "a31", 69 = "a32", 70 = "a33", 71 = "a34", 72 = "a35", 73 = "a36", 74 = "a37", 75 = "a38", 76 = "a39", 77 = "a40", 78 = "a41", 79 = "a42", 80 = "a43", 81 = "a44", 82 = "a45", 83 = "a46", 84 = "a47", 85 = "a48", 86 = "a49", 87 = "a50", 88 = "a51", 89 = "a52", 90 = "a53", 91 = "a54", 92 = "a55", 93 = "a56", 94 = "a57", 95 = "a58", 96 = "a59", 97 = "a60", 98 = "a61", 99 = "a62", 100 = "a63", 101 = "a64", 102 = "a65", 103 = "a66", 104 = "a67", 105 = "a68", 106 = "a69", 107 = "a70", 108 = "a71", 109 = "a72", 110 = "a73", 111 = "a74", 112 = "a203", 113 = "a75", 114 = "a204", 115 = "a76", 116 = "a77", 117 = "a78", 118 = "a79", 119 = "a81", 120 = "a82", 121 = "a83", 122 = "a84", 123 = "a97", 124 = "a98", 125 = "a99", 126 = "a100", 128 = "a89", 129 = "a90", 130 = "a93", 131 = "a94", 132 = "a91", 133 = "a92", 134 = "a205", 135 = "a85", 136 = "a206", 137 = "a86", 138 = "a87", 139 = "a88", 140 = "a95", 141 = "a96", 161 = "a101", 162 = "a102", 163 = "a103", 164 = "a104", 165 = "a106", 166 = "a107", 167 = "a108", 168 = "a112", 169 = "a111", 170 = "a110", 171 = "a109", 172 = "a120", 173 = "a121", 174 = "a122", 175 = "a123", 176 = "a124", 177 = "a125", 178 = "a126", 179 = "a127", 180 = "a128", 181 = "a129", 182 = "a130", 183 = "a131", 184 = "a132", 185 = "a133", 186 = "a134", 187 = "a135", 188 = "a136", 189 = "a137", 190 = "a138", 191 = "a139", 192 = "a140", 193 = "a141", 194 = "a142", 195 = "a143", 196 = "a144", 197 = "a145", 198 = "a146", 199 = "a147", 200 = "a148", 201 = "a149", 202 = "a150", 203 = "a151", 204 = "a152", 205 = "a153", 206 = "a154", 207 = "a155", 208 = "a156", 209 = "a157", 210 = "a158", 211 = "a159", 212 = "a160", 213 = "a161", 214 = "a163", 215 = "a164", 216 = "a196", 217 = "a165", 218 = "a192", 219 = "a166", 220 = "a167", 221 = "a168", 222 = "a169", 223 = "a170", 224 = "a171", 225 = "a172", 226 = "a173", 227 = "a162", 228 = "a174", 229 = "a175", 230 = "a176", 231 = "a177", 232 = "a178", 233 = "a179", 234 = "a193", 235 = "a180", 236 = "a199", 237 = "a181", 238 = "a200", 239 = "a182", 241 = "a201", 242 = "a183", 243 = "a184", 244 = "a197", 245 = "a185", 246 = "a194", 247 = "a198", 248 = "a186", 249 = "a195", 250 = "a187", 251 = "a188", 252 = "a189", 253 = "a190", 254 = "a191", } // The Adobe Glyph List, restricted to the ranges a PDF actually names: // Latin and its extensions, combining marks, Greek, Cyrillic, punctuation, // currency, arrows, mathematics, geometric shapes and dingbats, the private // use area AGL assigns to the expert glyphs, and the f-ligatures. Every name // used by the standard 14 fonts or by any built-in encoding is present // whatever its code point. Names standing for a sequence of code points keep // the first, since a glyph maps to one rune here. // // The 201 ZapfDingbats names (a1..a191) come from Adobe's separate // zapfdingbats.txt. The two lists share no name, so merging them cannot lose // anything, and it means dingbat text extracts without threading the font's // identity down to this table. @(private) Agl_Entry :: struct { name: string, cp: rune, } // Sorted by name. @(private, rodata) AGL_TABLE := [2435]Agl_Entry{ {"A", 0x0041}, {"AE", 0x00C6}, {"AEacute", 0x01FC}, {"AEmacron", 0x01E2}, {"AEsmall", 0xF7E6}, {"Aacute", 0x00C1}, {"Aacutesmall", 0xF7E1}, {"Abreve", 0x0102}, {"Abreveacute", 0x1EAE}, {"Abrevecyrillic", 0x04D0}, {"Abrevedotbelow", 0x1EB6}, {"Abrevegrave", 0x1EB0}, {"Abrevehookabove", 0x1EB2}, {"Abrevetilde", 0x1EB4}, {"Acaron", 0x01CD}, {"Acircle", 0x24B6}, {"Acircumflex", 0x00C2}, {"Acircumflexacute", 0x1EA4}, {"Acircumflexdotbelow", 0x1EAC}, {"Acircumflexgrave", 0x1EA6}, {"Acircumflexhookabove", 0x1EA8}, {"Acircumflexsmall", 0xF7E2}, {"Acircumflextilde", 0x1EAA}, {"Acute", 0xF6C9}, {"Acutesmall", 0xF7B4}, {"Acyrillic", 0x0410}, {"Adblgrave", 0x0200}, {"Adieresis", 0x00C4}, {"Adieresiscyrillic", 0x04D2}, {"Adieresismacron", 0x01DE}, {"Adieresissmall", 0xF7E4}, {"Adotbelow", 0x1EA0}, {"Adotmacron", 0x01E0}, {"Agrave", 0x00C0}, {"Agravesmall", 0xF7E0}, {"Ahookabove", 0x1EA2}, {"Aiecyrillic", 0x04D4}, {"Ainvertedbreve", 0x0202}, {"Alpha", 0x0391}, {"Alphatonos", 0x0386}, {"Amacron", 0x0100}, {"Aogonek", 0x0104}, {"Aring", 0x00C5}, {"Aringacute", 0x01FA}, {"Aringbelow", 0x1E00}, {"Aringsmall", 0xF7E5}, {"Asmall", 0xF761}, {"Atilde", 0x00C3}, {"Atildesmall", 0xF7E3}, {"B", 0x0042}, {"Bcircle", 0x24B7}, {"Bdotaccent", 0x1E02}, {"Bdotbelow", 0x1E04}, {"Becyrillic", 0x0411}, {"Beta", 0x0392}, {"Bhook", 0x0181}, {"Blinebelow", 0x1E06}, {"Brevesmall", 0xF6F4}, {"Bsmall", 0xF762}, {"Btopbar", 0x0182}, {"C", 0x0043}, {"Cacute", 0x0106}, {"Caron", 0xF6CA}, {"Caronsmall", 0xF6F5}, {"Ccaron", 0x010C}, {"Ccedilla", 0x00C7}, {"Ccedillaacute", 0x1E08}, {"Ccedillasmall", 0xF7E7}, {"Ccircle", 0x24B8}, {"Ccircumflex", 0x0108}, {"Cdot", 0x010A}, {"Cdotaccent", 0x010A}, {"Cedillasmall", 0xF7B8}, {"Cheabkhasiancyrillic", 0x04BC}, {"Checyrillic", 0x0427}, {"Chedescenderabkhasiancyrillic", 0x04BE}, {"Chedescendercyrillic", 0x04B6}, {"Chedieresiscyrillic", 0x04F4}, {"Chekhakassiancyrillic", 0x04CB}, {"Cheverticalstrokecyrillic", 0x04B8}, {"Chi", 0x03A7}, {"Chook", 0x0187}, {"Circumflexsmall", 0xF6F6}, {"Csmall", 0xF763}, {"D", 0x0044}, {"DZ", 0x01F1}, {"DZcaron", 0x01C4}, {"Dafrican", 0x0189}, {"Dcaron", 0x010E}, {"Dcedilla", 0x1E10}, {"Dcircle", 0x24B9}, {"Dcircumflexbelow", 0x1E12}, {"Dcroat", 0x0110}, {"Ddotaccent", 0x1E0A}, {"Ddotbelow", 0x1E0C}, {"Decyrillic", 0x0414}, {"Deicoptic", 0x03EE}, {"Delta", 0x2206}, {"Deltagreek", 0x0394}, {"Dhook", 0x018A}, {"Dieresis", 0xF6CB}, {"DieresisAcute", 0xF6CC}, {"DieresisGrave", 0xF6CD}, {"Dieresissmall", 0xF7A8}, {"Digammagreek", 0x03DC}, {"Djecyrillic", 0x0402}, {"Dlinebelow", 0x1E0E}, {"Dotaccentsmall", 0xF6F7}, {"Dslash", 0x0110}, {"Dsmall", 0xF764}, {"Dtopbar", 0x018B}, {"Dz", 0x01F2}, {"Dzcaron", 0x01C5}, {"Dzeabkhasiancyrillic", 0x04E0}, {"Dzecyrillic", 0x0405}, {"Dzhecyrillic", 0x040F}, {"E", 0x0045}, {"Eacute", 0x00C9}, {"Eacutesmall", 0xF7E9}, {"Ebreve", 0x0114}, {"Ecaron", 0x011A}, {"Ecedillabreve", 0x1E1C}, {"Ecircle", 0x24BA}, {"Ecircumflex", 0x00CA}, {"Ecircumflexacute", 0x1EBE}, {"Ecircumflexbelow", 0x1E18}, {"Ecircumflexdotbelow", 0x1EC6}, {"Ecircumflexgrave", 0x1EC0}, {"Ecircumflexhookabove", 0x1EC2}, {"Ecircumflexsmall", 0xF7EA}, {"Ecircumflextilde", 0x1EC4}, {"Ecyrillic", 0x0404}, {"Edblgrave", 0x0204}, {"Edieresis", 0x00CB}, {"Edieresissmall", 0xF7EB}, {"Edot", 0x0116}, {"Edotaccent", 0x0116}, {"Edotbelow", 0x1EB8}, {"Efcyrillic", 0x0424}, {"Egrave", 0x00C8}, {"Egravesmall", 0xF7E8}, {"Ehookabove", 0x1EBA}, {"Eightroman", 0x2167}, {"Einvertedbreve", 0x0206}, {"Eiotifiedcyrillic", 0x0464}, {"Elcyrillic", 0x041B}, {"Elevenroman", 0x216A}, {"Emacron", 0x0112}, {"Emacronacute", 0x1E16}, {"Emacrongrave", 0x1E14}, {"Emcyrillic", 0x041C}, {"Encyrillic", 0x041D}, {"Endescendercyrillic", 0x04A2}, {"Eng", 0x014A}, {"Enghecyrillic", 0x04A4}, {"Enhookcyrillic", 0x04C7}, {"Eogonek", 0x0118}, {"Eopen", 0x0190}, {"Epsilon", 0x0395}, {"Epsilontonos", 0x0388}, {"Ercyrillic", 0x0420}, {"Ereversed", 0x018E}, {"Ereversedcyrillic", 0x042D}, {"Escyrillic", 0x0421}, {"Esdescendercyrillic", 0x04AA}, {"Esh", 0x01A9}, {"Esmall", 0xF765}, {"Eta", 0x0397}, {"Etatonos", 0x0389}, {"Eth", 0x00D0}, {"Ethsmall", 0xF7F0}, {"Etilde", 0x1EBC}, {"Etildebelow", 0x1E1A}, {"Euro", 0x20AC}, {"Ezh", 0x01B7}, {"Ezhcaron", 0x01EE}, {"Ezhreversed", 0x01B8}, {"F", 0x0046}, {"Fcircle", 0x24BB}, {"Fdotaccent", 0x1E1E}, {"Feicoptic", 0x03E4}, {"Fhook", 0x0191}, {"Fitacyrillic", 0x0472}, {"Fiveroman", 0x2164}, {"Fourroman", 0x2163}, {"Fsmall", 0xF766}, {"G", 0x0047}, {"Gacute", 0x01F4}, {"Gamma", 0x0393}, {"Gammaafrican", 0x0194}, {"Gangiacoptic", 0x03EA}, {"Gbreve", 0x011E}, {"Gcaron", 0x01E6}, {"Gcedilla", 0x0122}, {"Gcircle", 0x24BC}, {"Gcircumflex", 0x011C}, {"Gcommaaccent", 0x0122}, {"Gdot", 0x0120}, {"Gdotaccent", 0x0120}, {"Gecyrillic", 0x0413}, {"Ghemiddlehookcyrillic", 0x0494}, {"Ghestrokecyrillic", 0x0492}, {"Gheupturncyrillic", 0x0490}, {"Ghook", 0x0193}, {"Gjecyrillic", 0x0403}, {"Gmacron", 0x1E20}, {"Grave", 0xF6CE}, {"Gravesmall", 0xF760}, {"Gsmall", 0xF767}, {"Gsmallhook", 0x029B}, {"Gstroke", 0x01E4}, {"H", 0x0048}, {"H18533", 0x25CF}, {"H18543", 0x25AA}, {"H18551", 0x25AB}, {"H22073", 0x25A1}, {"Haabkhasiancyrillic", 0x04A8}, {"Hadescendercyrillic", 0x04B2}, {"Hardsigncyrillic", 0x042A}, {"Hbar", 0x0126}, {"Hbrevebelow", 0x1E2A}, {"Hcedilla", 0x1E28}, {"Hcircle", 0x24BD}, {"Hcircumflex", 0x0124}, {"Hdieresis", 0x1E26}, {"Hdotaccent", 0x1E22}, {"Hdotbelow", 0x1E24}, {"Horicoptic", 0x03E8}, {"Hsmall", 0xF768}, {"Hungarumlaut", 0xF6CF}, {"Hungarumlautsmall", 0xF6F8}, {"I", 0x0049}, {"IAcyrillic", 0x042F}, {"IJ", 0x0132}, {"IUcyrillic", 0x042E}, {"Iacute", 0x00CD}, {"Iacutesmall", 0xF7ED}, {"Ibreve", 0x012C}, {"Icaron", 0x01CF}, {"Icircle", 0x24BE}, {"Icircumflex", 0x00CE}, {"Icircumflexsmall", 0xF7EE}, {"Icyrillic", 0x0406}, {"Idblgrave", 0x0208}, {"Idieresis", 0x00CF}, {"Idieresisacute", 0x1E2E}, {"Idieresiscyrillic", 0x04E4}, {"Idieresissmall", 0xF7EF}, {"Idot", 0x0130}, {"Idotaccent", 0x0130}, {"Idotbelow", 0x1ECA}, {"Iebrevecyrillic", 0x04D6}, {"Iecyrillic", 0x0415}, {"Ifraktur", 0x2111}, {"Igrave", 0x00CC}, {"Igravesmall", 0xF7EC}, {"Ihookabove", 0x1EC8}, {"Iicyrillic", 0x0418}, {"Iinvertedbreve", 0x020A}, {"Iishortcyrillic", 0x0419}, {"Imacron", 0x012A}, {"Imacroncyrillic", 0x04E2}, {"Iocyrillic", 0x0401}, {"Iogonek", 0x012E}, {"Iota", 0x0399}, {"Iotaafrican", 0x0196}, {"Iotadieresis", 0x03AA}, {"Iotatonos", 0x038A}, {"Ismall", 0xF769}, {"Istroke", 0x0197}, {"Itilde", 0x0128}, {"Itildebelow", 0x1E2C}, {"Izhitsacyrillic", 0x0474}, {"Izhitsadblgravecyrillic", 0x0476}, {"J", 0x004A}, {"Jcircle", 0x24BF}, {"Jcircumflex", 0x0134}, {"Jecyrillic", 0x0408}, {"Jsmall", 0xF76A}, {"K", 0x004B}, {"Kabashkircyrillic", 0x04A0}, {"Kacute", 0x1E30}, {"Kacyrillic", 0x041A}, {"Kadescendercyrillic", 0x049A}, {"Kahookcyrillic", 0x04C3}, {"Kappa", 0x039A}, {"Kastrokecyrillic", 0x049E}, {"Kaverticalstrokecyrillic", 0x049C}, {"Kcaron", 0x01E8}, {"Kcedilla", 0x0136}, {"Kcircle", 0x24C0}, {"Kcommaaccent", 0x0136}, {"Kdotbelow", 0x1E32}, {"Khacyrillic", 0x0425}, {"Kheicoptic", 0x03E6}, {"Khook", 0x0198}, {"Kjecyrillic", 0x040C}, {"Klinebelow", 0x1E34}, {"Koppacyrillic", 0x0480}, {"Koppagreek", 0x03DE}, {"Ksicyrillic", 0x046E}, {"Ksmall", 0xF76B}, {"L", 0x004C}, {"LJ", 0x01C7}, {"LL", 0xF6BF}, {"Lacute", 0x0139}, {"Lambda", 0x039B}, {"Lcaron", 0x013D}, {"Lcedilla", 0x013B}, {"Lcircle", 0x24C1}, {"Lcircumflexbelow", 0x1E3C}, {"Lcommaaccent", 0x013B}, {"Ldot", 0x013F}, {"Ldotaccent", 0x013F}, {"Ldotbelow", 0x1E36}, {"Ldotbelowmacron", 0x1E38}, {"Lj", 0x01C8}, {"Ljecyrillic", 0x0409}, {"Llinebelow", 0x1E3A}, {"Lslash", 0x0141}, {"Lslashsmall", 0xF6F9}, {"Lsmall", 0xF76C}, {"M", 0x004D}, {"Macron", 0xF6D0}, {"Macronsmall", 0xF7AF}, {"Macute", 0x1E3E}, {"Mcircle", 0x24C2}, {"Mdotaccent", 0x1E40}, {"Mdotbelow", 0x1E42}, {"Msmall", 0xF76D}, {"Mturned", 0x019C}, {"Mu", 0x039C}, {"N", 0x004E}, {"NJ", 0x01CA}, {"Nacute", 0x0143}, {"Ncaron", 0x0147}, {"Ncedilla", 0x0145}, {"Ncircle", 0x24C3}, {"Ncircumflexbelow", 0x1E4A}, {"Ncommaaccent", 0x0145}, {"Ndotaccent", 0x1E44}, {"Ndotbelow", 0x1E46}, {"Nhookleft", 0x019D}, {"Nineroman", 0x2168}, {"Nj", 0x01CB}, {"Njecyrillic", 0x040A}, {"Nlinebelow", 0x1E48}, {"Nsmall", 0xF76E}, {"Ntilde", 0x00D1}, {"Ntildesmall", 0xF7F1}, {"Nu", 0x039D}, {"O", 0x004F}, {"OE", 0x0152}, {"OEsmall", 0xF6FA}, {"Oacute", 0x00D3}, {"Oacutesmall", 0xF7F3}, {"Obarredcyrillic", 0x04E8}, {"Obarreddieresiscyrillic", 0x04EA}, {"Obreve", 0x014E}, {"Ocaron", 0x01D1}, {"Ocenteredtilde", 0x019F}, {"Ocircle", 0x24C4}, {"Ocircumflex", 0x00D4}, {"Ocircumflexacute", 0x1ED0}, {"Ocircumflexdotbelow", 0x1ED8}, {"Ocircumflexgrave", 0x1ED2}, {"Ocircumflexhookabove", 0x1ED4}, {"Ocircumflexsmall", 0xF7F4}, {"Ocircumflextilde", 0x1ED6}, {"Ocyrillic", 0x041E}, {"Odblacute", 0x0150}, {"Odblgrave", 0x020C}, {"Odieresis", 0x00D6}, {"Odieresiscyrillic", 0x04E6}, {"Odieresissmall", 0xF7F6}, {"Odotbelow", 0x1ECC}, {"Ogoneksmall", 0xF6FB}, {"Ograve", 0x00D2}, {"Ogravesmall", 0xF7F2}, {"Ohm", 0x2126}, {"Ohookabove", 0x1ECE}, {"Ohorn", 0x01A0}, {"Ohornacute", 0x1EDA}, {"Ohorndotbelow", 0x1EE2}, {"Ohorngrave", 0x1EDC}, {"Ohornhookabove", 0x1EDE}, {"Ohorntilde", 0x1EE0}, {"Ohungarumlaut", 0x0150}, {"Oi", 0x01A2}, {"Oinvertedbreve", 0x020E}, {"Omacron", 0x014C}, {"Omacronacute", 0x1E52}, {"Omacrongrave", 0x1E50}, {"Omega", 0x2126}, {"Omegacyrillic", 0x0460}, {"Omegagreek", 0x03A9}, {"Omegaroundcyrillic", 0x047A}, {"Omegatitlocyrillic", 0x047C}, {"Omegatonos", 0x038F}, {"Omicron", 0x039F}, {"Omicrontonos", 0x038C}, {"Oneroman", 0x2160}, {"Oogonek", 0x01EA}, {"Oogonekmacron", 0x01EC}, {"Oopen", 0x0186}, {"Oslash", 0x00D8}, {"Oslashacute", 0x01FE}, {"Oslashsmall", 0xF7F8}, {"Osmall", 0xF76F}, {"Ostrokeacute", 0x01FE}, {"Otcyrillic", 0x047E}, {"Otilde", 0x00D5}, {"Otildeacute", 0x1E4C}, {"Otildedieresis", 0x1E4E}, {"Otildesmall", 0xF7F5}, {"P", 0x0050}, {"Pacute", 0x1E54}, {"Pcircle", 0x24C5}, {"Pdotaccent", 0x1E56}, {"Pecyrillic", 0x041F}, {"Pemiddlehookcyrillic", 0x04A6}, {"Phi", 0x03A6}, {"Phook", 0x01A4}, {"Pi", 0x03A0}, {"Psi", 0x03A8}, {"Psicyrillic", 0x0470}, {"Psmall", 0xF770}, {"Q", 0x0051}, {"Qcircle", 0x24C6}, {"Qsmall", 0xF771}, {"R", 0x0052}, {"Racute", 0x0154}, {"Rcaron", 0x0158}, {"Rcedilla", 0x0156}, {"Rcircle", 0x24C7}, {"Rcommaaccent", 0x0156}, {"Rdblgrave", 0x0210}, {"Rdotaccent", 0x1E58}, {"Rdotbelow", 0x1E5A}, {"Rdotbelowmacron", 0x1E5C}, {"Rfraktur", 0x211C}, {"Rho", 0x03A1}, {"Ringsmall", 0xF6FC}, {"Rinvertedbreve", 0x0212}, {"Rlinebelow", 0x1E5E}, {"Rsmall", 0xF772}, {"Rsmallinverted", 0x0281}, {"Rsmallinvertedsuperior", 0x02B6}, {"S", 0x0053}, {"SF010000", 0x250C}, {"SF020000", 0x2514}, {"SF030000", 0x2510}, {"SF040000", 0x2518}, {"SF050000", 0x253C}, {"SF060000", 0x252C}, {"SF070000", 0x2534}, {"SF080000", 0x251C}, {"SF090000", 0x2524}, {"SF100000", 0x2500}, {"SF110000", 0x2502}, {"SF190000", 0x2561}, {"SF200000", 0x2562}, {"SF210000", 0x2556}, {"SF220000", 0x2555}, {"SF230000", 0x2563}, {"SF240000", 0x2551}, {"SF250000", 0x2557}, {"SF260000", 0x255D}, {"SF270000", 0x255C}, {"SF280000", 0x255B}, {"SF360000", 0x255E}, {"SF370000", 0x255F}, {"SF380000", 0x255A}, {"SF390000", 0x2554}, {"SF400000", 0x2569}, {"SF410000", 0x2566}, {"SF420000", 0x2560}, {"SF430000", 0x2550}, {"SF440000", 0x256C}, {"SF450000", 0x2567}, {"SF460000", 0x2568}, {"SF470000", 0x2564}, {"SF480000", 0x2565}, {"SF490000", 0x2559}, {"SF500000", 0x2558}, {"SF510000", 0x2552}, {"SF520000", 0x2553}, {"SF530000", 0x256B}, {"SF540000", 0x256A}, {"Sacute", 0x015A}, {"Sacutedotaccent", 0x1E64}, {"Sampigreek", 0x03E0}, {"Scaron", 0x0160}, {"Scarondotaccent", 0x1E66}, {"Scaronsmall", 0xF6FD}, {"Scedilla", 0x015E}, {"Schwa", 0x018F}, {"Schwacyrillic", 0x04D8}, {"Schwadieresiscyrillic", 0x04DA}, {"Scircle", 0x24C8}, {"Scircumflex", 0x015C}, {"Scommaaccent", 0x0218}, {"Sdotaccent", 0x1E60}, {"Sdotbelow", 0x1E62}, {"Sdotbelowdotaccent", 0x1E68}, {"Sevenroman", 0x2166}, {"Shacyrillic", 0x0428}, {"Shchacyrillic", 0x0429}, {"Sheicoptic", 0x03E2}, {"Shhacyrillic", 0x04BA}, {"Shimacoptic", 0x03EC}, {"Sigma", 0x03A3}, {"Sixroman", 0x2165}, {"Softsigncyrillic", 0x042C}, {"Ssmall", 0xF773}, {"Stigmagreek", 0x03DA}, {"T", 0x0054}, {"Tau", 0x03A4}, {"Tbar", 0x0166}, {"Tcaron", 0x0164}, {"Tcedilla", 0x0162}, {"Tcircle", 0x24C9}, {"Tcircumflexbelow", 0x1E70}, {"Tcommaaccent", 0x0162}, {"Tdotaccent", 0x1E6A}, {"Tdotbelow", 0x1E6C}, {"Tecyrillic", 0x0422}, {"Tedescendercyrillic", 0x04AC}, {"Tenroman", 0x2169}, {"Tetsecyrillic", 0x04B4}, {"Theta", 0x0398}, {"Thook", 0x01AC}, {"Thorn", 0x00DE}, {"Thornsmall", 0xF7FE}, {"Threeroman", 0x2162}, {"Tildesmall", 0xF6FE}, {"Tlinebelow", 0x1E6E}, {"Tonefive", 0x01BC}, {"Tonesix", 0x0184}, {"Tonetwo", 0x01A7}, {"Tretroflexhook", 0x01AE}, {"Tsecyrillic", 0x0426}, {"Tshecyrillic", 0x040B}, {"Tsmall", 0xF774}, {"Twelveroman", 0x216B}, {"Tworoman", 0x2161}, {"U", 0x0055}, {"Uacute", 0x00DA}, {"Uacutesmall", 0xF7FA}, {"Ubreve", 0x016C}, {"Ucaron", 0x01D3}, {"Ucircle", 0x24CA}, {"Ucircumflex", 0x00DB}, {"Ucircumflexbelow", 0x1E76}, {"Ucircumflexsmall", 0xF7FB}, {"Ucyrillic", 0x0423}, {"Udblacute", 0x0170}, {"Udblgrave", 0x0214}, {"Udieresis", 0x00DC}, {"Udieresisacute", 0x01D7}, {"Udieresisbelow", 0x1E72}, {"Udieresiscaron", 0x01D9}, {"Udieresiscyrillic", 0x04F0}, {"Udieresisgrave", 0x01DB}, {"Udieresismacron", 0x01D5}, {"Udieresissmall", 0xF7FC}, {"Udotbelow", 0x1EE4}, {"Ugrave", 0x00D9}, {"Ugravesmall", 0xF7F9}, {"Uhookabove", 0x1EE6}, {"Uhorn", 0x01AF}, {"Uhornacute", 0x1EE8}, {"Uhorndotbelow", 0x1EF0}, {"Uhorngrave", 0x1EEA}, {"Uhornhookabove", 0x1EEC}, {"Uhorntilde", 0x1EEE}, {"Uhungarumlaut", 0x0170}, {"Uhungarumlautcyrillic", 0x04F2}, {"Uinvertedbreve", 0x0216}, {"Ukcyrillic", 0x0478}, {"Umacron", 0x016A}, {"Umacroncyrillic", 0x04EE}, {"Umacrondieresis", 0x1E7A}, {"Uogonek", 0x0172}, {"Upsilon", 0x03A5}, {"Upsilon1", 0x03D2}, {"Upsilonacutehooksymbolgreek", 0x03D3}, {"Upsilonafrican", 0x01B1}, {"Upsilondieresis", 0x03AB}, {"Upsilondieresishooksymbolgreek", 0x03D4}, {"Upsilonhooksymbol", 0x03D2}, {"Upsilontonos", 0x038E}, {"Uring", 0x016E}, {"Ushortcyrillic", 0x040E}, {"Usmall", 0xF775}, {"Ustraightcyrillic", 0x04AE}, {"Ustraightstrokecyrillic", 0x04B0}, {"Utilde", 0x0168}, {"Utildeacute", 0x1E78}, {"Utildebelow", 0x1E74}, {"V", 0x0056}, {"Vcircle", 0x24CB}, {"Vdotbelow", 0x1E7E}, {"Vecyrillic", 0x0412}, {"Vhook", 0x01B2}, {"Vsmall", 0xF776}, {"Vtilde", 0x1E7C}, {"W", 0x0057}, {"Wacute", 0x1E82}, {"Wcircle", 0x24CC}, {"Wcircumflex", 0x0174}, {"Wdieresis", 0x1E84}, {"Wdotaccent", 0x1E86}, {"Wdotbelow", 0x1E88}, {"Wgrave", 0x1E80}, {"Wsmall", 0xF777}, {"X", 0x0058}, {"Xcircle", 0x24CD}, {"Xdieresis", 0x1E8C}, {"Xdotaccent", 0x1E8A}, {"Xi", 0x039E}, {"Xsmall", 0xF778}, {"Y", 0x0059}, {"Yacute", 0x00DD}, {"Yacutesmall", 0xF7FD}, {"Yatcyrillic", 0x0462}, {"Ycircle", 0x24CE}, {"Ycircumflex", 0x0176}, {"Ydieresis", 0x0178}, {"Ydieresissmall", 0xF7FF}, {"Ydotaccent", 0x1E8E}, {"Ydotbelow", 0x1EF4}, {"Yericyrillic", 0x042B}, {"Yerudieresiscyrillic", 0x04F8}, {"Ygrave", 0x1EF2}, {"Yhook", 0x01B3}, {"Yhookabove", 0x1EF6}, {"Yicyrillic", 0x0407}, {"Ysmall", 0xF779}, {"Ytilde", 0x1EF8}, {"Yusbigcyrillic", 0x046A}, {"Yusbigiotifiedcyrillic", 0x046C}, {"Yuslittlecyrillic", 0x0466}, {"Yuslittleiotifiedcyrillic", 0x0468}, {"Z", 0x005A}, {"Zacute", 0x0179}, {"Zcaron", 0x017D}, {"Zcaronsmall", 0xF6FF}, {"Zcircle", 0x24CF}, {"Zcircumflex", 0x1E90}, {"Zdot", 0x017B}, {"Zdotaccent", 0x017B}, {"Zdotbelow", 0x1E92}, {"Zecyrillic", 0x0417}, {"Zedescendercyrillic", 0x0498}, {"Zedieresiscyrillic", 0x04DE}, {"Zeta", 0x0396}, {"Zhebrevecyrillic", 0x04C1}, {"Zhecyrillic", 0x0416}, {"Zhedescendercyrillic", 0x0496}, {"Zhedieresiscyrillic", 0x04DC}, {"Zlinebelow", 0x1E94}, {"Zsmall", 0xF77A}, {"Zstroke", 0x01B5}, {"a", 0x0061}, {"a1", 0x2701}, {"a10", 0x2721}, {"a100", 0x275E}, {"a101", 0x2761}, {"a102", 0x2762}, {"a103", 0x2763}, {"a104", 0x2764}, {"a105", 0x2710}, {"a106", 0x2765}, {"a107", 0x2766}, {"a108", 0x2767}, {"a109", 0x2660}, {"a11", 0x261B}, {"a110", 0x2665}, {"a111", 0x2666}, {"a112", 0x2663}, {"a117", 0x2709}, {"a118", 0x2708}, {"a119", 0x2707}, {"a12", 0x261E}, {"a120", 0x2460}, {"a121", 0x2461}, {"a122", 0x2462}, {"a123", 0x2463}, {"a124", 0x2464}, {"a125", 0x2465}, {"a126", 0x2466}, {"a127", 0x2467}, {"a128", 0x2468}, {"a129", 0x2469}, {"a13", 0x270C}, {"a130", 0x2776}, {"a131", 0x2777}, {"a132", 0x2778}, {"a133", 0x2779}, {"a134", 0x277A}, {"a135", 0x277B}, {"a136", 0x277C}, {"a137", 0x277D}, {"a138", 0x277E}, {"a139", 0x277F}, {"a14", 0x270D}, {"a140", 0x2780}, {"a141", 0x2781}, {"a142", 0x2782}, {"a143", 0x2783}, {"a144", 0x2784}, {"a145", 0x2785}, {"a146", 0x2786}, {"a147", 0x2787}, {"a148", 0x2788}, {"a149", 0x2789}, {"a15", 0x270E}, {"a150", 0x278A}, {"a151", 0x278B}, {"a152", 0x278C}, {"a153", 0x278D}, {"a154", 0x278E}, {"a155", 0x278F}, {"a156", 0x2790}, {"a157", 0x2791}, {"a158", 0x2792}, {"a159", 0x2793}, {"a16", 0x270F}, {"a160", 0x2794}, {"a161", 0x2192}, {"a162", 0x27A3}, {"a163", 0x2194}, {"a164", 0x2195}, {"a165", 0x2799}, {"a166", 0x279B}, {"a167", 0x279C}, {"a168", 0x279D}, {"a169", 0x279E}, {"a17", 0x2711}, {"a170", 0x279F}, {"a171", 0x27A0}, {"a172", 0x27A1}, {"a173", 0x27A2}, {"a174", 0x27A4}, {"a175", 0x27A5}, {"a176", 0x27A6}, {"a177", 0x27A7}, {"a178", 0x27A8}, {"a179", 0x27A9}, {"a18", 0x2712}, {"a180", 0x27AB}, {"a181", 0x27AD}, {"a182", 0x27AF}, {"a183", 0x27B2}, {"a184", 0x27B3}, {"a185", 0x27B5}, {"a186", 0x27B8}, {"a187", 0x27BA}, {"a188", 0x27BB}, {"a189", 0x27BC}, {"a19", 0x2713}, {"a190", 0x27BD}, {"a191", 0x27BE}, {"a192", 0x279A}, {"a193", 0x27AA}, {"a194", 0x27B6}, {"a195", 0x27B9}, {"a196", 0x2798}, {"a197", 0x27B4}, {"a198", 0x27B7}, {"a199", 0x27AC}, {"a2", 0x2702}, {"a20", 0x2714}, {"a200", 0x27AE}, {"a201", 0x27B1}, {"a202", 0x2703}, {"a203", 0x2750}, {"a204", 0x2752}, {"a205", 0x276E}, {"a206", 0x2770}, {"a21", 0x2715}, {"a22", 0x2716}, {"a23", 0x2717}, {"a24", 0x2718}, {"a25", 0x2719}, {"a26", 0x271A}, {"a27", 0x271B}, {"a28", 0x271C}, {"a29", 0x2722}, {"a3", 0x2704}, {"a30", 0x2723}, {"a31", 0x2724}, {"a32", 0x2725}, {"a33", 0x2726}, {"a34", 0x2727}, {"a35", 0x2605}, {"a36", 0x2729}, {"a37", 0x272A}, {"a38", 0x272B}, {"a39", 0x272C}, {"a4", 0x260E}, {"a40", 0x272D}, {"a41", 0x272E}, {"a42", 0x272F}, {"a43", 0x2730}, {"a44", 0x2731}, {"a45", 0x2732}, {"a46", 0x2733}, {"a47", 0x2734}, {"a48", 0x2735}, {"a49", 0x2736}, {"a5", 0x2706}, {"a50", 0x2737}, {"a51", 0x2738}, {"a52", 0x2739}, {"a53", 0x273A}, {"a54", 0x273B}, {"a55", 0x273C}, {"a56", 0x273D}, {"a57", 0x273E}, {"a58", 0x273F}, {"a59", 0x2740}, {"a6", 0x271D}, {"a60", 0x2741}, {"a61", 0x2742}, {"a62", 0x2743}, {"a63", 0x2744}, {"a64", 0x2745}, {"a65", 0x2746}, {"a66", 0x2747}, {"a67", 0x2748}, {"a68", 0x2749}, {"a69", 0x274A}, {"a7", 0x271E}, {"a70", 0x274B}, {"a71", 0x25CF}, {"a72", 0x274D}, {"a73", 0x25A0}, {"a74", 0x274F}, {"a75", 0x2751}, {"a76", 0x25B2}, {"a77", 0x25BC}, {"a78", 0x25C6}, {"a79", 0x2756}, {"a8", 0x271F}, {"a81", 0x25D7}, {"a82", 0x2758}, {"a83", 0x2759}, {"a84", 0x275A}, {"a85", 0x276F}, {"a86", 0x2771}, {"a87", 0x2772}, {"a88", 0x2773}, {"a89", 0x2768}, {"a9", 0x2720}, {"a90", 0x2769}, {"a91", 0x276C}, {"a92", 0x276D}, {"a93", 0x276A}, {"a94", 0x276B}, {"a95", 0x2774}, {"a96", 0x2775}, {"a97", 0x275B}, {"a98", 0x275C}, {"a99", 0x275D}, {"aacute", 0x00E1}, {"abreve", 0x0103}, {"abreveacute", 0x1EAF}, {"abrevecyrillic", 0x04D1}, {"abrevedotbelow", 0x1EB7}, {"abrevegrave", 0x1EB1}, {"abrevehookabove", 0x1EB3}, {"abrevetilde", 0x1EB5}, {"acaron", 0x01CE}, {"acircle", 0x24D0}, {"acircumflex", 0x00E2}, {"acircumflexacute", 0x1EA5}, {"acircumflexdotbelow", 0x1EAD}, {"acircumflexgrave", 0x1EA7}, {"acircumflexhookabove", 0x1EA9}, {"acircumflextilde", 0x1EAB}, {"acute", 0x00B4}, {"acutebelowcmb", 0x0317}, {"acutecmb", 0x0301}, {"acutecomb", 0x0301}, {"acutelowmod", 0x02CF}, {"acutetonecmb", 0x0341}, {"acyrillic", 0x0430}, {"adblgrave", 0x0201}, {"adieresis", 0x00E4}, {"adieresiscyrillic", 0x04D3}, {"adieresismacron", 0x01DF}, {"adotbelow", 0x1EA1}, {"adotmacron", 0x01E1}, {"ae", 0x00E6}, {"aeacute", 0x01FD}, {"aemacron", 0x01E3}, {"afii00208", 0x2015}, {"afii08941", 0x20A4}, {"afii10017", 0x0410}, {"afii10018", 0x0411}, {"afii10019", 0x0412}, {"afii10020", 0x0413}, {"afii10021", 0x0414}, {"afii10022", 0x0415}, {"afii10023", 0x0401}, {"afii10024", 0x0416}, {"afii10025", 0x0417}, {"afii10026", 0x0418}, {"afii10027", 0x0419}, {"afii10028", 0x041A}, {"afii10029", 0x041B}, {"afii10030", 0x041C}, {"afii10031", 0x041D}, {"afii10032", 0x041E}, {"afii10033", 0x041F}, {"afii10034", 0x0420}, {"afii10035", 0x0421}, {"afii10036", 0x0422}, {"afii10037", 0x0423}, {"afii10038", 0x0424}, {"afii10039", 0x0425}, {"afii10040", 0x0426}, {"afii10041", 0x0427}, {"afii10042", 0x0428}, {"afii10043", 0x0429}, {"afii10044", 0x042A}, {"afii10045", 0x042B}, {"afii10046", 0x042C}, {"afii10047", 0x042D}, {"afii10048", 0x042E}, {"afii10049", 0x042F}, {"afii10050", 0x0490}, {"afii10051", 0x0402}, {"afii10052", 0x0403}, {"afii10053", 0x0404}, {"afii10054", 0x0405}, {"afii10055", 0x0406}, {"afii10056", 0x0407}, {"afii10057", 0x0408}, {"afii10058", 0x0409}, {"afii10059", 0x040A}, {"afii10060", 0x040B}, {"afii10061", 0x040C}, {"afii10062", 0x040E}, {"afii10063", 0xF6C4}, {"afii10064", 0xF6C5}, {"afii10065", 0x0430}, {"afii10066", 0x0431}, {"afii10067", 0x0432}, {"afii10068", 0x0433}, {"afii10069", 0x0434}, {"afii10070", 0x0435}, {"afii10071", 0x0451}, {"afii10072", 0x0436}, {"afii10073", 0x0437}, {"afii10074", 0x0438}, {"afii10075", 0x0439}, {"afii10076", 0x043A}, {"afii10077", 0x043B}, {"afii10078", 0x043C}, {"afii10079", 0x043D}, {"afii10080", 0x043E}, {"afii10081", 0x043F}, {"afii10082", 0x0440}, {"afii10083", 0x0441}, {"afii10084", 0x0442}, {"afii10085", 0x0443}, {"afii10086", 0x0444}, {"afii10087", 0x0445}, {"afii10088", 0x0446}, {"afii10089", 0x0447}, {"afii10090", 0x0448}, {"afii10091", 0x0449}, {"afii10092", 0x044A}, {"afii10093", 0x044B}, {"afii10094", 0x044C}, {"afii10095", 0x044D}, {"afii10096", 0x044E}, {"afii10097", 0x044F}, {"afii10098", 0x0491}, {"afii10099", 0x0452}, {"afii10100", 0x0453}, {"afii10101", 0x0454}, {"afii10102", 0x0455}, {"afii10103", 0x0456}, {"afii10104", 0x0457}, {"afii10105", 0x0458}, {"afii10106", 0x0459}, {"afii10107", 0x045A}, {"afii10108", 0x045B}, {"afii10109", 0x045C}, {"afii10110", 0x045E}, {"afii10145", 0x040F}, {"afii10146", 0x0462}, {"afii10147", 0x0472}, {"afii10148", 0x0474}, {"afii10192", 0xF6C6}, {"afii10193", 0x045F}, {"afii10194", 0x0463}, {"afii10195", 0x0473}, {"afii10196", 0x0475}, {"afii10831", 0xF6C7}, {"afii10832", 0xF6C8}, {"afii10846", 0x04D9}, {"afii299", 0x200E}, {"afii300", 0x200F}, {"afii301", 0x200D}, {"afii57636", 0x20AA}, {"afii57705", 0xFB1F}, {"afii57929", 0x02BC}, {"afii61248", 0x2105}, {"afii61289", 0x2113}, {"afii61352", 0x2116}, {"afii61573", 0x202C}, {"afii61574", 0x202D}, {"afii61575", 0x202E}, {"afii61664", 0x200C}, {"afii64937", 0x02BD}, {"agrave", 0x00E0}, {"ahookabove", 0x1EA3}, {"aiecyrillic", 0x04D5}, {"ainvertedbreve", 0x0203}, {"aleph", 0x2135}, {"allequal", 0x224C}, {"alpha", 0x03B1}, {"alphatonos", 0x03AC}, {"amacron", 0x0101}, {"ampersand", 0x0026}, {"ampersandsmall", 0xF726}, {"angle", 0x2220}, {"angleleft", 0x2329}, {"angleright", 0x232A}, {"angstrom", 0x212B}, {"anoteleia", 0x0387}, {"aogonek", 0x0105}, {"aparen", 0x249C}, {"apostrophemod", 0x02BC}, {"apple", 0xF8FF}, {"approaches", 0x2250}, {"approxequal", 0x2248}, {"approxequalorimage", 0x2252}, {"approximatelyequal", 0x2245}, {"arc", 0x2312}, {"arighthalfring", 0x1E9A}, {"aring", 0x00E5}, {"aringacute", 0x01FB}, {"aringbelow", 0x1E01}, {"arrowboth", 0x2194}, {"arrowdashdown", 0x21E3}, {"arrowdashleft", 0x21E0}, {"arrowdashright", 0x21E2}, {"arrowdashup", 0x21E1}, {"arrowdblboth", 0x21D4}, {"arrowdbldown", 0x21D3}, {"arrowdblleft", 0x21D0}, {"arrowdblright", 0x21D2}, {"arrowdblup", 0x21D1}, {"arrowdown", 0x2193}, {"arrowdownleft", 0x2199}, {"arrowdownright", 0x2198}, {"arrowdownwhite", 0x21E9}, {"arrowheaddownmod", 0x02C5}, {"arrowheadleftmod", 0x02C2}, {"arrowheadrightmod", 0x02C3}, {"arrowheadupmod", 0x02C4}, {"arrowhorizex", 0xF8E7}, {"arrowleft", 0x2190}, {"arrowleftdbl", 0x21D0}, {"arrowleftdblstroke", 0x21CD}, {"arrowleftoverright", 0x21C6}, {"arrowleftwhite", 0x21E6}, {"arrowright", 0x2192}, {"arrowrightdblstroke", 0x21CF}, {"arrowrightheavy", 0x279E}, {"arrowrightoverleft", 0x21C4}, {"arrowrightwhite", 0x21E8}, {"arrowtableft", 0x21E4}, {"arrowtabright", 0x21E5}, {"arrowup", 0x2191}, {"arrowupdn", 0x2195}, {"arrowupdnbse", 0x21A8}, {"arrowupdownbase", 0x21A8}, {"arrowupleft", 0x2196}, {"arrowupleftofdown", 0x21C5}, {"arrowupright", 0x2197}, {"arrowupwhite", 0x21E7}, {"arrowvertex", 0xF8E6}, {"asciicircum", 0x005E}, {"asciitilde", 0x007E}, {"ascript", 0x0251}, {"ascriptturned", 0x0252}, {"asterisk", 0x002A}, {"asteriskmath", 0x2217}, {"asterism", 0x2042}, {"asuperior", 0xF6E9}, {"asymptoticallyequal", 0x2243}, {"at", 0x0040}, {"atilde", 0x00E3}, {"aturned", 0x0250}, {"b", 0x0062}, {"backslash", 0x005C}, {"bar", 0x007C}, {"bcircle", 0x24D1}, {"bdotaccent", 0x1E03}, {"bdotbelow", 0x1E05}, {"beamedsixteenthnotes", 0x266C}, {"because", 0x2235}, {"becyrillic", 0x0431}, {"beta", 0x03B2}, {"betasymbolgreek", 0x03D0}, {"bhook", 0x0253}, {"bilabialclick", 0x0298}, {"blackcircle", 0x25CF}, {"blackdiamond", 0x25C6}, {"blackdownpointingtriangle", 0x25BC}, {"blackleftpointingpointer", 0x25C4}, {"blackleftpointingtriangle", 0x25C0}, {"blacklowerlefttriangle", 0x25E3}, {"blacklowerrighttriangle", 0x25E2}, {"blackrectangle", 0x25AC}, {"blackrightpointingpointer", 0x25BA}, {"blackrightpointingtriangle", 0x25B6}, {"blacksmallsquare", 0x25AA}, {"blacksmilingface", 0x263B}, {"blacksquare", 0x25A0}, {"blackstar", 0x2605}, {"blackupperlefttriangle", 0x25E4}, {"blackupperrighttriangle", 0x25E5}, {"blackuppointingsmalltriangle", 0x25B4}, {"blackuppointingtriangle", 0x25B2}, {"blank", 0x2423}, {"blinebelow", 0x1E07}, {"block", 0x2588}, {"bparen", 0x249D}, {"braceex", 0xF8F4}, {"braceleft", 0x007B}, {"braceleftbt", 0xF8F3}, {"braceleftmid", 0xF8F2}, {"bracelefttp", 0xF8F1}, {"braceright", 0x007D}, {"bracerightbt", 0xF8FE}, {"bracerightmid", 0xF8FD}, {"bracerighttp", 0xF8FC}, {"bracketleft", 0x005B}, {"bracketleftbt", 0xF8F0}, {"bracketleftex", 0xF8EF}, {"bracketlefttp", 0xF8EE}, {"bracketright", 0x005D}, {"bracketrightbt", 0xF8FB}, {"bracketrightex", 0xF8FA}, {"bracketrighttp", 0xF8F9}, {"breve", 0x02D8}, {"brevebelowcmb", 0x032E}, {"brevecmb", 0x0306}, {"breveinvertedbelowcmb", 0x032F}, {"breveinvertedcmb", 0x0311}, {"breveinverteddoublecmb", 0x0361}, {"bridgebelowcmb", 0x032A}, {"bridgeinvertedbelowcmb", 0x033A}, {"brokenbar", 0x00A6}, {"bstroke", 0x0180}, {"bsuperior", 0xF6EA}, {"btopbar", 0x0183}, {"bullet", 0x2022}, {"bulletinverse", 0x25D8}, {"bulletoperator", 0x2219}, {"bullseye", 0x25CE}, {"c", 0x0063}, {"cacute", 0x0107}, {"candrabinducmb", 0x0310}, {"capslock", 0x21EA}, {"careof", 0x2105}, {"caron", 0x02C7}, {"caronbelowcmb", 0x032C}, {"caroncmb", 0x030C}, {"carriagereturn", 0x21B5}, {"ccaron", 0x010D}, {"ccedilla", 0x00E7}, {"ccedillaacute", 0x1E09}, {"ccircle", 0x24D2}, {"ccircumflex", 0x0109}, {"ccurl", 0x0255}, {"cdot", 0x010B}, {"cdotaccent", 0x010B}, {"cedilla", 0x00B8}, {"cedillacmb", 0x0327}, {"cent", 0x00A2}, {"centigrade", 0x2103}, {"centinferior", 0xF6DF}, {"centoldstyle", 0xF7A2}, {"centsuperior", 0xF6E0}, {"cheabkhasiancyrillic", 0x04BD}, {"checkmark", 0x2713}, {"checyrillic", 0x0447}, {"chedescenderabkhasiancyrillic", 0x04BF}, {"chedescendercyrillic", 0x04B7}, {"chedieresiscyrillic", 0x04F5}, {"chekhakassiancyrillic", 0x04CC}, {"cheverticalstrokecyrillic", 0x04B9}, {"chi", 0x03C7}, {"chook", 0x0188}, {"circle", 0x25CB}, {"circlemultiply", 0x2297}, {"circleot", 0x2299}, {"circleplus", 0x2295}, {"circlewithlefthalfblack", 0x25D0}, {"circlewithrighthalfblack", 0x25D1}, {"circumflex", 0x02C6}, {"circumflexbelowcmb", 0x032D}, {"circumflexcmb", 0x0302}, {"clear", 0x2327}, {"clickalveolar", 0x01C2}, {"clickdental", 0x01C0}, {"clicklateral", 0x01C1}, {"clickretroflex", 0x01C3}, {"club", 0x2663}, {"clubsuitblack", 0x2663}, {"clubsuitwhite", 0x2667}, {"colon", 0x003A}, {"colonmonetary", 0x20A1}, {"colonsign", 0x20A1}, {"colontriangularhalfmod", 0x02D1}, {"colontriangularmod", 0x02D0}, {"comma", 0x002C}, {"commaabovecmb", 0x0313}, {"commaaboverightcmb", 0x0315}, {"commaaccent", 0xF6C3}, {"commainferior", 0xF6E1}, {"commareversedabovecmb", 0x0314}, {"commareversedmod", 0x02BD}, {"commasuperior", 0xF6E2}, {"commaturnedabovecmb", 0x0312}, {"commaturnedmod", 0x02BB}, {"compass", 0x263C}, {"congruent", 0x2245}, {"contourintegral", 0x222E}, {"control", 0x2303}, {"controlACK", 0x0006}, {"controlBEL", 0x0007}, {"controlBS", 0x0008}, {"controlCAN", 0x0018}, {"controlCR", 0x000D}, {"controlDC1", 0x0011}, {"controlDC2", 0x0012}, {"controlDC3", 0x0013}, {"controlDC4", 0x0014}, {"controlDEL", 0x007F}, {"controlDLE", 0x0010}, {"controlEM", 0x0019}, {"controlENQ", 0x0005}, {"controlEOT", 0x0004}, {"controlESC", 0x001B}, {"controlETB", 0x0017}, {"controlETX", 0x0003}, {"controlFF", 0x000C}, {"controlFS", 0x001C}, {"controlGS", 0x001D}, {"controlHT", 0x0009}, {"controlLF", 0x000A}, {"controlNAK", 0x0015}, {"controlRS", 0x001E}, {"controlSI", 0x000F}, {"controlSO", 0x000E}, {"controlSOT", 0x0002}, {"controlSTX", 0x0001}, {"controlSUB", 0x001A}, {"controlSYN", 0x0016}, {"controlUS", 0x001F}, {"controlVT", 0x000B}, {"copyright", 0x00A9}, {"copyrightsans", 0xF8E9}, {"copyrightserif", 0xF6D9}, {"cparen", 0x249E}, {"cruzeiro", 0x20A2}, {"cstretched", 0x0297}, {"curlyand", 0x22CF}, {"curlyor", 0x22CE}, {"currency", 0x00A4}, {"cyrBreve", 0xF6D1}, {"cyrFlex", 0xF6D2}, {"cyrbreve", 0xF6D4}, {"cyrflex", 0xF6D5}, {"d", 0x0064}, {"dagger", 0x2020}, {"daggerdbl", 0x2021}, {"dasiapneumatacyrilliccmb", 0x0485}, {"dblGrave", 0xF6D3}, {"dblarchinvertedbelowcmb", 0x032B}, {"dblarrowleft", 0x21D4}, {"dblarrowright", 0x21D2}, {"dblgrave", 0xF6D6}, {"dblgravecmb", 0x030F}, {"dblintegral", 0x222C}, {"dbllowline", 0x2017}, {"dbllowlinecmb", 0x0333}, {"dbloverlinecmb", 0x033F}, {"dblprimemod", 0x02BA}, {"dblverticalbar", 0x2016}, {"dblverticallineabovecmb", 0x030E}, {"dcaron", 0x010F}, {"dcedilla", 0x1E11}, {"dcircle", 0x24D3}, {"dcircumflexbelow", 0x1E13}, {"dcroat", 0x0111}, {"ddotaccent", 0x1E0B}, {"ddotbelow", 0x1E0D}, {"decyrillic", 0x0434}, {"degree", 0x00B0}, {"deicoptic", 0x03EF}, {"deleteleft", 0x232B}, {"deleteright", 0x2326}, {"delta", 0x03B4}, {"deltaturned", 0x018D}, {"dezh", 0x02A4}, {"dhook", 0x0257}, {"dialytikatonos", 0x0385}, {"dialytikatonoscmb", 0x0344}, {"diamond", 0x2666}, {"diamondsuitwhite", 0x2662}, {"dieresis", 0x00A8}, {"dieresisacute", 0xF6D7}, {"dieresisbelowcmb", 0x0324}, {"dieresiscmb", 0x0308}, {"dieresisgrave", 0xF6D8}, {"dieresistonos", 0x0385}, {"divide", 0x00F7}, {"divides", 0x2223}, {"divisionslash", 0x2215}, {"djecyrillic", 0x0452}, {"dkshade", 0x2593}, {"dlinebelow", 0x1E0F}, {"dmacron", 0x0111}, {"dnblock", 0x2584}, {"dollar", 0x0024}, {"dollarinferior", 0xF6E3}, {"dollaroldstyle", 0xF724}, {"dollarsuperior", 0xF6E4}, {"dong", 0x20AB}, {"dotaccent", 0x02D9}, {"dotaccentcmb", 0x0307}, {"dotbelowcmb", 0x0323}, {"dotbelowcomb", 0x0323}, {"dotlessi", 0x0131}, {"dotlessj", 0xF6BE}, {"dotlessjstrokehook", 0x0284}, {"dotmath", 0x22C5}, {"dottedcircle", 0x25CC}, {"doubleyodpatah", 0xFB1F}, {"doubleyodpatahhebrew", 0xFB1F}, {"downtackbelowcmb", 0x031E}, {"downtackmod", 0x02D5}, {"dparen", 0x249F}, {"dsuperior", 0xF6EB}, {"dtail", 0x0256}, {"dtopbar", 0x018C}, {"dz", 0x01F3}, {"dzaltone", 0x02A3}, {"dzcaron", 0x01C6}, {"dzcurl", 0x02A5}, {"dzeabkhasiancyrillic", 0x04E1}, {"dzecyrillic", 0x0455}, {"dzhecyrillic", 0x045F}, {"e", 0x0065}, {"eacute", 0x00E9}, {"earth", 0x2641}, {"ebreve", 0x0115}, {"ecaron", 0x011B}, {"ecedillabreve", 0x1E1D}, {"ecircle", 0x24D4}, {"ecircumflex", 0x00EA}, {"ecircumflexacute", 0x1EBF}, {"ecircumflexbelow", 0x1E19}, {"ecircumflexdotbelow", 0x1EC7}, {"ecircumflexgrave", 0x1EC1}, {"ecircumflexhookabove", 0x1EC3}, {"ecircumflextilde", 0x1EC5}, {"ecyrillic", 0x0454}, {"edblgrave", 0x0205}, {"edieresis", 0x00EB}, {"edot", 0x0117}, {"edotaccent", 0x0117}, {"edotbelow", 0x1EB9}, {"efcyrillic", 0x0444}, {"egrave", 0x00E8}, {"ehookabove", 0x1EBB}, {"eight", 0x0038}, {"eightcircle", 0x2467}, {"eightcircleinversesansserif", 0x2791}, {"eighteencircle", 0x2471}, {"eighteenparen", 0x2485}, {"eighteenperiod", 0x2499}, {"eighthnotebeamed", 0x266B}, {"eightinferior", 0x2088}, {"eightoldstyle", 0xF738}, {"eightparen", 0x247B}, {"eightperiod", 0x248F}, {"eightroman", 0x2177}, {"eightsuperior", 0x2078}, {"einvertedbreve", 0x0207}, {"eiotifiedcyrillic", 0x0465}, {"elcyrillic", 0x043B}, {"element", 0x2208}, {"elevencircle", 0x246A}, {"elevenparen", 0x247E}, {"elevenperiod", 0x2492}, {"elevenroman", 0x217A}, {"ellipsis", 0x2026}, {"ellipsisvertical", 0x22EE}, {"emacron", 0x0113}, {"emacronacute", 0x1E17}, {"emacrongrave", 0x1E15}, {"emcyrillic", 0x043C}, {"emdash", 0x2014}, {"emptyset", 0x2205}, {"encyrillic", 0x043D}, {"endash", 0x2013}, {"endescendercyrillic", 0x04A3}, {"eng", 0x014B}, {"enghecyrillic", 0x04A5}, {"enhookcyrillic", 0x04C8}, {"enspace", 0x2002}, {"eogonek", 0x0119}, {"eopen", 0x025B}, {"eopenclosed", 0x029A}, {"eopenreversed", 0x025C}, {"eopenreversedclosed", 0x025E}, {"eopenreversedhook", 0x025D}, {"eparen", 0x24A0}, {"epsilon", 0x03B5}, {"epsilontonos", 0x03AD}, {"equal", 0x003D}, {"equalsuperior", 0x207C}, {"equivalence", 0x2261}, {"ercyrillic", 0x0440}, {"ereversed", 0x0258}, {"ereversedcyrillic", 0x044D}, {"escyrillic", 0x0441}, {"esdescendercyrillic", 0x04AB}, {"esh", 0x0283}, {"eshcurl", 0x0286}, {"eshreversedloop", 0x01AA}, {"eshsquatreversed", 0x0285}, {"estimated", 0x212E}, {"esuperior", 0xF6EC}, {"eta", 0x03B7}, {"etatonos", 0x03AE}, {"eth", 0x00F0}, {"etilde", 0x1EBD}, {"etildebelow", 0x1E1B}, {"eturned", 0x01DD}, {"euro", 0x20AC}, {"exclam", 0x0021}, {"exclamdbl", 0x203C}, {"exclamdown", 0x00A1}, {"exclamdownsmall", 0xF7A1}, {"exclamsmall", 0xF721}, {"existential", 0x2203}, {"ezh", 0x0292}, {"ezhcaron", 0x01EF}, {"ezhcurl", 0x0293}, {"ezhreversed", 0x01B9}, {"ezhtail", 0x01BA}, {"f", 0x0066}, {"fahrenheit", 0x2109}, {"fcircle", 0x24D5}, {"fdotaccent", 0x1E1F}, {"feicoptic", 0x03E5}, {"female", 0x2640}, {"ff", 0xFB00}, {"ffi", 0xFB03}, {"ffl", 0xFB04}, {"fi", 0xFB01}, {"fifteencircle", 0x246E}, {"fifteenparen", 0x2482}, {"fifteenperiod", 0x2496}, {"figuredash", 0x2012}, {"filledbox", 0x25A0}, {"filledrect", 0x25AC}, {"firsttonechinese", 0x02C9}, {"fisheye", 0x25C9}, {"fitacyrillic", 0x0473}, {"five", 0x0035}, {"fivecircle", 0x2464}, {"fivecircleinversesansserif", 0x278E}, {"fiveeighths", 0x215D}, {"fiveinferior", 0x2085}, {"fiveoldstyle", 0xF735}, {"fiveparen", 0x2478}, {"fiveperiod", 0x248C}, {"fiveroman", 0x2174}, {"fivesuperior", 0x2075}, {"fl", 0xFB02}, {"florin", 0x0192}, {"forall", 0x2200}, {"four", 0x0034}, {"fourcircle", 0x2463}, {"fourcircleinversesansserif", 0x278D}, {"fourinferior", 0x2084}, {"fouroldstyle", 0xF734}, {"fourparen", 0x2477}, {"fourperiod", 0x248B}, {"fourroman", 0x2173}, {"foursuperior", 0x2074}, {"fourteencircle", 0x246D}, {"fourteenparen", 0x2481}, {"fourteenperiod", 0x2495}, {"fourthtonechinese", 0x02CB}, {"fparen", 0x24A1}, {"fraction", 0x2044}, {"franc", 0x20A3}, {"g", 0x0067}, {"gacute", 0x01F5}, {"gamma", 0x03B3}, {"gammalatinsmall", 0x0263}, {"gammasuperior", 0x02E0}, {"gangiacoptic", 0x03EB}, {"gbreve", 0x011F}, {"gcaron", 0x01E7}, {"gcedilla", 0x0123}, {"gcircle", 0x24D6}, {"gcircumflex", 0x011D}, {"gcommaaccent", 0x0123}, {"gdot", 0x0121}, {"gdotaccent", 0x0121}, {"gecyrillic", 0x0433}, {"geometricallyequal", 0x2251}, {"germandbls", 0x00DF}, {"ghemiddlehookcyrillic", 0x0495}, {"ghestrokecyrillic", 0x0493}, {"gheupturncyrillic", 0x0491}, {"ghook", 0x0260}, {"gjecyrillic", 0x0453}, {"glottalinvertedstroke", 0x01BE}, {"glottalstop", 0x0294}, {"glottalstopinverted", 0x0296}, {"glottalstopmod", 0x02C0}, {"glottalstopreversed", 0x0295}, {"glottalstopreversedmod", 0x02C1}, {"glottalstopreversedsuperior", 0x02E4}, {"glottalstopstroke", 0x02A1}, {"glottalstopstrokereversed", 0x02A2}, {"gmacron", 0x1E21}, {"gparen", 0x24A2}, {"gradient", 0x2207}, {"grave", 0x0060}, {"gravebelowcmb", 0x0316}, {"gravecmb", 0x0300}, {"gravecomb", 0x0300}, {"gravelowmod", 0x02CE}, {"gravetonecmb", 0x0340}, {"greater", 0x003E}, {"greaterequal", 0x2265}, {"greaterequalorless", 0x22DB}, {"greaterorequivalent", 0x2273}, {"greaterorless", 0x2277}, {"greateroverequal", 0x2267}, {"gscript", 0x0261}, {"gstroke", 0x01E5}, {"guillemotleft", 0x00AB}, {"guillemotright", 0x00BB}, {"guilsinglleft", 0x2039}, {"guilsinglright", 0x203A}, {"h", 0x0068}, {"haabkhasiancyrillic", 0x04A9}, {"hadescendercyrillic", 0x04B3}, {"hardsigncyrillic", 0x044A}, {"harpoonleftbarbup", 0x21BC}, {"harpoonrightbarbup", 0x21C0}, {"hbar", 0x0127}, {"hbrevebelow", 0x1E2B}, {"hcedilla", 0x1E29}, {"hcircle", 0x24D7}, {"hcircumflex", 0x0125}, {"hdieresis", 0x1E27}, {"hdotaccent", 0x1E23}, {"hdotbelow", 0x1E25}, {"heart", 0x2665}, {"heartsuitblack", 0x2665}, {"heartsuitwhite", 0x2661}, {"henghook", 0x0267}, {"hhook", 0x0266}, {"hhooksuperior", 0x02B1}, {"hlinebelow", 0x1E96}, {"hookabovecomb", 0x0309}, {"hookcmb", 0x0309}, {"hookpalatalizedbelowcmb", 0x0321}, {"hookretroflexbelowcmb", 0x0322}, {"horicoptic", 0x03E9}, {"horizontalbar", 0x2015}, {"horncmb", 0x031B}, {"hotsprings", 0x2668}, {"house", 0x2302}, {"hparen", 0x24A3}, {"hsuperior", 0x02B0}, {"hturned", 0x0265}, {"hungarumlaut", 0x02DD}, {"hungarumlautcmb", 0x030B}, {"hv", 0x0195}, {"hyphen", 0x002D}, {"hypheninferior", 0xF6E5}, {"hyphensuperior", 0xF6E6}, {"hyphentwo", 0x2010}, {"i", 0x0069}, {"iacute", 0x00ED}, {"iacyrillic", 0x044F}, {"ibreve", 0x012D}, {"icaron", 0x01D0}, {"icircle", 0x24D8}, {"icircumflex", 0x00EE}, {"icyrillic", 0x0456}, {"idblgrave", 0x0209}, {"idieresis", 0x00EF}, {"idieresisacute", 0x1E2F}, {"idieresiscyrillic", 0x04E5}, {"idotbelow", 0x1ECB}, {"iebrevecyrillic", 0x04D7}, {"iecyrillic", 0x0435}, {"igrave", 0x00EC}, {"ihookabove", 0x1EC9}, {"iicyrillic", 0x0438}, {"iinvertedbreve", 0x020B}, {"iishortcyrillic", 0x0439}, {"ij", 0x0133}, {"ilde", 0x02DC}, {"imacron", 0x012B}, {"imacroncyrillic", 0x04E3}, {"imageorapproximatelyequal", 0x2253}, {"increment", 0x2206}, {"infinity", 0x221E}, {"integral", 0x222B}, {"integralbottom", 0x2321}, {"integralbt", 0x2321}, {"integralex", 0xF8F5}, {"integraltop", 0x2320}, {"integraltp", 0x2320}, {"intersection", 0x2229}, {"invbullet", 0x25D8}, {"invcircle", 0x25D9}, {"invsmileface", 0x263B}, {"iocyrillic", 0x0451}, {"iogonek", 0x012F}, {"iota", 0x03B9}, {"iotadieresis", 0x03CA}, {"iotadieresistonos", 0x0390}, {"iotalatin", 0x0269}, {"iotatonos", 0x03AF}, {"iparen", 0x24A4}, {"istroke", 0x0268}, {"isuperior", 0xF6ED}, {"itilde", 0x0129}, {"itildebelow", 0x1E2D}, {"iucyrillic", 0x044E}, {"izhitsacyrillic", 0x0475}, {"izhitsadblgravecyrillic", 0x0477}, {"j", 0x006A}, {"jcaron", 0x01F0}, {"jcircle", 0x24D9}, {"jcircumflex", 0x0135}, {"jcrossedtail", 0x029D}, {"jdotlessstroke", 0x025F}, {"jecyrillic", 0x0458}, {"jparen", 0x24A5}, {"jsuperior", 0x02B2}, {"k", 0x006B}, {"kabashkircyrillic", 0x04A1}, {"kacute", 0x1E31}, {"kacyrillic", 0x043A}, {"kadescendercyrillic", 0x049B}, {"kahookcyrillic", 0x04C4}, {"kappa", 0x03BA}, {"kappasymbolgreek", 0x03F0}, {"kastrokecyrillic", 0x049F}, {"kaverticalstrokecyrillic", 0x049D}, {"kcaron", 0x01E9}, {"kcedilla", 0x0137}, {"kcircle", 0x24DA}, {"kcommaaccent", 0x0137}, {"kdotbelow", 0x1E33}, {"kgreenlandic", 0x0138}, {"khacyrillic", 0x0445}, {"kheicoptic", 0x03E7}, {"khook", 0x0199}, {"kjecyrillic", 0x045C}, {"klinebelow", 0x1E35}, {"koppacyrillic", 0x0481}, {"koroniscmb", 0x0343}, {"kparen", 0x24A6}, {"ksicyrillic", 0x046F}, {"kturned", 0x029E}, {"l", 0x006C}, {"lacute", 0x013A}, {"lambda", 0x03BB}, {"lambdastroke", 0x019B}, {"largecircle", 0x25EF}, {"lbar", 0x019A}, {"lbelt", 0x026C}, {"lcaron", 0x013E}, {"lcedilla", 0x013C}, {"lcircle", 0x24DB}, {"lcircumflexbelow", 0x1E3D}, {"lcommaaccent", 0x013C}, {"ldot", 0x0140}, {"ldotaccent", 0x0140}, {"ldotbelow", 0x1E37}, {"ldotbelowmacron", 0x1E39}, {"leftangleabovecmb", 0x031A}, {"lefttackbelowcmb", 0x0318}, {"less", 0x003C}, {"lessequal", 0x2264}, {"lessequalorgreater", 0x22DA}, {"lessorequivalent", 0x2272}, {"lessorgreater", 0x2276}, {"lessoverequal", 0x2266}, {"lezh", 0x026E}, {"lfblock", 0x258C}, {"lhookretroflex", 0x026D}, {"lira", 0x20A4}, {"lj", 0x01C9}, {"ljecyrillic", 0x0459}, {"ll", 0xF6C0}, {"llinebelow", 0x1E3B}, {"lmiddletilde", 0x026B}, {"logicaland", 0x2227}, {"logicalnot", 0x00AC}, {"logicalnotreversed", 0x2310}, {"logicalor", 0x2228}, {"longs", 0x017F}, {"lowlinecmb", 0x0332}, {"lozenge", 0x25CA}, {"lparen", 0x24A7}, {"lslash", 0x0142}, {"lsquare", 0x2113}, {"lsuperior", 0xF6EE}, {"ltshade", 0x2591}, {"m", 0x006D}, {"macron", 0x00AF}, {"macronbelowcmb", 0x0331}, {"macroncmb", 0x0304}, {"macronlowmod", 0x02CD}, {"macute", 0x1E3F}, {"maichattawalowleftthai", 0xF895}, {"maichattawalowrightthai", 0xF894}, {"maichattawaupperleftthai", 0xF893}, {"maieklowleftthai", 0xF88C}, {"maieklowrightthai", 0xF88B}, {"maiekupperleftthai", 0xF88A}, {"maihanakatleftthai", 0xF884}, {"maitaikhuleftthai", 0xF889}, {"maitholowleftthai", 0xF88F}, {"maitholowrightthai", 0xF88E}, {"maithoupperleftthai", 0xF88D}, {"maitrilowleftthai", 0xF892}, {"maitrilowrightthai", 0xF891}, {"maitriupperleftthai", 0xF890}, {"male", 0x2642}, {"mars", 0x2642}, {"mcircle", 0x24DC}, {"mdotaccent", 0x1E41}, {"mdotbelow", 0x1E43}, {"mhook", 0x0271}, {"middot", 0x00B7}, {"minus", 0x2212}, {"minusbelowcmb", 0x0320}, {"minuscircle", 0x2296}, {"minusmod", 0x02D7}, {"minusplus", 0x2213}, {"minute", 0x2032}, {"mlonglegturned", 0x0270}, {"mparen", 0x24A8}, {"msuperior", 0xF6EF}, {"mturned", 0x026F}, {"mu", 0x00B5}, {"mu1", 0x00B5}, {"muchgreater", 0x226B}, {"muchless", 0x226A}, {"mugreek", 0x03BC}, {"multiply", 0x00D7}, {"musicalnote", 0x266A}, {"musicalnotedbl", 0x266B}, {"musicflatsign", 0x266D}, {"musicsharpsign", 0x266F}, {"n", 0x006E}, {"nabla", 0x2207}, {"nacute", 0x0144}, {"napostrophe", 0x0149}, {"nbspace", 0x00A0}, {"ncaron", 0x0148}, {"ncedilla", 0x0146}, {"ncircle", 0x24DD}, {"ncircumflexbelow", 0x1E4B}, {"ncommaaccent", 0x0146}, {"ndotaccent", 0x1E45}, {"ndotbelow", 0x1E47}, {"newsheqelsign", 0x20AA}, {"nhookleft", 0x0272}, {"nhookretroflex", 0x0273}, {"nikhahitleftthai", 0xF899}, {"nine", 0x0039}, {"ninecircle", 0x2468}, {"ninecircleinversesansserif", 0x2792}, {"nineinferior", 0x2089}, {"nineoldstyle", 0xF739}, {"nineparen", 0x247C}, {"nineperiod", 0x2490}, {"nineroman", 0x2178}, {"ninesuperior", 0x2079}, {"nineteencircle", 0x2472}, {"nineteenparen", 0x2486}, {"nineteenperiod", 0x249A}, {"nj", 0x01CC}, {"njecyrillic", 0x045A}, {"nlegrightlong", 0x019E}, {"nlinebelow", 0x1E49}, {"nonbreakingspace", 0x00A0}, {"notcontains", 0x220C}, {"notelement", 0x2209}, {"notelementof", 0x2209}, {"notequal", 0x2260}, {"notgreater", 0x226F}, {"notgreaternorequal", 0x2271}, {"notgreaternorless", 0x2279}, {"notidentical", 0x2262}, {"notless", 0x226E}, {"notlessnorequal", 0x2270}, {"notparallel", 0x2226}, {"notprecedes", 0x2280}, {"notsubset", 0x2284}, {"notsucceeds", 0x2281}, {"notsuperset", 0x2285}, {"nparen", 0x24A9}, {"nsuperior", 0x207F}, {"ntilde", 0x00F1}, {"nu", 0x03BD}, {"numbersign", 0x0023}, {"numeralsigngreek", 0x0374}, {"numeralsignlowergreek", 0x0375}, {"numero", 0x2116}, {"o", 0x006F}, {"oacute", 0x00F3}, {"obarred", 0x0275}, {"obarredcyrillic", 0x04E9}, {"obarreddieresiscyrillic", 0x04EB}, {"obreve", 0x014F}, {"ocaron", 0x01D2}, {"ocircle", 0x24DE}, {"ocircumflex", 0x00F4}, {"ocircumflexacute", 0x1ED1}, {"ocircumflexdotbelow", 0x1ED9}, {"ocircumflexgrave", 0x1ED3}, {"ocircumflexhookabove", 0x1ED5}, {"ocircumflextilde", 0x1ED7}, {"ocyrillic", 0x043E}, {"odblacute", 0x0151}, {"odblgrave", 0x020D}, {"odieresis", 0x00F6}, {"odieresiscyrillic", 0x04E7}, {"odotbelow", 0x1ECD}, {"oe", 0x0153}, {"ogonek", 0x02DB}, {"ogonekcmb", 0x0328}, {"ograve", 0x00F2}, {"ohookabove", 0x1ECF}, {"ohorn", 0x01A1}, {"ohornacute", 0x1EDB}, {"ohorndotbelow", 0x1EE3}, {"ohorngrave", 0x1EDD}, {"ohornhookabove", 0x1EDF}, {"ohorntilde", 0x1EE1}, {"ohungarumlaut", 0x0151}, {"oi", 0x01A3}, {"oinvertedbreve", 0x020F}, {"omacron", 0x014D}, {"omacronacute", 0x1E53}, {"omacrongrave", 0x1E51}, {"omega", 0x03C9}, {"omega1", 0x03D6}, {"omegacyrillic", 0x0461}, {"omegalatinclosed", 0x0277}, {"omegaroundcyrillic", 0x047B}, {"omegatitlocyrillic", 0x047D}, {"omegatonos", 0x03CE}, {"omicron", 0x03BF}, {"omicrontonos", 0x03CC}, {"one", 0x0031}, {"onecircle", 0x2460}, {"onecircleinversesansserif", 0x278A}, {"onedotenleader", 0x2024}, {"oneeighth", 0x215B}, {"onefitted", 0xF6DC}, {"onehalf", 0x00BD}, {"oneinferior", 0x2081}, {"oneoldstyle", 0xF731}, {"oneparen", 0x2474}, {"oneperiod", 0x2488}, {"onequarter", 0x00BC}, {"oneroman", 0x2170}, {"onesuperior", 0x00B9}, {"onethird", 0x2153}, {"oogonek", 0x01EB}, {"oogonekmacron", 0x01ED}, {"oopen", 0x0254}, {"oparen", 0x24AA}, {"openbullet", 0x25E6}, {"option", 0x2325}, {"ordfeminine", 0x00AA}, {"ordmasculine", 0x00BA}, {"orthogonal", 0x221F}, {"oslash", 0x00F8}, {"oslashacute", 0x01FF}, {"ostrokeacute", 0x01FF}, {"osuperior", 0xF6F0}, {"otcyrillic", 0x047F}, {"otilde", 0x00F5}, {"otildeacute", 0x1E4D}, {"otildedieresis", 0x1E4F}, {"overline", 0x203E}, {"overlinecmb", 0x0305}, {"overscore", 0x00AF}, {"p", 0x0070}, {"pacute", 0x1E55}, {"pagedown", 0x21DF}, {"pageup", 0x21DE}, {"palatalizationcyrilliccmb", 0x0484}, {"palochkacyrillic", 0x04C0}, {"paragraph", 0x00B6}, {"parallel", 0x2225}, {"parenleft", 0x0028}, {"parenleftbt", 0xF8ED}, {"parenleftex", 0xF8EC}, {"parenleftinferior", 0x208D}, {"parenleftsuperior", 0x207D}, {"parenlefttp", 0xF8EB}, {"parenright", 0x0029}, {"parenrightbt", 0xF8F8}, {"parenrightex", 0xF8F7}, {"parenrightinferior", 0x208E}, {"parenrightsuperior", 0x207E}, {"parenrighttp", 0xF8F6}, {"partialdiff", 0x2202}, {"pcircle", 0x24DF}, {"pdotaccent", 0x1E57}, {"pecyrillic", 0x043F}, {"pemiddlehookcyrillic", 0x04A7}, {"percent", 0x0025}, {"period", 0x002E}, {"periodcentered", 0x00B7}, {"periodinferior", 0xF6E7}, {"periodsuperior", 0xF6E8}, {"perispomenigreekcmb", 0x0342}, {"perpendicular", 0x22A5}, {"perthousand", 0x2030}, {"peseta", 0x20A7}, {"phi", 0x03C6}, {"phi1", 0x03D5}, {"philatin", 0x0278}, {"phisymbolgreek", 0x03D5}, {"phook", 0x01A5}, {"pi", 0x03C0}, {"pisymbolgreek", 0x03D6}, {"plus", 0x002B}, {"plusbelowcmb", 0x031F}, {"pluscircle", 0x2295}, {"plusminus", 0x00B1}, {"plusmod", 0x02D6}, {"plussuperior", 0x207A}, {"pointingindexdownwhite", 0x261F}, {"pointingindexleftwhite", 0x261C}, {"pointingindexrightwhite", 0x261E}, {"pointingindexupwhite", 0x261D}, {"pparen", 0x24AB}, {"precedes", 0x227A}, {"prescription", 0x211E}, {"primemod", 0x02B9}, {"primereversed", 0x2035}, {"product", 0x220F}, {"projective", 0x2305}, {"propellor", 0x2318}, {"propersubset", 0x2282}, {"propersuperset", 0x2283}, {"proportion", 0x2237}, {"proportional", 0x221D}, {"psi", 0x03C8}, {"psicyrillic", 0x0471}, {"psilipneumatacyrilliccmb", 0x0486}, {"q", 0x0071}, {"qcircle", 0x24E0}, {"qhook", 0x02A0}, {"qparen", 0x24AC}, {"quarternote", 0x2669}, {"question", 0x003F}, {"questiondown", 0x00BF}, {"questiondownsmall", 0xF7BF}, {"questiongreek", 0x037E}, {"questionsmall", 0xF73F}, {"quotedbl", 0x0022}, {"quotedblbase", 0x201E}, {"quotedblleft", 0x201C}, {"quotedblright", 0x201D}, {"quoteleft", 0x2018}, {"quoteleftreversed", 0x201B}, {"quotereversed", 0x201B}, {"quoteright", 0x2019}, {"quoterightn", 0x0149}, {"quotesinglbase", 0x201A}, {"quotesingle", 0x0027}, {"r", 0x0072}, {"racute", 0x0155}, {"radical", 0x221A}, {"radicalex", 0xF8E5}, {"ramshorn", 0x0264}, {"ratio", 0x2236}, {"rcaron", 0x0159}, {"rcedilla", 0x0157}, {"rcircle", 0x24E1}, {"rcommaaccent", 0x0157}, {"rdblgrave", 0x0211}, {"rdotaccent", 0x1E59}, {"rdotbelow", 0x1E5B}, {"rdotbelowmacron", 0x1E5D}, {"referencemark", 0x203B}, {"reflexsubset", 0x2286}, {"reflexsuperset", 0x2287}, {"registered", 0x00AE}, {"registersans", 0xF8E8}, {"registerserif", 0xF6DA}, {"reversedtilde", 0x223D}, {"revlogicalnot", 0x2310}, {"rfishhook", 0x027E}, {"rfishhookreversed", 0x027F}, {"rho", 0x03C1}, {"rhook", 0x027D}, {"rhookturned", 0x027B}, {"rhookturnedsuperior", 0x02B5}, {"rhosymbolgreek", 0x03F1}, {"rhotichookmod", 0x02DE}, {"rightangle", 0x221F}, {"righttackbelowcmb", 0x0319}, {"righttriangle", 0x22BF}, {"ring", 0x02DA}, {"ringbelowcmb", 0x0325}, {"ringcmb", 0x030A}, {"ringhalfleft", 0x02BF}, {"ringhalfleftbelowcmb", 0x031C}, {"ringhalfleftcentered", 0x02D3}, {"ringhalfright", 0x02BE}, {"ringhalfrightbelowcmb", 0x0339}, {"ringhalfrightcentered", 0x02D2}, {"rinvertedbreve", 0x0213}, {"rlinebelow", 0x1E5F}, {"rlongleg", 0x027C}, {"rlonglegturned", 0x027A}, {"rparen", 0x24AD}, {"rsuperior", 0xF6F1}, {"rtblock", 0x2590}, {"rturned", 0x0279}, {"rturnedsuperior", 0x02B4}, {"rupiah", 0xF6DD}, {"s", 0x0073}, {"sacute", 0x015B}, {"sacutedotaccent", 0x1E65}, {"saraiileftthai", 0xF886}, {"saraileftthai", 0xF885}, {"saraueeleftthai", 0xF888}, {"saraueleftthai", 0xF887}, {"scaron", 0x0161}, {"scarondotaccent", 0x1E67}, {"scedilla", 0x015F}, {"schwa", 0x0259}, {"schwacyrillic", 0x04D9}, {"schwadieresiscyrillic", 0x04DB}, {"schwahook", 0x025A}, {"scircle", 0x24E2}, {"scircumflex", 0x015D}, {"scommaaccent", 0x0219}, {"sdotaccent", 0x1E61}, {"sdotbelow", 0x1E63}, {"sdotbelowdotaccent", 0x1E69}, {"seagullbelowcmb", 0x033C}, {"second", 0x2033}, {"secondtonechinese", 0x02CA}, {"section", 0x00A7}, {"semicolon", 0x003B}, {"seven", 0x0037}, {"sevencircle", 0x2466}, {"sevencircleinversesansserif", 0x2790}, {"seveneighths", 0x215E}, {"seveninferior", 0x2087}, {"sevenoldstyle", 0xF737}, {"sevenparen", 0x247A}, {"sevenperiod", 0x248E}, {"sevenroman", 0x2176}, {"sevensuperior", 0x2077}, {"seventeencircle", 0x2470}, {"seventeenparen", 0x2484}, {"seventeenperiod", 0x2498}, {"sfthyphen", 0x00AD}, {"shacyrillic", 0x0448}, {"shade", 0x2592}, {"shadedark", 0x2593}, {"shadelight", 0x2591}, {"shademedium", 0x2592}, {"shchacyrillic", 0x0449}, {"sheicoptic", 0x03E3}, {"sheqel", 0x20AA}, {"sheqelhebrew", 0x20AA}, {"shhacyrillic", 0x04BB}, {"shimacoptic", 0x03ED}, {"shook", 0x0282}, {"sigma", 0x03C3}, {"sigma1", 0x03C2}, {"sigmafinal", 0x03C2}, {"sigmalunatesymbolgreek", 0x03F2}, {"similar", 0x223C}, {"six", 0x0036}, {"sixcircle", 0x2465}, {"sixcircleinversesansserif", 0x278F}, {"sixinferior", 0x2086}, {"sixoldstyle", 0xF736}, {"sixparen", 0x2479}, {"sixperiod", 0x248D}, {"sixroman", 0x2175}, {"sixsuperior", 0x2076}, {"sixteencircle", 0x246F}, {"sixteenparen", 0x2483}, {"sixteenperiod", 0x2497}, {"slash", 0x002F}, {"slong", 0x017F}, {"slongdotaccent", 0x1E9B}, {"smileface", 0x263A}, {"softhyphen", 0x00AD}, {"softsigncyrillic", 0x044C}, {"soliduslongoverlaycmb", 0x0338}, {"solidusshortoverlaycmb", 0x0337}, {"space", 0x0020}, {"spacehackarabic", 0x0020}, {"spade", 0x2660}, {"spadesuitblack", 0x2660}, {"spadesuitwhite", 0x2664}, {"sparen", 0x24AE}, {"squarebelowcmb", 0x033B}, {"squarediagonalcrosshatchfill", 0x25A9}, {"squarehorizontalfill", 0x25A4}, {"squareorthogonalcrosshatchfill", 0x25A6}, {"squareupperlefttolowerrightfill", 0x25A7}, {"squareupperrighttolowerleftfill", 0x25A8}, {"squareverticalfill", 0x25A5}, {"squarewhitewithsmallblack", 0x25A3}, {"ssuperior", 0xF6F2}, {"sterling", 0x00A3}, {"strokelongoverlaycmb", 0x0336}, {"strokeshortoverlaycmb", 0x0335}, {"subset", 0x2282}, {"subsetnotequal", 0x228A}, {"subsetorequal", 0x2286}, {"succeeds", 0x227B}, {"suchthat", 0x220B}, {"summation", 0x2211}, {"sun", 0x263C}, {"superset", 0x2283}, {"supersetnotequal", 0x228B}, {"supersetorequal", 0x2287}, {"t", 0x0074}, {"tackdown", 0x22A4}, {"tackleft", 0x22A3}, {"tau", 0x03C4}, {"tbar", 0x0167}, {"tcaron", 0x0165}, {"tccurl", 0x02A8}, {"tcedilla", 0x0163}, {"tcircle", 0x24E3}, {"tcircumflexbelow", 0x1E71}, {"tcommaaccent", 0x0163}, {"tdieresis", 0x1E97}, {"tdotaccent", 0x1E6B}, {"tdotbelow", 0x1E6D}, {"tecyrillic", 0x0442}, {"tedescendercyrillic", 0x04AD}, {"telephone", 0x2121}, {"telephoneblack", 0x260E}, {"tencircle", 0x2469}, {"tenparen", 0x247D}, {"tenperiod", 0x2491}, {"tenroman", 0x2179}, {"tesh", 0x02A7}, {"tetsecyrillic", 0x04B5}, {"thanthakhatlowleftthai", 0xF898}, {"thanthakhatlowrightthai", 0xF897}, {"thanthakhatupperleftthai", 0xF896}, {"thereexists", 0x2203}, {"therefore", 0x2234}, {"theta", 0x03B8}, {"theta1", 0x03D1}, {"thetasymbolgreek", 0x03D1}, {"thirteencircle", 0x246C}, {"thirteenparen", 0x2480}, {"thirteenperiod", 0x2494}, {"thook", 0x01AD}, {"thorn", 0x00FE}, {"thousandcyrillic", 0x0482}, {"three", 0x0033}, {"threecircle", 0x2462}, {"threecircleinversesansserif", 0x278C}, {"threeeighths", 0x215C}, {"threeinferior", 0x2083}, {"threeoldstyle", 0xF733}, {"threeparen", 0x2476}, {"threeperiod", 0x248A}, {"threequarters", 0x00BE}, {"threequartersemdash", 0xF6DE}, {"threeroman", 0x2172}, {"threesuperior", 0x00B3}, {"tilde", 0x02DC}, {"tildebelowcmb", 0x0330}, {"tildecmb", 0x0303}, {"tildecomb", 0x0303}, {"tildedoublecmb", 0x0360}, {"tildeoperator", 0x223C}, {"tildeoverlaycmb", 0x0334}, {"tildeverticalcmb", 0x033E}, {"timescircle", 0x2297}, {"titlocyrilliccmb", 0x0483}, {"tlinebelow", 0x1E6F}, {"tonebarextrahighmod", 0x02E5}, {"tonebarextralowmod", 0x02E9}, {"tonebarhighmod", 0x02E6}, {"tonebarlowmod", 0x02E8}, {"tonebarmidmod", 0x02E7}, {"tonefive", 0x01BD}, {"tonesix", 0x0185}, {"tonetwo", 0x01A8}, {"tonos", 0x0384}, {"tpalatalhook", 0x01AB}, {"tparen", 0x24AF}, {"trademark", 0x2122}, {"trademarksans", 0xF8EA}, {"trademarkserif", 0xF6DB}, {"tretroflexhook", 0x0288}, {"triagdn", 0x25BC}, {"triaglf", 0x25C4}, {"triagrt", 0x25BA}, {"triagup", 0x25B2}, {"ts", 0x02A6}, {"tsecyrillic", 0x0446}, {"tshecyrillic", 0x045B}, {"tsuperior", 0xF6F3}, {"tturned", 0x0287}, {"twelvecircle", 0x246B}, {"twelveparen", 0x247F}, {"twelveperiod", 0x2493}, {"twelveroman", 0x217B}, {"twentycircle", 0x2473}, {"twentyparen", 0x2487}, {"twentyperiod", 0x249B}, {"two", 0x0032}, {"twocircle", 0x2461}, {"twocircleinversesansserif", 0x278B}, {"twodotenleader", 0x2025}, {"twodotleader", 0x2025}, {"twoinferior", 0x2082}, {"twooldstyle", 0xF732}, {"twoparen", 0x2475}, {"twoperiod", 0x2489}, {"tworoman", 0x2171}, {"twostroke", 0x01BB}, {"twosuperior", 0x00B2}, {"twothirds", 0x2154}, {"u", 0x0075}, {"uacute", 0x00FA}, {"ubar", 0x0289}, {"ubreve", 0x016D}, {"ucaron", 0x01D4}, {"ucircle", 0x24E4}, {"ucircumflex", 0x00FB}, {"ucircumflexbelow", 0x1E77}, {"ucyrillic", 0x0443}, {"udblacute", 0x0171}, {"udblgrave", 0x0215}, {"udieresis", 0x00FC}, {"udieresisacute", 0x01D8}, {"udieresisbelow", 0x1E73}, {"udieresiscaron", 0x01DA}, {"udieresiscyrillic", 0x04F1}, {"udieresisgrave", 0x01DC}, {"udieresismacron", 0x01D6}, {"udotbelow", 0x1EE5}, {"ugrave", 0x00F9}, {"uhookabove", 0x1EE7}, {"uhorn", 0x01B0}, {"uhornacute", 0x1EE9}, {"uhorndotbelow", 0x1EF1}, {"uhorngrave", 0x1EEB}, {"uhornhookabove", 0x1EED}, {"uhorntilde", 0x1EEF}, {"uhungarumlaut", 0x0171}, {"uhungarumlautcyrillic", 0x04F3}, {"uinvertedbreve", 0x0217}, {"ukcyrillic", 0x0479}, {"umacron", 0x016B}, {"umacroncyrillic", 0x04EF}, {"umacrondieresis", 0x1E7B}, {"underscore", 0x005F}, {"underscoredbl", 0x2017}, {"union", 0x222A}, {"universal", 0x2200}, {"uogonek", 0x0173}, {"uparen", 0x24B0}, {"upblock", 0x2580}, {"upsilon", 0x03C5}, {"upsilondieresis", 0x03CB}, {"upsilondieresistonos", 0x03B0}, {"upsilonlatin", 0x028A}, {"upsilontonos", 0x03CD}, {"uptackbelowcmb", 0x031D}, {"uptackmod", 0x02D4}, {"uring", 0x016F}, {"ushortcyrillic", 0x045E}, {"ustraightcyrillic", 0x04AF}, {"ustraightstrokecyrillic", 0x04B1}, {"utilde", 0x0169}, {"utildeacute", 0x1E79}, {"utildebelow", 0x1E75}, {"v", 0x0076}, {"vcircle", 0x24E5}, {"vdotbelow", 0x1E7F}, {"vecyrillic", 0x0432}, {"venus", 0x2640}, {"verticalbar", 0x007C}, {"verticallineabovecmb", 0x030D}, {"verticallinebelowcmb", 0x0329}, {"verticallinelowmod", 0x02CC}, {"verticallinemod", 0x02C8}, {"vhook", 0x028B}, {"vparen", 0x24B1}, {"vtilde", 0x1E7D}, {"vturned", 0x028C}, {"w", 0x0077}, {"wacute", 0x1E83}, {"wcircle", 0x24E6}, {"wcircumflex", 0x0175}, {"wdieresis", 0x1E85}, {"wdotaccent", 0x1E87}, {"wdotbelow", 0x1E89}, {"weierstrass", 0x2118}, {"wgrave", 0x1E81}, {"whitebullet", 0x25E6}, {"whitecircle", 0x25CB}, {"whitecircleinverse", 0x25D9}, {"whitediamond", 0x25C7}, {"whitediamondcontainingblacksmalldiamond", 0x25C8}, {"whitedownpointingsmalltriangle", 0x25BF}, {"whitedownpointingtriangle", 0x25BD}, {"whiteleftpointingsmalltriangle", 0x25C3}, {"whiteleftpointingtriangle", 0x25C1}, {"whiterightpointingsmalltriangle", 0x25B9}, {"whiterightpointingtriangle", 0x25B7}, {"whitesmallsquare", 0x25AB}, {"whitesmilingface", 0x263A}, {"whitesquare", 0x25A1}, {"whitestar", 0x2606}, {"whitetelephone", 0x260F}, {"whiteuppointingsmalltriangle", 0x25B5}, {"whiteuppointingtriangle", 0x25B3}, {"won", 0x20A9}, {"wparen", 0x24B2}, {"wring", 0x1E98}, {"wsuperior", 0x02B7}, {"wturned", 0x028D}, {"wynn", 0x01BF}, {"x", 0x0078}, {"xabovecmb", 0x033D}, {"xcircle", 0x24E7}, {"xdieresis", 0x1E8D}, {"xdotaccent", 0x1E8B}, {"xi", 0x03BE}, {"xparen", 0x24B3}, {"xsuperior", 0x02E3}, {"y", 0x0079}, {"yacute", 0x00FD}, {"yatcyrillic", 0x0463}, {"ycircle", 0x24E8}, {"ycircumflex", 0x0177}, {"ydieresis", 0x00FF}, {"ydotaccent", 0x1E8F}, {"ydotbelow", 0x1EF5}, {"yen", 0x00A5}, {"yericyrillic", 0x044B}, {"yerudieresiscyrillic", 0x04F9}, {"ygrave", 0x1EF3}, {"yhook", 0x01B4}, {"yhookabove", 0x1EF7}, {"yicyrillic", 0x0457}, {"yinyang", 0x262F}, {"yodyodpatahhebrew", 0xFB1F}, {"yotgreek", 0x03F3}, {"yparen", 0x24B4}, {"ypogegrammeni", 0x037A}, {"ypogegrammenigreekcmb", 0x0345}, {"yr", 0x01A6}, {"yring", 0x1E99}, {"ysuperior", 0x02B8}, {"ytilde", 0x1EF9}, {"yturned", 0x028E}, {"yusbigcyrillic", 0x046B}, {"yusbigiotifiedcyrillic", 0x046D}, {"yuslittlecyrillic", 0x0467}, {"yuslittleiotifiedcyrillic", 0x0469}, {"z", 0x007A}, {"zacute", 0x017A}, {"zcaron", 0x017E}, {"zcircle", 0x24E9}, {"zcircumflex", 0x1E91}, {"zcurl", 0x0291}, {"zdot", 0x017C}, {"zdotaccent", 0x017C}, {"zdotbelow", 0x1E93}, {"zecyrillic", 0x0437}, {"zedescendercyrillic", 0x0499}, {"zedieresiscyrillic", 0x04DF}, {"zero", 0x0030}, {"zeroinferior", 0x2080}, {"zerooldstyle", 0xF730}, {"zerosuperior", 0x2070}, {"zerowidthnonjoiner", 0x200C}, {"zerowidthspace", 0x200B}, {"zeta", 0x03B6}, {"zhebrevecyrillic", 0x04C2}, {"zhecyrillic", 0x0436}, {"zhedescendercyrillic", 0x0497}, {"zhedieresiscyrillic", 0x04DD}, {"zlinebelow", 0x1E95}, {"zparen", 0x24B5}, {"zretroflexhook", 0x0290}, {"zstroke", 0x01B6}, } // One preferred name per code point, as an index into AGL_TABLE, sorted by // code point. Where several names share a rune the AGLFN name wins, then one // used by a built-in encoding, then the shortest. @(private, rodata) AGL_BY_RUNE := [2179]u16{ 1266, 1265, 1255, 1252, 1251, 1239, 1240, 1241, 1259, 1260, 1270, 1256, 1243, 1264, 1263, 1249, 1244, 1245, 1246, 1247, 1261, 1268, 1254, 1242, 1250, 1267, 1253, 1257, 1258, 1262, 1269, 2135, 1453, 1996, 1835, 1335, 1945, 1029, 2006, 1928, 1934, 1093, 1961, 1225, 1600, 1946, 2127, 2420, 1885, 2255, 2201, 1496, 1483, 2115, 2084, 1387, 1799, 1220, 2083, 1709, 1432, 1552, 1991, 1098, 0, 49, 60, 84, 116, 177, 186, 211, 231, 274, 279, 302, 322, 332, 351, 415, 427, 430, 448, 516, 546, 600, 607, 616, 622, 644, 1145, 1102, 1149, 1089, 2302, 1546, 664, 1101, 1169, 1284, 1364, 1464, 1512, 1564, 1604, 1656, 1665, 1691, 1736, 1783, 1839, 1920, 1986, 2007, 2059, 2163, 2268, 2323, 2337, 2370, 2378, 2408, 1137, 1103, 1141, 1090, 1248, 1787, 1455, 1188, 2150, 1279, 2386, 1161, 2082, 1321, 1271, 1906, 1560, 1725, 2097, 2024, 1737, 1309, 1964, 2266, 2212, 882, 1773, 1926, 1947, 1186, 1898, 1907, 1561, 1896, 1891, 2209, 1992, 33, 5, 16, 47, 27, 42, 1, 65, 139, 117, 123, 133, 254, 235, 240, 244, 169, 348, 377, 354, 362, 411, 372, 1778, 405, 567, 547, 552, 558, 623, 532, 1528, 1020, 866, 876, 1099, 890, 1046, 895, 1179, 1385, 1365, 1371, 1380, 1619, 1605, 1610, 1613, 1448, 1833, 1862, 1840, 1847, 1914, 1856, 1327, 1909, 2287, 2269, 2274, 2279, 2379, 2199, 2383, 40, 1028, 7, 867, 41, 1036, 61, 1170, 69, 1182, 71, 1185, 64, 1178, 88, 1301, 92, 1305, 147, 1410, 119, 1367, 136, 1382, 156, 1423, 120, 1368, 195, 1522, 191, 1518, 198, 1525, 193, 1520, 223, 1574, 219, 1570, 270, 1651, 260, 1626, 237, 1607, 263, 1642, 249, 1344, 233, 1624, 276, 1659, 289, 1676, 1680, 305, 1692, 308, 1699, 307, 1698, 312, 1703, 319, 1732, 334, 1785, 336, 1789, 335, 1788, 1786, 153, 1419, 390, 1873, 358, 1844, 387, 1870, 352, 1859, 431, 2008, 433, 2014, 432, 2013, 489, 2060, 500, 2074, 495, 2068, 492, 2066, 520, 2170, 519, 2168, 518, 2167, 597, 2320, 580, 2299, 549, 2271, 592, 2316, 576, 2295, 583, 2306, 610, 2340, 627, 2382, 628, 645, 2409, 651, 2415, 646, 2410, 1728, 1162, 55, 59, 1164, 538, 2230, 404, 81, 1202, 87, 99, 110, 1356, 1314, 161, 496, 157, 181, 1494, 203, 189, 1599, 265, 269, 295, 1683, 1696, 1694, 330, 342, 1813, 360, 381, 1864, 388, 1871, 422, 1958, 2399, 539, 2231, 165, 1442, 2233, 531, 2198, 540, 570, 2289, 587, 604, 635, 2390, 663, 2434, 174, 176, 1462, 1463, 2265, 537, 2229, 1534, 2369, 1214, 1215, 1213, 1216, 86, 112, 1359, 303, 316, 1719, 333, 344, 1811, 14, 874, 238, 1608, 359, 1845, 550, 2272, 564, 2285, 559, 2280, 561, 2282, 563, 2284, 1451, 29, 892, 32, 894, 3, 897, 210, 1559, 192, 1519, 288, 1675, 402, 1900, 403, 1901, 175, 1460, 1657, 85, 111, 1357, 187, 1513, 43, 1047, 2, 896, 406, 1910, 26, 889, 37, 1023, 132, 1379, 143, 1400, 243, 1612, 258, 1622, 371, 1855, 389, 1872, 436, 2017, 443, 2049, 557, 2278, 578, 2297, 501, 2075, 1100, 1091, 1092, 1112, 1902, 1183, 1355, 1316, 1436, 2069, 2072, 1424, 1426, 1428, 1427, 1661, 1532, 1558, 1515, 2011, 1596, 1582, 1581, 1649, 1646, 1723, 1697, 1717, 1715, 1772, 1769, 1761, 1796, 1797, 1841, 1879, 1956, 2056, 2052, 2033, 2051, 2032, 2029, 2030, 446, 2109, 1440, 1346, 1443, 1441, 2247, 2238, 2270, 2312, 2333, 2336, 2368, 2403, 2433, 2413, 1459, 1461, 1535, 1538, 1536, 1276, 1113, 1425, 209, 1660, 1690, 1988, 1541, 1542, 1358, 1315, 1360, 2243, 2185, 2169, 1595, 1583, 1664, 2057, 2034, 447, 2367, 2401, 1974, 1298, 1234, 1011, 1019, 2046, 2043, 1537, 1539, 1064, 1065, 1066, 1063, 1209, 1174, 2332, 1480, 2081, 1508, 2331, 1740, 1550, 886, 1224, 1223, 2048, 2045, 2315, 1352, 1965, 1766, 1153, 1340, 2040, 1860, 2213, 1597, 2036, 1516, 2377, 1540, 2224, 2226, 2228, 2227, 2225, 1549, 885, 1211, 2216, 1739, 1918, 1155, 1341, 1324, 1585, 2042, 1598, 1176, 2329, 1300, 1293, 1171, 1157, 1233, 1226, 1230, 1227, 1547, 883, 1708, 2038, 1707, 1591, 2044, 2314, 1351, 1962, 1764, 1587, 1588, 1343, 1323, 2041, 1187, 1861, 2330, 1159, 1289, 1175, 1210, 1154, 1156, 2214, 1738, 1729, 1296, 2219, 2152, 2151, 2134, 2133, 2047, 1160, 2141, 2079, 2371, 2220, 1297, 1551, 887, 1950, 1687, 1318, 2398, 2217, 1158, 1836, 1837, 2397, 1994, 2232, 1326, 39, 1035, 159, 168, 267, 400, 591, 398, 1645, 38, 54, 188, 98, 158, 656, 167, 530, 264, 285, 306, 331, 350, 620, 399, 423, 441, 511, 517, 584, 421, 80, 424, 395, 266, 588, 1027, 1431, 1447, 1647, 2311, 1026, 1110, 1514, 1313, 1430, 2426, 1446, 2192, 1643, 1671, 1693, 1777, 1834, 2375, 1883, 1959, 2031, 2111, 2110, 2166, 2309, 1954, 1201, 1983, 1876, 1644, 2310, 1884, 2313, 1882, 1111, 2193, 585, 586, 589, 1955, 1877, 515, 104, 299, 491, 508, 2104, 180, 1468, 294, 1682, 227, 1589, 190, 1517, 510, 2108, 96, 1310, 1672, 2035, 2113, 2395, 906, 934, 935, 131, 937, 242, 939, 940, 941, 942, 943, 944, 945, 994, 25, 901, 902, 903, 904, 905, 907, 908, 909, 910, 911, 912, 913, 914, 369, 916, 917, 918, 919, 555, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 888, 949, 950, 951, 952, 953, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 954, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 999, 394, 1878, 995, 1000, 144, 1401, 642, 2406, 643, 2407, 640, 2404, 641, 2405, 300, 1689, 425, 1984, 996, 1001, 997, 1002, 273, 1655, 579, 2298, 396, 1880, 397, 1881, 410, 1913, 298, 1686, 2200, 2222, 1924, 1287, 1985, 933, 981, 201, 1530, 200, 1529, 659, 2429, 654, 2418, 283, 1669, 287, 1674, 286, 1673, 280, 1666, 152, 1418, 154, 1420, 420, 1944, 216, 1565, 164, 1439, 527, 2178, 595, 2318, 596, 2319, 217, 1566, 529, 2186, 76, 1197, 79, 1200, 509, 2107, 73, 1193, 75, 1196, 1925, 657, 2427, 284, 1670, 155, 1421, 78, 1199, 9, 869, 28, 891, 36, 1022, 251, 1617, 497, 1005, 498, 2071, 660, 2430, 655, 2419, 113, 1361, 261, 1627, 246, 1615, 373, 1857, 356, 1842, 357, 1843, 581, 2300, 562, 2283, 577, 2296, 77, 1198, 633, 2388, 44, 1048, 51, 1105, 52, 1106, 56, 1133, 66, 1180, 93, 1306, 94, 1307, 106, 1332, 89, 1302, 91, 1304, 149, 1412, 148, 1411, 125, 1373, 172, 1450, 121, 1369, 179, 1467, 205, 1543, 225, 1576, 226, 1577, 224, 1575, 221, 1572, 220, 1571, 271, 1652, 245, 1614, 281, 1667, 292, 1679, 297, 1685, 314, 1705, 315, 1706, 318, 1722, 310, 1701, 325, 1741, 327, 1759, 328, 1760, 340, 1793, 341, 1794, 346, 1814, 338, 1791, 412, 1915, 413, 1916, 392, 1875, 391, 1874, 416, 1921, 418, 1942, 437, 2018, 438, 2019, 439, 2020, 444, 2050, 502, 2076, 503, 2077, 490, 2061, 493, 2067, 504, 2078, 524, 2175, 525, 2176, 536, 2223, 522, 2172, 560, 2281, 599, 2322, 553, 2275, 598, 2321, 582, 2301, 606, 2335, 602, 2325, 614, 2345, 608, 2338, 611, 2341, 612, 2342, 613, 2343, 619, 2374, 618, 2373, 630, 2384, 649, 2412, 652, 2416, 661, 2431, 1584, 2174, 2366, 2400, 1045, 2129, 31, 893, 35, 1021, 17, 877, 19, 879, 20, 880, 22, 881, 18, 878, 8, 868, 11, 871, 12, 872, 13, 873, 10, 870, 137, 1383, 141, 1386, 171, 1449, 124, 1372, 127, 1375, 128, 1376, 130, 1377, 126, 1374, 256, 1620, 250, 1616, 375, 1858, 380, 1863, 363, 1848, 365, 1850, 366, 1851, 368, 1852, 364, 1849, 382, 1865, 384, 1867, 385, 1868, 386, 1869, 383, 1866, 566, 2286, 569, 2288, 571, 2290, 573, 2292, 574, 2293, 575, 2294, 572, 2291, 634, 2389, 631, 2385, 636, 2391, 639, 2402, 1422, 2425, 1018, 1008, 1006, 1007, 1603, 1477, 1417, 1414, 898, 1299, 2303, 2000, 2003, 2005, 2002, 1998, 1999, 1997, 1285, 1286, 1165, 1888, 2258, 1408, 1015, 1016, 1017, 1952, 1768, 2080, 1975, 1562, 1563, 2021, 1454, 1917, 1095, 1510, 2423, 1504, 1492, 2123, 2093, 1399, 1807, 1966, 1433, 1932, 1938, 1832, 2421, 1892, 2260, 2205, 1499, 1487, 2118, 2088, 1394, 1802, 1931, 1937, 1221, 1275, 1511, 1718, 1953, 2364, 2105, 1339, 173, 1189, 1173, 1465, 253, 1733, 1838, 2344, 440, 1973, 2179, 2235, 393, 1034, 1444, 1024, 1899, 2267, 1889, 2204, 1486, 2087, 401, 545, 534, 184, 183, 512, 505, 142, 343, 528, 146, 544, 1897, 2264, 2211, 1503, 1491, 2122, 2092, 1398, 1806, 2184, 1407, 2251, 1068, 1080, 1073, 1059, 1049, 1081, 1084, 1086, 1061, 1060, 1082, 1177, 1568, 1569, 1076, 1085, 1071, 1070, 1074, 1056, 1058, 1057, 1055, 1054, 1923, 1922, 1051, 1053, 1052, 1050, 1078, 1079, 1072, 1087, 1077, 1062, 1172, 2305, 1940, 1458, 1415, 97, 1545, 1403, 1817, 2157, 1816, 1976, 2158, 1763, 1767, 1329, 1094, 1167, 2009, 1982, 1630, 1908, 1031, 1328, 1927, 1826, 1724, 1727, 1637, 2304, 1631, 1294, 1237, 2191, 1108, 2012, 1981, 2114, 2027, 1097, 1236, 1041, 1025, 1040, 1527, 1042, 1628, 1819, 1434, 1823, 1710, 1553, 1714, 1557, 1776, 1775, 1824, 1820, 1825, 1821, 1712, 1555, 1713, 1556, 1822, 1972, 2156, 1827, 1829, 1979, 1980, 1828, 1830, 2022, 2023, 2154, 2161, 1206, 1765, 1204, 1205, 2165, 2164, 1951, 2039, 1347, 1278, 1277, 1711, 1554, 1409, 1593, 1238, 1977, 2028, 1044, 1978, 1636, 1633, 1905, 1312, 1212, 1032, 1033, 1311, 1132, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 1404, 2248, 2195, 1505, 1474, 2124, 2094, 1390, 1808, 2252, 1894, 2262, 2207, 1501, 1489, 2120, 2090, 1396, 1804, 2182, 1405, 2249, 2196, 1506, 1475, 2125, 2095, 1391, 1809, 2253, 1895, 2263, 2208, 1502, 1490, 2121, 2091, 1397, 1805, 2183, 1406, 2250, 2197, 1507, 1476, 2126, 2096, 1392, 1810, 2254, 1037, 1135, 1274, 1353, 1429, 1509, 1544, 1594, 1648, 1663, 1688, 1731, 1770, 1831, 1903, 1971, 1989, 2053, 2140, 2234, 2307, 2334, 2365, 2376, 2396, 2432, 15, 50, 68, 90, 122, 178, 194, 222, 239, 275, 290, 309, 326, 337, 361, 417, 428, 434, 499, 521, 551, 601, 609, 617, 626, 648, 875, 1104, 1181, 1303, 1370, 1466, 1521, 1573, 1609, 1658, 1677, 1700, 1758, 1790, 1846, 1941, 1987, 2015, 2073, 2171, 2273, 2324, 2339, 2372, 2381, 2411, 458, 459, 449, 451, 450, 452, 456, 457, 454, 455, 453, 477, 465, 485, 486, 473, 463, 462, 466, 484, 483, 472, 469, 468, 467, 470, 471, 476, 460, 461, 464, 481, 482, 475, 479, 480, 474, 488, 487, 478, 2308, 1334, 1134, 1716, 2055, 1735, 2099, 1331, 1478, 215, 2148, 2143, 2147, 2144, 2145, 2146, 2142, 213, 214, 1479, 2242, 2363, 1130, 2362, 1123, 2356, 2355, 2241, 2239, 2352, 2351, 1118, 2354, 2353, 2240, 843, 2349, 2350, 1481, 1730, 1203, 1348, 1168, 212, 1207, 1208, 846, 1638, 1639, 1120, 1119, 1128, 1129, 1904, 1695, 796, 2360, 801, 2361, 677, 1968, 1970, 684, 1967, 2393, 2130, 1640, 2159, 1469, 1366, 1756, 2137, 1580, 1320, 1217, 2139, 1578, 1319, 1219, 1592, 1990, 1779, 1780, 1107, 1781, 1782, 665, 772, 776, 790, 812, 683, 682, 681, 695, 706, 717, 728, 672, 739, 750, 761, 773, 781, 782, 783, 784, 785, 786, 787, 788, 823, 834, 845, 855, 666, 789, 791, 792, 793, 794, 795, 797, 798, 799, 800, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 835, 837, 839, 777, 840, 778, 844, 847, 848, 849, 863, 864, 865, 667, 668, 669, 670, 671, 673, 674, 675, 854, 856, 859, 860, 857, 858, 779, 850, 780, 851, 852, 853, 861, 862, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 729, 768, 734, 764, 735, 736, 737, 738, 740, 741, 742, 743, 731, 744, 745, 746, 747, 748, 749, 765, 751, 771, 752, 774, 753, 775, 754, 755, 769, 756, 766, 770, 757, 767, 758, 759, 760, 762, 763, 1345, 304, 1721, 1228, 946, 947, 998, 1003, 1004, 23, 62, 100, 101, 102, 206, 229, 323, 1280, 1281, 1288, 1282, 1283, 1292, 1322, 1325, 1273, 2026, 2237, 1890, 2058, 2210, 1190, 1192, 1229, 1232, 1336, 1338, 1601, 1602, 1948, 1949, 1096, 1163, 1354, 1445, 1650, 1734, 1771, 1912, 2054, 2149, 2246, 57, 63, 82, 107, 230, 320, 353, 376, 442, 494, 535, 647, 1457, 1337, 1030, 2422, 1893, 2261, 2206, 1500, 1488, 2119, 2089, 1395, 1803, 1995, 207, 46, 58, 83, 109, 166, 185, 208, 228, 268, 278, 301, 321, 329, 347, 408, 426, 429, 445, 514, 543, 594, 605, 615, 621, 638, 662, 1456, 1191, 103, 324, 24, 72, 1993, 34, 6, 21, 48, 30, 45, 4, 67, 140, 118, 129, 134, 255, 236, 241, 247, 170, 349, 378, 355, 367, 414, 374, 407, 568, 548, 554, 565, 624, 533, 629, 1748, 2063, 2062, 2065, 2064, 1749, 1747, 1746, 1745, 1752, 1751, 1750, 1755, 1754, 1753, 1744, 1743, 1742, 2189, 2188, 2187, 1798, 2010, 1088, 1067, 2025, 1272, 2236, 1933, 1930, 1929, 1148, 1147, 1146, 1140, 1139, 1138, 1136, 1634, 1939, 1936, 1935, 1152, 1151, 1150, 1144, 1143, 1142, 1039, 1470, 1473, 1493, 1471, 1472, 1010, } // --------------------------------------------------------------------------- // Name matching // --------------------------------------------------------------------------- // std_strip_subset removes the "ABCDEF+" tag a subsetter puts in front of a // /BaseFont name (ISO 32000-2, 9.9.2). The format says six uppercase letters, // but producers emit four, and lowercase, often enough that the check here is // "letters then a plus, within the first eight bytes" instead. A real font name // with a '+' that early is not a thing, so nothing legitimate is eaten. @(private) std_strip_subset :: proc(name: string) -> string { limit := min(len(name), 8) for i in 0 ..< limit { c := name[i] if c == '+' { return i > 0 ? name[i + 1:] : name } if !((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) { break } } return name } // std_normalize lowercases `name` into `buf` and drops everything that is not a // letter or a digit, so that "Arial-BoldMT", "Arial,Bold" and "ArialBold" all // compare equal. Returns the prefix of buf that was filled; a name longer than // buf is truncated, which only loses a style suffix on a name no producer // writes. @(private) std_normalize :: proc(name: string, buf: []u8) -> string { n := 0 for i in 0 ..< len(name) { if n >= len(buf) { break } c := name[i] if c >= 'A' && c <= 'Z' { c += 'a' - 'A' } if (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') { buf[n] = c n += 1 } } return string(buf[:n]) } // std_contains is `strings.contains` without the import; it runs over a name // that came out of a file, so it is written to be obviously bounded. @(private) std_contains :: proc(hay, needle: string) -> bool { if len(needle) == 0 { return true } if len(needle) > len(hay) { return false } for i in 0 ..= len(hay) - len(needle) { if hay[i:i + len(needle)] == needle { return true } } return false } // std_font_lookup matches a /BaseFont name against the standard 14 and returns // the index of the metrics to use. // // Matching is deliberately loose in one direction and strict in the other: any // spelling of a standard font resolves (subset tag stripped, case and // punctuation ignored, the Monotype and URW aliases folded in, style read out of // the name), but a font that is not one of the fourteen returns false rather // than being silently substituted. Choosing a substitute for an arbitrary // missing font is a decision about descriptor flags, and it belongs in // font.odin, not in a metrics table. @(private) std_font_lookup :: proc(base_font: string) -> (index: int, ok: bool) { buf: [128]u8 n := std_normalize(std_strip_subset(base_font), buf[:]) if len(n) == 0 { return 0, false } // The two symbolic fonts have no styles: "Symbol,Bold" is still Symbol. if std_contains(n, "zapfdingbat") || std_contains(n, "dingbats") { return STD_ZAPF_DINGBATS, true } if std_contains(n, "symbol") { return STD_SYMBOL, true } family := -1 switch { case std_contains(n, "courier") || std_contains(n, "nimbusmon") || std_contains(n, "monospac"): family = STD_COURIER case std_contains(n, "helvetica") || std_contains(n, "arial") || std_contains(n, "nimbussan"): family = STD_HELVETICA case std_contains(n, "times") || std_contains(n, "nimbusrom"): family = STD_TIMES_ROMAN } if family < 0 { return 0, false } style := 0 // "semibold" and "extrabold" both contain "bold"; "black" and "heavy" are // the other names producers give the bold face of these families. if std_contains(n, "bold") || std_contains(n, "black") || std_contains(n, "heavy") { style += 1 } if std_contains(n, "italic") || std_contains(n, "oblique") { style += 2 } return family + style, true } // std_font_name is the canonical PostScript name of a standard font, or "" for // an index that is not one. @(private) std_font_name :: proc(index: int) -> string { if index < 0 || index >= STD_FONT_COUNT { return "" } return STD_FONT_NAMES[index] } // std_font_is_symbolic reports whether the font uses a built-in, font-specific // encoding rather than a Latin text encoding -- true only for Symbol and // ZapfDingbats, whose descriptors set the Symbolic flag (ISO 32000-2, 9.8.2). @(private) std_font_is_symbolic :: proc(index: int) -> bool { return index == STD_SYMBOL || index == STD_ZAPF_DINGBATS } // std_font_builtin_encoding is the encoding a standard font uses when the font // dictionary gives none. The twelve text fonts are AdobeStandardEncoding, which // is what their AFMs declare; Symbol and ZapfDingbats each have their own. // Returns nil for an index that is not a standard font. @(private) std_font_builtin_encoding :: proc(index: int) -> ^[256]string { switch { case index == STD_SYMBOL: return &ENC_SYMBOL case index == STD_ZAPF_DINGBATS: return &ENC_ZAPF case index >= 0 && index < STD_FONT_COUNT: return &ENC_STANDARD } return nil } // --------------------------------------------------------------------------- // Widths // --------------------------------------------------------------------------- // std_glyph_search is a binary search over a sorted glyph-name table. Odin // compares strings byte-wise, which is the order the tables were generated in. @(private) std_glyph_search :: proc(names: []string, name: string) -> (int, bool) { lo, hi := 0, len(names) for lo < hi { mid := lo + (hi - lo) / 2 if names[mid] < name { lo = mid + 1 } else { hi = mid } } if lo < len(names) && names[lo] == name { return lo, true } return 0, false } // std_font_width is the advance of one glyph of a standard font, in glyph space // (1/1000 of the text space unit; all fourteen are 1000 units per em). // // ok is false when the font has no such glyph, which is the caller's cue to fall // back to the descriptor's /MissingWidth. Courier is the exception: it is // fixed-pitch, so 600 is the answer for any name at all, including one the font // cannot draw -- a viewer still advances the pen by one cell. @(private) std_font_width :: proc(index: int, glyph_name: string) -> (width: f64, ok: bool) { if len(glyph_name) == 0 { return 0, false } switch { case index >= STD_COURIER && index <= STD_COURIER_BOLD_OBLIQUE: return 600, true case index >= STD_HELVETICA && index <= STD_TIMES_BOLD_ITALIC: i := std_glyph_search(STD_TEXT_GLYPHS[:], glyph_name) or_return return f64(STD_TEXT_WIDTHS[index - STD_HELVETICA][i]), true case index == STD_SYMBOL: i := std_glyph_search(STD_SYMBOL_GLYPHS[:], glyph_name) or_return return f64(STD_SYMBOL_WIDTHS[i]), true case index == STD_ZAPF_DINGBATS: i := std_glyph_search(STD_ZAPF_GLYPHS[:], glyph_name) or_return return f64(STD_ZAPF_WIDTHS[i]), true } return 0, false } // --------------------------------------------------------------------------- // The built-in encodings // --------------------------------------------------------------------------- // // Each is 256 glyph names, "" where the encoding leaves the code undefined. The // tables are read-only and live for the life of the program, so handing back a // pointer costs nothing and lets a font apply /Differences over a copy. @(private) encoding_standard :: proc() -> ^[256]string { return &ENC_STANDARD } @(private) encoding_winansi :: proc() -> ^[256]string { return &ENC_WINANSI } @(private) encoding_macroman :: proc() -> ^[256]string { return &ENC_MACROMAN } @(private) encoding_macexpert :: proc() -> ^[256]string { return &ENC_MACEXPERT } @(private) encoding_symbol :: proc() -> ^[256]string { return &ENC_SYMBOL } @(private) encoding_zapf :: proc() -> ^[256]string { return &ENC_ZAPF } // encoding_macroman_code is ENC_MACROMAN read the other way round: the code a // glyph name sits at in MacRomanEncoding, if it sits at one. // // ISO 32000-2, 9.6.5.4 needs exactly this to reach a non-symbolic TrueType // font's (1,0) cmap, which is keyed by Mac Roman codes and not by the codes // the PDF's own /Encoding uses. Without it a font whose only cmap is (1,0) // resolves nothing above ASCII. // // A linear scan rather than a second sorted table: it runs only for a code the // other routes could not resolve, and a reverse table would be one more thing // to keep in step with the forward one for no measurable gain. "space" is the // one name the encoding repeats (0x20 and 0xCA); the lower code is the one // meant, and scanning upwards is what returns it. @(private) encoding_macroman_code :: proc(name: string) -> (u8, bool) { if name == "" { return 0, false } for nm, i in ENC_MACROMAN { if nm == name { return u8(i), true } } return 0, false } // encoding_by_name resolves an /Encoding or /BaseEncoding name. Returns nil for // anything else, which the caller must read as "keep the font's built-in // encoding" -- an unknown name is not a reason to reset a font to Standard. // The bare forms are accepted because they appear in the wild. @(private) encoding_by_name :: proc(name: string) -> ^[256]string { switch name { case "WinAnsiEncoding", "WinAnsi": return &ENC_WINANSI case "MacRomanEncoding", "MacRoman": return &ENC_MACROMAN case "MacExpertEncoding", "MacExpert": return &ENC_MACEXPERT case "StandardEncoding", "Standard": return &ENC_STANDARD case "SymbolEncoding", "Symbol": return &ENC_SYMBOL case "ZapfDingbatsEncoding", "ZapfDingbats": return &ENC_ZAPF } return nil } // --------------------------------------------------------------------------- // Glyph names and Unicode // --------------------------------------------------------------------------- // agl_search is a binary search over AGL_TABLE, which is sorted by name. @(private) agl_search :: proc(name: string) -> (rune, bool) { lo, hi := 0, len(AGL_TABLE) for lo < hi { mid := lo + (hi - lo) / 2 if AGL_TABLE[mid].name < name { lo = mid + 1 } else { hi = mid } } if lo < len(AGL_TABLE) && AGL_TABLE[lo].name == name { return AGL_TABLE[lo].cp, true } return -1, false } // agl_hex_prefix reads exactly `n` hex digits from the front of s. The AGL says // uppercase, but "uni00e9" is common enough in real fonts that rejecting it // would lose characters for no gain. @(private) agl_hex_prefix :: proc(s: string, n: int) -> (cp: rune, ok: bool) { if len(s) < n { return -1, false } v := 0 for i in 0 ..< n { // hex_value is object.odin's, and is the package's one hex digit // decoder: a second copy here is a second place to get it wrong. d, valid := hex_value(s[i]) if !valid { return -1, false } v = v * 16 + int(d) } return rune(v), true } // agl_valid_rune rejects what cannot be a character: surrogate halves (which a // glyph name is explicitly not allowed to encode) and anything past the end of // the code space. @(private) agl_valid_rune :: proc(r: rune) -> bool { return r >= 0 && r <= 0x10FFFF && !(r >= 0xD800 && r <= 0xDFFF) } // agl_is_index_name reports whether a name is one of the "this is glyph number // N" spellings -- gNN, cidNN, indexNN, glyphNN -- that subsetters and broken // producers emit. They carry no Unicode at all, and reading the digits as a // character would put arbitrary text into a document that has none. // // No AGL name has this shape, so today the fallthrough below would answer -1 // anyway; the rule is written out so that it survives a change to the table, and // the test asserts the table still has no such name. @(private) agl_is_index_name :: proc(name: string) -> bool { prefixes := [?]string{"g", "cid", "index", "glyph"} for p in prefixes { if len(name) > len(p) && name[:len(p)] == p { all_digits := true for i in len(p) ..< len(name) { if name[i] < '0' || name[i] > '9' { all_digits = false break } } if all_digits { return true } } } return false } // glyph_name_to_rune maps a glyph name to Unicode by the Adobe Glyph List // algorithm ("Unicode and Glyph Names", Adobe technical note), returning -1 when // the name carries no character. // // The algorithm, in order: // // 1. drop everything from the first '.', so "a.sc" is "a" and ".notdef" is // nothing at all; // 2. split on '_' and take the first component -- "f_i" is a ligature glyph, // and one rune has to stand for it; // 3. look the component up in the AGL; // 4. "uniXXXX" with a multiple of four hex digits, first code point wins; // 5. "uXXXX" through "uXXXXXX"; // 6. otherwise nothing. // // The AGL is consulted before the uni/u forms because a legitimate name can look // like one: "union" starts with "uni" and would otherwise be searched for hex. @(private) glyph_name_to_rune :: proc(name: string) -> rune { s := name for i in 0 ..< len(s) { if s[i] == '.' { s = s[:i] break } } for i in 0 ..< len(s) { if s[i] == '_' { s = s[:i] break } } if len(s) == 0 { return -1 } if r, ok := agl_search(s); ok { return r } if agl_is_index_name(s) { return -1 } if len(s) > 3 && s[:3] == "uni" { // Four hex digits per code point, and every group has to be whole and in // range for the name to mean anything -- "uni41" and "uni0041D800" are // both nothing. Only the first code point survives as a rune. rest := s[3:] first := rune(-1) for i := 0; i < len(rest); i += 4 { r, ok := agl_hex_prefix(rest[i:], 4) if !ok || !agl_valid_rune(r) { return -1 } if i == 0 { first = r } } return first } if len(s) >= 5 && len(s) <= 7 && s[0] == 'u' { if r, ok := agl_hex_prefix(s[1:], len(s) - 1); ok && agl_valid_rune(r) { return r } } return -1 } // rune_to_glyph_name is the other direction: the name a font is most likely to // use for a character, or "" when the AGL has none. Where several names share a // code point the one Adobe's AGLFN list prefers wins, so the ASCII range comes // back as the plain names ("A", "space", "period") and round-trips through // glyph_name_to_rune. @(private) rune_to_glyph_name :: proc(r: rune) -> string { lo, hi := 0, len(AGL_BY_RUNE) for lo < hi { mid := lo + (hi - lo) / 2 if AGL_TABLE[AGL_BY_RUNE[mid]].cp < r { lo = mid + 1 } else { hi = mid } } if lo < len(AGL_BY_RUNE) { e := AGL_TABLE[AGL_BY_RUNE[lo]] if e.cp == r { return e.name } } return "" }