[compat] Fix compat_shlex_split for non-ASCII input
[youtube-dl] / youtube_dl / compat.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import binascii
5 import collections
6 import email
7 import getpass
8 import io
9 import optparse
10 import os
11 import re
12 import shlex
13 import shutil
14 import socket
15 import struct
16 import subprocess
17 import sys
18 import itertools
19 import xml.etree.ElementTree
20
21
22 try:
23     import urllib.request as compat_urllib_request
24 except ImportError:  # Python 2
25     import urllib2 as compat_urllib_request
26
27 try:
28     import urllib.error as compat_urllib_error
29 except ImportError:  # Python 2
30     import urllib2 as compat_urllib_error
31
32 try:
33     import urllib.parse as compat_urllib_parse
34 except ImportError:  # Python 2
35     import urllib as compat_urllib_parse
36
37 try:
38     from urllib.parse import urlparse as compat_urllib_parse_urlparse
39 except ImportError:  # Python 2
40     from urlparse import urlparse as compat_urllib_parse_urlparse
41
42 try:
43     import urllib.parse as compat_urlparse
44 except ImportError:  # Python 2
45     import urlparse as compat_urlparse
46
47 try:
48     import urllib.response as compat_urllib_response
49 except ImportError:  # Python 2
50     import urllib as compat_urllib_response
51
52 try:
53     import http.cookiejar as compat_cookiejar
54 except ImportError:  # Python 2
55     import cookielib as compat_cookiejar
56
57 try:
58     import http.cookies as compat_cookies
59 except ImportError:  # Python 2
60     import Cookie as compat_cookies
61
62 try:
63     import html.entities as compat_html_entities
64 except ImportError:  # Python 2
65     import htmlentitydefs as compat_html_entities
66
67 try:  # Python >= 3.3
68     compat_html_entities_html5 = compat_html_entities.html5
69 except AttributeError:
70     # Copied from CPython 3.5.1 html/entities.py
71     compat_html_entities_html5 = {
72         'Aacute': '\xc1',
73         'aacute': '\xe1',
74         'Aacute;': '\xc1',
75         'aacute;': '\xe1',
76         'Abreve;': '\u0102',
77         'abreve;': '\u0103',
78         'ac;': '\u223e',
79         'acd;': '\u223f',
80         'acE;': '\u223e\u0333',
81         'Acirc': '\xc2',
82         'acirc': '\xe2',
83         'Acirc;': '\xc2',
84         'acirc;': '\xe2',
85         'acute': '\xb4',
86         'acute;': '\xb4',
87         'Acy;': '\u0410',
88         'acy;': '\u0430',
89         'AElig': '\xc6',
90         'aelig': '\xe6',
91         'AElig;': '\xc6',
92         'aelig;': '\xe6',
93         'af;': '\u2061',
94         'Afr;': '\U0001d504',
95         'afr;': '\U0001d51e',
96         'Agrave': '\xc0',
97         'agrave': '\xe0',
98         'Agrave;': '\xc0',
99         'agrave;': '\xe0',
100         'alefsym;': '\u2135',
101         'aleph;': '\u2135',
102         'Alpha;': '\u0391',
103         'alpha;': '\u03b1',
104         'Amacr;': '\u0100',
105         'amacr;': '\u0101',
106         'amalg;': '\u2a3f',
107         'AMP': '&',
108         'amp': '&',
109         'AMP;': '&',
110         'amp;': '&',
111         'And;': '\u2a53',
112         'and;': '\u2227',
113         'andand;': '\u2a55',
114         'andd;': '\u2a5c',
115         'andslope;': '\u2a58',
116         'andv;': '\u2a5a',
117         'ang;': '\u2220',
118         'ange;': '\u29a4',
119         'angle;': '\u2220',
120         'angmsd;': '\u2221',
121         'angmsdaa;': '\u29a8',
122         'angmsdab;': '\u29a9',
123         'angmsdac;': '\u29aa',
124         'angmsdad;': '\u29ab',
125         'angmsdae;': '\u29ac',
126         'angmsdaf;': '\u29ad',
127         'angmsdag;': '\u29ae',
128         'angmsdah;': '\u29af',
129         'angrt;': '\u221f',
130         'angrtvb;': '\u22be',
131         'angrtvbd;': '\u299d',
132         'angsph;': '\u2222',
133         'angst;': '\xc5',
134         'angzarr;': '\u237c',
135         'Aogon;': '\u0104',
136         'aogon;': '\u0105',
137         'Aopf;': '\U0001d538',
138         'aopf;': '\U0001d552',
139         'ap;': '\u2248',
140         'apacir;': '\u2a6f',
141         'apE;': '\u2a70',
142         'ape;': '\u224a',
143         'apid;': '\u224b',
144         'apos;': "'",
145         'ApplyFunction;': '\u2061',
146         'approx;': '\u2248',
147         'approxeq;': '\u224a',
148         'Aring': '\xc5',
149         'aring': '\xe5',
150         'Aring;': '\xc5',
151         'aring;': '\xe5',
152         'Ascr;': '\U0001d49c',
153         'ascr;': '\U0001d4b6',
154         'Assign;': '\u2254',
155         'ast;': '*',
156         'asymp;': '\u2248',
157         'asympeq;': '\u224d',
158         'Atilde': '\xc3',
159         'atilde': '\xe3',
160         'Atilde;': '\xc3',
161         'atilde;': '\xe3',
162         'Auml': '\xc4',
163         'auml': '\xe4',
164         'Auml;': '\xc4',
165         'auml;': '\xe4',
166         'awconint;': '\u2233',
167         'awint;': '\u2a11',
168         'backcong;': '\u224c',
169         'backepsilon;': '\u03f6',
170         'backprime;': '\u2035',
171         'backsim;': '\u223d',
172         'backsimeq;': '\u22cd',
173         'Backslash;': '\u2216',
174         'Barv;': '\u2ae7',
175         'barvee;': '\u22bd',
176         'Barwed;': '\u2306',
177         'barwed;': '\u2305',
178         'barwedge;': '\u2305',
179         'bbrk;': '\u23b5',
180         'bbrktbrk;': '\u23b6',
181         'bcong;': '\u224c',
182         'Bcy;': '\u0411',
183         'bcy;': '\u0431',
184         'bdquo;': '\u201e',
185         'becaus;': '\u2235',
186         'Because;': '\u2235',
187         'because;': '\u2235',
188         'bemptyv;': '\u29b0',
189         'bepsi;': '\u03f6',
190         'bernou;': '\u212c',
191         'Bernoullis;': '\u212c',
192         'Beta;': '\u0392',
193         'beta;': '\u03b2',
194         'beth;': '\u2136',
195         'between;': '\u226c',
196         'Bfr;': '\U0001d505',
197         'bfr;': '\U0001d51f',
198         'bigcap;': '\u22c2',
199         'bigcirc;': '\u25ef',
200         'bigcup;': '\u22c3',
201         'bigodot;': '\u2a00',
202         'bigoplus;': '\u2a01',
203         'bigotimes;': '\u2a02',
204         'bigsqcup;': '\u2a06',
205         'bigstar;': '\u2605',
206         'bigtriangledown;': '\u25bd',
207         'bigtriangleup;': '\u25b3',
208         'biguplus;': '\u2a04',
209         'bigvee;': '\u22c1',
210         'bigwedge;': '\u22c0',
211         'bkarow;': '\u290d',
212         'blacklozenge;': '\u29eb',
213         'blacksquare;': '\u25aa',
214         'blacktriangle;': '\u25b4',
215         'blacktriangledown;': '\u25be',
216         'blacktriangleleft;': '\u25c2',
217         'blacktriangleright;': '\u25b8',
218         'blank;': '\u2423',
219         'blk12;': '\u2592',
220         'blk14;': '\u2591',
221         'blk34;': '\u2593',
222         'block;': '\u2588',
223         'bne;': '=\u20e5',
224         'bnequiv;': '\u2261\u20e5',
225         'bNot;': '\u2aed',
226         'bnot;': '\u2310',
227         'Bopf;': '\U0001d539',
228         'bopf;': '\U0001d553',
229         'bot;': '\u22a5',
230         'bottom;': '\u22a5',
231         'bowtie;': '\u22c8',
232         'boxbox;': '\u29c9',
233         'boxDL;': '\u2557',
234         'boxDl;': '\u2556',
235         'boxdL;': '\u2555',
236         'boxdl;': '\u2510',
237         'boxDR;': '\u2554',
238         'boxDr;': '\u2553',
239         'boxdR;': '\u2552',
240         'boxdr;': '\u250c',
241         'boxH;': '\u2550',
242         'boxh;': '\u2500',
243         'boxHD;': '\u2566',
244         'boxHd;': '\u2564',
245         'boxhD;': '\u2565',
246         'boxhd;': '\u252c',
247         'boxHU;': '\u2569',
248         'boxHu;': '\u2567',
249         'boxhU;': '\u2568',
250         'boxhu;': '\u2534',
251         'boxminus;': '\u229f',
252         'boxplus;': '\u229e',
253         'boxtimes;': '\u22a0',
254         'boxUL;': '\u255d',
255         'boxUl;': '\u255c',
256         'boxuL;': '\u255b',
257         'boxul;': '\u2518',
258         'boxUR;': '\u255a',
259         'boxUr;': '\u2559',
260         'boxuR;': '\u2558',
261         'boxur;': '\u2514',
262         'boxV;': '\u2551',
263         'boxv;': '\u2502',
264         'boxVH;': '\u256c',
265         'boxVh;': '\u256b',
266         'boxvH;': '\u256a',
267         'boxvh;': '\u253c',
268         'boxVL;': '\u2563',
269         'boxVl;': '\u2562',
270         'boxvL;': '\u2561',
271         'boxvl;': '\u2524',
272         'boxVR;': '\u2560',
273         'boxVr;': '\u255f',
274         'boxvR;': '\u255e',
275         'boxvr;': '\u251c',
276         'bprime;': '\u2035',
277         'Breve;': '\u02d8',
278         'breve;': '\u02d8',
279         'brvbar': '\xa6',
280         'brvbar;': '\xa6',
281         'Bscr;': '\u212c',
282         'bscr;': '\U0001d4b7',
283         'bsemi;': '\u204f',
284         'bsim;': '\u223d',
285         'bsime;': '\u22cd',
286         'bsol;': '\\',
287         'bsolb;': '\u29c5',
288         'bsolhsub;': '\u27c8',
289         'bull;': '\u2022',
290         'bullet;': '\u2022',
291         'bump;': '\u224e',
292         'bumpE;': '\u2aae',
293         'bumpe;': '\u224f',
294         'Bumpeq;': '\u224e',
295         'bumpeq;': '\u224f',
296         'Cacute;': '\u0106',
297         'cacute;': '\u0107',
298         'Cap;': '\u22d2',
299         'cap;': '\u2229',
300         'capand;': '\u2a44',
301         'capbrcup;': '\u2a49',
302         'capcap;': '\u2a4b',
303         'capcup;': '\u2a47',
304         'capdot;': '\u2a40',
305         'CapitalDifferentialD;': '\u2145',
306         'caps;': '\u2229\ufe00',
307         'caret;': '\u2041',
308         'caron;': '\u02c7',
309         'Cayleys;': '\u212d',
310         'ccaps;': '\u2a4d',
311         'Ccaron;': '\u010c',
312         'ccaron;': '\u010d',
313         'Ccedil': '\xc7',
314         'ccedil': '\xe7',
315         'Ccedil;': '\xc7',
316         'ccedil;': '\xe7',
317         'Ccirc;': '\u0108',
318         'ccirc;': '\u0109',
319         'Cconint;': '\u2230',
320         'ccups;': '\u2a4c',
321         'ccupssm;': '\u2a50',
322         'Cdot;': '\u010a',
323         'cdot;': '\u010b',
324         'cedil': '\xb8',
325         'cedil;': '\xb8',
326         'Cedilla;': '\xb8',
327         'cemptyv;': '\u29b2',
328         'cent': '\xa2',
329         'cent;': '\xa2',
330         'CenterDot;': '\xb7',
331         'centerdot;': '\xb7',
332         'Cfr;': '\u212d',
333         'cfr;': '\U0001d520',
334         'CHcy;': '\u0427',
335         'chcy;': '\u0447',
336         'check;': '\u2713',
337         'checkmark;': '\u2713',
338         'Chi;': '\u03a7',
339         'chi;': '\u03c7',
340         'cir;': '\u25cb',
341         'circ;': '\u02c6',
342         'circeq;': '\u2257',
343         'circlearrowleft;': '\u21ba',
344         'circlearrowright;': '\u21bb',
345         'circledast;': '\u229b',
346         'circledcirc;': '\u229a',
347         'circleddash;': '\u229d',
348         'CircleDot;': '\u2299',
349         'circledR;': '\xae',
350         'circledS;': '\u24c8',
351         'CircleMinus;': '\u2296',
352         'CirclePlus;': '\u2295',
353         'CircleTimes;': '\u2297',
354         'cirE;': '\u29c3',
355         'cire;': '\u2257',
356         'cirfnint;': '\u2a10',
357         'cirmid;': '\u2aef',
358         'cirscir;': '\u29c2',
359         'ClockwiseContourIntegral;': '\u2232',
360         'CloseCurlyDoubleQuote;': '\u201d',
361         'CloseCurlyQuote;': '\u2019',
362         'clubs;': '\u2663',
363         'clubsuit;': '\u2663',
364         'Colon;': '\u2237',
365         'colon;': ':',
366         'Colone;': '\u2a74',
367         'colone;': '\u2254',
368         'coloneq;': '\u2254',
369         'comma;': ',',
370         'commat;': '@',
371         'comp;': '\u2201',
372         'compfn;': '\u2218',
373         'complement;': '\u2201',
374         'complexes;': '\u2102',
375         'cong;': '\u2245',
376         'congdot;': '\u2a6d',
377         'Congruent;': '\u2261',
378         'Conint;': '\u222f',
379         'conint;': '\u222e',
380         'ContourIntegral;': '\u222e',
381         'Copf;': '\u2102',
382         'copf;': '\U0001d554',
383         'coprod;': '\u2210',
384         'Coproduct;': '\u2210',
385         'COPY': '\xa9',
386         'copy': '\xa9',
387         'COPY;': '\xa9',
388         'copy;': '\xa9',
389         'copysr;': '\u2117',
390         'CounterClockwiseContourIntegral;': '\u2233',
391         'crarr;': '\u21b5',
392         'Cross;': '\u2a2f',
393         'cross;': '\u2717',
394         'Cscr;': '\U0001d49e',
395         'cscr;': '\U0001d4b8',
396         'csub;': '\u2acf',
397         'csube;': '\u2ad1',
398         'csup;': '\u2ad0',
399         'csupe;': '\u2ad2',
400         'ctdot;': '\u22ef',
401         'cudarrl;': '\u2938',
402         'cudarrr;': '\u2935',
403         'cuepr;': '\u22de',
404         'cuesc;': '\u22df',
405         'cularr;': '\u21b6',
406         'cularrp;': '\u293d',
407         'Cup;': '\u22d3',
408         'cup;': '\u222a',
409         'cupbrcap;': '\u2a48',
410         'CupCap;': '\u224d',
411         'cupcap;': '\u2a46',
412         'cupcup;': '\u2a4a',
413         'cupdot;': '\u228d',
414         'cupor;': '\u2a45',
415         'cups;': '\u222a\ufe00',
416         'curarr;': '\u21b7',
417         'curarrm;': '\u293c',
418         'curlyeqprec;': '\u22de',
419         'curlyeqsucc;': '\u22df',
420         'curlyvee;': '\u22ce',
421         'curlywedge;': '\u22cf',
422         'curren': '\xa4',
423         'curren;': '\xa4',
424         'curvearrowleft;': '\u21b6',
425         'curvearrowright;': '\u21b7',
426         'cuvee;': '\u22ce',
427         'cuwed;': '\u22cf',
428         'cwconint;': '\u2232',
429         'cwint;': '\u2231',
430         'cylcty;': '\u232d',
431         'Dagger;': '\u2021',
432         'dagger;': '\u2020',
433         'daleth;': '\u2138',
434         'Darr;': '\u21a1',
435         'dArr;': '\u21d3',
436         'darr;': '\u2193',
437         'dash;': '\u2010',
438         'Dashv;': '\u2ae4',
439         'dashv;': '\u22a3',
440         'dbkarow;': '\u290f',
441         'dblac;': '\u02dd',
442         'Dcaron;': '\u010e',
443         'dcaron;': '\u010f',
444         'Dcy;': '\u0414',
445         'dcy;': '\u0434',
446         'DD;': '\u2145',
447         'dd;': '\u2146',
448         'ddagger;': '\u2021',
449         'ddarr;': '\u21ca',
450         'DDotrahd;': '\u2911',
451         'ddotseq;': '\u2a77',
452         'deg': '\xb0',
453         'deg;': '\xb0',
454         'Del;': '\u2207',
455         'Delta;': '\u0394',
456         'delta;': '\u03b4',
457         'demptyv;': '\u29b1',
458         'dfisht;': '\u297f',
459         'Dfr;': '\U0001d507',
460         'dfr;': '\U0001d521',
461         'dHar;': '\u2965',
462         'dharl;': '\u21c3',
463         'dharr;': '\u21c2',
464         'DiacriticalAcute;': '\xb4',
465         'DiacriticalDot;': '\u02d9',
466         'DiacriticalDoubleAcute;': '\u02dd',
467         'DiacriticalGrave;': '`',
468         'DiacriticalTilde;': '\u02dc',
469         'diam;': '\u22c4',
470         'Diamond;': '\u22c4',
471         'diamond;': '\u22c4',
472         'diamondsuit;': '\u2666',
473         'diams;': '\u2666',
474         'die;': '\xa8',
475         'DifferentialD;': '\u2146',
476         'digamma;': '\u03dd',
477         'disin;': '\u22f2',
478         'div;': '\xf7',
479         'divide': '\xf7',
480         'divide;': '\xf7',
481         'divideontimes;': '\u22c7',
482         'divonx;': '\u22c7',
483         'DJcy;': '\u0402',
484         'djcy;': '\u0452',
485         'dlcorn;': '\u231e',
486         'dlcrop;': '\u230d',
487         'dollar;': '$',
488         'Dopf;': '\U0001d53b',
489         'dopf;': '\U0001d555',
490         'Dot;': '\xa8',
491         'dot;': '\u02d9',
492         'DotDot;': '\u20dc',
493         'doteq;': '\u2250',
494         'doteqdot;': '\u2251',
495         'DotEqual;': '\u2250',
496         'dotminus;': '\u2238',
497         'dotplus;': '\u2214',
498         'dotsquare;': '\u22a1',
499         'doublebarwedge;': '\u2306',
500         'DoubleContourIntegral;': '\u222f',
501         'DoubleDot;': '\xa8',
502         'DoubleDownArrow;': '\u21d3',
503         'DoubleLeftArrow;': '\u21d0',
504         'DoubleLeftRightArrow;': '\u21d4',
505         'DoubleLeftTee;': '\u2ae4',
506         'DoubleLongLeftArrow;': '\u27f8',
507         'DoubleLongLeftRightArrow;': '\u27fa',
508         'DoubleLongRightArrow;': '\u27f9',
509         'DoubleRightArrow;': '\u21d2',
510         'DoubleRightTee;': '\u22a8',
511         'DoubleUpArrow;': '\u21d1',
512         'DoubleUpDownArrow;': '\u21d5',
513         'DoubleVerticalBar;': '\u2225',
514         'DownArrow;': '\u2193',
515         'Downarrow;': '\u21d3',
516         'downarrow;': '\u2193',
517         'DownArrowBar;': '\u2913',
518         'DownArrowUpArrow;': '\u21f5',
519         'DownBreve;': '\u0311',
520         'downdownarrows;': '\u21ca',
521         'downharpoonleft;': '\u21c3',
522         'downharpoonright;': '\u21c2',
523         'DownLeftRightVector;': '\u2950',
524         'DownLeftTeeVector;': '\u295e',
525         'DownLeftVector;': '\u21bd',
526         'DownLeftVectorBar;': '\u2956',
527         'DownRightTeeVector;': '\u295f',
528         'DownRightVector;': '\u21c1',
529         'DownRightVectorBar;': '\u2957',
530         'DownTee;': '\u22a4',
531         'DownTeeArrow;': '\u21a7',
532         'drbkarow;': '\u2910',
533         'drcorn;': '\u231f',
534         'drcrop;': '\u230c',
535         'Dscr;': '\U0001d49f',
536         'dscr;': '\U0001d4b9',
537         'DScy;': '\u0405',
538         'dscy;': '\u0455',
539         'dsol;': '\u29f6',
540         'Dstrok;': '\u0110',
541         'dstrok;': '\u0111',
542         'dtdot;': '\u22f1',
543         'dtri;': '\u25bf',
544         'dtrif;': '\u25be',
545         'duarr;': '\u21f5',
546         'duhar;': '\u296f',
547         'dwangle;': '\u29a6',
548         'DZcy;': '\u040f',
549         'dzcy;': '\u045f',
550         'dzigrarr;': '\u27ff',
551         'Eacute': '\xc9',
552         'eacute': '\xe9',
553         'Eacute;': '\xc9',
554         'eacute;': '\xe9',
555         'easter;': '\u2a6e',
556         'Ecaron;': '\u011a',
557         'ecaron;': '\u011b',
558         'ecir;': '\u2256',
559         'Ecirc': '\xca',
560         'ecirc': '\xea',
561         'Ecirc;': '\xca',
562         'ecirc;': '\xea',
563         'ecolon;': '\u2255',
564         'Ecy;': '\u042d',
565         'ecy;': '\u044d',
566         'eDDot;': '\u2a77',
567         'Edot;': '\u0116',
568         'eDot;': '\u2251',
569         'edot;': '\u0117',
570         'ee;': '\u2147',
571         'efDot;': '\u2252',
572         'Efr;': '\U0001d508',
573         'efr;': '\U0001d522',
574         'eg;': '\u2a9a',
575         'Egrave': '\xc8',
576         'egrave': '\xe8',
577         'Egrave;': '\xc8',
578         'egrave;': '\xe8',
579         'egs;': '\u2a96',
580         'egsdot;': '\u2a98',
581         'el;': '\u2a99',
582         'Element;': '\u2208',
583         'elinters;': '\u23e7',
584         'ell;': '\u2113',
585         'els;': '\u2a95',
586         'elsdot;': '\u2a97',
587         'Emacr;': '\u0112',
588         'emacr;': '\u0113',
589         'empty;': '\u2205',
590         'emptyset;': '\u2205',
591         'EmptySmallSquare;': '\u25fb',
592         'emptyv;': '\u2205',
593         'EmptyVerySmallSquare;': '\u25ab',
594         'emsp13;': '\u2004',
595         'emsp14;': '\u2005',
596         'emsp;': '\u2003',
597         'ENG;': '\u014a',
598         'eng;': '\u014b',
599         'ensp;': '\u2002',
600         'Eogon;': '\u0118',
601         'eogon;': '\u0119',
602         'Eopf;': '\U0001d53c',
603         'eopf;': '\U0001d556',
604         'epar;': '\u22d5',
605         'eparsl;': '\u29e3',
606         'eplus;': '\u2a71',
607         'epsi;': '\u03b5',
608         'Epsilon;': '\u0395',
609         'epsilon;': '\u03b5',
610         'epsiv;': '\u03f5',
611         'eqcirc;': '\u2256',
612         'eqcolon;': '\u2255',
613         'eqsim;': '\u2242',
614         'eqslantgtr;': '\u2a96',
615         'eqslantless;': '\u2a95',
616         'Equal;': '\u2a75',
617         'equals;': '=',
618         'EqualTilde;': '\u2242',
619         'equest;': '\u225f',
620         'Equilibrium;': '\u21cc',
621         'equiv;': '\u2261',
622         'equivDD;': '\u2a78',
623         'eqvparsl;': '\u29e5',
624         'erarr;': '\u2971',
625         'erDot;': '\u2253',
626         'Escr;': '\u2130',
627         'escr;': '\u212f',
628         'esdot;': '\u2250',
629         'Esim;': '\u2a73',
630         'esim;': '\u2242',
631         'Eta;': '\u0397',
632         'eta;': '\u03b7',
633         'ETH': '\xd0',
634         'eth': '\xf0',
635         'ETH;': '\xd0',
636         'eth;': '\xf0',
637         'Euml': '\xcb',
638         'euml': '\xeb',
639         'Euml;': '\xcb',
640         'euml;': '\xeb',
641         'euro;': '\u20ac',
642         'excl;': '!',
643         'exist;': '\u2203',
644         'Exists;': '\u2203',
645         'expectation;': '\u2130',
646         'ExponentialE;': '\u2147',
647         'exponentiale;': '\u2147',
648         'fallingdotseq;': '\u2252',
649         'Fcy;': '\u0424',
650         'fcy;': '\u0444',
651         'female;': '\u2640',
652         'ffilig;': '\ufb03',
653         'fflig;': '\ufb00',
654         'ffllig;': '\ufb04',
655         'Ffr;': '\U0001d509',
656         'ffr;': '\U0001d523',
657         'filig;': '\ufb01',
658         'FilledSmallSquare;': '\u25fc',
659         'FilledVerySmallSquare;': '\u25aa',
660         'fjlig;': 'fj',
661         'flat;': '\u266d',
662         'fllig;': '\ufb02',
663         'fltns;': '\u25b1',
664         'fnof;': '\u0192',
665         'Fopf;': '\U0001d53d',
666         'fopf;': '\U0001d557',
667         'ForAll;': '\u2200',
668         'forall;': '\u2200',
669         'fork;': '\u22d4',
670         'forkv;': '\u2ad9',
671         'Fouriertrf;': '\u2131',
672         'fpartint;': '\u2a0d',
673         'frac12': '\xbd',
674         'frac12;': '\xbd',
675         'frac13;': '\u2153',
676         'frac14': '\xbc',
677         'frac14;': '\xbc',
678         'frac15;': '\u2155',
679         'frac16;': '\u2159',
680         'frac18;': '\u215b',
681         'frac23;': '\u2154',
682         'frac25;': '\u2156',
683         'frac34': '\xbe',
684         'frac34;': '\xbe',
685         'frac35;': '\u2157',
686         'frac38;': '\u215c',
687         'frac45;': '\u2158',
688         'frac56;': '\u215a',
689         'frac58;': '\u215d',
690         'frac78;': '\u215e',
691         'frasl;': '\u2044',
692         'frown;': '\u2322',
693         'Fscr;': '\u2131',
694         'fscr;': '\U0001d4bb',
695         'gacute;': '\u01f5',
696         'Gamma;': '\u0393',
697         'gamma;': '\u03b3',
698         'Gammad;': '\u03dc',
699         'gammad;': '\u03dd',
700         'gap;': '\u2a86',
701         'Gbreve;': '\u011e',
702         'gbreve;': '\u011f',
703         'Gcedil;': '\u0122',
704         'Gcirc;': '\u011c',
705         'gcirc;': '\u011d',
706         'Gcy;': '\u0413',
707         'gcy;': '\u0433',
708         'Gdot;': '\u0120',
709         'gdot;': '\u0121',
710         'gE;': '\u2267',
711         'ge;': '\u2265',
712         'gEl;': '\u2a8c',
713         'gel;': '\u22db',
714         'geq;': '\u2265',
715         'geqq;': '\u2267',
716         'geqslant;': '\u2a7e',
717         'ges;': '\u2a7e',
718         'gescc;': '\u2aa9',
719         'gesdot;': '\u2a80',
720         'gesdoto;': '\u2a82',
721         'gesdotol;': '\u2a84',
722         'gesl;': '\u22db\ufe00',
723         'gesles;': '\u2a94',
724         'Gfr;': '\U0001d50a',
725         'gfr;': '\U0001d524',
726         'Gg;': '\u22d9',
727         'gg;': '\u226b',
728         'ggg;': '\u22d9',
729         'gimel;': '\u2137',
730         'GJcy;': '\u0403',
731         'gjcy;': '\u0453',
732         'gl;': '\u2277',
733         'gla;': '\u2aa5',
734         'glE;': '\u2a92',
735         'glj;': '\u2aa4',
736         'gnap;': '\u2a8a',
737         'gnapprox;': '\u2a8a',
738         'gnE;': '\u2269',
739         'gne;': '\u2a88',
740         'gneq;': '\u2a88',
741         'gneqq;': '\u2269',
742         'gnsim;': '\u22e7',
743         'Gopf;': '\U0001d53e',
744         'gopf;': '\U0001d558',
745         'grave;': '`',
746         'GreaterEqual;': '\u2265',
747         'GreaterEqualLess;': '\u22db',
748         'GreaterFullEqual;': '\u2267',
749         'GreaterGreater;': '\u2aa2',
750         'GreaterLess;': '\u2277',
751         'GreaterSlantEqual;': '\u2a7e',
752         'GreaterTilde;': '\u2273',
753         'Gscr;': '\U0001d4a2',
754         'gscr;': '\u210a',
755         'gsim;': '\u2273',
756         'gsime;': '\u2a8e',
757         'gsiml;': '\u2a90',
758         'GT': '>',
759         'gt': '>',
760         'GT;': '>',
761         'Gt;': '\u226b',
762         'gt;': '>',
763         'gtcc;': '\u2aa7',
764         'gtcir;': '\u2a7a',
765         'gtdot;': '\u22d7',
766         'gtlPar;': '\u2995',
767         'gtquest;': '\u2a7c',
768         'gtrapprox;': '\u2a86',
769         'gtrarr;': '\u2978',
770         'gtrdot;': '\u22d7',
771         'gtreqless;': '\u22db',
772         'gtreqqless;': '\u2a8c',
773         'gtrless;': '\u2277',
774         'gtrsim;': '\u2273',
775         'gvertneqq;': '\u2269\ufe00',
776         'gvnE;': '\u2269\ufe00',
777         'Hacek;': '\u02c7',
778         'hairsp;': '\u200a',
779         'half;': '\xbd',
780         'hamilt;': '\u210b',
781         'HARDcy;': '\u042a',
782         'hardcy;': '\u044a',
783         'hArr;': '\u21d4',
784         'harr;': '\u2194',
785         'harrcir;': '\u2948',
786         'harrw;': '\u21ad',
787         'Hat;': '^',
788         'hbar;': '\u210f',
789         'Hcirc;': '\u0124',
790         'hcirc;': '\u0125',
791         'hearts;': '\u2665',
792         'heartsuit;': '\u2665',
793         'hellip;': '\u2026',
794         'hercon;': '\u22b9',
795         'Hfr;': '\u210c',
796         'hfr;': '\U0001d525',
797         'HilbertSpace;': '\u210b',
798         'hksearow;': '\u2925',
799         'hkswarow;': '\u2926',
800         'hoarr;': '\u21ff',
801         'homtht;': '\u223b',
802         'hookleftarrow;': '\u21a9',
803         'hookrightarrow;': '\u21aa',
804         'Hopf;': '\u210d',
805         'hopf;': '\U0001d559',
806         'horbar;': '\u2015',
807         'HorizontalLine;': '\u2500',
808         'Hscr;': '\u210b',
809         'hscr;': '\U0001d4bd',
810         'hslash;': '\u210f',
811         'Hstrok;': '\u0126',
812         'hstrok;': '\u0127',
813         'HumpDownHump;': '\u224e',
814         'HumpEqual;': '\u224f',
815         'hybull;': '\u2043',
816         'hyphen;': '\u2010',
817         'Iacute': '\xcd',
818         'iacute': '\xed',
819         'Iacute;': '\xcd',
820         'iacute;': '\xed',
821         'ic;': '\u2063',
822         'Icirc': '\xce',
823         'icirc': '\xee',
824         'Icirc;': '\xce',
825         'icirc;': '\xee',
826         'Icy;': '\u0418',
827         'icy;': '\u0438',
828         'Idot;': '\u0130',
829         'IEcy;': '\u0415',
830         'iecy;': '\u0435',
831         'iexcl': '\xa1',
832         'iexcl;': '\xa1',
833         'iff;': '\u21d4',
834         'Ifr;': '\u2111',
835         'ifr;': '\U0001d526',
836         'Igrave': '\xcc',
837         'igrave': '\xec',
838         'Igrave;': '\xcc',
839         'igrave;': '\xec',
840         'ii;': '\u2148',
841         'iiiint;': '\u2a0c',
842         'iiint;': '\u222d',
843         'iinfin;': '\u29dc',
844         'iiota;': '\u2129',
845         'IJlig;': '\u0132',
846         'ijlig;': '\u0133',
847         'Im;': '\u2111',
848         'Imacr;': '\u012a',
849         'imacr;': '\u012b',
850         'image;': '\u2111',
851         'ImaginaryI;': '\u2148',
852         'imagline;': '\u2110',
853         'imagpart;': '\u2111',
854         'imath;': '\u0131',
855         'imof;': '\u22b7',
856         'imped;': '\u01b5',
857         'Implies;': '\u21d2',
858         'in;': '\u2208',
859         'incare;': '\u2105',
860         'infin;': '\u221e',
861         'infintie;': '\u29dd',
862         'inodot;': '\u0131',
863         'Int;': '\u222c',
864         'int;': '\u222b',
865         'intcal;': '\u22ba',
866         'integers;': '\u2124',
867         'Integral;': '\u222b',
868         'intercal;': '\u22ba',
869         'Intersection;': '\u22c2',
870         'intlarhk;': '\u2a17',
871         'intprod;': '\u2a3c',
872         'InvisibleComma;': '\u2063',
873         'InvisibleTimes;': '\u2062',
874         'IOcy;': '\u0401',
875         'iocy;': '\u0451',
876         'Iogon;': '\u012e',
877         'iogon;': '\u012f',
878         'Iopf;': '\U0001d540',
879         'iopf;': '\U0001d55a',
880         'Iota;': '\u0399',
881         'iota;': '\u03b9',
882         'iprod;': '\u2a3c',
883         'iquest': '\xbf',
884         'iquest;': '\xbf',
885         'Iscr;': '\u2110',
886         'iscr;': '\U0001d4be',
887         'isin;': '\u2208',
888         'isindot;': '\u22f5',
889         'isinE;': '\u22f9',
890         'isins;': '\u22f4',
891         'isinsv;': '\u22f3',
892         'isinv;': '\u2208',
893         'it;': '\u2062',
894         'Itilde;': '\u0128',
895         'itilde;': '\u0129',
896         'Iukcy;': '\u0406',
897         'iukcy;': '\u0456',
898         'Iuml': '\xcf',
899         'iuml': '\xef',
900         'Iuml;': '\xcf',
901         'iuml;': '\xef',
902         'Jcirc;': '\u0134',
903         'jcirc;': '\u0135',
904         'Jcy;': '\u0419',
905         'jcy;': '\u0439',
906         'Jfr;': '\U0001d50d',
907         'jfr;': '\U0001d527',
908         'jmath;': '\u0237',
909         'Jopf;': '\U0001d541',
910         'jopf;': '\U0001d55b',
911         'Jscr;': '\U0001d4a5',
912         'jscr;': '\U0001d4bf',
913         'Jsercy;': '\u0408',
914         'jsercy;': '\u0458',
915         'Jukcy;': '\u0404',
916         'jukcy;': '\u0454',
917         'Kappa;': '\u039a',
918         'kappa;': '\u03ba',
919         'kappav;': '\u03f0',
920         'Kcedil;': '\u0136',
921         'kcedil;': '\u0137',
922         'Kcy;': '\u041a',
923         'kcy;': '\u043a',
924         'Kfr;': '\U0001d50e',
925         'kfr;': '\U0001d528',
926         'kgreen;': '\u0138',
927         'KHcy;': '\u0425',
928         'khcy;': '\u0445',
929         'KJcy;': '\u040c',
930         'kjcy;': '\u045c',
931         'Kopf;': '\U0001d542',
932         'kopf;': '\U0001d55c',
933         'Kscr;': '\U0001d4a6',
934         'kscr;': '\U0001d4c0',
935         'lAarr;': '\u21da',
936         'Lacute;': '\u0139',
937         'lacute;': '\u013a',
938         'laemptyv;': '\u29b4',
939         'lagran;': '\u2112',
940         'Lambda;': '\u039b',
941         'lambda;': '\u03bb',
942         'Lang;': '\u27ea',
943         'lang;': '\u27e8',
944         'langd;': '\u2991',
945         'langle;': '\u27e8',
946         'lap;': '\u2a85',
947         'Laplacetrf;': '\u2112',
948         'laquo': '\xab',
949         'laquo;': '\xab',
950         'Larr;': '\u219e',
951         'lArr;': '\u21d0',
952         'larr;': '\u2190',
953         'larrb;': '\u21e4',
954         'larrbfs;': '\u291f',
955         'larrfs;': '\u291d',
956         'larrhk;': '\u21a9',
957         'larrlp;': '\u21ab',
958         'larrpl;': '\u2939',
959         'larrsim;': '\u2973',
960         'larrtl;': '\u21a2',
961         'lat;': '\u2aab',
962         'lAtail;': '\u291b',
963         'latail;': '\u2919',
964         'late;': '\u2aad',
965         'lates;': '\u2aad\ufe00',
966         'lBarr;': '\u290e',
967         'lbarr;': '\u290c',
968         'lbbrk;': '\u2772',
969         'lbrace;': '{',
970         'lbrack;': '[',
971         'lbrke;': '\u298b',
972         'lbrksld;': '\u298f',
973         'lbrkslu;': '\u298d',
974         'Lcaron;': '\u013d',
975         'lcaron;': '\u013e',
976         'Lcedil;': '\u013b',
977         'lcedil;': '\u013c',
978         'lceil;': '\u2308',
979         'lcub;': '{',
980         'Lcy;': '\u041b',
981         'lcy;': '\u043b',
982         'ldca;': '\u2936',
983         'ldquo;': '\u201c',
984         'ldquor;': '\u201e',
985         'ldrdhar;': '\u2967',
986         'ldrushar;': '\u294b',
987         'ldsh;': '\u21b2',
988         'lE;': '\u2266',
989         'le;': '\u2264',
990         'LeftAngleBracket;': '\u27e8',
991         'LeftArrow;': '\u2190',
992         'Leftarrow;': '\u21d0',
993         'leftarrow;': '\u2190',
994         'LeftArrowBar;': '\u21e4',
995         'LeftArrowRightArrow;': '\u21c6',
996         'leftarrowtail;': '\u21a2',
997         'LeftCeiling;': '\u2308',
998         'LeftDoubleBracket;': '\u27e6',
999         'LeftDownTeeVector;': '\u2961',
1000         'LeftDownVector;': '\u21c3',
1001         'LeftDownVectorBar;': '\u2959',
1002         'LeftFloor;': '\u230a',
1003         'leftharpoondown;': '\u21bd',
1004         'leftharpoonup;': '\u21bc',
1005         'leftleftarrows;': '\u21c7',
1006         'LeftRightArrow;': '\u2194',
1007         'Leftrightarrow;': '\u21d4',
1008         'leftrightarrow;': '\u2194',
1009         'leftrightarrows;': '\u21c6',
1010         'leftrightharpoons;': '\u21cb',
1011         'leftrightsquigarrow;': '\u21ad',
1012         'LeftRightVector;': '\u294e',
1013         'LeftTee;': '\u22a3',
1014         'LeftTeeArrow;': '\u21a4',
1015         'LeftTeeVector;': '\u295a',
1016         'leftthreetimes;': '\u22cb',
1017         'LeftTriangle;': '\u22b2',
1018         'LeftTriangleBar;': '\u29cf',
1019         'LeftTriangleEqual;': '\u22b4',
1020         'LeftUpDownVector;': '\u2951',
1021         'LeftUpTeeVector;': '\u2960',
1022         'LeftUpVector;': '\u21bf',
1023         'LeftUpVectorBar;': '\u2958',
1024         'LeftVector;': '\u21bc',
1025         'LeftVectorBar;': '\u2952',
1026         'lEg;': '\u2a8b',
1027         'leg;': '\u22da',
1028         'leq;': '\u2264',
1029         'leqq;': '\u2266',
1030         'leqslant;': '\u2a7d',
1031         'les;': '\u2a7d',
1032         'lescc;': '\u2aa8',
1033         'lesdot;': '\u2a7f',
1034         'lesdoto;': '\u2a81',
1035         'lesdotor;': '\u2a83',
1036         'lesg;': '\u22da\ufe00',
1037         'lesges;': '\u2a93',
1038         'lessapprox;': '\u2a85',
1039         'lessdot;': '\u22d6',
1040         'lesseqgtr;': '\u22da',
1041         'lesseqqgtr;': '\u2a8b',
1042         'LessEqualGreater;': '\u22da',
1043         'LessFullEqual;': '\u2266',
1044         'LessGreater;': '\u2276',
1045         'lessgtr;': '\u2276',
1046         'LessLess;': '\u2aa1',
1047         'lesssim;': '\u2272',
1048         'LessSlantEqual;': '\u2a7d',
1049         'LessTilde;': '\u2272',
1050         'lfisht;': '\u297c',
1051         'lfloor;': '\u230a',
1052         'Lfr;': '\U0001d50f',
1053         'lfr;': '\U0001d529',
1054         'lg;': '\u2276',
1055         'lgE;': '\u2a91',
1056         'lHar;': '\u2962',
1057         'lhard;': '\u21bd',
1058         'lharu;': '\u21bc',
1059         'lharul;': '\u296a',
1060         'lhblk;': '\u2584',
1061         'LJcy;': '\u0409',
1062         'ljcy;': '\u0459',
1063         'Ll;': '\u22d8',
1064         'll;': '\u226a',
1065         'llarr;': '\u21c7',
1066         'llcorner;': '\u231e',
1067         'Lleftarrow;': '\u21da',
1068         'llhard;': '\u296b',
1069         'lltri;': '\u25fa',
1070         'Lmidot;': '\u013f',
1071         'lmidot;': '\u0140',
1072         'lmoust;': '\u23b0',
1073         'lmoustache;': '\u23b0',
1074         'lnap;': '\u2a89',
1075         'lnapprox;': '\u2a89',
1076         'lnE;': '\u2268',
1077         'lne;': '\u2a87',
1078         'lneq;': '\u2a87',
1079         'lneqq;': '\u2268',
1080         'lnsim;': '\u22e6',
1081         'loang;': '\u27ec',
1082         'loarr;': '\u21fd',
1083         'lobrk;': '\u27e6',
1084         'LongLeftArrow;': '\u27f5',
1085         'Longleftarrow;': '\u27f8',
1086         'longleftarrow;': '\u27f5',
1087         'LongLeftRightArrow;': '\u27f7',
1088         'Longleftrightarrow;': '\u27fa',
1089         'longleftrightarrow;': '\u27f7',
1090         'longmapsto;': '\u27fc',
1091         'LongRightArrow;': '\u27f6',
1092         'Longrightarrow;': '\u27f9',
1093         'longrightarrow;': '\u27f6',
1094         'looparrowleft;': '\u21ab',
1095         'looparrowright;': '\u21ac',
1096         'lopar;': '\u2985',
1097         'Lopf;': '\U0001d543',
1098         'lopf;': '\U0001d55d',
1099         'loplus;': '\u2a2d',
1100         'lotimes;': '\u2a34',
1101         'lowast;': '\u2217',
1102         'lowbar;': '_',
1103         'LowerLeftArrow;': '\u2199',
1104         'LowerRightArrow;': '\u2198',
1105         'loz;': '\u25ca',
1106         'lozenge;': '\u25ca',
1107         'lozf;': '\u29eb',
1108         'lpar;': '(',
1109         'lparlt;': '\u2993',
1110         'lrarr;': '\u21c6',
1111         'lrcorner;': '\u231f',
1112         'lrhar;': '\u21cb',
1113         'lrhard;': '\u296d',
1114         'lrm;': '\u200e',
1115         'lrtri;': '\u22bf',
1116         'lsaquo;': '\u2039',
1117         'Lscr;': '\u2112',
1118         'lscr;': '\U0001d4c1',
1119         'Lsh;': '\u21b0',
1120         'lsh;': '\u21b0',
1121         'lsim;': '\u2272',
1122         'lsime;': '\u2a8d',
1123         'lsimg;': '\u2a8f',
1124         'lsqb;': '[',
1125         'lsquo;': '\u2018',
1126         'lsquor;': '\u201a',
1127         'Lstrok;': '\u0141',
1128         'lstrok;': '\u0142',
1129         'LT': '<',
1130         'lt': '<',
1131         'LT;': '<',
1132         'Lt;': '\u226a',
1133         'lt;': '<',
1134         'ltcc;': '\u2aa6',
1135         'ltcir;': '\u2a79',
1136         'ltdot;': '\u22d6',
1137         'lthree;': '\u22cb',
1138         'ltimes;': '\u22c9',
1139         'ltlarr;': '\u2976',
1140         'ltquest;': '\u2a7b',
1141         'ltri;': '\u25c3',
1142         'ltrie;': '\u22b4',
1143         'ltrif;': '\u25c2',
1144         'ltrPar;': '\u2996',
1145         'lurdshar;': '\u294a',
1146         'luruhar;': '\u2966',
1147         'lvertneqq;': '\u2268\ufe00',
1148         'lvnE;': '\u2268\ufe00',
1149         'macr': '\xaf',
1150         'macr;': '\xaf',
1151         'male;': '\u2642',
1152         'malt;': '\u2720',
1153         'maltese;': '\u2720',
1154         'Map;': '\u2905',
1155         'map;': '\u21a6',
1156         'mapsto;': '\u21a6',
1157         'mapstodown;': '\u21a7',
1158         'mapstoleft;': '\u21a4',
1159         'mapstoup;': '\u21a5',
1160         'marker;': '\u25ae',
1161         'mcomma;': '\u2a29',
1162         'Mcy;': '\u041c',
1163         'mcy;': '\u043c',
1164         'mdash;': '\u2014',
1165         'mDDot;': '\u223a',
1166         'measuredangle;': '\u2221',
1167         'MediumSpace;': '\u205f',
1168         'Mellintrf;': '\u2133',
1169         'Mfr;': '\U0001d510',
1170         'mfr;': '\U0001d52a',
1171         'mho;': '\u2127',
1172         'micro': '\xb5',
1173         'micro;': '\xb5',
1174         'mid;': '\u2223',
1175         'midast;': '*',
1176         'midcir;': '\u2af0',
1177         'middot': '\xb7',
1178         'middot;': '\xb7',
1179         'minus;': '\u2212',
1180         'minusb;': '\u229f',
1181         'minusd;': '\u2238',
1182         'minusdu;': '\u2a2a',
1183         'MinusPlus;': '\u2213',
1184         'mlcp;': '\u2adb',
1185         'mldr;': '\u2026',
1186         'mnplus;': '\u2213',
1187         'models;': '\u22a7',
1188         'Mopf;': '\U0001d544',
1189         'mopf;': '\U0001d55e',
1190         'mp;': '\u2213',
1191         'Mscr;': '\u2133',
1192         'mscr;': '\U0001d4c2',
1193         'mstpos;': '\u223e',
1194         'Mu;': '\u039c',
1195         'mu;': '\u03bc',
1196         'multimap;': '\u22b8',
1197         'mumap;': '\u22b8',
1198         'nabla;': '\u2207',
1199         'Nacute;': '\u0143',
1200         'nacute;': '\u0144',
1201         'nang;': '\u2220\u20d2',
1202         'nap;': '\u2249',
1203         'napE;': '\u2a70\u0338',
1204         'napid;': '\u224b\u0338',
1205         'napos;': '\u0149',
1206         'napprox;': '\u2249',
1207         'natur;': '\u266e',
1208         'natural;': '\u266e',
1209         'naturals;': '\u2115',
1210         'nbsp': '\xa0',
1211         'nbsp;': '\xa0',
1212         'nbump;': '\u224e\u0338',
1213         'nbumpe;': '\u224f\u0338',
1214         'ncap;': '\u2a43',
1215         'Ncaron;': '\u0147',
1216         'ncaron;': '\u0148',
1217         'Ncedil;': '\u0145',
1218         'ncedil;': '\u0146',
1219         'ncong;': '\u2247',
1220         'ncongdot;': '\u2a6d\u0338',
1221         'ncup;': '\u2a42',
1222         'Ncy;': '\u041d',
1223         'ncy;': '\u043d',
1224         'ndash;': '\u2013',
1225         'ne;': '\u2260',
1226         'nearhk;': '\u2924',
1227         'neArr;': '\u21d7',
1228         'nearr;': '\u2197',
1229         'nearrow;': '\u2197',
1230         'nedot;': '\u2250\u0338',
1231         'NegativeMediumSpace;': '\u200b',
1232         'NegativeThickSpace;': '\u200b',
1233         'NegativeThinSpace;': '\u200b',
1234         'NegativeVeryThinSpace;': '\u200b',
1235         'nequiv;': '\u2262',
1236         'nesear;': '\u2928',
1237         'nesim;': '\u2242\u0338',
1238         'NestedGreaterGreater;': '\u226b',
1239         'NestedLessLess;': '\u226a',
1240         'NewLine;': '\n',
1241         'nexist;': '\u2204',
1242         'nexists;': '\u2204',
1243         'Nfr;': '\U0001d511',
1244         'nfr;': '\U0001d52b',
1245         'ngE;': '\u2267\u0338',
1246         'nge;': '\u2271',
1247         'ngeq;': '\u2271',
1248         'ngeqq;': '\u2267\u0338',
1249         'ngeqslant;': '\u2a7e\u0338',
1250         'nges;': '\u2a7e\u0338',
1251         'nGg;': '\u22d9\u0338',
1252         'ngsim;': '\u2275',
1253         'nGt;': '\u226b\u20d2',
1254         'ngt;': '\u226f',
1255         'ngtr;': '\u226f',
1256         'nGtv;': '\u226b\u0338',
1257         'nhArr;': '\u21ce',
1258         'nharr;': '\u21ae',
1259         'nhpar;': '\u2af2',
1260         'ni;': '\u220b',
1261         'nis;': '\u22fc',
1262         'nisd;': '\u22fa',
1263         'niv;': '\u220b',
1264         'NJcy;': '\u040a',
1265         'njcy;': '\u045a',
1266         'nlArr;': '\u21cd',
1267         'nlarr;': '\u219a',
1268         'nldr;': '\u2025',
1269         'nlE;': '\u2266\u0338',
1270         'nle;': '\u2270',
1271         'nLeftarrow;': '\u21cd',
1272         'nleftarrow;': '\u219a',
1273         'nLeftrightarrow;': '\u21ce',
1274         'nleftrightarrow;': '\u21ae',
1275         'nleq;': '\u2270',
1276         'nleqq;': '\u2266\u0338',
1277         'nleqslant;': '\u2a7d\u0338',
1278         'nles;': '\u2a7d\u0338',
1279         'nless;': '\u226e',
1280         'nLl;': '\u22d8\u0338',
1281         'nlsim;': '\u2274',
1282         'nLt;': '\u226a\u20d2',
1283         'nlt;': '\u226e',
1284         'nltri;': '\u22ea',
1285         'nltrie;': '\u22ec',
1286         'nLtv;': '\u226a\u0338',
1287         'nmid;': '\u2224',
1288         'NoBreak;': '\u2060',
1289         'NonBreakingSpace;': '\xa0',
1290         'Nopf;': '\u2115',
1291         'nopf;': '\U0001d55f',
1292         'not': '\xac',
1293         'Not;': '\u2aec',
1294         'not;': '\xac',
1295         'NotCongruent;': '\u2262',
1296         'NotCupCap;': '\u226d',
1297         'NotDoubleVerticalBar;': '\u2226',
1298         'NotElement;': '\u2209',
1299         'NotEqual;': '\u2260',
1300         'NotEqualTilde;': '\u2242\u0338',
1301         'NotExists;': '\u2204',
1302         'NotGreater;': '\u226f',
1303         'NotGreaterEqual;': '\u2271',
1304         'NotGreaterFullEqual;': '\u2267\u0338',
1305         'NotGreaterGreater;': '\u226b\u0338',
1306         'NotGreaterLess;': '\u2279',
1307         'NotGreaterSlantEqual;': '\u2a7e\u0338',
1308         'NotGreaterTilde;': '\u2275',
1309         'NotHumpDownHump;': '\u224e\u0338',
1310         'NotHumpEqual;': '\u224f\u0338',
1311         'notin;': '\u2209',
1312         'notindot;': '\u22f5\u0338',
1313         'notinE;': '\u22f9\u0338',
1314         'notinva;': '\u2209',
1315         'notinvb;': '\u22f7',
1316         'notinvc;': '\u22f6',
1317         'NotLeftTriangle;': '\u22ea',
1318         'NotLeftTriangleBar;': '\u29cf\u0338',
1319         'NotLeftTriangleEqual;': '\u22ec',
1320         'NotLess;': '\u226e',
1321         'NotLessEqual;': '\u2270',
1322         'NotLessGreater;': '\u2278',
1323         'NotLessLess;': '\u226a\u0338',
1324         'NotLessSlantEqual;': '\u2a7d\u0338',
1325         'NotLessTilde;': '\u2274',
1326         'NotNestedGreaterGreater;': '\u2aa2\u0338',
1327         'NotNestedLessLess;': '\u2aa1\u0338',
1328         'notni;': '\u220c',
1329         'notniva;': '\u220c',
1330         'notnivb;': '\u22fe',
1331         'notnivc;': '\u22fd',
1332         'NotPrecedes;': '\u2280',
1333         'NotPrecedesEqual;': '\u2aaf\u0338',
1334         'NotPrecedesSlantEqual;': '\u22e0',
1335         'NotReverseElement;': '\u220c',
1336         'NotRightTriangle;': '\u22eb',
1337         'NotRightTriangleBar;': '\u29d0\u0338',
1338         'NotRightTriangleEqual;': '\u22ed',
1339         'NotSquareSubset;': '\u228f\u0338',
1340         'NotSquareSubsetEqual;': '\u22e2',
1341         'NotSquareSuperset;': '\u2290\u0338',
1342         'NotSquareSupersetEqual;': '\u22e3',
1343         'NotSubset;': '\u2282\u20d2',
1344         'NotSubsetEqual;': '\u2288',
1345         'NotSucceeds;': '\u2281',
1346         'NotSucceedsEqual;': '\u2ab0\u0338',
1347         'NotSucceedsSlantEqual;': '\u22e1',
1348         'NotSucceedsTilde;': '\u227f\u0338',
1349         'NotSuperset;': '\u2283\u20d2',
1350         'NotSupersetEqual;': '\u2289',
1351         'NotTilde;': '\u2241',
1352         'NotTildeEqual;': '\u2244',
1353         'NotTildeFullEqual;': '\u2247',
1354         'NotTildeTilde;': '\u2249',
1355         'NotVerticalBar;': '\u2224',
1356         'npar;': '\u2226',
1357         'nparallel;': '\u2226',
1358         'nparsl;': '\u2afd\u20e5',
1359         'npart;': '\u2202\u0338',
1360         'npolint;': '\u2a14',
1361         'npr;': '\u2280',
1362         'nprcue;': '\u22e0',
1363         'npre;': '\u2aaf\u0338',
1364         'nprec;': '\u2280',
1365         'npreceq;': '\u2aaf\u0338',
1366         'nrArr;': '\u21cf',
1367         'nrarr;': '\u219b',
1368         'nrarrc;': '\u2933\u0338',
1369         'nrarrw;': '\u219d\u0338',
1370         'nRightarrow;': '\u21cf',
1371         'nrightarrow;': '\u219b',
1372         'nrtri;': '\u22eb',
1373         'nrtrie;': '\u22ed',
1374         'nsc;': '\u2281',
1375         'nsccue;': '\u22e1',
1376         'nsce;': '\u2ab0\u0338',
1377         'Nscr;': '\U0001d4a9',
1378         'nscr;': '\U0001d4c3',
1379         'nshortmid;': '\u2224',
1380         'nshortparallel;': '\u2226',
1381         'nsim;': '\u2241',
1382         'nsime;': '\u2244',
1383         'nsimeq;': '\u2244',
1384         'nsmid;': '\u2224',
1385         'nspar;': '\u2226',
1386         'nsqsube;': '\u22e2',
1387         'nsqsupe;': '\u22e3',
1388         'nsub;': '\u2284',
1389         'nsubE;': '\u2ac5\u0338',
1390         'nsube;': '\u2288',
1391         'nsubset;': '\u2282\u20d2',
1392         'nsubseteq;': '\u2288',
1393         'nsubseteqq;': '\u2ac5\u0338',
1394         'nsucc;': '\u2281',
1395         'nsucceq;': '\u2ab0\u0338',
1396         'nsup;': '\u2285',
1397         'nsupE;': '\u2ac6\u0338',
1398         'nsupe;': '\u2289',
1399         'nsupset;': '\u2283\u20d2',
1400         'nsupseteq;': '\u2289',
1401         'nsupseteqq;': '\u2ac6\u0338',
1402         'ntgl;': '\u2279',
1403         'Ntilde': '\xd1',
1404         'ntilde': '\xf1',
1405         'Ntilde;': '\xd1',
1406         'ntilde;': '\xf1',
1407         'ntlg;': '\u2278',
1408         'ntriangleleft;': '\u22ea',
1409         'ntrianglelefteq;': '\u22ec',
1410         'ntriangleright;': '\u22eb',
1411         'ntrianglerighteq;': '\u22ed',
1412         'Nu;': '\u039d',
1413         'nu;': '\u03bd',
1414         'num;': '#',
1415         'numero;': '\u2116',
1416         'numsp;': '\u2007',
1417         'nvap;': '\u224d\u20d2',
1418         'nVDash;': '\u22af',
1419         'nVdash;': '\u22ae',
1420         'nvDash;': '\u22ad',
1421         'nvdash;': '\u22ac',
1422         'nvge;': '\u2265\u20d2',
1423         'nvgt;': '>\u20d2',
1424         'nvHarr;': '\u2904',
1425         'nvinfin;': '\u29de',
1426         'nvlArr;': '\u2902',
1427         'nvle;': '\u2264\u20d2',
1428         'nvlt;': '<\u20d2',
1429         'nvltrie;': '\u22b4\u20d2',
1430         'nvrArr;': '\u2903',
1431         'nvrtrie;': '\u22b5\u20d2',
1432         'nvsim;': '\u223c\u20d2',
1433         'nwarhk;': '\u2923',
1434         'nwArr;': '\u21d6',
1435         'nwarr;': '\u2196',
1436         'nwarrow;': '\u2196',
1437         'nwnear;': '\u2927',
1438         'Oacute': '\xd3',
1439         'oacute': '\xf3',
1440         'Oacute;': '\xd3',
1441         'oacute;': '\xf3',
1442         'oast;': '\u229b',
1443         'ocir;': '\u229a',
1444         'Ocirc': '\xd4',
1445         'ocirc': '\xf4',
1446         'Ocirc;': '\xd4',
1447         'ocirc;': '\xf4',
1448         'Ocy;': '\u041e',
1449         'ocy;': '\u043e',
1450         'odash;': '\u229d',
1451         'Odblac;': '\u0150',
1452         'odblac;': '\u0151',
1453         'odiv;': '\u2a38',
1454         'odot;': '\u2299',
1455         'odsold;': '\u29bc',
1456         'OElig;': '\u0152',
1457         'oelig;': '\u0153',
1458         'ofcir;': '\u29bf',
1459         'Ofr;': '\U0001d512',
1460         'ofr;': '\U0001d52c',
1461         'ogon;': '\u02db',
1462         'Ograve': '\xd2',
1463         'ograve': '\xf2',
1464         'Ograve;': '\xd2',
1465         'ograve;': '\xf2',
1466         'ogt;': '\u29c1',
1467         'ohbar;': '\u29b5',
1468         'ohm;': '\u03a9',
1469         'oint;': '\u222e',
1470         'olarr;': '\u21ba',
1471         'olcir;': '\u29be',
1472         'olcross;': '\u29bb',
1473         'oline;': '\u203e',
1474         'olt;': '\u29c0',
1475         'Omacr;': '\u014c',
1476         'omacr;': '\u014d',
1477         'Omega;': '\u03a9',
1478         'omega;': '\u03c9',
1479         'Omicron;': '\u039f',
1480         'omicron;': '\u03bf',
1481         'omid;': '\u29b6',
1482         'ominus;': '\u2296',
1483         'Oopf;': '\U0001d546',
1484         'oopf;': '\U0001d560',
1485         'opar;': '\u29b7',
1486         'OpenCurlyDoubleQuote;': '\u201c',
1487         'OpenCurlyQuote;': '\u2018',
1488         'operp;': '\u29b9',
1489         'oplus;': '\u2295',
1490         'Or;': '\u2a54',
1491         'or;': '\u2228',
1492         'orarr;': '\u21bb',
1493         'ord;': '\u2a5d',
1494         'order;': '\u2134',
1495         'orderof;': '\u2134',
1496         'ordf': '\xaa',
1497         'ordf;': '\xaa',
1498         'ordm': '\xba',
1499         'ordm;': '\xba',
1500         'origof;': '\u22b6',
1501         'oror;': '\u2a56',
1502         'orslope;': '\u2a57',
1503         'orv;': '\u2a5b',
1504         'oS;': '\u24c8',
1505         'Oscr;': '\U0001d4aa',
1506         'oscr;': '\u2134',
1507         'Oslash': '\xd8',
1508         'oslash': '\xf8',
1509         'Oslash;': '\xd8',
1510         'oslash;': '\xf8',
1511         'osol;': '\u2298',
1512         'Otilde': '\xd5',
1513         'otilde': '\xf5',
1514         'Otilde;': '\xd5',
1515         'otilde;': '\xf5',
1516         'Otimes;': '\u2a37',
1517         'otimes;': '\u2297',
1518         'otimesas;': '\u2a36',
1519         'Ouml': '\xd6',
1520         'ouml': '\xf6',
1521         'Ouml;': '\xd6',
1522         'ouml;': '\xf6',
1523         'ovbar;': '\u233d',
1524         'OverBar;': '\u203e',
1525         'OverBrace;': '\u23de',
1526         'OverBracket;': '\u23b4',
1527         'OverParenthesis;': '\u23dc',
1528         'par;': '\u2225',
1529         'para': '\xb6',
1530         'para;': '\xb6',
1531         'parallel;': '\u2225',
1532         'parsim;': '\u2af3',
1533         'parsl;': '\u2afd',
1534         'part;': '\u2202',
1535         'PartialD;': '\u2202',
1536         'Pcy;': '\u041f',
1537         'pcy;': '\u043f',
1538         'percnt;': '%',
1539         'period;': '.',
1540         'permil;': '\u2030',
1541         'perp;': '\u22a5',
1542         'pertenk;': '\u2031',
1543         'Pfr;': '\U0001d513',
1544         'pfr;': '\U0001d52d',
1545         'Phi;': '\u03a6',
1546         'phi;': '\u03c6',
1547         'phiv;': '\u03d5',
1548         'phmmat;': '\u2133',
1549         'phone;': '\u260e',
1550         'Pi;': '\u03a0',
1551         'pi;': '\u03c0',
1552         'pitchfork;': '\u22d4',
1553         'piv;': '\u03d6',
1554         'planck;': '\u210f',
1555         'planckh;': '\u210e',
1556         'plankv;': '\u210f',
1557         'plus;': '+',
1558         'plusacir;': '\u2a23',
1559         'plusb;': '\u229e',
1560         'pluscir;': '\u2a22',
1561         'plusdo;': '\u2214',
1562         'plusdu;': '\u2a25',
1563         'pluse;': '\u2a72',
1564         'PlusMinus;': '\xb1',
1565         'plusmn': '\xb1',
1566         'plusmn;': '\xb1',
1567         'plussim;': '\u2a26',
1568         'plustwo;': '\u2a27',
1569         'pm;': '\xb1',
1570         'Poincareplane;': '\u210c',
1571         'pointint;': '\u2a15',
1572         'Popf;': '\u2119',
1573         'popf;': '\U0001d561',
1574         'pound': '\xa3',
1575         'pound;': '\xa3',
1576         'Pr;': '\u2abb',
1577         'pr;': '\u227a',
1578         'prap;': '\u2ab7',
1579         'prcue;': '\u227c',
1580         'prE;': '\u2ab3',
1581         'pre;': '\u2aaf',
1582         'prec;': '\u227a',
1583         'precapprox;': '\u2ab7',
1584         'preccurlyeq;': '\u227c',
1585         'Precedes;': '\u227a',
1586         'PrecedesEqual;': '\u2aaf',
1587         'PrecedesSlantEqual;': '\u227c',
1588         'PrecedesTilde;': '\u227e',
1589         'preceq;': '\u2aaf',
1590         'precnapprox;': '\u2ab9',
1591         'precneqq;': '\u2ab5',
1592         'precnsim;': '\u22e8',
1593         'precsim;': '\u227e',
1594         'Prime;': '\u2033',
1595         'prime;': '\u2032',
1596         'primes;': '\u2119',
1597         'prnap;': '\u2ab9',
1598         'prnE;': '\u2ab5',
1599         'prnsim;': '\u22e8',
1600         'prod;': '\u220f',
1601         'Product;': '\u220f',
1602         'profalar;': '\u232e',
1603         'profline;': '\u2312',
1604         'profsurf;': '\u2313',
1605         'prop;': '\u221d',
1606         'Proportion;': '\u2237',
1607         'Proportional;': '\u221d',
1608         'propto;': '\u221d',
1609         'prsim;': '\u227e',
1610         'prurel;': '\u22b0',
1611         'Pscr;': '\U0001d4ab',
1612         'pscr;': '\U0001d4c5',
1613         'Psi;': '\u03a8',
1614         'psi;': '\u03c8',
1615         'puncsp;': '\u2008',
1616         'Qfr;': '\U0001d514',
1617         'qfr;': '\U0001d52e',
1618         'qint;': '\u2a0c',
1619         'Qopf;': '\u211a',
1620         'qopf;': '\U0001d562',
1621         'qprime;': '\u2057',
1622         'Qscr;': '\U0001d4ac',
1623         'qscr;': '\U0001d4c6',
1624         'quaternions;': '\u210d',
1625         'quatint;': '\u2a16',
1626         'quest;': '?',
1627         'questeq;': '\u225f',
1628         'QUOT': '"',
1629         'quot': '"',
1630         'QUOT;': '"',
1631         'quot;': '"',
1632         'rAarr;': '\u21db',
1633         'race;': '\u223d\u0331',
1634         'Racute;': '\u0154',
1635         'racute;': '\u0155',
1636         'radic;': '\u221a',
1637         'raemptyv;': '\u29b3',
1638         'Rang;': '\u27eb',
1639         'rang;': '\u27e9',
1640         'rangd;': '\u2992',
1641         'range;': '\u29a5',
1642         'rangle;': '\u27e9',
1643         'raquo': '\xbb',
1644         'raquo;': '\xbb',
1645         'Rarr;': '\u21a0',
1646         'rArr;': '\u21d2',
1647         'rarr;': '\u2192',
1648         'rarrap;': '\u2975',
1649         'rarrb;': '\u21e5',
1650         'rarrbfs;': '\u2920',
1651         'rarrc;': '\u2933',
1652         'rarrfs;': '\u291e',
1653         'rarrhk;': '\u21aa',
1654         'rarrlp;': '\u21ac',
1655         'rarrpl;': '\u2945',
1656         'rarrsim;': '\u2974',
1657         'Rarrtl;': '\u2916',
1658         'rarrtl;': '\u21a3',
1659         'rarrw;': '\u219d',
1660         'rAtail;': '\u291c',
1661         'ratail;': '\u291a',
1662         'ratio;': '\u2236',
1663         'rationals;': '\u211a',
1664         'RBarr;': '\u2910',
1665         'rBarr;': '\u290f',
1666         'rbarr;': '\u290d',
1667         'rbbrk;': '\u2773',
1668         'rbrace;': '}',
1669         'rbrack;': ']',
1670         'rbrke;': '\u298c',
1671         'rbrksld;': '\u298e',
1672         'rbrkslu;': '\u2990',
1673         'Rcaron;': '\u0158',
1674         'rcaron;': '\u0159',
1675         'Rcedil;': '\u0156',
1676         'rcedil;': '\u0157',
1677         'rceil;': '\u2309',
1678         'rcub;': '}',
1679         'Rcy;': '\u0420',
1680         'rcy;': '\u0440',
1681         'rdca;': '\u2937',
1682         'rdldhar;': '\u2969',
1683         'rdquo;': '\u201d',
1684         'rdquor;': '\u201d',
1685         'rdsh;': '\u21b3',
1686         'Re;': '\u211c',
1687         'real;': '\u211c',
1688         'realine;': '\u211b',
1689         'realpart;': '\u211c',
1690         'reals;': '\u211d',
1691         'rect;': '\u25ad',
1692         'REG': '\xae',
1693         'reg': '\xae',
1694         'REG;': '\xae',
1695         'reg;': '\xae',
1696         'ReverseElement;': '\u220b',
1697         'ReverseEquilibrium;': '\u21cb',
1698         'ReverseUpEquilibrium;': '\u296f',
1699         'rfisht;': '\u297d',
1700         'rfloor;': '\u230b',
1701         'Rfr;': '\u211c',
1702         'rfr;': '\U0001d52f',
1703         'rHar;': '\u2964',
1704         'rhard;': '\u21c1',
1705         'rharu;': '\u21c0',
1706         'rharul;': '\u296c',
1707         'Rho;': '\u03a1',
1708         'rho;': '\u03c1',
1709         'rhov;': '\u03f1',
1710         'RightAngleBracket;': '\u27e9',
1711         'RightArrow;': '\u2192',
1712         'Rightarrow;': '\u21d2',
1713         'rightarrow;': '\u2192',
1714         'RightArrowBar;': '\u21e5',
1715         'RightArrowLeftArrow;': '\u21c4',
1716         'rightarrowtail;': '\u21a3',
1717         'RightCeiling;': '\u2309',
1718         'RightDoubleBracket;': '\u27e7',
1719         'RightDownTeeVector;': '\u295d',
1720         'RightDownVector;': '\u21c2',
1721         'RightDownVectorBar;': '\u2955',
1722         'RightFloor;': '\u230b',
1723         'rightharpoondown;': '\u21c1',
1724         'rightharpoonup;': '\u21c0',
1725         'rightleftarrows;': '\u21c4',
1726         'rightleftharpoons;': '\u21cc',
1727         'rightrightarrows;': '\u21c9',
1728         'rightsquigarrow;': '\u219d',
1729         'RightTee;': '\u22a2',
1730         'RightTeeArrow;': '\u21a6',
1731         'RightTeeVector;': '\u295b',
1732         'rightthreetimes;': '\u22cc',
1733         'RightTriangle;': '\u22b3',
1734         'RightTriangleBar;': '\u29d0',
1735         'RightTriangleEqual;': '\u22b5',
1736         'RightUpDownVector;': '\u294f',
1737         'RightUpTeeVector;': '\u295c',
1738         'RightUpVector;': '\u21be',
1739         'RightUpVectorBar;': '\u2954',
1740         'RightVector;': '\u21c0',
1741         'RightVectorBar;': '\u2953',
1742         'ring;': '\u02da',
1743         'risingdotseq;': '\u2253',
1744         'rlarr;': '\u21c4',
1745         'rlhar;': '\u21cc',
1746         'rlm;': '\u200f',
1747         'rmoust;': '\u23b1',
1748         'rmoustache;': '\u23b1',
1749         'rnmid;': '\u2aee',
1750         'roang;': '\u27ed',
1751         'roarr;': '\u21fe',
1752         'robrk;': '\u27e7',
1753         'ropar;': '\u2986',
1754         'Ropf;': '\u211d',
1755         'ropf;': '\U0001d563',
1756         'roplus;': '\u2a2e',
1757         'rotimes;': '\u2a35',
1758         'RoundImplies;': '\u2970',
1759         'rpar;': ')',
1760         'rpargt;': '\u2994',
1761         'rppolint;': '\u2a12',
1762         'rrarr;': '\u21c9',
1763         'Rrightarrow;': '\u21db',
1764         'rsaquo;': '\u203a',
1765         'Rscr;': '\u211b',
1766         'rscr;': '\U0001d4c7',
1767         'Rsh;': '\u21b1',
1768         'rsh;': '\u21b1',
1769         'rsqb;': ']',
1770         'rsquo;': '\u2019',
1771         'rsquor;': '\u2019',
1772         'rthree;': '\u22cc',
1773         'rtimes;': '\u22ca',
1774         'rtri;': '\u25b9',
1775         'rtrie;': '\u22b5',
1776         'rtrif;': '\u25b8',
1777         'rtriltri;': '\u29ce',
1778         'RuleDelayed;': '\u29f4',
1779         'ruluhar;': '\u2968',
1780         'rx;': '\u211e',
1781         'Sacute;': '\u015a',
1782         'sacute;': '\u015b',
1783         'sbquo;': '\u201a',
1784         'Sc;': '\u2abc',
1785         'sc;': '\u227b',
1786         'scap;': '\u2ab8',
1787         'Scaron;': '\u0160',
1788         'scaron;': '\u0161',
1789         'sccue;': '\u227d',
1790         'scE;': '\u2ab4',
1791         'sce;': '\u2ab0',
1792         'Scedil;': '\u015e',
1793         'scedil;': '\u015f',
1794         'Scirc;': '\u015c',
1795         'scirc;': '\u015d',
1796         'scnap;': '\u2aba',
1797         'scnE;': '\u2ab6',
1798         'scnsim;': '\u22e9',
1799         'scpolint;': '\u2a13',
1800         'scsim;': '\u227f',
1801         'Scy;': '\u0421',
1802         'scy;': '\u0441',
1803         'sdot;': '\u22c5',
1804         'sdotb;': '\u22a1',
1805         'sdote;': '\u2a66',
1806         'searhk;': '\u2925',
1807         'seArr;': '\u21d8',
1808         'searr;': '\u2198',
1809         'searrow;': '\u2198',
1810         'sect': '\xa7',
1811         'sect;': '\xa7',
1812         'semi;': ';',
1813         'seswar;': '\u2929',
1814         'setminus;': '\u2216',
1815         'setmn;': '\u2216',
1816         'sext;': '\u2736',
1817         'Sfr;': '\U0001d516',
1818         'sfr;': '\U0001d530',
1819         'sfrown;': '\u2322',
1820         'sharp;': '\u266f',
1821         'SHCHcy;': '\u0429',
1822         'shchcy;': '\u0449',
1823         'SHcy;': '\u0428',
1824         'shcy;': '\u0448',
1825         'ShortDownArrow;': '\u2193',
1826         'ShortLeftArrow;': '\u2190',
1827         'shortmid;': '\u2223',
1828         'shortparallel;': '\u2225',
1829         'ShortRightArrow;': '\u2192',
1830         'ShortUpArrow;': '\u2191',
1831         'shy': '\xad',
1832         'shy;': '\xad',
1833         'Sigma;': '\u03a3',
1834         'sigma;': '\u03c3',
1835         'sigmaf;': '\u03c2',
1836         'sigmav;': '\u03c2',
1837         'sim;': '\u223c',
1838         'simdot;': '\u2a6a',
1839         'sime;': '\u2243',
1840         'simeq;': '\u2243',
1841         'simg;': '\u2a9e',
1842         'simgE;': '\u2aa0',
1843         'siml;': '\u2a9d',
1844         'simlE;': '\u2a9f',
1845         'simne;': '\u2246',
1846         'simplus;': '\u2a24',
1847         'simrarr;': '\u2972',
1848         'slarr;': '\u2190',
1849         'SmallCircle;': '\u2218',
1850         'smallsetminus;': '\u2216',
1851         'smashp;': '\u2a33',
1852         'smeparsl;': '\u29e4',
1853         'smid;': '\u2223',
1854         'smile;': '\u2323',
1855         'smt;': '\u2aaa',
1856         'smte;': '\u2aac',
1857         'smtes;': '\u2aac\ufe00',
1858         'SOFTcy;': '\u042c',
1859         'softcy;': '\u044c',
1860         'sol;': '/',
1861         'solb;': '\u29c4',
1862         'solbar;': '\u233f',
1863         'Sopf;': '\U0001d54a',
1864         'sopf;': '\U0001d564',
1865         'spades;': '\u2660',
1866         'spadesuit;': '\u2660',
1867         'spar;': '\u2225',
1868         'sqcap;': '\u2293',
1869         'sqcaps;': '\u2293\ufe00',
1870         'sqcup;': '\u2294',
1871         'sqcups;': '\u2294\ufe00',
1872         'Sqrt;': '\u221a',
1873         'sqsub;': '\u228f',
1874         'sqsube;': '\u2291',
1875         'sqsubset;': '\u228f',
1876         'sqsubseteq;': '\u2291',
1877         'sqsup;': '\u2290',
1878         'sqsupe;': '\u2292',
1879         'sqsupset;': '\u2290',
1880         'sqsupseteq;': '\u2292',
1881         'squ;': '\u25a1',
1882         'Square;': '\u25a1',
1883         'square;': '\u25a1',
1884         'SquareIntersection;': '\u2293',
1885         'SquareSubset;': '\u228f',
1886         'SquareSubsetEqual;': '\u2291',
1887         'SquareSuperset;': '\u2290',
1888         'SquareSupersetEqual;': '\u2292',
1889         'SquareUnion;': '\u2294',
1890         'squarf;': '\u25aa',
1891         'squf;': '\u25aa',
1892         'srarr;': '\u2192',
1893         'Sscr;': '\U0001d4ae',
1894         'sscr;': '\U0001d4c8',
1895         'ssetmn;': '\u2216',
1896         'ssmile;': '\u2323',
1897         'sstarf;': '\u22c6',
1898         'Star;': '\u22c6',
1899         'star;': '\u2606',
1900         'starf;': '\u2605',
1901         'straightepsilon;': '\u03f5',
1902         'straightphi;': '\u03d5',
1903         'strns;': '\xaf',
1904         'Sub;': '\u22d0',
1905         'sub;': '\u2282',
1906         'subdot;': '\u2abd',
1907         'subE;': '\u2ac5',
1908         'sube;': '\u2286',
1909         'subedot;': '\u2ac3',
1910         'submult;': '\u2ac1',
1911         'subnE;': '\u2acb',
1912         'subne;': '\u228a',
1913         'subplus;': '\u2abf',
1914         'subrarr;': '\u2979',
1915         'Subset;': '\u22d0',
1916         'subset;': '\u2282',
1917         'subseteq;': '\u2286',
1918         'subseteqq;': '\u2ac5',
1919         'SubsetEqual;': '\u2286',
1920         'subsetneq;': '\u228a',
1921         'subsetneqq;': '\u2acb',
1922         'subsim;': '\u2ac7',
1923         'subsub;': '\u2ad5',
1924         'subsup;': '\u2ad3',
1925         'succ;': '\u227b',
1926         'succapprox;': '\u2ab8',
1927         'succcurlyeq;': '\u227d',
1928         'Succeeds;': '\u227b',
1929         'SucceedsEqual;': '\u2ab0',
1930         'SucceedsSlantEqual;': '\u227d',
1931         'SucceedsTilde;': '\u227f',
1932         'succeq;': '\u2ab0',
1933         'succnapprox;': '\u2aba',
1934         'succneqq;': '\u2ab6',
1935         'succnsim;': '\u22e9',
1936         'succsim;': '\u227f',
1937         'SuchThat;': '\u220b',
1938         'Sum;': '\u2211',
1939         'sum;': '\u2211',
1940         'sung;': '\u266a',
1941         'sup1': '\xb9',
1942         'sup1;': '\xb9',
1943         'sup2': '\xb2',
1944         'sup2;': '\xb2',
1945         'sup3': '\xb3',
1946         'sup3;': '\xb3',
1947         'Sup;': '\u22d1',
1948         'sup;': '\u2283',
1949         'supdot;': '\u2abe',
1950         'supdsub;': '\u2ad8',
1951         'supE;': '\u2ac6',
1952         'supe;': '\u2287',
1953         'supedot;': '\u2ac4',
1954         'Superset;': '\u2283',
1955         'SupersetEqual;': '\u2287',
1956         'suphsol;': '\u27c9',
1957         'suphsub;': '\u2ad7',
1958         'suplarr;': '\u297b',
1959         'supmult;': '\u2ac2',
1960         'supnE;': '\u2acc',
1961         'supne;': '\u228b',
1962         'supplus;': '\u2ac0',
1963         'Supset;': '\u22d1',
1964         'supset;': '\u2283',
1965         'supseteq;': '\u2287',
1966         'supseteqq;': '\u2ac6',
1967         'supsetneq;': '\u228b',
1968         'supsetneqq;': '\u2acc',
1969         'supsim;': '\u2ac8',
1970         'supsub;': '\u2ad4',
1971         'supsup;': '\u2ad6',
1972         'swarhk;': '\u2926',
1973         'swArr;': '\u21d9',
1974         'swarr;': '\u2199',
1975         'swarrow;': '\u2199',
1976         'swnwar;': '\u292a',
1977         'szlig': '\xdf',
1978         'szlig;': '\xdf',
1979         'Tab;': '\t',
1980         'target;': '\u2316',
1981         'Tau;': '\u03a4',
1982         'tau;': '\u03c4',
1983         'tbrk;': '\u23b4',
1984         'Tcaron;': '\u0164',
1985         'tcaron;': '\u0165',
1986         'Tcedil;': '\u0162',
1987         'tcedil;': '\u0163',
1988         'Tcy;': '\u0422',
1989         'tcy;': '\u0442',
1990         'tdot;': '\u20db',
1991         'telrec;': '\u2315',
1992         'Tfr;': '\U0001d517',
1993         'tfr;': '\U0001d531',
1994         'there4;': '\u2234',
1995         'Therefore;': '\u2234',
1996         'therefore;': '\u2234',
1997         'Theta;': '\u0398',
1998         'theta;': '\u03b8',
1999         'thetasym;': '\u03d1',
2000         'thetav;': '\u03d1',
2001         'thickapprox;': '\u2248',
2002         'thicksim;': '\u223c',
2003         'ThickSpace;': '\u205f\u200a',
2004         'thinsp;': '\u2009',
2005         'ThinSpace;': '\u2009',
2006         'thkap;': '\u2248',
2007         'thksim;': '\u223c',
2008         'THORN': '\xde',
2009         'thorn': '\xfe',
2010         'THORN;': '\xde',
2011         'thorn;': '\xfe',
2012         'Tilde;': '\u223c',
2013         'tilde;': '\u02dc',
2014         'TildeEqual;': '\u2243',
2015         'TildeFullEqual;': '\u2245',
2016         'TildeTilde;': '\u2248',
2017         'times': '\xd7',
2018         'times;': '\xd7',
2019         'timesb;': '\u22a0',
2020         'timesbar;': '\u2a31',
2021         'timesd;': '\u2a30',
2022         'tint;': '\u222d',
2023         'toea;': '\u2928',
2024         'top;': '\u22a4',
2025         'topbot;': '\u2336',
2026         'topcir;': '\u2af1',
2027         'Topf;': '\U0001d54b',
2028         'topf;': '\U0001d565',
2029         'topfork;': '\u2ada',
2030         'tosa;': '\u2929',
2031         'tprime;': '\u2034',
2032         'TRADE;': '\u2122',
2033         'trade;': '\u2122',
2034         'triangle;': '\u25b5',
2035         'triangledown;': '\u25bf',
2036         'triangleleft;': '\u25c3',
2037         'trianglelefteq;': '\u22b4',
2038         'triangleq;': '\u225c',
2039         'triangleright;': '\u25b9',
2040         'trianglerighteq;': '\u22b5',
2041         'tridot;': '\u25ec',
2042         'trie;': '\u225c',
2043         'triminus;': '\u2a3a',
2044         'TripleDot;': '\u20db',
2045         'triplus;': '\u2a39',
2046         'trisb;': '\u29cd',
2047         'tritime;': '\u2a3b',
2048         'trpezium;': '\u23e2',
2049         'Tscr;': '\U0001d4af',
2050         'tscr;': '\U0001d4c9',
2051         'TScy;': '\u0426',
2052         'tscy;': '\u0446',
2053         'TSHcy;': '\u040b',
2054         'tshcy;': '\u045b',
2055         'Tstrok;': '\u0166',
2056         'tstrok;': '\u0167',
2057         'twixt;': '\u226c',
2058         'twoheadleftarrow;': '\u219e',
2059         'twoheadrightarrow;': '\u21a0',
2060         'Uacute': '\xda',
2061         'uacute': '\xfa',
2062         'Uacute;': '\xda',
2063         'uacute;': '\xfa',
2064         'Uarr;': '\u219f',
2065         'uArr;': '\u21d1',
2066         'uarr;': '\u2191',
2067         'Uarrocir;': '\u2949',
2068         'Ubrcy;': '\u040e',
2069         'ubrcy;': '\u045e',
2070         'Ubreve;': '\u016c',
2071         'ubreve;': '\u016d',
2072         'Ucirc': '\xdb',
2073         'ucirc': '\xfb',
2074         'Ucirc;': '\xdb',
2075         'ucirc;': '\xfb',
2076         'Ucy;': '\u0423',
2077         'ucy;': '\u0443',
2078         'udarr;': '\u21c5',
2079         'Udblac;': '\u0170',
2080         'udblac;': '\u0171',
2081         'udhar;': '\u296e',
2082         'ufisht;': '\u297e',
2083         'Ufr;': '\U0001d518',
2084         'ufr;': '\U0001d532',
2085         'Ugrave': '\xd9',
2086         'ugrave': '\xf9',
2087         'Ugrave;': '\xd9',
2088         'ugrave;': '\xf9',
2089         'uHar;': '\u2963',
2090         'uharl;': '\u21bf',
2091         'uharr;': '\u21be',
2092         'uhblk;': '\u2580',
2093         'ulcorn;': '\u231c',
2094         'ulcorner;': '\u231c',
2095         'ulcrop;': '\u230f',
2096         'ultri;': '\u25f8',
2097         'Umacr;': '\u016a',
2098         'umacr;': '\u016b',
2099         'uml': '\xa8',
2100         'uml;': '\xa8',
2101         'UnderBar;': '_',
2102         'UnderBrace;': '\u23df',
2103         'UnderBracket;': '\u23b5',
2104         'UnderParenthesis;': '\u23dd',
2105         'Union;': '\u22c3',
2106         'UnionPlus;': '\u228e',
2107         'Uogon;': '\u0172',
2108         'uogon;': '\u0173',
2109         'Uopf;': '\U0001d54c',
2110         'uopf;': '\U0001d566',
2111         'UpArrow;': '\u2191',
2112         'Uparrow;': '\u21d1',
2113         'uparrow;': '\u2191',
2114         'UpArrowBar;': '\u2912',
2115         'UpArrowDownArrow;': '\u21c5',
2116         'UpDownArrow;': '\u2195',
2117         'Updownarrow;': '\u21d5',
2118         'updownarrow;': '\u2195',
2119         'UpEquilibrium;': '\u296e',
2120         'upharpoonleft;': '\u21bf',
2121         'upharpoonright;': '\u21be',
2122         'uplus;': '\u228e',
2123         'UpperLeftArrow;': '\u2196',
2124         'UpperRightArrow;': '\u2197',
2125         'Upsi;': '\u03d2',
2126         'upsi;': '\u03c5',
2127         'upsih;': '\u03d2',
2128         'Upsilon;': '\u03a5',
2129         'upsilon;': '\u03c5',
2130         'UpTee;': '\u22a5',
2131         'UpTeeArrow;': '\u21a5',
2132         'upuparrows;': '\u21c8',
2133         'urcorn;': '\u231d',
2134         'urcorner;': '\u231d',
2135         'urcrop;': '\u230e',
2136         'Uring;': '\u016e',
2137         'uring;': '\u016f',
2138         'urtri;': '\u25f9',
2139         'Uscr;': '\U0001d4b0',
2140         'uscr;': '\U0001d4ca',
2141         'utdot;': '\u22f0',
2142         'Utilde;': '\u0168',
2143         'utilde;': '\u0169',
2144         'utri;': '\u25b5',
2145         'utrif;': '\u25b4',
2146         'uuarr;': '\u21c8',
2147         'Uuml': '\xdc',
2148         'uuml': '\xfc',
2149         'Uuml;': '\xdc',
2150         'uuml;': '\xfc',
2151         'uwangle;': '\u29a7',
2152         'vangrt;': '\u299c',
2153         'varepsilon;': '\u03f5',
2154         'varkappa;': '\u03f0',
2155         'varnothing;': '\u2205',
2156         'varphi;': '\u03d5',
2157         'varpi;': '\u03d6',
2158         'varpropto;': '\u221d',
2159         'vArr;': '\u21d5',
2160         'varr;': '\u2195',
2161         'varrho;': '\u03f1',
2162         'varsigma;': '\u03c2',
2163         'varsubsetneq;': '\u228a\ufe00',
2164         'varsubsetneqq;': '\u2acb\ufe00',
2165         'varsupsetneq;': '\u228b\ufe00',
2166         'varsupsetneqq;': '\u2acc\ufe00',
2167         'vartheta;': '\u03d1',
2168         'vartriangleleft;': '\u22b2',
2169         'vartriangleright;': '\u22b3',
2170         'Vbar;': '\u2aeb',
2171         'vBar;': '\u2ae8',
2172         'vBarv;': '\u2ae9',
2173         'Vcy;': '\u0412',
2174         'vcy;': '\u0432',
2175         'VDash;': '\u22ab',
2176         'Vdash;': '\u22a9',
2177         'vDash;': '\u22a8',
2178         'vdash;': '\u22a2',
2179         'Vdashl;': '\u2ae6',
2180         'Vee;': '\u22c1',
2181         'vee;': '\u2228',
2182         'veebar;': '\u22bb',
2183         'veeeq;': '\u225a',
2184         'vellip;': '\u22ee',
2185         'Verbar;': '\u2016',
2186         'verbar;': '|',
2187         'Vert;': '\u2016',
2188         'vert;': '|',
2189         'VerticalBar;': '\u2223',
2190         'VerticalLine;': '|',
2191         'VerticalSeparator;': '\u2758',
2192         'VerticalTilde;': '\u2240',
2193         'VeryThinSpace;': '\u200a',
2194         'Vfr;': '\U0001d519',
2195         'vfr;': '\U0001d533',
2196         'vltri;': '\u22b2',
2197         'vnsub;': '\u2282\u20d2',
2198         'vnsup;': '\u2283\u20d2',
2199         'Vopf;': '\U0001d54d',
2200         'vopf;': '\U0001d567',
2201         'vprop;': '\u221d',
2202         'vrtri;': '\u22b3',
2203         'Vscr;': '\U0001d4b1',
2204         'vscr;': '\U0001d4cb',
2205         'vsubnE;': '\u2acb\ufe00',
2206         'vsubne;': '\u228a\ufe00',
2207         'vsupnE;': '\u2acc\ufe00',
2208         'vsupne;': '\u228b\ufe00',
2209         'Vvdash;': '\u22aa',
2210         'vzigzag;': '\u299a',
2211         'Wcirc;': '\u0174',
2212         'wcirc;': '\u0175',
2213         'wedbar;': '\u2a5f',
2214         'Wedge;': '\u22c0',
2215         'wedge;': '\u2227',
2216         'wedgeq;': '\u2259',
2217         'weierp;': '\u2118',
2218         'Wfr;': '\U0001d51a',
2219         'wfr;': '\U0001d534',
2220         'Wopf;': '\U0001d54e',
2221         'wopf;': '\U0001d568',
2222         'wp;': '\u2118',
2223         'wr;': '\u2240',
2224         'wreath;': '\u2240',
2225         'Wscr;': '\U0001d4b2',
2226         'wscr;': '\U0001d4cc',
2227         'xcap;': '\u22c2',
2228         'xcirc;': '\u25ef',
2229         'xcup;': '\u22c3',
2230         'xdtri;': '\u25bd',
2231         'Xfr;': '\U0001d51b',
2232         'xfr;': '\U0001d535',
2233         'xhArr;': '\u27fa',
2234         'xharr;': '\u27f7',
2235         'Xi;': '\u039e',
2236         'xi;': '\u03be',
2237         'xlArr;': '\u27f8',
2238         'xlarr;': '\u27f5',
2239         'xmap;': '\u27fc',
2240         'xnis;': '\u22fb',
2241         'xodot;': '\u2a00',
2242         'Xopf;': '\U0001d54f',
2243         'xopf;': '\U0001d569',
2244         'xoplus;': '\u2a01',
2245         'xotime;': '\u2a02',
2246         'xrArr;': '\u27f9',
2247         'xrarr;': '\u27f6',
2248         'Xscr;': '\U0001d4b3',
2249         'xscr;': '\U0001d4cd',
2250         'xsqcup;': '\u2a06',
2251         'xuplus;': '\u2a04',
2252         'xutri;': '\u25b3',
2253         'xvee;': '\u22c1',
2254         'xwedge;': '\u22c0',
2255         'Yacute': '\xdd',
2256         'yacute': '\xfd',
2257         'Yacute;': '\xdd',
2258         'yacute;': '\xfd',
2259         'YAcy;': '\u042f',
2260         'yacy;': '\u044f',
2261         'Ycirc;': '\u0176',
2262         'ycirc;': '\u0177',
2263         'Ycy;': '\u042b',
2264         'ycy;': '\u044b',
2265         'yen': '\xa5',
2266         'yen;': '\xa5',
2267         'Yfr;': '\U0001d51c',
2268         'yfr;': '\U0001d536',
2269         'YIcy;': '\u0407',
2270         'yicy;': '\u0457',
2271         'Yopf;': '\U0001d550',
2272         'yopf;': '\U0001d56a',
2273         'Yscr;': '\U0001d4b4',
2274         'yscr;': '\U0001d4ce',
2275         'YUcy;': '\u042e',
2276         'yucy;': '\u044e',
2277         'yuml': '\xff',
2278         'Yuml;': '\u0178',
2279         'yuml;': '\xff',
2280         'Zacute;': '\u0179',
2281         'zacute;': '\u017a',
2282         'Zcaron;': '\u017d',
2283         'zcaron;': '\u017e',
2284         'Zcy;': '\u0417',
2285         'zcy;': '\u0437',
2286         'Zdot;': '\u017b',
2287         'zdot;': '\u017c',
2288         'zeetrf;': '\u2128',
2289         'ZeroWidthSpace;': '\u200b',
2290         'Zeta;': '\u0396',
2291         'zeta;': '\u03b6',
2292         'Zfr;': '\u2128',
2293         'zfr;': '\U0001d537',
2294         'ZHcy;': '\u0416',
2295         'zhcy;': '\u0436',
2296         'zigrarr;': '\u21dd',
2297         'Zopf;': '\u2124',
2298         'zopf;': '\U0001d56b',
2299         'Zscr;': '\U0001d4b5',
2300         'zscr;': '\U0001d4cf',
2301         'zwj;': '\u200d',
2302         'zwnj;': '\u200c',
2303     }
2304
2305 try:
2306     import http.client as compat_http_client
2307 except ImportError:  # Python 2
2308     import httplib as compat_http_client
2309
2310 try:
2311     from urllib.error import HTTPError as compat_HTTPError
2312 except ImportError:  # Python 2
2313     from urllib2 import HTTPError as compat_HTTPError
2314
2315 try:
2316     from urllib.request import urlretrieve as compat_urlretrieve
2317 except ImportError:  # Python 2
2318     from urllib import urlretrieve as compat_urlretrieve
2319
2320 try:
2321     from html.parser import HTMLParser as compat_HTMLParser
2322 except ImportError:  # Python 2
2323     from HTMLParser import HTMLParser as compat_HTMLParser
2324
2325 try:
2326     from subprocess import DEVNULL
2327     compat_subprocess_get_DEVNULL = lambda: DEVNULL
2328 except ImportError:
2329     compat_subprocess_get_DEVNULL = lambda: open(os.path.devnull, 'w')
2330
2331 try:
2332     import http.server as compat_http_server
2333 except ImportError:
2334     import BaseHTTPServer as compat_http_server
2335
2336 try:
2337     compat_str = unicode  # Python 2
2338 except NameError:
2339     compat_str = str
2340
2341 try:
2342     from urllib.parse import unquote_to_bytes as compat_urllib_parse_unquote_to_bytes
2343     from urllib.parse import unquote as compat_urllib_parse_unquote
2344     from urllib.parse import unquote_plus as compat_urllib_parse_unquote_plus
2345 except ImportError:  # Python 2
2346     _asciire = (compat_urllib_parse._asciire if hasattr(compat_urllib_parse, '_asciire')
2347                 else re.compile('([\x00-\x7f]+)'))
2348
2349     # HACK: The following are the correct unquote_to_bytes, unquote and unquote_plus
2350     # implementations from cpython 3.4.3's stdlib. Python 2's version
2351     # is apparently broken (see https://github.com/rg3/youtube-dl/pull/6244)
2352
2353     def compat_urllib_parse_unquote_to_bytes(string):
2354         """unquote_to_bytes('abc%20def') -> b'abc def'."""
2355         # Note: strings are encoded as UTF-8. This is only an issue if it contains
2356         # unescaped non-ASCII characters, which URIs should not.
2357         if not string:
2358             # Is it a string-like object?
2359             string.split
2360             return b''
2361         if isinstance(string, compat_str):
2362             string = string.encode('utf-8')
2363         bits = string.split(b'%')
2364         if len(bits) == 1:
2365             return string
2366         res = [bits[0]]
2367         append = res.append
2368         for item in bits[1:]:
2369             try:
2370                 append(compat_urllib_parse._hextochr[item[:2]])
2371                 append(item[2:])
2372             except KeyError:
2373                 append(b'%')
2374                 append(item)
2375         return b''.join(res)
2376
2377     def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'):
2378         """Replace %xx escapes by their single-character equivalent. The optional
2379         encoding and errors parameters specify how to decode percent-encoded
2380         sequences into Unicode characters, as accepted by the bytes.decode()
2381         method.
2382         By default, percent-encoded sequences are decoded with UTF-8, and invalid
2383         sequences are replaced by a placeholder character.
2384
2385         unquote('abc%20def') -> 'abc def'.
2386         """
2387         if '%' not in string:
2388             string.split
2389             return string
2390         if encoding is None:
2391             encoding = 'utf-8'
2392         if errors is None:
2393             errors = 'replace'
2394         bits = _asciire.split(string)
2395         res = [bits[0]]
2396         append = res.append
2397         for i in range(1, len(bits), 2):
2398             append(compat_urllib_parse_unquote_to_bytes(bits[i]).decode(encoding, errors))
2399             append(bits[i + 1])
2400         return ''.join(res)
2401
2402     def compat_urllib_parse_unquote_plus(string, encoding='utf-8', errors='replace'):
2403         """Like unquote(), but also replace plus signs by spaces, as required for
2404         unquoting HTML form values.
2405
2406         unquote_plus('%7e/abc+def') -> '~/abc def'
2407         """
2408         string = string.replace('+', ' ')
2409         return compat_urllib_parse_unquote(string, encoding, errors)
2410
2411 try:
2412     from urllib.parse import urlencode as compat_urllib_parse_urlencode
2413 except ImportError:  # Python 2
2414     # Python 2 will choke in urlencode on mixture of byte and unicode strings.
2415     # Possible solutions are to either port it from python 3 with all
2416     # the friends or manually ensure input query contains only byte strings.
2417     # We will stick with latter thus recursively encoding the whole query.
2418     def compat_urllib_parse_urlencode(query, doseq=0, encoding='utf-8'):
2419         def encode_elem(e):
2420             if isinstance(e, dict):
2421                 e = encode_dict(e)
2422             elif isinstance(e, (list, tuple,)):
2423                 list_e = encode_list(e)
2424                 e = tuple(list_e) if isinstance(e, tuple) else list_e
2425             elif isinstance(e, compat_str):
2426                 e = e.encode(encoding)
2427             return e
2428
2429         def encode_dict(d):
2430             return dict((encode_elem(k), encode_elem(v)) for k, v in d.items())
2431
2432         def encode_list(l):
2433             return [encode_elem(e) for e in l]
2434
2435         return compat_urllib_parse.urlencode(encode_elem(query), doseq=doseq)
2436
2437 try:
2438     from urllib.request import DataHandler as compat_urllib_request_DataHandler
2439 except ImportError:  # Python < 3.4
2440     # Ported from CPython 98774:1733b3bd46db, Lib/urllib/request.py
2441     class compat_urllib_request_DataHandler(compat_urllib_request.BaseHandler):
2442         def data_open(self, req):
2443             # data URLs as specified in RFC 2397.
2444             #
2445             # ignores POSTed data
2446             #
2447             # syntax:
2448             # dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
2449             # mediatype := [ type "/" subtype ] *( ";" parameter )
2450             # data      := *urlchar
2451             # parameter := attribute "=" value
2452             url = req.get_full_url()
2453
2454             scheme, data = url.split(':', 1)
2455             mediatype, data = data.split(',', 1)
2456
2457             # even base64 encoded data URLs might be quoted so unquote in any case:
2458             data = compat_urllib_parse_unquote_to_bytes(data)
2459             if mediatype.endswith(';base64'):
2460                 data = binascii.a2b_base64(data)
2461                 mediatype = mediatype[:-7]
2462
2463             if not mediatype:
2464                 mediatype = 'text/plain;charset=US-ASCII'
2465
2466             headers = email.message_from_string(
2467                 'Content-type: %s\nContent-length: %d\n' % (mediatype, len(data)))
2468
2469             return compat_urllib_response.addinfourl(io.BytesIO(data), headers, url)
2470
2471 try:
2472     compat_basestring = basestring  # Python 2
2473 except NameError:
2474     compat_basestring = str
2475
2476 try:
2477     compat_chr = unichr  # Python 2
2478 except NameError:
2479     compat_chr = chr
2480
2481 try:
2482     from xml.etree.ElementTree import ParseError as compat_xml_parse_error
2483 except ImportError:  # Python 2.6
2484     from xml.parsers.expat import ExpatError as compat_xml_parse_error
2485
2486
2487 etree = xml.etree.ElementTree
2488
2489
2490 class _TreeBuilder(etree.TreeBuilder):
2491     def doctype(self, name, pubid, system):
2492         pass
2493
2494 if sys.version_info[0] >= 3:
2495     def compat_etree_fromstring(text):
2496         return etree.XML(text, parser=etree.XMLParser(target=_TreeBuilder()))
2497 else:
2498     # python 2.x tries to encode unicode strings with ascii (see the
2499     # XMLParser._fixtext method)
2500     try:
2501         _etree_iter = etree.Element.iter
2502     except AttributeError:  # Python <=2.6
2503         def _etree_iter(root):
2504             for el in root.findall('*'):
2505                 yield el
2506                 for sub in _etree_iter(el):
2507                     yield sub
2508
2509     # on 2.6 XML doesn't have a parser argument, function copied from CPython
2510     # 2.7 source
2511     def _XML(text, parser=None):
2512         if not parser:
2513             parser = etree.XMLParser(target=_TreeBuilder())
2514         parser.feed(text)
2515         return parser.close()
2516
2517     def _element_factory(*args, **kwargs):
2518         el = etree.Element(*args, **kwargs)
2519         for k, v in el.items():
2520             if isinstance(v, bytes):
2521                 el.set(k, v.decode('utf-8'))
2522         return el
2523
2524     def compat_etree_fromstring(text):
2525         doc = _XML(text, parser=etree.XMLParser(target=_TreeBuilder(element_factory=_element_factory)))
2526         for el in _etree_iter(doc):
2527             if el.text is not None and isinstance(el.text, bytes):
2528                 el.text = el.text.decode('utf-8')
2529         return doc
2530
2531 if sys.version_info < (2, 7):
2532     # Here comes the crazy part: In 2.6, if the xpath is a unicode,
2533     # .//node does not match if a node is a direct child of . !
2534     def compat_xpath(xpath):
2535         if isinstance(xpath, compat_str):
2536             xpath = xpath.encode('ascii')
2537         return xpath
2538 else:
2539     compat_xpath = lambda xpath: xpath
2540
2541 try:
2542     from urllib.parse import parse_qs as compat_parse_qs
2543 except ImportError:  # Python 2
2544     # HACK: The following is the correct parse_qs implementation from cpython 3's stdlib.
2545     # Python 2's version is apparently totally broken
2546
2547     def _parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
2548                    encoding='utf-8', errors='replace'):
2549         qs, _coerce_result = qs, compat_str
2550         pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
2551         r = []
2552         for name_value in pairs:
2553             if not name_value and not strict_parsing:
2554                 continue
2555             nv = name_value.split('=', 1)
2556             if len(nv) != 2:
2557                 if strict_parsing:
2558                     raise ValueError('bad query field: %r' % (name_value,))
2559                 # Handle case of a control-name with no equal sign
2560                 if keep_blank_values:
2561                     nv.append('')
2562                 else:
2563                     continue
2564             if len(nv[1]) or keep_blank_values:
2565                 name = nv[0].replace('+', ' ')
2566                 name = compat_urllib_parse_unquote(
2567                     name, encoding=encoding, errors=errors)
2568                 name = _coerce_result(name)
2569                 value = nv[1].replace('+', ' ')
2570                 value = compat_urllib_parse_unquote(
2571                     value, encoding=encoding, errors=errors)
2572                 value = _coerce_result(value)
2573                 r.append((name, value))
2574         return r
2575
2576     def compat_parse_qs(qs, keep_blank_values=False, strict_parsing=False,
2577                         encoding='utf-8', errors='replace'):
2578         parsed_result = {}
2579         pairs = _parse_qsl(qs, keep_blank_values, strict_parsing,
2580                            encoding=encoding, errors=errors)
2581         for name, value in pairs:
2582             if name in parsed_result:
2583                 parsed_result[name].append(value)
2584             else:
2585                 parsed_result[name] = [value]
2586         return parsed_result
2587
2588 try:
2589     from shlex import quote as compat_shlex_quote
2590 except ImportError:  # Python < 3.3
2591     def compat_shlex_quote(s):
2592         if re.match(r'^[-_\w./]+$', s):
2593             return s
2594         else:
2595             return "'" + s.replace("'", "'\"'\"'") + "'"
2596
2597
2598 try:
2599     assert shlex.split('中文') == ['中文']
2600     compat_shlex_split = shlex.split
2601 except (AssertionError, UnicodeWarning, UnicodeEncodeError):
2602     # Working around shlex issue with unicode strings on some python 2
2603     # versions (see http://bugs.python.org/issue1548891)
2604     def compat_shlex_split(s, comments=False, posix=True):
2605         if isinstance(s, compat_str):
2606             s = s.encode('utf-8')
2607         return list(map(lambda s: s.decode('utf-8'), shlex.split(s, comments, posix)))
2608
2609
2610 def compat_ord(c):
2611     if type(c) is int:
2612         return c
2613     else:
2614         return ord(c)
2615
2616
2617 compat_os_name = os._name if os.name == 'java' else os.name
2618
2619
2620 if sys.version_info >= (3, 0):
2621     compat_getenv = os.getenv
2622     compat_expanduser = os.path.expanduser
2623
2624     def compat_setenv(key, value, env=os.environ):
2625         env[key] = value
2626 else:
2627     # Environment variables should be decoded with filesystem encoding.
2628     # Otherwise it will fail if any non-ASCII characters present (see #3854 #3217 #2918)
2629
2630     def compat_getenv(key, default=None):
2631         from .utils import get_filesystem_encoding
2632         env = os.getenv(key, default)
2633         if env:
2634             env = env.decode(get_filesystem_encoding())
2635         return env
2636
2637     def compat_setenv(key, value, env=os.environ):
2638         def encode(v):
2639             from .utils import get_filesystem_encoding
2640             return v.encode(get_filesystem_encoding()) if isinstance(v, compat_str) else v
2641         env[encode(key)] = encode(value)
2642
2643     # HACK: The default implementations of os.path.expanduser from cpython do not decode
2644     # environment variables with filesystem encoding. We will work around this by
2645     # providing adjusted implementations.
2646     # The following are os.path.expanduser implementations from cpython 2.7.8 stdlib
2647     # for different platforms with correct environment variables decoding.
2648
2649     if compat_os_name == 'posix':
2650         def compat_expanduser(path):
2651             """Expand ~ and ~user constructions.  If user or $HOME is unknown,
2652             do nothing."""
2653             if not path.startswith('~'):
2654                 return path
2655             i = path.find('/', 1)
2656             if i < 0:
2657                 i = len(path)
2658             if i == 1:
2659                 if 'HOME' not in os.environ:
2660                     import pwd
2661                     userhome = pwd.getpwuid(os.getuid()).pw_dir
2662                 else:
2663                     userhome = compat_getenv('HOME')
2664             else:
2665                 import pwd
2666                 try:
2667                     pwent = pwd.getpwnam(path[1:i])
2668                 except KeyError:
2669                     return path
2670                 userhome = pwent.pw_dir
2671             userhome = userhome.rstrip('/')
2672             return (userhome + path[i:]) or '/'
2673     elif compat_os_name == 'nt' or compat_os_name == 'ce':
2674         def compat_expanduser(path):
2675             """Expand ~ and ~user constructs.
2676
2677             If user or $HOME is unknown, do nothing."""
2678             if path[:1] != '~':
2679                 return path
2680             i, n = 1, len(path)
2681             while i < n and path[i] not in '/\\':
2682                 i = i + 1
2683
2684             if 'HOME' in os.environ:
2685                 userhome = compat_getenv('HOME')
2686             elif 'USERPROFILE' in os.environ:
2687                 userhome = compat_getenv('USERPROFILE')
2688             elif 'HOMEPATH' not in os.environ:
2689                 return path
2690             else:
2691                 try:
2692                     drive = compat_getenv('HOMEDRIVE')
2693                 except KeyError:
2694                     drive = ''
2695                 userhome = os.path.join(drive, compat_getenv('HOMEPATH'))
2696
2697             if i != 1:  # ~user
2698                 userhome = os.path.join(os.path.dirname(userhome), path[1:i])
2699
2700             return userhome + path[i:]
2701     else:
2702         compat_expanduser = os.path.expanduser
2703
2704
2705 if sys.version_info < (3, 0):
2706     def compat_print(s):
2707         from .utils import preferredencoding
2708         print(s.encode(preferredencoding(), 'xmlcharrefreplace'))
2709 else:
2710     def compat_print(s):
2711         assert isinstance(s, compat_str)
2712         print(s)
2713
2714
2715 if sys.version_info < (3, 0) and sys.platform == 'win32':
2716     def compat_getpass(prompt, *args, **kwargs):
2717         if isinstance(prompt, compat_str):
2718             from .utils import preferredencoding
2719             prompt = prompt.encode(preferredencoding())
2720         return getpass.getpass(prompt, *args, **kwargs)
2721 else:
2722     compat_getpass = getpass.getpass
2723
2724 try:
2725     compat_input = raw_input
2726 except NameError:  # Python 3
2727     compat_input = input
2728
2729 # Python < 2.6.5 require kwargs to be bytes
2730 try:
2731     def _testfunc(x):
2732         pass
2733     _testfunc(**{'x': 0})
2734 except TypeError:
2735     def compat_kwargs(kwargs):
2736         return dict((bytes(k), v) for k, v in kwargs.items())
2737 else:
2738     compat_kwargs = lambda kwargs: kwargs
2739
2740
2741 if sys.version_info < (2, 7):
2742     def compat_socket_create_connection(address, timeout, source_address=None):
2743         host, port = address
2744         err = None
2745         for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
2746             af, socktype, proto, canonname, sa = res
2747             sock = None
2748             try:
2749                 sock = socket.socket(af, socktype, proto)
2750                 sock.settimeout(timeout)
2751                 if source_address:
2752                     sock.bind(source_address)
2753                 sock.connect(sa)
2754                 return sock
2755             except socket.error as _:
2756                 err = _
2757                 if sock is not None:
2758                     sock.close()
2759         if err is not None:
2760             raise err
2761         else:
2762             raise socket.error('getaddrinfo returns an empty list')
2763 else:
2764     compat_socket_create_connection = socket.create_connection
2765
2766
2767 # Fix https://github.com/rg3/youtube-dl/issues/4223
2768 # See http://bugs.python.org/issue9161 for what is broken
2769 def workaround_optparse_bug9161():
2770     op = optparse.OptionParser()
2771     og = optparse.OptionGroup(op, 'foo')
2772     try:
2773         og.add_option('-t')
2774     except TypeError:
2775         real_add_option = optparse.OptionGroup.add_option
2776
2777         def _compat_add_option(self, *args, **kwargs):
2778             enc = lambda v: (
2779                 v.encode('ascii', 'replace') if isinstance(v, compat_str)
2780                 else v)
2781             bargs = [enc(a) for a in args]
2782             bkwargs = dict(
2783                 (k, enc(v)) for k, v in kwargs.items())
2784             return real_add_option(self, *bargs, **bkwargs)
2785         optparse.OptionGroup.add_option = _compat_add_option
2786
2787 if hasattr(shutil, 'get_terminal_size'):  # Python >= 3.3
2788     compat_get_terminal_size = shutil.get_terminal_size
2789 else:
2790     _terminal_size = collections.namedtuple('terminal_size', ['columns', 'lines'])
2791
2792     def compat_get_terminal_size(fallback=(80, 24)):
2793         columns = compat_getenv('COLUMNS')
2794         if columns:
2795             columns = int(columns)
2796         else:
2797             columns = None
2798         lines = compat_getenv('LINES')
2799         if lines:
2800             lines = int(lines)
2801         else:
2802             lines = None
2803
2804         if columns is None or lines is None or columns <= 0 or lines <= 0:
2805             try:
2806                 sp = subprocess.Popen(
2807                     ['stty', 'size'],
2808                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2809                 out, err = sp.communicate()
2810                 _lines, _columns = map(int, out.split())
2811             except Exception:
2812                 _columns, _lines = _terminal_size(*fallback)
2813
2814             if columns is None or columns <= 0:
2815                 columns = _columns
2816             if lines is None or lines <= 0:
2817                 lines = _lines
2818         return _terminal_size(columns, lines)
2819
2820 try:
2821     itertools.count(start=0, step=1)
2822     compat_itertools_count = itertools.count
2823 except TypeError:  # Python 2.6
2824     def compat_itertools_count(start=0, step=1):
2825         n = start
2826         while True:
2827             yield n
2828             n += step
2829
2830 if sys.version_info >= (3, 0):
2831     from tokenize import tokenize as compat_tokenize_tokenize
2832 else:
2833     from tokenize import generate_tokens as compat_tokenize_tokenize
2834
2835
2836 try:
2837     struct.pack('!I', 0)
2838 except TypeError:
2839     # In Python 2.6 and 2.7.x < 2.7.7, struct requires a bytes argument
2840     # See https://bugs.python.org/issue19099
2841     def compat_struct_pack(spec, *args):
2842         if isinstance(spec, compat_str):
2843             spec = spec.encode('ascii')
2844         return struct.pack(spec, *args)
2845
2846     def compat_struct_unpack(spec, *args):
2847         if isinstance(spec, compat_str):
2848             spec = spec.encode('ascii')
2849         return struct.unpack(spec, *args)
2850 else:
2851     compat_struct_pack = struct.pack
2852     compat_struct_unpack = struct.unpack
2853
2854
2855 __all__ = [
2856     'compat_HTMLParser',
2857     'compat_HTTPError',
2858     'compat_basestring',
2859     'compat_chr',
2860     'compat_cookiejar',
2861     'compat_cookies',
2862     'compat_etree_fromstring',
2863     'compat_expanduser',
2864     'compat_get_terminal_size',
2865     'compat_getenv',
2866     'compat_getpass',
2867     'compat_html_entities',
2868     'compat_html_entities_html5',
2869     'compat_http_client',
2870     'compat_http_server',
2871     'compat_input',
2872     'compat_itertools_count',
2873     'compat_kwargs',
2874     'compat_ord',
2875     'compat_os_name',
2876     'compat_parse_qs',
2877     'compat_print',
2878     'compat_setenv',
2879     'compat_shlex_quote',
2880     'compat_shlex_split',
2881     'compat_socket_create_connection',
2882     'compat_str',
2883     'compat_struct_pack',
2884     'compat_struct_unpack',
2885     'compat_subprocess_get_DEVNULL',
2886     'compat_tokenize_tokenize',
2887     'compat_urllib_error',
2888     'compat_urllib_parse',
2889     'compat_urllib_parse_unquote',
2890     'compat_urllib_parse_unquote_plus',
2891     'compat_urllib_parse_unquote_to_bytes',
2892     'compat_urllib_parse_urlencode',
2893     'compat_urllib_parse_urlparse',
2894     'compat_urllib_request',
2895     'compat_urllib_request_DataHandler',
2896     'compat_urllib_response',
2897     'compat_urlparse',
2898     'compat_urlretrieve',
2899     'compat_xml_parse_error',
2900     'compat_xpath',
2901     'workaround_optparse_bug9161',
2902 ]