let charRefTable = [ "AElig;", 0x00C6; "AElig", 0x00C6; "AMP;", 0x0026; "AMP", 0x0026; "Aacute;", 0x00C1; "Aacute", 0x00C1; "Acirc;", 0x00C2; "Acirc", 0x00C2; "Agrave;", 0x00C0; "Agrave", 0x00C0; "Alpha;", 0x0391; "Aring;", 0x00C5; "Aring", 0x00C5; "Atilde;", 0x00C3; "Atilde", 0x00C3; "Auml;", 0x00C4; "Auml", 0x00C4; "Beta;", 0x0392; "COPY;", 0x00A9; "COPY", 0x00A9; "Ccedil;", 0x00C7; "Ccedil", 0x00C7; "Chi;", 0x03A7; "Dagger;", 0x2021; "Delta;", 0x0394; "ETH;", 0x00D0; "ETH", 0x00D0; "Eacute;", 0x00C9; "Eacute", 0x00C9; "Ecirc;", 0x00CA; "Ecirc", 0x00CA; "Egrave;", 0x00C8; "Egrave", 0x00C8; "Epsilon;", 0x0395; "Eta;", 0x0397; "Euml;", 0x00CB; "Euml", 0x00CB; "GT;", 0x003E; "GT", 0x003E; "Gamma;", 0x0393; "Iacute;", 0x00CD; "Iacute", 0x00CD; "Icirc;", 0x00CE; "Icirc", 0x00CE; "Igrave;", 0x00CC; "Igrave", 0x00CC; "Iota;", 0x0399; "Iuml;", 0x00CF; "Iuml", 0x00CF; "Kappa;", 0x039A; "LT;", 0x003C; "LT", 0x003C; "Lambda;", 0x039B; "Mu;", 0x039C; "Ntilde;", 0x00D1; "Ntilde", 0x00D1; "Nu;", 0x039D; "OElig;", 0x0152; "Oacute;", 0x00D3; "Oacute", 0x00D3; "Ocirc;", 0x00D4; "Ocirc", 0x00D4; "Ograve;", 0x00D2; "Ograve", 0x00D2; "Omega;", 0x03A9; "Omicron;", 0x039F; "Oslash;", 0x00D8; "Oslash", 0x00D8; "Otilde;", 0x00D5; "Otilde", 0x00D5; "Ouml;", 0x00D6; "Ouml", 0x00D6; "Phi;", 0x03A6; "Pi;", 0x03A0; "Prime;", 0x2033; "Psi;", 0x03A8; "QUOT;", 0x0022; "QUOT", 0x0022; "REG;", 0x00AE; "REG", 0x00AE; "Rho;", 0x03A1; "Scaron;", 0x0160; "Sigma;", 0x03A3; "THORN;", 0x00DE; "THORN", 0x00DE; "TRADE;", 0x2122; "Tau;", 0x03A4; "Theta;", 0x0398; "Uacute;", 0x00DA; "Uacute", 0x00DA; "Ucirc;", 0x00DB; "Ucirc", 0x00DB; "Ugrave;", 0x00D9; "Ugrave", 0x00D9; "Upsilon;", 0x03A5; "Uuml;", 0x00DC; "Uuml", 0x00DC; "Xi;", 0x039E; "Yacute;", 0x00DD; "Yacute", 0x00DD; "Yuml;", 0x0178; "Zeta;", 0x0396; "aacute;", 0x00E1; "aacute", 0x00E1; "acirc;", 0x00E2; "acirc", 0x00E2; "acute;", 0x00B4; "acute", 0x00B4; "aelig;", 0x00E6; "aelig", 0x00E6; "agrave;", 0x00E0; "agrave", 0x00E0; "alefsym;", 0x2135; "alpha;", 0x03B1; "amp;", 0x0026; "amp", 0x0026; "and;", 0x2227; "ang;", 0x2220; "apos;", 0x0027; "aring;", 0x00E5; "aring", 0x00E5; "asymp;", 0x2248; "atilde;", 0x00E3; "atilde", 0x00E3; "auml;", 0x00E4; "auml", 0x00E4; "bdquo;", 0x201E; "beta;", 0x03B2; "brvbar;", 0x00A6; "brvbar", 0x00A6; "bull;", 0x2022; "cap;", 0x2229; "ccedil;", 0x00E7; "ccedil", 0x00E7; "cedil;", 0x00B8; "cedil", 0x00B8; "cent;", 0x00A2; "cent", 0x00A2; "chi;", 0x03C7; "circ;", 0x02C6; "clubs;", 0x2663; "cong;", 0x2245; "copy;", 0x00A9; "copy", 0x00A9; "crarr;", 0x21B5; "cup;", 0x222A; "curren;", 0x00A4; "curren", 0x00A4; "dArr;", 0x21D3; "dagger;", 0x2020; "darr;", 0x2193; "deg;", 0x00B0; "deg", 0x00B0; "delta;", 0x03B4; "diams;", 0x2666; "divide;", 0x00F7; "divide", 0x00F7; "eacute;", 0x00E9; "eacute", 0x00E9; "ecirc;", 0x00EA; "ecirc", 0x00EA; "egrave;", 0x00E8; "egrave", 0x00E8; "empty;", 0x2205; "emsp;", 0x2003; "ensp;", 0x2002; "epsilon;", 0x03B5; "equiv;", 0x2261; "eta;", 0x03B7; "eth;", 0x00F0; "eth", 0x00F0; "euml;", 0x00EB; "euml", 0x00EB; "euro;", 0x20AC; "exist;", 0x2203; "fnof;", 0x0192; "forall;", 0x2200; "frac12;", 0x00BD; "frac12", 0x00BD; "frac14;", 0x00BC; "frac14", 0x00BC; "frac34;", 0x00BE; "frac34", 0x00BE; "frasl;", 0x2044; "gamma;", 0x03B3; "ge;", 0x2265; "gt;", 0x003E; "gt", 0x003E; "hArr;", 0x21D4; "harr;", 0x2194; "hearts;", 0x2665; "hellip;", 0x2026; "iacute;", 0x00ED; "iacute", 0x00ED; "icirc;", 0x00EE; "icirc", 0x00EE; "iexcl;", 0x00A1; "iexcl", 0x00A1; "igrave;", 0x00EC; "igrave", 0x00EC; "image;", 0x2111; "infin;", 0x221E; "int;", 0x222B; "iota;", 0x03B9; "iquest;", 0x00BF; "iquest", 0x00BF; "isin;", 0x2208; "iuml;", 0x00EF; "iuml", 0x00EF; "kappa;", 0x03BA; "lArr;", 0x21D0; "lambda;", 0x03BB; "lang;", 0x27E8; "laquo;", 0x00AB; "laquo", 0x00AB; "larr;", 0x2190; "lceil;", 0x2308; "ldquo;", 0x201C; "le;", 0x2264; "lfloor;", 0x230A; "lowast;", 0x2217; "loz;", 0x25CA; "lrm;", 0x200E; "lsaquo;", 0x2039; "lsquo;", 0x2018; "lt;", 0x003C; "lt", 0x003C; "macr;", 0x00AF; "macr", 0x00AF; "mdash;", 0x2014; "micro;", 0x00B5; "micro", 0x00B5; "middot;", 0x00B7; "middot", 0x00B7; "minus;", 0x2212; "mu;", 0x03BC; "nabla;", 0x2207; "nbsp;", 0x00A0; "nbsp", 0x00A0; "ndash;", 0x2013; "ne;", 0x2260; "ni;", 0x220B; "not;", 0x00AC; "not", 0x00AC; "notin;", 0x2209; "nsub;", 0x2284; "ntilde;", 0x00F1; "ntilde", 0x00F1; "nu;", 0x03BD; "oacute;", 0x00F3; "oacute", 0x00F3; "ocirc;", 0x00F4; "ocirc", 0x00F4; "oelig;", 0x0153; "ograve;", 0x00F2; "ograve", 0x00F2; "oline;", 0x203E; "omega;", 0x03C9; "omicron;", 0x03BF; "oplus;", 0x2295; "or;", 0x2228; "ordf;", 0x00AA; "ordf", 0x00AA; "ordm;", 0x00BA; "ordm", 0x00BA; "oslash;", 0x00F8; "oslash", 0x00F8; "otilde;", 0x00F5; "otilde", 0x00F5; "otimes;", 0x2297; "ouml;", 0x00F6; "ouml", 0x00F6; "para;", 0x00B6; "para", 0x00B6; "part;", 0x2202; "permil;", 0x2030; "perp;", 0x22A5; "phi;", 0x03C6; "pi;", 0x03C0; "piv;", 0x03D6; "plusmn;", 0x00B1; "plusmn", 0x00B1; "pound;", 0x00A3; "pound", 0x00A3; "prime;", 0x2032; "prod;", 0x220F; "prop;", 0x221D; "psi;", 0x03C8; "quot;", 0x0022; "quot", 0x0022; "rArr;", 0x21D2; "radic;", 0x221A; "rang;", 0x27E9; "raquo;", 0x00BB; "raquo", 0x00BB; "rarr;", 0x2192; "rceil;", 0x2309; "rdquo;", 0x201D; "real;", 0x211C; "reg;", 0x00AE; "reg", 0x00AE; "rfloor;", 0x230B; "rho;", 0x03C1; "rlm;", 0x200F; "rsaquo;", 0x203A; "rsquo;", 0x2019; "sbquo;", 0x201A; "scaron;", 0x0161; "sdot;", 0x22C5; "sect;", 0x00A7; "sect", 0x00A7; "shy;", 0x00AD; "shy", 0x00AD; "sigma;", 0x03C3; "sigmaf;", 0x03C2; "sim;", 0x223C; "spades;", 0x2660; "sub;", 0x2282; "sube;", 0x2286; "sum;", 0x2211; "sup1;", 0x00B9; "sup1", 0x00B9; "sup2;", 0x00B2; "sup2", 0x00B2; "sup3;", 0x00B3; "sup3", 0x00B3; "sup;", 0x2283; "supe;", 0x2287; "szlig;", 0x00DF; "szlig", 0x00DF; "tau;", 0x03C4; "there4;", 0x2234; "theta;", 0x03B8; "thetasym;", 0x03D1; "thinsp;", 0x2009; "thorn;", 0x00FE; "thorn", 0x00FE; "tilde;", 0x02DC; "times;", 0x00D7; "times", 0x00D7; "trade;", 0x2122; "uArr;", 0x21D1; "uacute;", 0x00FA; "uacute", 0x00FA; "uarr;", 0x2191; "ucirc;", 0x00FB; "ucirc", 0x00FB; "ugrave;", 0x00F9; "ugrave", 0x00F9; "uml;", 0x00A8; "uml", 0x00A8; "upsih;", 0x03D2; "upsilon;", 0x03C5; "uuml;", 0x00FC; "uuml", 0x00FC; "weierp;", 0x2118; "xi;", 0x03BE; "yacute;", 0x00FD; "yacute", 0x00FD; "yen;", 0x00A5; "yen", 0x00A5; "yuml;", 0x00FF; "yuml", 0x00FF; "zeta;", 0x03B6; "zwj;", 0x200D; "zwnj;", 0x200C; ] let charRefMappingTable = [ 0x0D, 0x000A; 0x80, 0x20AC; 0x81, 0xFFFD; 0x82, 0x201A; 0x83, 0x0192; 0x84, 0x201E; 0x85, 0x2026; 0x86, 0x2020; 0x87, 0x2021; 0x88, 0x02C6; 0x89, 0x2030; 0x8A, 0x0160; 0x8B, 0x2039; 0x8C, 0x0152; 0x8D, 0xFFFD; 0x8E, 0x017D; 0x8F, 0xFFFD; 0x90, 0xFFFD; 0x91, 0x2018; 0x92, 0x2019; 0x93, 0x201C; 0x94, 0x201D; 0x95, 0x2022; 0x96, 0x2013; 0x97, 0x2014; 0x98, 0x02DC; 0x99, 0x2122; 0x9A, 0x0161; 0x9B, 0x203A; 0x9C, 0x0153; 0x9D, 0xFFFD; 0x9E, 0x017E; 0x9F, 0x0178; ] let charRefInvalidRanges = [ 0x0000, 0x0008; 0x000B, 0x000B; 0x000E, 0x001F; 0x007F, 0x009F; 0xD800, 0xDFFF; 0xFDD0, 0xFDDF; 0xFFFE, 0xFFFF; 0x1FFFE, 0x1FFFF; 0x2FFFE, 0x2FFFF; 0x3FFFE, 0x3FFFF; 0x4FFFE, 0x4FFFF; 0x5FFFE, 0x5FFFF; 0x6FFFE, 0x6FFFF; 0x7FFFE, 0x7FFFF; 0x8FFFE, 0x8FFFF; 0x9FFFE, 0x9FFFF; 0xAFFFE, 0xAFFFF; 0xBFFFE, 0xBFFFF; 0xCFFFE, 0xCFFFF; 0xDFFFE, 0xDFFFF; 0xEFFFE, 0xEFFFF; 0xFFFFE, 0xFFFFF; 0x10FFFE, 0x10FFFF ]