]> Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/compat.py
Update changelog.
[youtubedl] / 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 args = shlex.split('äø­ę–‡')
2600 assert (isinstance(args, list) and
2601 isinstance(args[0], compat_str) and
2602 args[0] == 'äø­ę–‡')
2603 compat_shlex_split = shlex.split
2604 except (AssertionError, UnicodeEncodeError):
2605 # Working around shlex issue with unicode strings on some python 2
2606 # versions (see http://bugs.python.org/issue1548891)
2607 def compat_shlex_split(s, comments=False, posix=True):
2608 if isinstance(s, compat_str):
2609 s = s.encode('utf-8')
2610 return list(map(lambda s: s.decode('utf-8'), shlex.split(s, comments, posix)))
2611
2612
2613 def compat_ord(c):
2614 if type(c) is int:
2615 return c
2616 else:
2617 return ord(c)
2618
2619
2620 compat_os_name = os._name if os.name == 'java' else os.name
2621
2622
2623 if sys.version_info >= (3, 0):
2624 compat_getenv = os.getenv
2625 compat_expanduser = os.path.expanduser
2626
2627 def compat_setenv(key, value, env=os.environ):
2628 env[key] = value
2629 else:
2630 # Environment variables should be decoded with filesystem encoding.
2631 # Otherwise it will fail if any non-ASCII characters present (see #3854 #3217 #2918)
2632
2633 def compat_getenv(key, default=None):
2634 from .utils import get_filesystem_encoding
2635 env = os.getenv(key, default)
2636 if env:
2637 env = env.decode(get_filesystem_encoding())
2638 return env
2639
2640 def compat_setenv(key, value, env=os.environ):
2641 def encode(v):
2642 from .utils import get_filesystem_encoding
2643 return v.encode(get_filesystem_encoding()) if isinstance(v, compat_str) else v
2644 env[encode(key)] = encode(value)
2645
2646 # HACK: The default implementations of os.path.expanduser from cpython do not decode
2647 # environment variables with filesystem encoding. We will work around this by
2648 # providing adjusted implementations.
2649 # The following are os.path.expanduser implementations from cpython 2.7.8 stdlib
2650 # for different platforms with correct environment variables decoding.
2651
2652 if compat_os_name == 'posix':
2653 def compat_expanduser(path):
2654 """Expand ~ and ~user constructions. If user or $HOME is unknown,
2655 do nothing."""
2656 if not path.startswith('~'):
2657 return path
2658 i = path.find('/', 1)
2659 if i < 0:
2660 i = len(path)
2661 if i == 1:
2662 if 'HOME' not in os.environ:
2663 import pwd
2664 userhome = pwd.getpwuid(os.getuid()).pw_dir
2665 else:
2666 userhome = compat_getenv('HOME')
2667 else:
2668 import pwd
2669 try:
2670 pwent = pwd.getpwnam(path[1:i])
2671 except KeyError:
2672 return path
2673 userhome = pwent.pw_dir
2674 userhome = userhome.rstrip('/')
2675 return (userhome + path[i:]) or '/'
2676 elif compat_os_name == 'nt' or compat_os_name == 'ce':
2677 def compat_expanduser(path):
2678 """Expand ~ and ~user constructs.
2679
2680 If user or $HOME is unknown, do nothing."""
2681 if path[:1] != '~':
2682 return path
2683 i, n = 1, len(path)
2684 while i < n and path[i] not in '/\\':
2685 i = i + 1
2686
2687 if 'HOME' in os.environ:
2688 userhome = compat_getenv('HOME')
2689 elif 'USERPROFILE' in os.environ:
2690 userhome = compat_getenv('USERPROFILE')
2691 elif 'HOMEPATH' not in os.environ:
2692 return path
2693 else:
2694 try:
2695 drive = compat_getenv('HOMEDRIVE')
2696 except KeyError:
2697 drive = ''
2698 userhome = os.path.join(drive, compat_getenv('HOMEPATH'))
2699
2700 if i != 1: # ~user
2701 userhome = os.path.join(os.path.dirname(userhome), path[1:i])
2702
2703 return userhome + path[i:]
2704 else:
2705 compat_expanduser = os.path.expanduser
2706
2707
2708 if sys.version_info < (3, 0):
2709 def compat_print(s):
2710 from .utils import preferredencoding
2711 print(s.encode(preferredencoding(), 'xmlcharrefreplace'))
2712 else:
2713 def compat_print(s):
2714 assert isinstance(s, compat_str)
2715 print(s)
2716
2717
2718 if sys.version_info < (3, 0) and sys.platform == 'win32':
2719 def compat_getpass(prompt, *args, **kwargs):
2720 if isinstance(prompt, compat_str):
2721 from .utils import preferredencoding
2722 prompt = prompt.encode(preferredencoding())
2723 return getpass.getpass(prompt, *args, **kwargs)
2724 else:
2725 compat_getpass = getpass.getpass
2726
2727 try:
2728 compat_input = raw_input
2729 except NameError: # Python 3
2730 compat_input = input
2731
2732 # Python < 2.6.5 require kwargs to be bytes
2733 try:
2734 def _testfunc(x):
2735 pass
2736 _testfunc(**{'x': 0})
2737 except TypeError:
2738 def compat_kwargs(kwargs):
2739 return dict((bytes(k), v) for k, v in kwargs.items())
2740 else:
2741 compat_kwargs = lambda kwargs: kwargs
2742
2743
2744 if sys.version_info < (2, 7):
2745 def compat_socket_create_connection(address, timeout, source_address=None):
2746 host, port = address
2747 err = None
2748 for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
2749 af, socktype, proto, canonname, sa = res
2750 sock = None
2751 try:
2752 sock = socket.socket(af, socktype, proto)
2753 sock.settimeout(timeout)
2754 if source_address:
2755 sock.bind(source_address)
2756 sock.connect(sa)
2757 return sock
2758 except socket.error as _:
2759 err = _
2760 if sock is not None:
2761 sock.close()
2762 if err is not None:
2763 raise err
2764 else:
2765 raise socket.error('getaddrinfo returns an empty list')
2766 else:
2767 compat_socket_create_connection = socket.create_connection
2768
2769
2770 # Fix https://github.com/rg3/youtube-dl/issues/4223
2771 # See http://bugs.python.org/issue9161 for what is broken
2772 def workaround_optparse_bug9161():
2773 op = optparse.OptionParser()
2774 og = optparse.OptionGroup(op, 'foo')
2775 try:
2776 og.add_option('-t')
2777 except TypeError:
2778 real_add_option = optparse.OptionGroup.add_option
2779
2780 def _compat_add_option(self, *args, **kwargs):
2781 enc = lambda v: (
2782 v.encode('ascii', 'replace') if isinstance(v, compat_str)
2783 else v)
2784 bargs = [enc(a) for a in args]
2785 bkwargs = dict(
2786 (k, enc(v)) for k, v in kwargs.items())
2787 return real_add_option(self, *bargs, **bkwargs)
2788 optparse.OptionGroup.add_option = _compat_add_option
2789
2790 if hasattr(shutil, 'get_terminal_size'): # Python >= 3.3
2791 compat_get_terminal_size = shutil.get_terminal_size
2792 else:
2793 _terminal_size = collections.namedtuple('terminal_size', ['columns', 'lines'])
2794
2795 def compat_get_terminal_size(fallback=(80, 24)):
2796 columns = compat_getenv('COLUMNS')
2797 if columns:
2798 columns = int(columns)
2799 else:
2800 columns = None
2801 lines = compat_getenv('LINES')
2802 if lines:
2803 lines = int(lines)
2804 else:
2805 lines = None
2806
2807 if columns is None or lines is None or columns <= 0 or lines <= 0:
2808 try:
2809 sp = subprocess.Popen(
2810 ['stty', 'size'],
2811 stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2812 out, err = sp.communicate()
2813 _lines, _columns = map(int, out.split())
2814 except Exception:
2815 _columns, _lines = _terminal_size(*fallback)
2816
2817 if columns is None or columns <= 0:
2818 columns = _columns
2819 if lines is None or lines <= 0:
2820 lines = _lines
2821 return _terminal_size(columns, lines)
2822
2823 try:
2824 itertools.count(start=0, step=1)
2825 compat_itertools_count = itertools.count
2826 except TypeError: # Python 2.6
2827 def compat_itertools_count(start=0, step=1):
2828 n = start
2829 while True:
2830 yield n
2831 n += step
2832
2833 if sys.version_info >= (3, 0):
2834 from tokenize import tokenize as compat_tokenize_tokenize
2835 else:
2836 from tokenize import generate_tokens as compat_tokenize_tokenize
2837
2838
2839 try:
2840 struct.pack('!I', 0)
2841 except TypeError:
2842 # In Python 2.6 and 2.7.x < 2.7.7, struct requires a bytes argument
2843 # See https://bugs.python.org/issue19099
2844 def compat_struct_pack(spec, *args):
2845 if isinstance(spec, compat_str):
2846 spec = spec.encode('ascii')
2847 return struct.pack(spec, *args)
2848
2849 def compat_struct_unpack(spec, *args):
2850 if isinstance(spec, compat_str):
2851 spec = spec.encode('ascii')
2852 return struct.unpack(spec, *args)
2853 else:
2854 compat_struct_pack = struct.pack
2855 compat_struct_unpack = struct.unpack
2856
2857
2858 __all__ = [
2859 'compat_HTMLParser',
2860 'compat_HTTPError',
2861 'compat_basestring',
2862 'compat_chr',
2863 'compat_cookiejar',
2864 'compat_cookies',
2865 'compat_etree_fromstring',
2866 'compat_expanduser',
2867 'compat_get_terminal_size',
2868 'compat_getenv',
2869 'compat_getpass',
2870 'compat_html_entities',
2871 'compat_html_entities_html5',
2872 'compat_http_client',
2873 'compat_http_server',
2874 'compat_input',
2875 'compat_itertools_count',
2876 'compat_kwargs',
2877 'compat_ord',
2878 'compat_os_name',
2879 'compat_parse_qs',
2880 'compat_print',
2881 'compat_setenv',
2882 'compat_shlex_quote',
2883 'compat_shlex_split',
2884 'compat_socket_create_connection',
2885 'compat_str',
2886 'compat_struct_pack',
2887 'compat_struct_unpack',
2888 'compat_subprocess_get_DEVNULL',
2889 'compat_tokenize_tokenize',
2890 'compat_urllib_error',
2891 'compat_urllib_parse',
2892 'compat_urllib_parse_unquote',
2893 'compat_urllib_parse_unquote_plus',
2894 'compat_urllib_parse_unquote_to_bytes',
2895 'compat_urllib_parse_urlencode',
2896 'compat_urllib_parse_urlparse',
2897 'compat_urllib_request',
2898 'compat_urllib_request_DataHandler',
2899 'compat_urllib_response',
2900 'compat_urlparse',
2901 'compat_urlretrieve',
2902 'compat_xml_parse_error',
2903 'compat_xpath',
2904 'workaround_optparse_bug9161',
2905 ]