diff --git a/.idea/misc.xml b/.idea/misc.xml index 6b12f5d..1a3cba4 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/.idea/myclass_api.iml b/.idea/myclass_api.iml index 1467ed4..7ba7f95 100644 --- a/.idea/myclass_api.iml +++ b/.idea/myclass_api.iml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1ad18ec --- /dev/null +++ b/requirements.txt @@ -0,0 +1,34 @@ +flask +Pillow +textdistance +unidecode +wrapper +google-search-results +sib_api_v3_sdk +xhtml2pdf +pysftp +pymongo +flask_mongoengine +unicodecsv +pdfminer +flask_cors +spacy +nltk +pyspellchecker +textblob +autocorrect +pandas +stripe +python-dotenv +pyopenssl + +arabic-reshaper +coverage +html5lib +Pillow +PyPDF3 +python-bidi +reportlab +svglib +pyHanko +pyhanko-certvalidator \ No newline at end of file diff --git a/venv/Lib/site-packages/pdfminer/__init__.py b/venv/Lib/site-packages/pdfminer/__init__.py index 13d59c1..03e58cd 100644 --- a/venv/Lib/site-packages/pdfminer/__init__.py +++ b/venv/Lib/site-packages/pdfminer/__init__.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python3 -__version__ = '1.3.1' +#!/usr/bin/env python +__version__ = '20191125' -if __name__ == '__main__': print(__version__) +if __name__ == '__main__': + print(__version__) diff --git a/venv/Lib/site-packages/pdfminer/arcfour.py b/venv/Lib/site-packages/pdfminer/arcfour.py index 13f4a2e..bed83eb 100644 --- a/venv/Lib/site-packages/pdfminer/arcfour.py +++ b/venv/Lib/site-packages/pdfminer/arcfour.py @@ -1,10 +1,25 @@ +#!/usr/bin/env python + """ Python implementation of Arcfour encryption algorithm. This code is in the public domain. """ + +## Arcfour +## class Arcfour: + + """ + >>> Arcfour(b'Key').process(b'Plaintext').hex() + 'bbf316e8d940af0ad3' + >>> Arcfour(b'Wiki').process(b'pedia').hex() + '1021bf0420' + >>> Arcfour(b'Secret').process(b'Attack at dawn').hex() + '45a01f645fc35b383552544b9bf5' + """ + def __init__(self, key): s = list(range(256)) j = 0 @@ -14,6 +29,7 @@ class Arcfour: (s[i], s[j]) = (s[j], s[i]) self.s = s (self.i, self.j) = (0, 0) + return def process(self, data): (i, j) = (self.i, self.j) @@ -27,3 +43,12 @@ class Arcfour: r.append(c ^ k) (self.i, self.j) = (i, j) return bytes(r) + + encrypt = decrypt = process + +new = Arcfour + +# test +if __name__ == '__main__': + import doctest + print('pdfminer.arcfour:', doctest.testmod()) diff --git a/venv/Lib/site-packages/pdfminer/ascii85.py b/venv/Lib/site-packages/pdfminer/ascii85.py index a62d0f0..b0af08c 100644 --- a/venv/Lib/site-packages/pdfminer/ascii85.py +++ b/venv/Lib/site-packages/pdfminer/ascii85.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ Python implementation of ASCII85/ASCIIHex decoder (Adobe version). @@ -9,43 +9,51 @@ This code is in the public domain. import re import struct + +# ascii85decode(data) def ascii85decode(data): """ In ASCII85 encoding, every four bytes are encoded with five ASCII letters, using 85 different types of characters (as 256**4 < 85**5). When the length of the original bytes is not a multiple of 4, a special rule is used for round up. - + The Adobe's ASCII85 implementation is slightly different from its original in handling the last characters. - + The sample string is taken from: http://en.wikipedia.org/w/index.php?title=Ascii85 + + >>> ascii85decode(b'9jqo^BlbD-BleB1DJ+*+F(f,q') + b'Man is distinguished' + >>> ascii85decode(b'E,9)oF*2M7/c~>') + b'pleasure.' """ - if isinstance(data, str): - data = data.encode('ascii') n = b = 0 - out = bytearray() + out = b'' for c in data: - if ord('!') <= c and c <= ord('u'): + if 33 <= c and c <= 117: # b'!' <= c and c <= b'u' n += 1 b = b*85+(c-33) if n == 5: - out += struct.pack(b'>L',b) + out += struct.pack('>L', b) n = b = 0 - elif c == ord('z'): + elif c == 122: # b'z' assert n == 0 out += b'\0\0\0\0' - elif c == ord('~'): + elif c == 126: # b'~' if n: for _ in range(5-n): b = b*85+84 - out += struct.pack(b'>L',b)[:n-1] + out += struct.pack('>L', b)[:n-1] break - return bytes(out) + return out +# asciihexdecode(data) hex_re = re.compile(r'([a-f\d]{2})', re.IGNORECASE) trail_re = re.compile(r'^(?:[a-f\d]{2}|\s)*([a-f\d])[\s>]*$', re.IGNORECASE) + + def asciihexdecode(data): """ ASCIIHexDecode filter: PDFReference v1.4 section 3.3.1 @@ -55,10 +63,22 @@ def asciihexdecode(data): EOD. Any other characters will cause an error. If the filter encounters the EOD marker after reading an odd number of hexadecimal digits, it will behave as if a 0 followed the last digit. + + >>> asciihexdecode(b'61 62 2e6364 65') + b'ab.cde' + >>> asciihexdecode(b'61 62 2e6364 657>') + b'ab.cdep' + >>> asciihexdecode(b'7>') + b'p' """ - decode = (lambda hx: chr(int(hx, 16))) - out = list(map(decode, hex_re.findall(data))) + data = data.decode('latin1') + out = [ int(hx,16) for hx in hex_re.findall(data) ] m = trail_re.search(data) if m: - out.append(decode("%c0" % m.group(1))) - return ''.join(out) + out.append(int(m.group(1),16) << 4) + return bytes(out) + + +if __name__ == '__main__': + import doctest + print('pdfminer.ascii85', doctest.testmod()) diff --git a/venv/Lib/site-packages/pdfminer/cmapdb.py b/venv/Lib/site-packages/pdfminer/cmapdb.py index b0f2a91..fa72f0d 100644 --- a/venv/Lib/site-packages/pdfminer/cmapdb.py +++ b/venv/Lib/site-packages/pdfminer/cmapdb.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ Adobe character mapping (CMap) support. @@ -15,37 +15,69 @@ import sys import os import os.path import gzip -import pickle as pickle +import codecs +import marshal import struct import logging - -from . import cmap from .psparser import PSStackParser -from .psparser import PSSyntaxError, PSEOF +from .psparser import PSSyntaxError +from .psparser import PSEOF from .psparser import PSLiteral from .psparser import literal_name +from .psparser import KWD from .encodingdb import name2unicode -from .utils import choplist, nunpack +from .utils import choplist +from .utils import nunpack -logger = logging.getLogger(__name__) +class CMapError(Exception): + pass -class CMapError(Exception): pass +## CMapBase +## +class CMapBase: + debug = 0 -class CMap: - - def __init__(self, code2cid=None): - self.code2cid = code2cid or {} + def __init__(self, **kwargs): + self.attrs = kwargs.copy() + return def is_vertical(self): - return False + return self.attrs.get('WMode', 0) != 0 + + def set_attr(self, k, v): + self.attrs[k] = v + return + + def add_code2cid(self, code, cid): + return + + def add_cid2unichr(self, cid, code): + return + + def use_cmap(self, cmap): + return + + +## CMap +## +class CMap(CMapBase): + + def __init__(self, **kwargs): + CMapBase.__init__(self, **kwargs) + self.code2cid = {} + return + + def __repr__(self): + return '' % self.attrs.get('CMapName') def use_cmap(self, cmap): assert isinstance(cmap, CMap) + def copy(dst, src): - for (k,v) in src.items(): + for (k, v) in src.items(): if isinstance(v, dict): d = {} dst[k] = d @@ -53,11 +85,11 @@ class CMap: else: dst[k] = v copy(self.code2cid, cmap.code2cid) + return def decode(self, code): - logger.debug('decode: %r, %r', self, code) - if isinstance(code, str): - code = code.encode('latin-1') + if self.debug: + logging.debug('decode: %r, %r' % (self, code)) d = self.code2cid for c in code: if c in d: @@ -67,73 +99,62 @@ class CMap: d = self.code2cid else: d = self.code2cid + return def dump(self, out=sys.stdout, code2cid=None, code=None): if code2cid is None: code2cid = self.code2cid code = () - for (k,v) in sorted(code2cid.items()): + for (k, v) in sorted(code2cid.items()): c = code+(k,) if isinstance(v, int): - out.write('code %r = cid %d\n' % (c,v)) + out.write('code %r = cid %d\n' % (c, v)) else: self.dump(out=out, code2cid=v, code=c) - + return -class IdentityCMap: - def __init__(self, vertical): - self.vertical = vertical - - def is_vertical(self): - return self.vertical +## IdentityCMap +## +class IdentityCMap(CMapBase): def decode(self, code): - if isinstance(code, str): - code = code.encode('latin-1') - if len(code) % 2 != 0: - # Something's wrong, but we have to at least prevent a crash by removing the last char - logger.warning("The code %r has an uneven length, trimming last byte.", code) - code = code[:-1] n = len(code)//2 if n: return struct.unpack('>%dH' % n, code) else: return () - - -class UnicodeMap: - - def __init__(self, cid2unichr=None): - self.cid2unichr = cid2unichr or {} + +## UnicodeMap +## +class UnicodeMap(CMapBase): + + def __init__(self, **kwargs): + CMapBase.__init__(self, **kwargs) + self.cid2unichr = {} + return + + def __repr__(self): + return '' % self.attrs.get('CMapName') def get_unichr(self, cid): - logger.debug('get_unichr: %r, %r', self, cid) + if self.debug: + logging.debug('get_unichr: %r, %r' % (self, cid)) return self.cid2unichr[cid] def dump(self, out=sys.stdout): - for (k,v) in sorted(self.cid2unichr.items()): - out.write('cid %d = unicode %r\n' % (k,v)) + for (k, v) in sorted(self.cid2unichr.items()): + out.write('cid %d = unicode %r\n' % (k, v)) + return +## FileCMap +## class FileCMap(CMap): - def __init__(self): - CMap.__init__(self) - self.attrs = {} - - def __repr__(self): - return '' % self.attrs.get('CMapName') - - def is_vertical(self): - return self.attrs.get('WMode', 0) != 0 - - def set_attr(self, k, v): - self.attrs[k] = v - def add_code2cid(self, code, cid): - assert isinstance(code, str) and isinstance(cid, int) + assert isinstance(code, bytes) and isinstance(cid, int) d = self.code2cid for c in code[:-1]: c = ord(c) @@ -142,28 +163,18 @@ class FileCMap(CMap): else: t = {} d[c] = t - d =t + d = t c = ord(code[-1]) d[c] = cid + return +## FileUnicodeMap +## class FileUnicodeMap(UnicodeMap): - - def __init__(self): - UnicodeMap.__init__(self) - self.attrs = {} - - def __repr__(self): - return '' % self.attrs.get('CMapName') - - def set_attr(self, k, v): - self.attrs[k] = v def add_cid2unichr(self, cid, code): assert isinstance(cid, int) - if isinstance(code, str): - # Interpret the contents of the string as bytes, and decode it as if it was bytes - code = code.encode('latin-1') if isinstance(code, PSLiteral): # Interpret as an Adobe glyph name. self.cid2unichr[cid] = name2unicode(code.name) @@ -173,55 +184,58 @@ class FileUnicodeMap(UnicodeMap): elif isinstance(code, int): self.cid2unichr[cid] = chr(code) else: - raise TypeError(repr(code)) + raise TypeError(code) + return +## PyCMap +## class PyCMap(CMap): def __init__(self, name, module): - CMap.__init__(self, module.CODE2CID) - self.name = name - self._is_vertical = module.IS_VERTICAL + CMap.__init__(self, CMapName=name) + self.code2cid = module.CODE2CID + if module.IS_VERTICAL: + self.attrs['WMode'] = 1 + return - def __repr__(self): - return '' % (self.name) - - def is_vertical(self): - return self._is_vertical - +## PyUnicodeMap +## class PyUnicodeMap(UnicodeMap): - + def __init__(self, name, module, vertical): + UnicodeMap.__init__(self, CMapName=name) if vertical: - cid2unichr = module.CID2UNICHR_V + self.cid2unichr = module.CID2UNICHR_V + self.attrs['WMode'] = 1 else: - cid2unichr = module.CID2UNICHR_H - UnicodeMap.__init__(self, cid2unichr) - self.name = name - - def __repr__(self): - return '' % (self.name) + self.cid2unichr = module.CID2UNICHR_H + return +## CMapDB +## class CMapDB: _cmap_cache = {} _umap_cache = {} - - class CMapNotFound(CMapError): pass + + class CMapNotFound(CMapError): + pass @classmethod def _load_data(klass, name): - filename = '%s.pickle.gz' % name - logger.debug('loading: %s', name) - default_path = os.environ.get('CMAP_PATH', '/usr/share/pdfminer/') - for directory in (os.path.dirname(cmap.__file__), default_path): + filename = '%s.marshal.gz' % name + logging.info('loading: %r' % name) + cmap_paths = (os.environ.get('CMAP_PATH', '/usr/share/pdfminer/'), + os.path.join(os.path.dirname(__file__), 'cmap'),) + for directory in cmap_paths: path = os.path.join(directory, filename) if os.path.exists(path): gzfile = gzip.open(path) try: - return type(name, (), pickle.loads(gzfile.read())) + return type(str(name), (), marshal.loads(gzfile.read())) finally: gzfile.close() else: @@ -230,9 +244,9 @@ class CMapDB: @classmethod def get_cmap(klass, name): if name == 'Identity-H': - return IdentityCMap(False) + return IdentityCMap(WMode=0) elif name == 'Identity-V': - return IdentityCMap(True) + return IdentityCMap(WMode=1) try: return klass._cmap_cache[name] except KeyError: @@ -252,42 +266,63 @@ class CMapDB: return umaps[vertical] +## CMapParser +## class CMapParser(PSStackParser): def __init__(self, cmap, fp): PSStackParser.__init__(self, fp) self.cmap = cmap - self._in_cmap = False + # some ToUnicode maps don't have "begincmap" keyword. + self._in_cmap = True + return def run(self): try: self.nextobject() except PSEOF: pass + return + + KEYWORD_BEGINCMAP = KWD(b'begincmap') + KEYWORD_ENDCMAP = KWD(b'endcmap') + KEYWORD_USECMAP = KWD(b'usecmap') + KEYWORD_DEF = KWD(b'def') + KEYWORD_BEGINCODESPACERANGE = KWD(b'begincodespacerange') + KEYWORD_ENDCODESPACERANGE = KWD(b'endcodespacerange') + KEYWORD_BEGINCIDRANGE = KWD(b'begincidrange') + KEYWORD_ENDCIDRANGE = KWD(b'endcidrange') + KEYWORD_BEGINCIDCHAR = KWD(b'begincidchar') + KEYWORD_ENDCIDCHAR = KWD(b'endcidchar') + KEYWORD_BEGINBFRANGE = KWD(b'beginbfrange') + KEYWORD_ENDBFRANGE = KWD(b'endbfrange') + KEYWORD_BEGINBFCHAR = KWD(b'beginbfchar') + KEYWORD_ENDBFCHAR = KWD(b'endbfchar') + KEYWORD_BEGINNOTDEFRANGE = KWD(b'beginnotdefrange') + KEYWORD_ENDNOTDEFRANGE = KWD(b'endnotdefrange') def do_keyword(self, pos, token): - name = token.name - if name == 'begincmap': + if token is self.KEYWORD_BEGINCMAP: self._in_cmap = True self.popall() return - elif name == 'endcmap': + elif token is self.KEYWORD_ENDCMAP: self._in_cmap = False return if not self._in_cmap: return - - if name == 'def': + # + if token is self.KEYWORD_DEF: try: - ((_,k),(_,v)) = self.pop(2) + ((_, k), (_, v)) = self.pop(2) self.cmap.set_attr(literal_name(k), v) except PSSyntaxError: pass return - if name == 'usecmap': + if token is self.KEYWORD_USECMAP: try: - ((_,cmapname),) = self.pop(1) + ((_, cmapname),) = self.pop(1) self.cmap.use_cmap(CMapDB.get_cmap(literal_name(cmapname))) except PSSyntaxError: pass @@ -295,24 +330,26 @@ class CMapParser(PSStackParser): pass return - if name == 'begincodespacerange': + if token is self.KEYWORD_BEGINCODESPACERANGE: self.popall() return - if name == 'endcodespacerange': + if token is self.KEYWORD_ENDCODESPACERANGE: self.popall() return - if name == 'begincidrange': + if token is self.KEYWORD_BEGINCIDRANGE: self.popall() return - if name == 'endcidrange': - objs = [ obj for (_,obj) in self.popall() ] - for (s,e,cid) in choplist(3, objs): - if (not isinstance(s, str) or not isinstance(e, str) or - not isinstance(cid, int) or len(s) != len(e)): continue + if token is self.KEYWORD_ENDCIDRANGE: + objs = [obj for (__, obj) in self.popall()] + for (s, e, cid) in choplist(3, objs): + if (not isinstance(s, bytes) or not isinstance(e, bytes) or + not isinstance(cid, int) or len(s) != len(e)): + continue sprefix = s[:-4] eprefix = e[:-4] - if sprefix != eprefix: continue + if sprefix != eprefix: + continue svar = s[-4:] evar = e[-4:] s1 = nunpack(svar) @@ -320,33 +357,29 @@ class CMapParser(PSStackParser): vlen = len(svar) #assert s1 <= e1 for i in range(e1-s1+1): - x = sprefix+struct.pack('>L',s1+i)[-vlen:] + x = sprefix+struct.pack('>L', s1+i)[-vlen:] self.cmap.add_code2cid(x, cid+i) return - if name == 'begincidchar': + if token is self.KEYWORD_BEGINCIDCHAR: self.popall() return - if name == 'endcidchar': - objs = [ obj for (_,obj) in self.popall() ] - for (cid,code) in choplist(2, objs): - if isinstance(code, str) and isinstance(cid, str): + if token is self.KEYWORD_ENDCIDCHAR: + objs = [obj for (__, obj) in self.popall()] + for (cid, code) in choplist(2, objs): + if isinstance(code, bytes) and isinstance(cid, bytes): self.cmap.add_code2cid(code, nunpack(cid)) return - if name == 'beginbfrange': + if token is self.KEYWORD_BEGINBFRANGE: self.popall() return - if name == 'endbfrange': - objs = [ obj for (_,obj) in self.popall() ] - # These objects were hex numbers and have been parsed into a string. But what we want - # are bytes. Convert them. - # Oh wait, it seems that sometimes we have bytes... - tobytes = lambda o: (o.encode('ascii') if isinstance(o, str) else o) - objs = [tobytes(o) for o in objs] - for (s,e,code) in choplist(3, objs): + if token is self.KEYWORD_ENDBFRANGE: + objs = [obj for (__, obj) in self.popall()] + for (s, e, code) in choplist(3, objs): if (not isinstance(s, bytes) or not isinstance(e, bytes) or - len(s) != len(e)): continue + len(s) != len(e)): + continue s1 = nunpack(s) e1 = nunpack(e) #assert s1 <= e1 @@ -359,39 +392,211 @@ class CMapParser(PSStackParser): prefix = code[:-4] vlen = len(var) for i in range(e1-s1+1): - x = prefix+struct.pack('>L',base+i)[-vlen:] + x = prefix+struct.pack('>L', base+i)[-vlen:] self.cmap.add_cid2unichr(s1+i, x) return - if name == 'beginbfchar': + if token is self.KEYWORD_BEGINBFCHAR: self.popall() return - if name == 'endbfchar': - objs = [ obj for (_,obj) in self.popall() ] - for (cid,code) in choplist(2, objs): - if isinstance(cid, (str, bytes)) and isinstance(code, (str, bytes)): + if token is self.KEYWORD_ENDBFCHAR: + objs = [obj for (__, obj) in self.popall()] + for (cid, code) in choplist(2, objs): + if isinstance(cid, bytes) and isinstance(code, bytes): self.cmap.add_cid2unichr(nunpack(cid), code) return - if name == 'beginnotdefrange': + if token is self.KEYWORD_BEGINNOTDEFRANGE: self.popall() return - if name == 'endnotdefrange': + if token is self.KEYWORD_ENDNOTDEFRANGE: self.popall() return self.push((pos, token)) + return + + +## CMapConverter +## +class CMapConverter: + + def __init__(self, enc2codec={}): + self.enc2codec = enc2codec + self.code2cid = {} # {'cmapname': ...} + self.is_vertical = {} + self.cid2unichr_h = {} # {cid: unichr} + self.cid2unichr_v = {} # {cid: unichr} + return + + def get_encs(self): + return self.code2cid.keys() + + def get_maps(self, enc): + if enc.endswith('-H'): + (hmapenc, vmapenc) = (enc, None) + elif enc == 'H': + (hmapenc, vmapenc) = ('H', 'V') + else: + (hmapenc, vmapenc) = (enc+'-H', enc+'-V') + if hmapenc in self.code2cid: + hmap = self.code2cid[hmapenc] + else: + hmap = {} + self.code2cid[hmapenc] = hmap + vmap = None + if vmapenc: + self.is_vertical[vmapenc] = True + if vmapenc in self.code2cid: + vmap = self.code2cid[vmapenc] + else: + vmap = {} + self.code2cid[vmapenc] = vmap + return (hmap, vmap) + + def load(self, fp): + encs = None + for line in fp: + (line,_,_) = line.strip().partition('#') + if not line: continue + values = line.split('\t') + if encs is None: + assert values[0] == 'CID' + encs = values + continue + + def put(dmap, code, cid, force=False): + for b in code[:-1]: + if b in dmap: + dmap = dmap[b] + else: + d = {} + dmap[b] = d + dmap = d + b = code[-1] + if force or ((b not in dmap) or dmap[b] == cid): + dmap[b] = cid + return + + def add(unimap, enc, code): + try: + codec = self.enc2codec[enc] + c = code.decode(codec, 'strict') + if len(c) == 1: + if c not in unimap: + unimap[c] = 0 + unimap[c] += 1 + except KeyError: + pass + except UnicodeError: + pass + return + + def pick(unimap): + chars = sorted( + unimap.items(), + key=(lambda x:(x[1],-ord(x[0]))), reverse=True) + (c,_) = chars[0] + return c + + cid = int(values[0]) + unimap_h = {} + unimap_v = {} + for (enc,value) in zip(encs, values): + if enc == 'CID': continue + if value == '*': continue + + # hcodes, vcodes: encoded bytes for each writing mode. + hcodes = [] + vcodes = [] + for code in value.split(','): + vertical = code.endswith('v') + if vertical: + code = code[:-1] + try: + code = codecs.decode(code, 'hex') + except: + code = bytes([int(code, 16)]) + if vertical: + vcodes.append(code) + add(unimap_v, enc, code) + else: + hcodes.append(code) + add(unimap_h, enc, code) + # add cid to each map. + (hmap, vmap) = self.get_maps(enc) + if vcodes: + assert vmap is not None + for code in vcodes: + put(vmap, code, cid, True) + for code in hcodes: + put(hmap, code, cid, True) + else: + for code in hcodes: + put(hmap, code, cid) + put(vmap, code, cid) + + # Determine the "most popular" candidate. + if unimap_h: + self.cid2unichr_h[cid] = pick(unimap_h) + if unimap_v or unimap_h: + self.cid2unichr_v[cid] = pick(unimap_v or unimap_h) + + return + + def dump_cmap(self, fp, enc): + data = dict( + IS_VERTICAL=self.is_vertical.get(enc, False), + CODE2CID=self.code2cid.get(enc), + ) + fp.write(marshal.dumps(data)) + return + + def dump_unicodemap(self, fp): + data = dict( + CID2UNICHR_H=self.cid2unichr_h, + CID2UNICHR_V=self.cid2unichr_v, + ) + fp.write(marshal.dumps(data)) + return + +# convert_cmap +def convert_cmap(outdir, regname, enc2codec, paths): + converter = CMapConverter(enc2codec) + + for path in paths: + print('reading: %r...' % path) + with open(path) as fp: + converter.load(fp) + + files = [] + for enc in converter.get_encs(): + fname = '%s.marshal.gz' % enc + path = os.path.join(outdir, fname) + print('writing: %r...' % path) + with gzip.open(path, 'wb') as fp: + converter.dump_cmap(fp, enc) + files.append(path) + + fname = 'to-unicode-%s.marshal.gz' % regname + path = os.path.join(outdir, fname) + print('writing: %r...' % path) + with gzip.open(path, 'wb') as fp: + converter.dump_unicodemap(fp) + files.append(path) + return files + # test def main(argv): args = argv[1:] for fname in args: - fp = open(fname, 'rb') - cmap = FileUnicodeMap() - #cmap = FileCMap() - CMapParser(cmap, fp).run() - fp.close() - cmap.dump() + with open(fname, 'rb') as fp: + cmap = FileUnicodeMap() + #cmap = FileCMap() + CMapParser(cmap, fp).run() + cmap.dump() + return if __name__ == '__main__': sys.exit(main(sys.argv)) diff --git a/venv/Lib/site-packages/pdfminer/converter.py b/venv/Lib/site-packages/pdfminer/converter.py index 8a7a663..020ea97 100644 --- a/venv/Lib/site-packages/pdfminer/converter.py +++ b/venv/Lib/site-packages/pdfminer/converter.py @@ -1,20 +1,29 @@ -import os.path +#!/usr/bin/env python import logging - +import re from .pdfdevice import PDFTextDevice from .pdffont import PDFUnicodeNotDefined -from .pdftypes import LITERALS_DCT_DECODE -from .pdfcolor import LITERAL_DEVICE_GRAY, LITERAL_DEVICE_RGB -from .layout import LTContainer, LTPage, LTText, LTLine, LTRect, LTCurve -from .layout import LTFigure, LTImage, LTChar, LTTextLine -from .layout import LTTextBox, LTTextBoxVertical, LTTextGroup -from .utils import apply_matrix_pt, mult_matrix -from .utils import htmlescape, bbox2str, create_bmp - - -logger = logging.getLogger(__name__) +from .layout import LTContainer +from .layout import LTPage +from .layout import LTText +from .layout import LTLine +from .layout import LTRect +from .layout import LTCurve +from .layout import LTFigure +from .layout import LTImage +from .layout import LTChar +from .layout import LTTextLine +from .layout import LTTextBox +from .layout import LTTextBoxVertical +from .layout import LTTextGroup +from .utils import apply_matrix_pt +from .utils import mult_matrix +from .utils import q +from .utils import bbox2str +## PDFLayoutAnalyzer +## class PDFLayoutAnalyzer(PDFTextDevice): def __init__(self, rsrcmgr, pageno=1, laparams=None): @@ -22,13 +31,15 @@ class PDFLayoutAnalyzer(PDFTextDevice): self.pageno = pageno self.laparams = laparams self._stack = [] + return def begin_page(self, page, ctm): - (x0,y0,x1,y1) = page.mediabox - (x0,y0) = apply_matrix_pt(ctm, (x0,y0)) - (x1,y1) = apply_matrix_pt(ctm, (x1,y1)) + (x0, y0, x1, y1) = page.mediabox + (x0, y0) = apply_matrix_pt(ctm, (x0, y0)) + (x1, y1) = apply_matrix_pt(ctm, (x1, y1)) mediabox = (0, 0, abs(x0-x1), abs(y0-y1)) self.cur_item = LTPage(self.pageno, mediabox) + return def end_page(self, page): assert not self._stack @@ -37,16 +48,19 @@ class PDFLayoutAnalyzer(PDFTextDevice): self.cur_item.analyze(self.laparams) self.pageno += 1 self.receive_layout(self.cur_item) + return def begin_figure(self, name, bbox, matrix): self._stack.append(self.cur_item) self.cur_item = LTFigure(name, bbox, mult_matrix(matrix, self.ctm)) + return def end_figure(self, _): fig = self.cur_item assert isinstance(self.cur_item, LTFigure) self.cur_item = self._stack.pop() self.cur_item.add(fig) + return def render_image(self, name, stream): assert isinstance(self.cur_item, LTFigure) @@ -54,31 +68,32 @@ class PDFLayoutAnalyzer(PDFTextDevice): (self.cur_item.x0, self.cur_item.y0, self.cur_item.x1, self.cur_item.y1)) self.cur_item.add(item) + return def paint_path(self, gstate, stroke, fill, evenodd, path): shape = ''.join(x[0] for x in path) if shape == 'ml': # horizontal/vertical line - (_,x0,y0) = path[0] - (_,x1,y1) = path[1] - (x0,y0) = apply_matrix_pt(self.ctm, (x0,y0)) - (x1,y1) = apply_matrix_pt(self.ctm, (x1,y1)) + (_, x0, y0) = path[0] + (_, x1, y1) = path[1] + (x0, y0) = apply_matrix_pt(self.ctm, (x0, y0)) + (x1, y1) = apply_matrix_pt(self.ctm, (x1, y1)) if x0 == x1 or y0 == y1: - self.cur_item.add(LTLine(gstate.linewidth, (x0,y0), (x1,y1))) + self.cur_item.add(LTLine(gstate.linewidth, (x0, y0), (x1, y1))) return if shape == 'mlllh': # rectangle - (_,x0,y0) = path[0] - (_,x1,y1) = path[1] - (_,x2,y2) = path[2] - (_,x3,y3) = path[3] - (x0,y0) = apply_matrix_pt(self.ctm, (x0,y0)) - (x1,y1) = apply_matrix_pt(self.ctm, (x1,y1)) - (x2,y2) = apply_matrix_pt(self.ctm, (x2,y2)) - (x3,y3) = apply_matrix_pt(self.ctm, (x3,y3)) + (_, x0, y0) = path[0] + (_, x1, y1) = path[1] + (_, x2, y2) = path[2] + (_, x3, y3) = path[3] + (x0, y0) = apply_matrix_pt(self.ctm, (x0, y0)) + (x1, y1) = apply_matrix_pt(self.ctm, (x1, y1)) + (x2, y2) = apply_matrix_pt(self.ctm, (x2, y2)) + (x3, y3) = apply_matrix_pt(self.ctm, (x3, y3)) if ((x0 == x1 and y1 == y2 and x2 == x3 and y3 == y0) or (y0 == y1 and x1 == x2 and y2 == y3 and x3 == x0)): - self.cur_item.add(LTRect(gstate.linewidth, (x0,y0,x2,y2))) + self.cur_item.add(LTRect(gstate.linewidth, (x0, y0, x2, y2))) return # other shapes pts = [] @@ -86,6 +101,7 @@ class PDFLayoutAnalyzer(PDFTextDevice): for i in range(1, len(p), 2): pts.append(apply_matrix_pt(self.ctm, (p[i], p[i+1]))) self.cur_item.add(LTCurve(gstate.linewidth, pts)) + return def render_char(self, matrix, font, fontsize, scaling, rise, cid): try: @@ -100,21 +116,25 @@ class PDFLayoutAnalyzer(PDFTextDevice): return item.adv def handle_undefined_char(self, font, cid): - logger.warning('undefined: %r, %r', font, cid) - return '(cid:%d)' % cid + logging.info('undefined: %r, %r' % (font, cid)) + return f'(cid:{cid})' def receive_layout(self, ltpage): - pass + return +## PDFPageAggregator +## class PDFPageAggregator(PDFLayoutAnalyzer): def __init__(self, rsrcmgr, pageno=1, laparams=None): PDFLayoutAnalyzer.__init__(self, rsrcmgr, pageno=pageno, laparams=laparams) self.result = None - + return + def receive_layout(self, ltpage): self.result = ltpage + return def get_result(self): return self.result @@ -123,45 +143,27 @@ class PDFPageAggregator(PDFLayoutAnalyzer): ## PDFConverter ## class PDFConverter(PDFLayoutAnalyzer): - # outfp is an fp opened in *text* mode + def __init__(self, rsrcmgr, outfp, pageno=1, laparams=None): PDFLayoutAnalyzer.__init__(self, rsrcmgr, pageno=pageno, laparams=laparams) self.outfp = outfp + return - def write_image(self, image): - stream = image.stream - filters = stream.get_filters() - if len(filters) == 1 and filters[0] in LITERALS_DCT_DECODE: - ext = '.jpg' - data = stream.get_rawdata() - elif image.colorspace is LITERAL_DEVICE_RGB: - ext = '.bmp' - data = create_bmp(stream.get_data(), stream.bits*3, image.width, image.height) - elif image.colorspace is LITERAL_DEVICE_GRAY: - ext = '.bmp' - data = create_bmp(stream.get_data(), stream.bits, image.width, image.height) - else: - ext = '.img' - data = stream.get_data() - name = image.name+ext - path = os.path.join(self.outdir, name) - fp = file(path, 'wb') - fp.write(data) - fp.close() - return name - ## TextConverter ## class TextConverter(PDFConverter): def __init__(self, rsrcmgr, outfp, pageno=1, laparams=None, - showpageno=False): + showpageno=False, imagewriter=None): PDFConverter.__init__(self, rsrcmgr, outfp, pageno=pageno, laparams=laparams) self.showpageno = showpageno + self.imagewriter = imagewriter + return def write_text(self, text): self.outfp.write(text) + return def receive_layout(self, ltpage): def render(item): @@ -172,18 +174,26 @@ class TextConverter(PDFConverter): self.write_text(item.get_text()) if isinstance(item, LTTextBox): self.write_text('\n') + elif isinstance(item, LTImage): + if self.imagewriter is not None: + self.imagewriter.export_image(item) if self.showpageno: self.write_text('Page %s\n' % ltpage.pageid) render(ltpage) self.write_text('\f') + return - # Some dummy functions to save memory/CPU when all that is wanted is text. - # This stops all the image and drawing ouput from being recorded and taking - # up RAM. + # Some dummy functions to save memory/CPU when all that is wanted + # is text. This stops all the image and drawing output from being + # recorded and taking up RAM. def render_image(self, name, stream): - pass + if self.imagewriter is None: + return + PDFConverter.render_image(self, name, stream) + return + def paint_path(self, gstate, stroke, fill, evenodd, path): - pass + return ## HTMLConverter @@ -198,26 +208,25 @@ class HTMLConverter(PDFConverter): 'textgroup': 'red', 'curve': 'black', 'page': 'gray', - } - + } + TEXT_COLORS = { 'textbox': 'blue', 'char': 'black', - } + } - def __init__(self, rsrcmgr, outfp, pageno=1, laparams=None, - scale=1, fontscale=0.7, layoutmode='normal', showpageno=True, - pagemargin=50, outdir=None, - rect_colors={'curve':'black', 'page':'gray'}, - text_colors={'char':'black'}, - debug=False): + def __init__(self, rsrcmgr, outfp, pageno=1, laparams=None, + scale=1, fontscale=1.0, layoutmode='normal', showpageno=True, + pagemargin=50, imagewriter=None, debug=0, + rect_colors={'curve': 'black', 'page': 'gray'}, + text_colors={'char': 'black'}): PDFConverter.__init__(self, rsrcmgr, outfp, pageno=pageno, laparams=laparams) self.scale = scale self.fontscale = fontscale self.layoutmode = layoutmode self.showpageno = showpageno self.pagemargin = pagemargin - self.outdir = outdir + self.imagewriter = imagewriter self.rect_colors = rect_colors self.text_colors = text_colors if debug: @@ -227,22 +236,27 @@ class HTMLConverter(PDFConverter): self._font = None self._fontstack = [] self.write_header() + return def write(self, text): self.outfp.write(text) + return def write_header(self): self.write('\n') - self.write('\n' % self.outfp.encoding) + self.write('\n') self.write('\n') + return def write_footer(self): self.write('
Page: %s
\n' % - ', '.join('%s' % (i,i) for i in range(1,self.pageno))) + ', '.join('%s' % (i, i) for i in range(1, self.pageno))) self.write('\n') + return def write_text(self, text): - self.write(htmlescape(text, self.outfp.encoding)) + self.write(q(text)) + return def place_rect(self, color, borderwidth, x, y, w, h): color = self.rect_colors.get(color) @@ -252,18 +266,21 @@ class HTMLConverter(PDFConverter): (color, borderwidth, x*self.scale, (self._yoffset-y)*self.scale, w*self.scale, h*self.scale)) + return def place_border(self, color, borderwidth, item): self.place_rect(color, borderwidth, item.x0, item.y1, item.width, item.height) + return def place_image(self, item, borderwidth, x, y, w, h): - if self.outdir is not None: - name = self.write_image(item) + if self.imagewriter is not None: + name = self.imagewriter.export_image(item) self.write('\n' % - (enc(name), borderwidth, + (q(name), borderwidth, x*self.scale, (self._yoffset-y)*self.scale, w*self.scale, h*self.scale)) + return def place_text(self, color, text, x, y, size): color = self.text_colors.get(color) @@ -272,8 +289,9 @@ class HTMLConverter(PDFConverter): (color, x*self.scale, (self._yoffset-y)*self.scale, size*self.scale*self.fontscale)) self.write_text(text) self.write('\n') + return - def begin_textbox(self, color, borderwidth, x, y, w, h, writing_mode): + def begin_div(self, color, borderwidth, x, y, w, h, writing_mode=False): self._fontstack.append(self._font) self._font = None self.write('
' % - (fontname, fontsize * self.scale * self.fontscale)) + (q(fontname), fontsize * self.scale * self.fontscale)) self._font = font self.write_text(text) + return def put_newline(self): self.write('
') - - def end_textbox(self, color): - if self._font is not None: - self.write('') - self._font = self._fontstack.pop() - self.write('
') + return def receive_layout(self, ltpage): def show_group(item): @@ -307,7 +329,8 @@ class HTMLConverter(PDFConverter): self.place_border('textgroup', 1, item) for child in item: show_group(child) - + return + def render(item): if isinstance(item, LTPage): self._yoffset += item.y1 @@ -324,9 +347,10 @@ class HTMLConverter(PDFConverter): elif isinstance(item, LTCurve): self.place_border('curve', 1, item) elif isinstance(item, LTFigure): - self.place_border('figure', 1, item) + self.begin_div('figure', 1, item.x0, item.y1, item.width, item.height) for child in item: render(child) + self.end_div('figure') elif isinstance(item, LTImage): self.place_image(item, 1, item.x0, item.y1, item.width, item.height) else: @@ -350,39 +374,53 @@ class HTMLConverter(PDFConverter): if self.layoutmode != 'loose': self.put_newline() elif isinstance(item, LTTextBox): - self.begin_textbox('textbox', 1, item.x0, item.y1, item.width, item.height, - item.get_writing_mode()) + self.begin_div('textbox', 1, item.x0, item.y1, item.width, item.height, + item.get_writing_mode()) for child in item: render(child) - self.end_textbox('textbox') + self.end_div('textbox') elif isinstance(item, LTChar): self.put_text(item.get_text(), item.fontname, item.size) elif isinstance(item, LTText): self.write_text(item.get_text()) - + return render(ltpage) self._yoffset += self.pagemargin + return def close(self): self.write_footer() + return +## XMLConverter +## class XMLConverter(PDFConverter): - def __init__(self, rsrcmgr, outfp, pageno=1, laparams=None, outdir=None): + CONTROL = re.compile(r'[\x00-\x08\x0b-\x0c\x0e-\x1f]') + + def __init__(self, rsrcmgr, outfp, pageno=1, + laparams=None, imagewriter=None, stripcontrol=False): PDFConverter.__init__(self, rsrcmgr, outfp, pageno=pageno, laparams=laparams) - self.outdir = outdir + self.imagewriter = imagewriter + self.stripcontrol = stripcontrol self.write_header() + return def write_header(self): - self.outfp.write('\n' % self.outfp.encoding) + self.outfp.write('\n') self.outfp.write('\n') + return def write_footer(self): self.outfp.write('\n') - + return + def write_text(self, text): - self.outfp.write(htmlescape(text, self.outfp.encoding)) + if self.stripcontrol: + text = self.CONTROL.sub(u'', text) + self.outfp.write(q(text)) + return def receive_layout(self, ltpage): def show_group(item): @@ -394,7 +432,8 @@ class XMLConverter(PDFConverter): for child in item: show_group(child) self.outfp.write('\n') - + return + def render(item): if isinstance(item, LTPage): self.outfp.write('\n' % @@ -438,23 +477,25 @@ class XMLConverter(PDFConverter): self.outfp.write('\n') elif isinstance(item, LTChar): self.outfp.write('' % - (htmlescape(item.fontname), bbox2str(item.bbox), item.size)) + (q(item.fontname), bbox2str(item.bbox), item.size)) self.write_text(item.get_text()) self.outfp.write('\n') elif isinstance(item, LTText): self.outfp.write('%s\n' % item.get_text()) elif isinstance(item, LTImage): - if self.outdir: - name = self.write_image(item) + if self.imagewriter is not None: + name = self.imagewriter.export_image(item) self.outfp.write('\n' % - (enc(name), item.width, item.height)) + (q(name), item.width, item.height)) else: self.outfp.write('\n' % (item.width, item.height)) else: assert 0, item - + return render(ltpage) + return def close(self): self.write_footer() + return diff --git a/venv/Lib/site-packages/pdfminer/encodingdb.py b/venv/Lib/site-packages/pdfminer/encodingdb.py index bd94555..648b8f0 100644 --- a/venv/Lib/site-packages/pdfminer/encodingdb.py +++ b/venv/Lib/site-packages/pdfminer/encodingdb.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python import re from .psparser import PSLiteral from .glyphlist import glyphname2unicode @@ -5,38 +6,49 @@ from .latin_enc import ENCODING STRIP_NAME = re.compile(r'[0-9]+') + + +## name2unicode +## def name2unicode(name): """Converts Adobe glyph names to Unicode numbers.""" if name in glyphname2unicode: return glyphname2unicode[name] m = STRIP_NAME.search(name) - if not m: raise KeyError(name) + if not m: + raise KeyError(name) return chr(int(m.group(0))) +## EncodingDB +## class EncodingDB: std2unicode = {} mac2unicode = {} win2unicode = {} pdf2unicode = {} - for (name,std,mac,win,pdf) in ENCODING: + for (name, std, mac, win, pdf) in ENCODING: c = name2unicode(name) - if std: std2unicode[std] = c - if mac: mac2unicode[mac] = c - if win: win2unicode[win] = c - if pdf: pdf2unicode[pdf] = c + if std: + std2unicode[std] = c + if mac: + mac2unicode[mac] = c + if win: + win2unicode[win] = c + if pdf: + pdf2unicode[pdf] = c encodings = { - 'StandardEncoding': std2unicode, - 'MacRomanEncoding': mac2unicode, - 'WinAnsiEncoding': win2unicode, - 'PDFDocEncoding': pdf2unicode, - } + 'StandardEncoding': std2unicode, + 'MacRomanEncoding': mac2unicode, + 'WinAnsiEncoding': win2unicode, + 'PDFDocEncoding': pdf2unicode, + } @classmethod - def get_encoding(cls, name, diff=None): - cid2unicode = cls.encodings.get(name, cls.std2unicode) + def get_encoding(klass, name, diff=None): + cid2unicode = klass.encodings.get(name, klass.std2unicode) if diff: cid2unicode = cid2unicode.copy() cid = 0 diff --git a/venv/Lib/site-packages/pdfminer/fontmetrics.py b/venv/Lib/site-packages/pdfminer/fontmetrics.py index f4f7281..bf0be75 100644 --- a/venv/Lib/site-packages/pdfminer/fontmetrics.py +++ b/venv/Lib/site-packages/pdfminer/fontmetrics.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ Font metrics for the Adobe core 14 fonts. @@ -8,14 +8,13 @@ written with a proportional font. The following data were extracted from the AFM files: http://www.ctan.org/tex-archive/fonts/adobe/afm/ - -""" +""" ### BEGIN Verbatim copy of the license part # -# Adobe Core 35 AFM Files with 229 Glyph Entries - ReadMe +# Adobe Core 35 AFM Files with 314 Glyph Entries - ReadMe # # This file and the 35 PostScript(R) AFM files it accompanies may be # used, copied, and distributed for any purpose and without charge, @@ -30,18 +29,18 @@ The following data were extracted from the AFM files: ### END Verbatim copy of the license part FONT_METRICS = { - 'Courier-Oblique': ({'FontName': 'Courier-Oblique', 'Descent': -194.0, 'FontBBox': (-49.0, -249.0, 749.0, 803.0), 'FontWeight': 'Medium', 'CapHeight': 572.0, 'FontFamily': 'Courier', 'Flags': 64, 'XHeight': 434.0, 'ItalicAngle': -11.0, 'Ascent': 627.0}, {32: 600, 33: 600, 34: 600, 35: 600, 36: 600, 37: 600, 38: 600, 39: 600, 40: 600, 41: 600, 42: 600, 43: 600, 44: 600, 45: 600, 46: 600, 47: 600, 48: 600, 49: 600, 50: 600, 51: 600, 52: 600, 53: 600, 54: 600, 55: 600, 56: 600, 57: 600, 58: 600, 59: 600, 60: 600, 61: 600, 62: 600, 63: 600, 64: 600, 65: 600, 66: 600, 67: 600, 68: 600, 69: 600, 70: 600, 71: 600, 72: 600, 73: 600, 74: 600, 75: 600, 76: 600, 77: 600, 78: 600, 79: 600, 80: 600, 81: 600, 82: 600, 83: 600, 84: 600, 85: 600, 86: 600, 87: 600, 88: 600, 89: 600, 90: 600, 91: 600, 92: 600, 93: 600, 94: 600, 95: 600, 96: 600, 97: 600, 98: 600, 99: 600, 100: 600, 101: 600, 102: 600, 103: 600, 104: 600, 105: 600, 106: 600, 107: 600, 108: 600, 109: 600, 110: 600, 111: 600, 112: 600, 113: 600, 114: 600, 115: 600, 116: 600, 117: 600, 118: 600, 119: 600, 120: 600, 121: 600, 122: 600, 123: 600, 124: 600, 125: 600, 126: 600, 161: 600, 162: 600, 163: 600, 164: 600, 165: 600, 166: 600, 167: 600, 168: 600, 169: 600, 170: 600, 171: 600, 172: 600, 173: 600, 174: 600, 175: 600, 177: 600, 178: 600, 179: 600, 180: 600, 182: 600, 183: 600, 184: 600, 185: 600, 186: 600, 187: 600, 188: 600, 189: 600, 191: 600, 193: 600, 194: 600, 195: 600, 196: 600, 197: 600, 198: 600, 199: 600, 200: 600, 202: 600, 203: 600, 205: 600, 206: 600, 207: 600, 208: 600, 225: 600, 227: 600, 232: 600, 233: 600, 234: 600, 235: 600, 241: 600, 245: 600, 248: 600, 249: 600, 250: 600, 251: 600}), - 'Times-BoldItalic': ({'FontName': 'Times-BoldItalic', 'Descent': -217.0, 'FontBBox': (-200.0, -218.0, 996.0, 921.0), 'FontWeight': 'Bold', 'CapHeight': 669.0, 'FontFamily': 'Times', 'Flags': 0, 'XHeight': 462.0, 'ItalicAngle': -15.0, 'Ascent': 683.0}, {32: 250, 33: 389, 34: 555, 35: 500, 36: 500, 37: 833, 38: 778, 39: 333, 40: 333, 41: 333, 42: 500, 43: 570, 44: 250, 45: 333, 46: 250, 47: 278, 48: 500, 49: 500, 50: 500, 51: 500, 52: 500, 53: 500, 54: 500, 55: 500, 56: 500, 57: 500, 58: 333, 59: 333, 60: 570, 61: 570, 62: 570, 63: 500, 64: 832, 65: 667, 66: 667, 67: 667, 68: 722, 69: 667, 70: 667, 71: 722, 72: 778, 73: 389, 74: 500, 75: 667, 76: 611, 77: 889, 78: 722, 79: 722, 80: 611, 81: 722, 82: 667, 83: 556, 84: 611, 85: 722, 86: 667, 87: 889, 88: 667, 89: 611, 90: 611, 91: 333, 92: 278, 93: 333, 94: 570, 95: 500, 96: 333, 97: 500, 98: 500, 99: 444, 100: 500, 101: 444, 102: 333, 103: 500, 104: 556, 105: 278, 106: 278, 107: 500, 108: 278, 109: 778, 110: 556, 111: 500, 112: 500, 113: 500, 114: 389, 115: 389, 116: 278, 117: 556, 118: 444, 119: 667, 120: 500, 121: 444, 122: 389, 123: 348, 124: 220, 125: 348, 126: 570, 161: 389, 162: 500, 163: 500, 164: 167, 165: 500, 166: 500, 167: 500, 168: 500, 169: 278, 170: 500, 171: 500, 172: 333, 173: 333, 174: 556, 175: 556, 177: 500, 178: 500, 179: 500, 180: 250, 182: 500, 183: 350, 184: 333, 185: 500, 186: 500, 187: 500, 188: 1000, 189: 1000, 191: 500, 193: 333, 194: 333, 195: 333, 196: 333, 197: 333, 198: 333, 199: 333, 200: 333, 202: 333, 203: 333, 205: 333, 206: 333, 207: 333, 208: 1000, 225: 944, 227: 266, 232: 611, 233: 722, 234: 944, 235: 300, 241: 722, 245: 278, 248: 278, 249: 500, 250: 722, 251: 500}), - 'Helvetica-Bold': ({'FontName': 'Helvetica-Bold', 'Descent': -207.0, 'FontBBox': (-170.0, -228.0, 1003.0, 962.0), 'FontWeight': 'Bold', 'CapHeight': 718.0, 'FontFamily': 'Helvetica', 'Flags': 0, 'XHeight': 532.0, 'ItalicAngle': 0.0, 'Ascent': 718.0}, {32: 278, 33: 333, 34: 474, 35: 556, 36: 556, 37: 889, 38: 722, 39: 278, 40: 333, 41: 333, 42: 389, 43: 584, 44: 278, 45: 333, 46: 278, 47: 278, 48: 556, 49: 556, 50: 556, 51: 556, 52: 556, 53: 556, 54: 556, 55: 556, 56: 556, 57: 556, 58: 333, 59: 333, 60: 584, 61: 584, 62: 584, 63: 611, 64: 975, 65: 722, 66: 722, 67: 722, 68: 722, 69: 667, 70: 611, 71: 778, 72: 722, 73: 278, 74: 556, 75: 722, 76: 611, 77: 833, 78: 722, 79: 778, 80: 667, 81: 778, 82: 722, 83: 667, 84: 611, 85: 722, 86: 667, 87: 944, 88: 667, 89: 667, 90: 611, 91: 333, 92: 278, 93: 333, 94: 584, 95: 556, 96: 278, 97: 556, 98: 611, 99: 556, 100: 611, 101: 556, 102: 333, 103: 611, 104: 611, 105: 278, 106: 278, 107: 556, 108: 278, 109: 889, 110: 611, 111: 611, 112: 611, 113: 611, 114: 389, 115: 556, 116: 333, 117: 611, 118: 556, 119: 778, 120: 556, 121: 556, 122: 500, 123: 389, 124: 280, 125: 389, 126: 584, 161: 333, 162: 556, 163: 556, 164: 167, 165: 556, 166: 556, 167: 556, 168: 556, 169: 238, 170: 500, 171: 556, 172: 333, 173: 333, 174: 611, 175: 611, 177: 556, 178: 556, 179: 556, 180: 278, 182: 556, 183: 350, 184: 278, 185: 500, 186: 500, 187: 556, 188: 1000, 189: 1000, 191: 611, 193: 333, 194: 333, 195: 333, 196: 333, 197: 333, 198: 333, 199: 333, 200: 333, 202: 333, 203: 333, 205: 333, 206: 333, 207: 333, 208: 1000, 225: 1000, 227: 370, 232: 611, 233: 778, 234: 1000, 235: 365, 241: 889, 245: 278, 248: 278, 249: 611, 250: 944, 251: 611}), - 'Courier': ({'FontName': 'Courier', 'Descent': -194.0, 'FontBBox': (-6.0, -249.0, 639.0, 803.0), 'FontWeight': 'Medium', 'CapHeight': 572.0, 'FontFamily': 'Courier', 'Flags': 64, 'XHeight': 434.0, 'ItalicAngle': 0.0, 'Ascent': 627.0}, {32: 600, 33: 600, 34: 600, 35: 600, 36: 600, 37: 600, 38: 600, 39: 600, 40: 600, 41: 600, 42: 600, 43: 600, 44: 600, 45: 600, 46: 600, 47: 600, 48: 600, 49: 600, 50: 600, 51: 600, 52: 600, 53: 600, 54: 600, 55: 600, 56: 600, 57: 600, 58: 600, 59: 600, 60: 600, 61: 600, 62: 600, 63: 600, 64: 600, 65: 600, 66: 600, 67: 600, 68: 600, 69: 600, 70: 600, 71: 600, 72: 600, 73: 600, 74: 600, 75: 600, 76: 600, 77: 600, 78: 600, 79: 600, 80: 600, 81: 600, 82: 600, 83: 600, 84: 600, 85: 600, 86: 600, 87: 600, 88: 600, 89: 600, 90: 600, 91: 600, 92: 600, 93: 600, 94: 600, 95: 600, 96: 600, 97: 600, 98: 600, 99: 600, 100: 600, 101: 600, 102: 600, 103: 600, 104: 600, 105: 600, 106: 600, 107: 600, 108: 600, 109: 600, 110: 600, 111: 600, 112: 600, 113: 600, 114: 600, 115: 600, 116: 600, 117: 600, 118: 600, 119: 600, 120: 600, 121: 600, 122: 600, 123: 600, 124: 600, 125: 600, 126: 600, 161: 600, 162: 600, 163: 600, 164: 600, 165: 600, 166: 600, 167: 600, 168: 600, 169: 600, 170: 600, 171: 600, 172: 600, 173: 600, 174: 600, 175: 600, 177: 600, 178: 600, 179: 600, 180: 600, 182: 600, 183: 600, 184: 600, 185: 600, 186: 600, 187: 600, 188: 600, 189: 600, 191: 600, 193: 600, 194: 600, 195: 600, 196: 600, 197: 600, 198: 600, 199: 600, 200: 600, 202: 600, 203: 600, 205: 600, 206: 600, 207: 600, 208: 600, 225: 600, 227: 600, 232: 600, 233: 600, 234: 600, 235: 600, 241: 600, 245: 600, 248: 600, 249: 600, 250: 600, 251: 600}), - 'Courier-BoldOblique': ({'FontName': 'Courier-BoldOblique', 'Descent': -194.0, 'FontBBox': (-49.0, -249.0, 758.0, 811.0), 'FontWeight': 'Bold', 'CapHeight': 572.0, 'FontFamily': 'Courier', 'Flags': 64, 'XHeight': 434.0, 'ItalicAngle': -11.0, 'Ascent': 627.0}, {32: 600, 33: 600, 34: 600, 35: 600, 36: 600, 37: 600, 38: 600, 39: 600, 40: 600, 41: 600, 42: 600, 43: 600, 44: 600, 45: 600, 46: 600, 47: 600, 48: 600, 49: 600, 50: 600, 51: 600, 52: 600, 53: 600, 54: 600, 55: 600, 56: 600, 57: 600, 58: 600, 59: 600, 60: 600, 61: 600, 62: 600, 63: 600, 64: 600, 65: 600, 66: 600, 67: 600, 68: 600, 69: 600, 70: 600, 71: 600, 72: 600, 73: 600, 74: 600, 75: 600, 76: 600, 77: 600, 78: 600, 79: 600, 80: 600, 81: 600, 82: 600, 83: 600, 84: 600, 85: 600, 86: 600, 87: 600, 88: 600, 89: 600, 90: 600, 91: 600, 92: 600, 93: 600, 94: 600, 95: 600, 96: 600, 97: 600, 98: 600, 99: 600, 100: 600, 101: 600, 102: 600, 103: 600, 104: 600, 105: 600, 106: 600, 107: 600, 108: 600, 109: 600, 110: 600, 111: 600, 112: 600, 113: 600, 114: 600, 115: 600, 116: 600, 117: 600, 118: 600, 119: 600, 120: 600, 121: 600, 122: 600, 123: 600, 124: 600, 125: 600, 126: 600, 161: 600, 162: 600, 163: 600, 164: 600, 165: 600, 166: 600, 167: 600, 168: 600, 169: 600, 170: 600, 171: 600, 172: 600, 173: 600, 174: 600, 175: 600, 177: 600, 178: 600, 179: 600, 180: 600, 182: 600, 183: 600, 184: 600, 185: 600, 186: 600, 187: 600, 188: 600, 189: 600, 191: 600, 193: 600, 194: 600, 195: 600, 196: 600, 197: 600, 198: 600, 199: 600, 200: 600, 202: 600, 203: 600, 205: 600, 206: 600, 207: 600, 208: 600, 225: 600, 227: 600, 232: 600, 233: 600, 234: 600, 235: 600, 241: 600, 245: 600, 248: 600, 249: 600, 250: 600, 251: 600}), - 'Times-Bold': ({'FontName': 'Times-Bold', 'Descent': -217.0, 'FontBBox': (-168.0, -218.0, 1000.0, 935.0), 'FontWeight': 'Bold', 'CapHeight': 676.0, 'FontFamily': 'Times', 'Flags': 0, 'XHeight': 461.0, 'ItalicAngle': 0.0, 'Ascent': 683.0}, {32: 250, 33: 333, 34: 555, 35: 500, 36: 500, 37: 1000, 38: 833, 39: 333, 40: 333, 41: 333, 42: 500, 43: 570, 44: 250, 45: 333, 46: 250, 47: 278, 48: 500, 49: 500, 50: 500, 51: 500, 52: 500, 53: 500, 54: 500, 55: 500, 56: 500, 57: 500, 58: 333, 59: 333, 60: 570, 61: 570, 62: 570, 63: 500, 64: 930, 65: 722, 66: 667, 67: 722, 68: 722, 69: 667, 70: 611, 71: 778, 72: 778, 73: 389, 74: 500, 75: 778, 76: 667, 77: 944, 78: 722, 79: 778, 80: 611, 81: 778, 82: 722, 83: 556, 84: 667, 85: 722, 86: 722, 87: 1000, 88: 722, 89: 722, 90: 667, 91: 333, 92: 278, 93: 333, 94: 581, 95: 500, 96: 333, 97: 500, 98: 556, 99: 444, 100: 556, 101: 444, 102: 333, 103: 500, 104: 556, 105: 278, 106: 333, 107: 556, 108: 278, 109: 833, 110: 556, 111: 500, 112: 556, 113: 556, 114: 444, 115: 389, 116: 333, 117: 556, 118: 500, 119: 722, 120: 500, 121: 500, 122: 444, 123: 394, 124: 220, 125: 394, 126: 520, 161: 333, 162: 500, 163: 500, 164: 167, 165: 500, 166: 500, 167: 500, 168: 500, 169: 278, 170: 500, 171: 500, 172: 333, 173: 333, 174: 556, 175: 556, 177: 500, 178: 500, 179: 500, 180: 250, 182: 540, 183: 350, 184: 333, 185: 500, 186: 500, 187: 500, 188: 1000, 189: 1000, 191: 500, 193: 333, 194: 333, 195: 333, 196: 333, 197: 333, 198: 333, 199: 333, 200: 333, 202: 333, 203: 333, 205: 333, 206: 333, 207: 333, 208: 1000, 225: 1000, 227: 300, 232: 667, 233: 778, 234: 1000, 235: 330, 241: 722, 245: 278, 248: 278, 249: 500, 250: 722, 251: 556}), - 'Symbol': ({'FontName': 'Symbol', 'FontBBox': (-180.0, -293.0, 1090.0, 1010.0), 'FontWeight': 'Medium', 'FontFamily': 'Symbol', 'Flags': 0, 'ItalicAngle': 0.0}, {32: 250, 33: 333, 34: 713, 35: 500, 36: 549, 37: 833, 38: 778, 39: 439, 40: 333, 41: 333, 42: 500, 43: 549, 44: 250, 45: 549, 46: 250, 47: 278, 48: 500, 49: 500, 50: 500, 51: 500, 52: 500, 53: 500, 54: 500, 55: 500, 56: 500, 57: 500, 58: 278, 59: 278, 60: 549, 61: 549, 62: 549, 63: 444, 64: 549, 65: 722, 66: 667, 67: 722, 68: 612, 69: 611, 70: 763, 71: 603, 72: 722, 73: 333, 74: 631, 75: 722, 76: 686, 77: 889, 78: 722, 79: 722, 80: 768, 81: 741, 82: 556, 83: 592, 84: 611, 85: 690, 86: 439, 87: 768, 88: 645, 89: 795, 90: 611, 91: 333, 92: 863, 93: 333, 94: 658, 95: 500, 96: 500, 97: 631, 98: 549, 99: 549, 100: 494, 101: 439, 102: 521, 103: 411, 104: 603, 105: 329, 106: 603, 107: 549, 108: 549, 109: 576, 110: 521, 111: 549, 112: 549, 113: 521, 114: 549, 115: 603, 116: 439, 117: 576, 118: 713, 119: 686, 120: 493, 121: 686, 122: 494, 123: 480, 124: 200, 125: 480, 126: 549, 160: 750, 161: 620, 162: 247, 163: 549, 164: 167, 165: 713, 166: 500, 167: 753, 168: 753, 169: 753, 170: 753, 171: 1042, 172: 987, 173: 603, 174: 987, 175: 603, 176: 400, 177: 549, 178: 411, 179: 549, 180: 549, 181: 713, 182: 494, 183: 460, 184: 549, 185: 549, 186: 549, 187: 549, 188: 1000, 189: 603, 190: 1000, 191: 658, 192: 823, 193: 686, 194: 795, 195: 987, 196: 768, 197: 768, 198: 823, 199: 768, 200: 768, 201: 713, 202: 713, 203: 713, 204: 713, 205: 713, 206: 713, 207: 713, 208: 768, 209: 713, 210: 790, 211: 790, 212: 890, 213: 823, 214: 549, 215: 250, 216: 713, 217: 603, 218: 603, 219: 1042, 220: 987, 221: 603, 222: 987, 223: 603, 224: 494, 225: 329, 226: 790, 227: 790, 228: 786, 229: 713, 230: 384, 231: 384, 232: 384, 233: 384, 234: 384, 235: 384, 236: 494, 237: 494, 238: 494, 239: 494, 241: 329, 242: 274, 243: 686, 244: 686, 245: 686, 246: 384, 247: 384, 248: 384, 249: 384, 250: 384, 251: 384, 252: 494, 253: 494, 254: 494}), - 'Helvetica': ({'FontName': 'Helvetica', 'Descent': -207.0, 'FontBBox': (-166.0, -225.0, 1000.0, 931.0), 'FontWeight': 'Medium', 'CapHeight': 718.0, 'FontFamily': 'Helvetica', 'Flags': 0, 'XHeight': 523.0, 'ItalicAngle': 0.0, 'Ascent': 718.0}, {32: 278, 33: 278, 34: 355, 35: 556, 36: 556, 37: 889, 38: 667, 39: 222, 40: 333, 41: 333, 42: 389, 43: 584, 44: 278, 45: 333, 46: 278, 47: 278, 48: 556, 49: 556, 50: 556, 51: 556, 52: 556, 53: 556, 54: 556, 55: 556, 56: 556, 57: 556, 58: 278, 59: 278, 60: 584, 61: 584, 62: 584, 63: 556, 64: 1015, 65: 667, 66: 667, 67: 722, 68: 722, 69: 667, 70: 611, 71: 778, 72: 722, 73: 278, 74: 500, 75: 667, 76: 556, 77: 833, 78: 722, 79: 778, 80: 667, 81: 778, 82: 722, 83: 667, 84: 611, 85: 722, 86: 667, 87: 944, 88: 667, 89: 667, 90: 611, 91: 278, 92: 278, 93: 278, 94: 469, 95: 556, 96: 222, 97: 556, 98: 556, 99: 500, 100: 556, 101: 556, 102: 278, 103: 556, 104: 556, 105: 222, 106: 222, 107: 500, 108: 222, 109: 833, 110: 556, 111: 556, 112: 556, 113: 556, 114: 333, 115: 500, 116: 278, 117: 556, 118: 500, 119: 722, 120: 500, 121: 500, 122: 500, 123: 334, 124: 260, 125: 334, 126: 584, 161: 333, 162: 556, 163: 556, 164: 167, 165: 556, 166: 556, 167: 556, 168: 556, 169: 191, 170: 333, 171: 556, 172: 333, 173: 333, 174: 500, 175: 500, 177: 556, 178: 556, 179: 556, 180: 278, 182: 537, 183: 350, 184: 222, 185: 333, 186: 333, 187: 556, 188: 1000, 189: 1000, 191: 611, 193: 333, 194: 333, 195: 333, 196: 333, 197: 333, 198: 333, 199: 333, 200: 333, 202: 333, 203: 333, 205: 333, 206: 333, 207: 333, 208: 1000, 225: 1000, 227: 370, 232: 556, 233: 778, 234: 1000, 235: 365, 241: 889, 245: 278, 248: 222, 249: 611, 250: 944, 251: 611}), - 'Helvetica-BoldOblique': ({'FontName': 'Helvetica-BoldOblique', 'Descent': -207.0, 'FontBBox': (-175.0, -228.0, 1114.0, 962.0), 'FontWeight': 'Bold', 'CapHeight': 718.0, 'FontFamily': 'Helvetica', 'Flags': 0, 'XHeight': 532.0, 'ItalicAngle': -12.0, 'Ascent': 718.0}, {32: 278, 33: 333, 34: 474, 35: 556, 36: 556, 37: 889, 38: 722, 39: 278, 40: 333, 41: 333, 42: 389, 43: 584, 44: 278, 45: 333, 46: 278, 47: 278, 48: 556, 49: 556, 50: 556, 51: 556, 52: 556, 53: 556, 54: 556, 55: 556, 56: 556, 57: 556, 58: 333, 59: 333, 60: 584, 61: 584, 62: 584, 63: 611, 64: 975, 65: 722, 66: 722, 67: 722, 68: 722, 69: 667, 70: 611, 71: 778, 72: 722, 73: 278, 74: 556, 75: 722, 76: 611, 77: 833, 78: 722, 79: 778, 80: 667, 81: 778, 82: 722, 83: 667, 84: 611, 85: 722, 86: 667, 87: 944, 88: 667, 89: 667, 90: 611, 91: 333, 92: 278, 93: 333, 94: 584, 95: 556, 96: 278, 97: 556, 98: 611, 99: 556, 100: 611, 101: 556, 102: 333, 103: 611, 104: 611, 105: 278, 106: 278, 107: 556, 108: 278, 109: 889, 110: 611, 111: 611, 112: 611, 113: 611, 114: 389, 115: 556, 116: 333, 117: 611, 118: 556, 119: 778, 120: 556, 121: 556, 122: 500, 123: 389, 124: 280, 125: 389, 126: 584, 161: 333, 162: 556, 163: 556, 164: 167, 165: 556, 166: 556, 167: 556, 168: 556, 169: 238, 170: 500, 171: 556, 172: 333, 173: 333, 174: 611, 175: 611, 177: 556, 178: 556, 179: 556, 180: 278, 182: 556, 183: 350, 184: 278, 185: 500, 186: 500, 187: 556, 188: 1000, 189: 1000, 191: 611, 193: 333, 194: 333, 195: 333, 196: 333, 197: 333, 198: 333, 199: 333, 200: 333, 202: 333, 203: 333, 205: 333, 206: 333, 207: 333, 208: 1000, 225: 1000, 227: 370, 232: 611, 233: 778, 234: 1000, 235: 365, 241: 889, 245: 278, 248: 278, 249: 611, 250: 944, 251: 611}), - 'ZapfDingbats': ({'FontName': 'ZapfDingbats', 'FontBBox': (-1.0, -143.0, 981.0, 820.0), 'FontWeight': 'Medium', 'FontFamily': 'ITC', 'Flags': 0, 'ItalicAngle': 0.0}, {32: 278, 33: 974, 34: 961, 35: 974, 36: 980, 37: 719, 38: 789, 39: 790, 40: 791, 41: 690, 42: 960, 43: 939, 44: 549, 45: 855, 46: 911, 47: 933, 48: 911, 49: 945, 50: 974, 51: 755, 52: 846, 53: 762, 54: 761, 55: 571, 56: 677, 57: 763, 58: 760, 59: 759, 60: 754, 61: 494, 62: 552, 63: 537, 64: 577, 65: 692, 66: 786, 67: 788, 68: 788, 69: 790, 70: 793, 71: 794, 72: 816, 73: 823, 74: 789, 75: 841, 76: 823, 77: 833, 78: 816, 79: 831, 80: 923, 81: 744, 82: 723, 83: 749, 84: 790, 85: 792, 86: 695, 87: 776, 88: 768, 89: 792, 90: 759, 91: 707, 92: 708, 93: 682, 94: 701, 95: 826, 96: 815, 97: 789, 98: 789, 99: 707, 100: 687, 101: 696, 102: 689, 103: 786, 104: 787, 105: 713, 106: 791, 107: 785, 108: 791, 109: 873, 110: 761, 111: 762, 112: 762, 113: 759, 114: 759, 115: 892, 116: 892, 117: 788, 118: 784, 119: 438, 120: 138, 121: 277, 122: 415, 123: 392, 124: 392, 125: 668, 126: 668, 128: 390, 129: 390, 130: 317, 131: 317, 132: 276, 133: 276, 134: 509, 135: 509, 136: 410, 137: 410, 138: 234, 139: 234, 140: 334, 141: 334, 161: 732, 162: 544, 163: 544, 164: 910, 165: 667, 166: 760, 167: 760, 168: 776, 169: 595, 170: 694, 171: 626, 172: 788, 173: 788, 174: 788, 175: 788, 176: 788, 177: 788, 178: 788, 179: 788, 180: 788, 181: 788, 182: 788, 183: 788, 184: 788, 185: 788, 186: 788, 187: 788, 188: 788, 189: 788, 190: 788, 191: 788, 192: 788, 193: 788, 194: 788, 195: 788, 196: 788, 197: 788, 198: 788, 199: 788, 200: 788, 201: 788, 202: 788, 203: 788, 204: 788, 205: 788, 206: 788, 207: 788, 208: 788, 209: 788, 210: 788, 211: 788, 212: 894, 213: 838, 214: 1016, 215: 458, 216: 748, 217: 924, 218: 748, 219: 918, 220: 927, 221: 928, 222: 928, 223: 834, 224: 873, 225: 828, 226: 924, 227: 924, 228: 917, 229: 930, 230: 931, 231: 463, 232: 883, 233: 836, 234: 836, 235: 867, 236: 867, 237: 696, 238: 696, 239: 874, 241: 874, 242: 760, 243: 946, 244: 771, 245: 865, 246: 771, 247: 888, 248: 967, 249: 888, 250: 831, 251: 873, 252: 927, 253: 970, 254: 918}), - 'Courier-Bold': ({'FontName': 'Courier-Bold', 'Descent': -194.0, 'FontBBox': (-88.0, -249.0, 697.0, 811.0), 'FontWeight': 'Bold', 'CapHeight': 572.0, 'FontFamily': 'Courier', 'Flags': 64, 'XHeight': 434.0, 'ItalicAngle': 0.0, 'Ascent': 627.0}, {32: 600, 33: 600, 34: 600, 35: 600, 36: 600, 37: 600, 38: 600, 39: 600, 40: 600, 41: 600, 42: 600, 43: 600, 44: 600, 45: 600, 46: 600, 47: 600, 48: 600, 49: 600, 50: 600, 51: 600, 52: 600, 53: 600, 54: 600, 55: 600, 56: 600, 57: 600, 58: 600, 59: 600, 60: 600, 61: 600, 62: 600, 63: 600, 64: 600, 65: 600, 66: 600, 67: 600, 68: 600, 69: 600, 70: 600, 71: 600, 72: 600, 73: 600, 74: 600, 75: 600, 76: 600, 77: 600, 78: 600, 79: 600, 80: 600, 81: 600, 82: 600, 83: 600, 84: 600, 85: 600, 86: 600, 87: 600, 88: 600, 89: 600, 90: 600, 91: 600, 92: 600, 93: 600, 94: 600, 95: 600, 96: 600, 97: 600, 98: 600, 99: 600, 100: 600, 101: 600, 102: 600, 103: 600, 104: 600, 105: 600, 106: 600, 107: 600, 108: 600, 109: 600, 110: 600, 111: 600, 112: 600, 113: 600, 114: 600, 115: 600, 116: 600, 117: 600, 118: 600, 119: 600, 120: 600, 121: 600, 122: 600, 123: 600, 124: 600, 125: 600, 126: 600, 161: 600, 162: 600, 163: 600, 164: 600, 165: 600, 166: 600, 167: 600, 168: 600, 169: 600, 170: 600, 171: 600, 172: 600, 173: 600, 174: 600, 175: 600, 177: 600, 178: 600, 179: 600, 180: 600, 182: 600, 183: 600, 184: 600, 185: 600, 186: 600, 187: 600, 188: 600, 189: 600, 191: 600, 193: 600, 194: 600, 195: 600, 196: 600, 197: 600, 198: 600, 199: 600, 200: 600, 202: 600, 203: 600, 205: 600, 206: 600, 207: 600, 208: 600, 225: 600, 227: 600, 232: 600, 233: 600, 234: 600, 235: 600, 241: 600, 245: 600, 248: 600, 249: 600, 250: 600, 251: 600}), - 'Times-Italic': ({'FontName': 'Times-Italic', 'Descent': -217.0, 'FontBBox': (-169.0, -217.0, 1010.0, 883.0), 'FontWeight': 'Medium', 'CapHeight': 653.0, 'FontFamily': 'Times', 'Flags': 0, 'XHeight': 441.0, 'ItalicAngle': -15.5, 'Ascent': 683.0}, {32: 250, 33: 333, 34: 420, 35: 500, 36: 500, 37: 833, 38: 778, 39: 333, 40: 333, 41: 333, 42: 500, 43: 675, 44: 250, 45: 333, 46: 250, 47: 278, 48: 500, 49: 500, 50: 500, 51: 500, 52: 500, 53: 500, 54: 500, 55: 500, 56: 500, 57: 500, 58: 333, 59: 333, 60: 675, 61: 675, 62: 675, 63: 500, 64: 920, 65: 611, 66: 611, 67: 667, 68: 722, 69: 611, 70: 611, 71: 722, 72: 722, 73: 333, 74: 444, 75: 667, 76: 556, 77: 833, 78: 667, 79: 722, 80: 611, 81: 722, 82: 611, 83: 500, 84: 556, 85: 722, 86: 611, 87: 833, 88: 611, 89: 556, 90: 556, 91: 389, 92: 278, 93: 389, 94: 422, 95: 500, 96: 333, 97: 500, 98: 500, 99: 444, 100: 500, 101: 444, 102: 278, 103: 500, 104: 500, 105: 278, 106: 278, 107: 444, 108: 278, 109: 722, 110: 500, 111: 500, 112: 500, 113: 500, 114: 389, 115: 389, 116: 278, 117: 500, 118: 444, 119: 667, 120: 444, 121: 444, 122: 389, 123: 400, 124: 275, 125: 400, 126: 541, 161: 389, 162: 500, 163: 500, 164: 167, 165: 500, 166: 500, 167: 500, 168: 500, 169: 214, 170: 556, 171: 500, 172: 333, 173: 333, 174: 500, 175: 500, 177: 500, 178: 500, 179: 500, 180: 250, 182: 523, 183: 350, 184: 333, 185: 556, 186: 556, 187: 500, 188: 889, 189: 1000, 191: 500, 193: 333, 194: 333, 195: 333, 196: 333, 197: 333, 198: 333, 199: 333, 200: 333, 202: 333, 203: 333, 205: 333, 206: 333, 207: 333, 208: 889, 225: 889, 227: 276, 232: 556, 233: 722, 234: 944, 235: 310, 241: 667, 245: 278, 248: 278, 249: 500, 250: 667, 251: 500}), - 'Times-Roman': ({'FontName': 'Times-Roman', 'Descent': -217.0, 'FontBBox': (-168.0, -218.0, 1000.0, 898.0), 'FontWeight': 'Roman', 'CapHeight': 662.0, 'FontFamily': 'Times', 'Flags': 0, 'XHeight': 450.0, 'ItalicAngle': 0.0, 'Ascent': 683.0}, {32: 250, 33: 333, 34: 408, 35: 500, 36: 500, 37: 833, 38: 778, 39: 333, 40: 333, 41: 333, 42: 500, 43: 564, 44: 250, 45: 333, 46: 250, 47: 278, 48: 500, 49: 500, 50: 500, 51: 500, 52: 500, 53: 500, 54: 500, 55: 500, 56: 500, 57: 500, 58: 278, 59: 278, 60: 564, 61: 564, 62: 564, 63: 444, 64: 921, 65: 722, 66: 667, 67: 667, 68: 722, 69: 611, 70: 556, 71: 722, 72: 722, 73: 333, 74: 389, 75: 722, 76: 611, 77: 889, 78: 722, 79: 722, 80: 556, 81: 722, 82: 667, 83: 556, 84: 611, 85: 722, 86: 722, 87: 944, 88: 722, 89: 722, 90: 611, 91: 333, 92: 278, 93: 333, 94: 469, 95: 500, 96: 333, 97: 444, 98: 500, 99: 444, 100: 500, 101: 444, 102: 333, 103: 500, 104: 500, 105: 278, 106: 278, 107: 500, 108: 278, 109: 778, 110: 500, 111: 500, 112: 500, 113: 500, 114: 333, 115: 389, 116: 278, 117: 500, 118: 500, 119: 722, 120: 500, 121: 500, 122: 444, 123: 480, 124: 200, 125: 480, 126: 541, 161: 333, 162: 500, 163: 500, 164: 167, 165: 500, 166: 500, 167: 500, 168: 500, 169: 180, 170: 444, 171: 500, 172: 333, 173: 333, 174: 556, 175: 556, 177: 500, 178: 500, 179: 500, 180: 250, 182: 453, 183: 350, 184: 333, 185: 444, 186: 444, 187: 500, 188: 1000, 189: 1000, 191: 444, 193: 333, 194: 333, 195: 333, 196: 333, 197: 333, 198: 333, 199: 333, 200: 333, 202: 333, 203: 333, 205: 333, 206: 333, 207: 333, 208: 1000, 225: 889, 227: 276, 232: 611, 233: 722, 234: 889, 235: 310, 241: 667, 245: 278, 248: 278, 249: 500, 250: 722, 251: 500}), - 'Helvetica-Oblique': ({'FontName': 'Helvetica-Oblique', 'Descent': -207.0, 'FontBBox': (-171.0, -225.0, 1116.0, 931.0), 'FontWeight': 'Medium', 'CapHeight': 718.0, 'FontFamily': 'Helvetica', 'Flags': 0, 'XHeight': 523.0, 'ItalicAngle': -12.0, 'Ascent': 718.0}, {32: 278, 33: 278, 34: 355, 35: 556, 36: 556, 37: 889, 38: 667, 39: 222, 40: 333, 41: 333, 42: 389, 43: 584, 44: 278, 45: 333, 46: 278, 47: 278, 48: 556, 49: 556, 50: 556, 51: 556, 52: 556, 53: 556, 54: 556, 55: 556, 56: 556, 57: 556, 58: 278, 59: 278, 60: 584, 61: 584, 62: 584, 63: 556, 64: 1015, 65: 667, 66: 667, 67: 722, 68: 722, 69: 667, 70: 611, 71: 778, 72: 722, 73: 278, 74: 500, 75: 667, 76: 556, 77: 833, 78: 722, 79: 778, 80: 667, 81: 778, 82: 722, 83: 667, 84: 611, 85: 722, 86: 667, 87: 944, 88: 667, 89: 667, 90: 611, 91: 278, 92: 278, 93: 278, 94: 469, 95: 556, 96: 222, 97: 556, 98: 556, 99: 500, 100: 556, 101: 556, 102: 278, 103: 556, 104: 556, 105: 222, 106: 222, 107: 500, 108: 222, 109: 833, 110: 556, 111: 556, 112: 556, 113: 556, 114: 333, 115: 500, 116: 278, 117: 556, 118: 500, 119: 722, 120: 500, 121: 500, 122: 500, 123: 334, 124: 260, 125: 334, 126: 584, 161: 333, 162: 556, 163: 556, 164: 167, 165: 556, 166: 556, 167: 556, 168: 556, 169: 191, 170: 333, 171: 556, 172: 333, 173: 333, 174: 500, 175: 500, 177: 556, 178: 556, 179: 556, 180: 278, 182: 537, 183: 350, 184: 222, 185: 333, 186: 333, 187: 556, 188: 1000, 189: 1000, 191: 611, 193: 333, 194: 333, 195: 333, 196: 333, 197: 333, 198: 333, 199: 333, 200: 333, 202: 333, 203: 333, 205: 333, 206: 333, 207: 333, 208: 1000, 225: 1000, 227: 370, 232: 556, 233: 778, 234: 1000, 235: 365, 241: 889, 245: 278, 248: 222, 249: 611, 250: 944, 251: 611}), + 'Courier': ({'FontName': 'Courier', 'Descent': -194.0, 'FontBBox': (-6.0, -249.0, 639.0, 803.0), 'FontWeight': 'Medium', 'CapHeight': 572.0, 'FontFamily': 'Courier', 'Flags': 64, 'XHeight': 434.0, 'ItalicAngle': 0.0, 'Ascent': 627.0}, {u' ': 600, u'!': 600, u'"': 600, u'#': 600, u'$': 600, u'%': 600, u'&': 600, u"'": 600, u'(': 600, u')': 600, u'*': 600, u'+': 600, u',': 600, u'-': 600, u'.': 600, u'/': 600, u'0': 600, u'1': 600, u'2': 600, u'3': 600, u'4': 600, u'5': 600, u'6': 600, u'7': 600, u'8': 600, u'9': 600, u':': 600, u';': 600, u'<': 600, u'=': 600, u'>': 600, u'?': 600, u'@': 600, u'A': 600, u'B': 600, u'C': 600, u'D': 600, u'E': 600, u'F': 600, u'G': 600, u'H': 600, u'I': 600, u'J': 600, u'K': 600, u'L': 600, u'M': 600, u'N': 600, u'O': 600, u'P': 600, u'Q': 600, u'R': 600, u'S': 600, u'T': 600, u'U': 600, u'V': 600, u'W': 600, u'X': 600, u'Y': 600, u'Z': 600, u'[': 600, u'\\': 600, u']': 600, u'^': 600, u'_': 600, u'`': 600, u'a': 600, u'b': 600, u'c': 600, u'd': 600, u'e': 600, u'f': 600, u'g': 600, u'h': 600, u'i': 600, u'j': 600, u'k': 600, u'l': 600, u'm': 600, u'n': 600, u'o': 600, u'p': 600, u'q': 600, u'r': 600, u's': 600, u't': 600, u'u': 600, u'v': 600, u'w': 600, u'x': 600, u'y': 600, u'z': 600, u'{': 600, u'|': 600, u'}': 600, u'~': 600, u'\xa1': 600, u'\xa2': 600, u'\xa3': 600, u'\xa4': 600, u'\xa5': 600, u'\xa6': 600, u'\xa7': 600, u'\xa8': 600, u'\xa9': 600, u'\xaa': 600, u'\xab': 600, u'\xac': 600, u'\xae': 600, u'\xaf': 600, u'\xb0': 600, u'\xb1': 600, u'\xb2': 600, u'\xb3': 600, u'\xb4': 600, u'\xb5': 600, u'\xb6': 600, u'\xb7': 600, u'\xb8': 600, u'\xb9': 600, u'\xba': 600, u'\xbb': 600, u'\xbc': 600, u'\xbd': 600, u'\xbe': 600, u'\xbf': 600, u'\xc0': 600, u'\xc1': 600, u'\xc2': 600, u'\xc3': 600, u'\xc4': 600, u'\xc5': 600, u'\xc6': 600, u'\xc7': 600, u'\xc8': 600, u'\xc9': 600, u'\xca': 600, u'\xcb': 600, u'\xcc': 600, u'\xcd': 600, u'\xce': 600, u'\xcf': 600, u'\xd0': 600, u'\xd1': 600, u'\xd2': 600, u'\xd3': 600, u'\xd4': 600, u'\xd5': 600, u'\xd6': 600, u'\xd7': 600, u'\xd8': 600, u'\xd9': 600, u'\xda': 600, u'\xdb': 600, u'\xdc': 600, u'\xdd': 600, u'\xde': 600, u'\xdf': 600, u'\xe0': 600, u'\xe1': 600, u'\xe2': 600, u'\xe3': 600, u'\xe4': 600, u'\xe5': 600, u'\xe6': 600, u'\xe7': 600, u'\xe8': 600, u'\xe9': 600, u'\xea': 600, u'\xeb': 600, u'\xec': 600, u'\xed': 600, u'\xee': 600, u'\xef': 600, u'\xf0': 600, u'\xf1': 600, u'\xf2': 600, u'\xf3': 600, u'\xf4': 600, u'\xf5': 600, u'\xf6': 600, u'\xf7': 600, u'\xf8': 600, u'\xf9': 600, u'\xfa': 600, u'\xfb': 600, u'\xfc': 600, u'\xfd': 600, u'\xfe': 600, u'\xff': 600, u'\u0100': 600, u'\u0101': 600, u'\u0102': 600, u'\u0103': 600, u'\u0104': 600, u'\u0105': 600, u'\u0106': 600, u'\u0107': 600, u'\u010c': 600, u'\u010d': 600, u'\u010e': 600, u'\u010f': 600, u'\u0110': 600, u'\u0111': 600, u'\u0112': 600, u'\u0113': 600, u'\u0116': 600, u'\u0117': 600, u'\u0118': 600, u'\u0119': 600, u'\u011a': 600, u'\u011b': 600, u'\u011e': 600, u'\u011f': 600, u'\u0122': 600, u'\u0123': 600, u'\u012a': 600, u'\u012b': 600, u'\u012e': 600, u'\u012f': 600, u'\u0130': 600, u'\u0131': 600, u'\u0136': 600, u'\u0137': 600, u'\u0139': 600, u'\u013a': 600, u'\u013b': 600, u'\u013c': 600, u'\u013d': 600, u'\u013e': 600, u'\u0141': 600, u'\u0142': 600, u'\u0143': 600, u'\u0144': 600, u'\u0145': 600, u'\u0146': 600, u'\u0147': 600, u'\u0148': 600, u'\u014c': 600, u'\u014d': 600, u'\u0150': 600, u'\u0151': 600, u'\u0152': 600, u'\u0153': 600, u'\u0154': 600, u'\u0155': 600, u'\u0156': 600, u'\u0157': 600, u'\u0158': 600, u'\u0159': 600, u'\u015a': 600, u'\u015b': 600, u'\u015e': 600, u'\u015f': 600, u'\u0160': 600, u'\u0161': 600, u'\u0162': 600, u'\u0163': 600, u'\u0164': 600, u'\u0165': 600, u'\u016a': 600, u'\u016b': 600, u'\u016e': 600, u'\u016f': 600, u'\u0170': 600, u'\u0171': 600, u'\u0172': 600, u'\u0173': 600, u'\u0178': 600, u'\u0179': 600, u'\u017a': 600, u'\u017b': 600, u'\u017c': 600, u'\u017d': 600, u'\u017e': 600, u'\u0192': 600, u'\u0218': 600, u'\u0219': 600, u'\u02c6': 600, u'\u02c7': 600, u'\u02d8': 600, u'\u02d9': 600, u'\u02da': 600, u'\u02db': 600, u'\u02dc': 600, u'\u02dd': 600, u'\u2013': 600, u'\u2014': 600, u'\u2018': 600, u'\u2019': 600, u'\u201a': 600, u'\u201c': 600, u'\u201d': 600, u'\u201e': 600, u'\u2020': 600, u'\u2021': 600, u'\u2022': 600, u'\u2026': 600, u'\u2030': 600, u'\u2039': 600, u'\u203a': 600, u'\u2044': 600, u'\u2122': 600, u'\u2202': 600, u'\u2206': 600, u'\u2211': 600, u'\u2212': 600, u'\u221a': 600, u'\u2260': 600, u'\u2264': 600, u'\u2265': 600, u'\u25ca': 600, u'\uf6c3': 600, u'\ufb01': 600, u'\ufb02': 600}), + 'Courier-Bold': ({'FontName': 'Courier-Bold', 'Descent': -194.0, 'FontBBox': (-88.0, -249.0, 697.0, 811.0), 'FontWeight': 'Bold', 'CapHeight': 572.0, 'FontFamily': 'Courier', 'Flags': 64, 'XHeight': 434.0, 'ItalicAngle': 0.0, 'Ascent': 627.0}, {u' ': 600, u'!': 600, u'"': 600, u'#': 600, u'$': 600, u'%': 600, u'&': 600, u"'": 600, u'(': 600, u')': 600, u'*': 600, u'+': 600, u',': 600, u'-': 600, u'.': 600, u'/': 600, u'0': 600, u'1': 600, u'2': 600, u'3': 600, u'4': 600, u'5': 600, u'6': 600, u'7': 600, u'8': 600, u'9': 600, u':': 600, u';': 600, u'<': 600, u'=': 600, u'>': 600, u'?': 600, u'@': 600, u'A': 600, u'B': 600, u'C': 600, u'D': 600, u'E': 600, u'F': 600, u'G': 600, u'H': 600, u'I': 600, u'J': 600, u'K': 600, u'L': 600, u'M': 600, u'N': 600, u'O': 600, u'P': 600, u'Q': 600, u'R': 600, u'S': 600, u'T': 600, u'U': 600, u'V': 600, u'W': 600, u'X': 600, u'Y': 600, u'Z': 600, u'[': 600, u'\\': 600, u']': 600, u'^': 600, u'_': 600, u'`': 600, u'a': 600, u'b': 600, u'c': 600, u'd': 600, u'e': 600, u'f': 600, u'g': 600, u'h': 600, u'i': 600, u'j': 600, u'k': 600, u'l': 600, u'm': 600, u'n': 600, u'o': 600, u'p': 600, u'q': 600, u'r': 600, u's': 600, u't': 600, u'u': 600, u'v': 600, u'w': 600, u'x': 600, u'y': 600, u'z': 600, u'{': 600, u'|': 600, u'}': 600, u'~': 600, u'\xa1': 600, u'\xa2': 600, u'\xa3': 600, u'\xa4': 600, u'\xa5': 600, u'\xa6': 600, u'\xa7': 600, u'\xa8': 600, u'\xa9': 600, u'\xaa': 600, u'\xab': 600, u'\xac': 600, u'\xae': 600, u'\xaf': 600, u'\xb0': 600, u'\xb1': 600, u'\xb2': 600, u'\xb3': 600, u'\xb4': 600, u'\xb5': 600, u'\xb6': 600, u'\xb7': 600, u'\xb8': 600, u'\xb9': 600, u'\xba': 600, u'\xbb': 600, u'\xbc': 600, u'\xbd': 600, u'\xbe': 600, u'\xbf': 600, u'\xc0': 600, u'\xc1': 600, u'\xc2': 600, u'\xc3': 600, u'\xc4': 600, u'\xc5': 600, u'\xc6': 600, u'\xc7': 600, u'\xc8': 600, u'\xc9': 600, u'\xca': 600, u'\xcb': 600, u'\xcc': 600, u'\xcd': 600, u'\xce': 600, u'\xcf': 600, u'\xd0': 600, u'\xd1': 600, u'\xd2': 600, u'\xd3': 600, u'\xd4': 600, u'\xd5': 600, u'\xd6': 600, u'\xd7': 600, u'\xd8': 600, u'\xd9': 600, u'\xda': 600, u'\xdb': 600, u'\xdc': 600, u'\xdd': 600, u'\xde': 600, u'\xdf': 600, u'\xe0': 600, u'\xe1': 600, u'\xe2': 600, u'\xe3': 600, u'\xe4': 600, u'\xe5': 600, u'\xe6': 600, u'\xe7': 600, u'\xe8': 600, u'\xe9': 600, u'\xea': 600, u'\xeb': 600, u'\xec': 600, u'\xed': 600, u'\xee': 600, u'\xef': 600, u'\xf0': 600, u'\xf1': 600, u'\xf2': 600, u'\xf3': 600, u'\xf4': 600, u'\xf5': 600, u'\xf6': 600, u'\xf7': 600, u'\xf8': 600, u'\xf9': 600, u'\xfa': 600, u'\xfb': 600, u'\xfc': 600, u'\xfd': 600, u'\xfe': 600, u'\xff': 600, u'\u0100': 600, u'\u0101': 600, u'\u0102': 600, u'\u0103': 600, u'\u0104': 600, u'\u0105': 600, u'\u0106': 600, u'\u0107': 600, u'\u010c': 600, u'\u010d': 600, u'\u010e': 600, u'\u010f': 600, u'\u0110': 600, u'\u0111': 600, u'\u0112': 600, u'\u0113': 600, u'\u0116': 600, u'\u0117': 600, u'\u0118': 600, u'\u0119': 600, u'\u011a': 600, u'\u011b': 600, u'\u011e': 600, u'\u011f': 600, u'\u0122': 600, u'\u0123': 600, u'\u012a': 600, u'\u012b': 600, u'\u012e': 600, u'\u012f': 600, u'\u0130': 600, u'\u0131': 600, u'\u0136': 600, u'\u0137': 600, u'\u0139': 600, u'\u013a': 600, u'\u013b': 600, u'\u013c': 600, u'\u013d': 600, u'\u013e': 600, u'\u0141': 600, u'\u0142': 600, u'\u0143': 600, u'\u0144': 600, u'\u0145': 600, u'\u0146': 600, u'\u0147': 600, u'\u0148': 600, u'\u014c': 600, u'\u014d': 600, u'\u0150': 600, u'\u0151': 600, u'\u0152': 600, u'\u0153': 600, u'\u0154': 600, u'\u0155': 600, u'\u0156': 600, u'\u0157': 600, u'\u0158': 600, u'\u0159': 600, u'\u015a': 600, u'\u015b': 600, u'\u015e': 600, u'\u015f': 600, u'\u0160': 600, u'\u0161': 600, u'\u0162': 600, u'\u0163': 600, u'\u0164': 600, u'\u0165': 600, u'\u016a': 600, u'\u016b': 600, u'\u016e': 600, u'\u016f': 600, u'\u0170': 600, u'\u0171': 600, u'\u0172': 600, u'\u0173': 600, u'\u0178': 600, u'\u0179': 600, u'\u017a': 600, u'\u017b': 600, u'\u017c': 600, u'\u017d': 600, u'\u017e': 600, u'\u0192': 600, u'\u0218': 600, u'\u0219': 600, u'\u02c6': 600, u'\u02c7': 600, u'\u02d8': 600, u'\u02d9': 600, u'\u02da': 600, u'\u02db': 600, u'\u02dc': 600, u'\u02dd': 600, u'\u2013': 600, u'\u2014': 600, u'\u2018': 600, u'\u2019': 600, u'\u201a': 600, u'\u201c': 600, u'\u201d': 600, u'\u201e': 600, u'\u2020': 600, u'\u2021': 600, u'\u2022': 600, u'\u2026': 600, u'\u2030': 600, u'\u2039': 600, u'\u203a': 600, u'\u2044': 600, u'\u2122': 600, u'\u2202': 600, u'\u2206': 600, u'\u2211': 600, u'\u2212': 600, u'\u221a': 600, u'\u2260': 600, u'\u2264': 600, u'\u2265': 600, u'\u25ca': 600, u'\uf6c3': 600, u'\ufb01': 600, u'\ufb02': 600}), + 'Courier-BoldOblique': ({'FontName': 'Courier-BoldOblique', 'Descent': -194.0, 'FontBBox': (-49.0, -249.0, 758.0, 811.0), 'FontWeight': 'Bold', 'CapHeight': 572.0, 'FontFamily': 'Courier', 'Flags': 64, 'XHeight': 434.0, 'ItalicAngle': -11.0, 'Ascent': 627.0}, {u' ': 600, u'!': 600, u'"': 600, u'#': 600, u'$': 600, u'%': 600, u'&': 600, u"'": 600, u'(': 600, u')': 600, u'*': 600, u'+': 600, u',': 600, u'-': 600, u'.': 600, u'/': 600, u'0': 600, u'1': 600, u'2': 600, u'3': 600, u'4': 600, u'5': 600, u'6': 600, u'7': 600, u'8': 600, u'9': 600, u':': 600, u';': 600, u'<': 600, u'=': 600, u'>': 600, u'?': 600, u'@': 600, u'A': 600, u'B': 600, u'C': 600, u'D': 600, u'E': 600, u'F': 600, u'G': 600, u'H': 600, u'I': 600, u'J': 600, u'K': 600, u'L': 600, u'M': 600, u'N': 600, u'O': 600, u'P': 600, u'Q': 600, u'R': 600, u'S': 600, u'T': 600, u'U': 600, u'V': 600, u'W': 600, u'X': 600, u'Y': 600, u'Z': 600, u'[': 600, u'\\': 600, u']': 600, u'^': 600, u'_': 600, u'`': 600, u'a': 600, u'b': 600, u'c': 600, u'd': 600, u'e': 600, u'f': 600, u'g': 600, u'h': 600, u'i': 600, u'j': 600, u'k': 600, u'l': 600, u'm': 600, u'n': 600, u'o': 600, u'p': 600, u'q': 600, u'r': 600, u's': 600, u't': 600, u'u': 600, u'v': 600, u'w': 600, u'x': 600, u'y': 600, u'z': 600, u'{': 600, u'|': 600, u'}': 600, u'~': 600, u'\xa1': 600, u'\xa2': 600, u'\xa3': 600, u'\xa4': 600, u'\xa5': 600, u'\xa6': 600, u'\xa7': 600, u'\xa8': 600, u'\xa9': 600, u'\xaa': 600, u'\xab': 600, u'\xac': 600, u'\xae': 600, u'\xaf': 600, u'\xb0': 600, u'\xb1': 600, u'\xb2': 600, u'\xb3': 600, u'\xb4': 600, u'\xb5': 600, u'\xb6': 600, u'\xb7': 600, u'\xb8': 600, u'\xb9': 600, u'\xba': 600, u'\xbb': 600, u'\xbc': 600, u'\xbd': 600, u'\xbe': 600, u'\xbf': 600, u'\xc0': 600, u'\xc1': 600, u'\xc2': 600, u'\xc3': 600, u'\xc4': 600, u'\xc5': 600, u'\xc6': 600, u'\xc7': 600, u'\xc8': 600, u'\xc9': 600, u'\xca': 600, u'\xcb': 600, u'\xcc': 600, u'\xcd': 600, u'\xce': 600, u'\xcf': 600, u'\xd0': 600, u'\xd1': 600, u'\xd2': 600, u'\xd3': 600, u'\xd4': 600, u'\xd5': 600, u'\xd6': 600, u'\xd7': 600, u'\xd8': 600, u'\xd9': 600, u'\xda': 600, u'\xdb': 600, u'\xdc': 600, u'\xdd': 600, u'\xde': 600, u'\xdf': 600, u'\xe0': 600, u'\xe1': 600, u'\xe2': 600, u'\xe3': 600, u'\xe4': 600, u'\xe5': 600, u'\xe6': 600, u'\xe7': 600, u'\xe8': 600, u'\xe9': 600, u'\xea': 600, u'\xeb': 600, u'\xec': 600, u'\xed': 600, u'\xee': 600, u'\xef': 600, u'\xf0': 600, u'\xf1': 600, u'\xf2': 600, u'\xf3': 600, u'\xf4': 600, u'\xf5': 600, u'\xf6': 600, u'\xf7': 600, u'\xf8': 600, u'\xf9': 600, u'\xfa': 600, u'\xfb': 600, u'\xfc': 600, u'\xfd': 600, u'\xfe': 600, u'\xff': 600, u'\u0100': 600, u'\u0101': 600, u'\u0102': 600, u'\u0103': 600, u'\u0104': 600, u'\u0105': 600, u'\u0106': 600, u'\u0107': 600, u'\u010c': 600, u'\u010d': 600, u'\u010e': 600, u'\u010f': 600, u'\u0110': 600, u'\u0111': 600, u'\u0112': 600, u'\u0113': 600, u'\u0116': 600, u'\u0117': 600, u'\u0118': 600, u'\u0119': 600, u'\u011a': 600, u'\u011b': 600, u'\u011e': 600, u'\u011f': 600, u'\u0122': 600, u'\u0123': 600, u'\u012a': 600, u'\u012b': 600, u'\u012e': 600, u'\u012f': 600, u'\u0130': 600, u'\u0131': 600, u'\u0136': 600, u'\u0137': 600, u'\u0139': 600, u'\u013a': 600, u'\u013b': 600, u'\u013c': 600, u'\u013d': 600, u'\u013e': 600, u'\u0141': 600, u'\u0142': 600, u'\u0143': 600, u'\u0144': 600, u'\u0145': 600, u'\u0146': 600, u'\u0147': 600, u'\u0148': 600, u'\u014c': 600, u'\u014d': 600, u'\u0150': 600, u'\u0151': 600, u'\u0152': 600, u'\u0153': 600, u'\u0154': 600, u'\u0155': 600, u'\u0156': 600, u'\u0157': 600, u'\u0158': 600, u'\u0159': 600, u'\u015a': 600, u'\u015b': 600, u'\u015e': 600, u'\u015f': 600, u'\u0160': 600, u'\u0161': 600, u'\u0162': 600, u'\u0163': 600, u'\u0164': 600, u'\u0165': 600, u'\u016a': 600, u'\u016b': 600, u'\u016e': 600, u'\u016f': 600, u'\u0170': 600, u'\u0171': 600, u'\u0172': 600, u'\u0173': 600, u'\u0178': 600, u'\u0179': 600, u'\u017a': 600, u'\u017b': 600, u'\u017c': 600, u'\u017d': 600, u'\u017e': 600, u'\u0192': 600, u'\u0218': 600, u'\u0219': 600, u'\u02c6': 600, u'\u02c7': 600, u'\u02d8': 600, u'\u02d9': 600, u'\u02da': 600, u'\u02db': 600, u'\u02dc': 600, u'\u02dd': 600, u'\u2013': 600, u'\u2014': 600, u'\u2018': 600, u'\u2019': 600, u'\u201a': 600, u'\u201c': 600, u'\u201d': 600, u'\u201e': 600, u'\u2020': 600, u'\u2021': 600, u'\u2022': 600, u'\u2026': 600, u'\u2030': 600, u'\u2039': 600, u'\u203a': 600, u'\u2044': 600, u'\u2122': 600, u'\u2202': 600, u'\u2206': 600, u'\u2211': 600, u'\u2212': 600, u'\u221a': 600, u'\u2260': 600, u'\u2264': 600, u'\u2265': 600, u'\u25ca': 600, u'\uf6c3': 600, u'\ufb01': 600, u'\ufb02': 600}), + 'Courier-Oblique': ({'FontName': 'Courier-Oblique', 'Descent': -194.0, 'FontBBox': (-49.0, -249.0, 749.0, 803.0), 'FontWeight': 'Medium', 'CapHeight': 572.0, 'FontFamily': 'Courier', 'Flags': 64, 'XHeight': 434.0, 'ItalicAngle': -11.0, 'Ascent': 627.0}, {u' ': 600, u'!': 600, u'"': 600, u'#': 600, u'$': 600, u'%': 600, u'&': 600, u"'": 600, u'(': 600, u')': 600, u'*': 600, u'+': 600, u',': 600, u'-': 600, u'.': 600, u'/': 600, u'0': 600, u'1': 600, u'2': 600, u'3': 600, u'4': 600, u'5': 600, u'6': 600, u'7': 600, u'8': 600, u'9': 600, u':': 600, u';': 600, u'<': 600, u'=': 600, u'>': 600, u'?': 600, u'@': 600, u'A': 600, u'B': 600, u'C': 600, u'D': 600, u'E': 600, u'F': 600, u'G': 600, u'H': 600, u'I': 600, u'J': 600, u'K': 600, u'L': 600, u'M': 600, u'N': 600, u'O': 600, u'P': 600, u'Q': 600, u'R': 600, u'S': 600, u'T': 600, u'U': 600, u'V': 600, u'W': 600, u'X': 600, u'Y': 600, u'Z': 600, u'[': 600, u'\\': 600, u']': 600, u'^': 600, u'_': 600, u'`': 600, u'a': 600, u'b': 600, u'c': 600, u'd': 600, u'e': 600, u'f': 600, u'g': 600, u'h': 600, u'i': 600, u'j': 600, u'k': 600, u'l': 600, u'm': 600, u'n': 600, u'o': 600, u'p': 600, u'q': 600, u'r': 600, u's': 600, u't': 600, u'u': 600, u'v': 600, u'w': 600, u'x': 600, u'y': 600, u'z': 600, u'{': 600, u'|': 600, u'}': 600, u'~': 600, u'\xa1': 600, u'\xa2': 600, u'\xa3': 600, u'\xa4': 600, u'\xa5': 600, u'\xa6': 600, u'\xa7': 600, u'\xa8': 600, u'\xa9': 600, u'\xaa': 600, u'\xab': 600, u'\xac': 600, u'\xae': 600, u'\xaf': 600, u'\xb0': 600, u'\xb1': 600, u'\xb2': 600, u'\xb3': 600, u'\xb4': 600, u'\xb5': 600, u'\xb6': 600, u'\xb7': 600, u'\xb8': 600, u'\xb9': 600, u'\xba': 600, u'\xbb': 600, u'\xbc': 600, u'\xbd': 600, u'\xbe': 600, u'\xbf': 600, u'\xc0': 600, u'\xc1': 600, u'\xc2': 600, u'\xc3': 600, u'\xc4': 600, u'\xc5': 600, u'\xc6': 600, u'\xc7': 600, u'\xc8': 600, u'\xc9': 600, u'\xca': 600, u'\xcb': 600, u'\xcc': 600, u'\xcd': 600, u'\xce': 600, u'\xcf': 600, u'\xd0': 600, u'\xd1': 600, u'\xd2': 600, u'\xd3': 600, u'\xd4': 600, u'\xd5': 600, u'\xd6': 600, u'\xd7': 600, u'\xd8': 600, u'\xd9': 600, u'\xda': 600, u'\xdb': 600, u'\xdc': 600, u'\xdd': 600, u'\xde': 600, u'\xdf': 600, u'\xe0': 600, u'\xe1': 600, u'\xe2': 600, u'\xe3': 600, u'\xe4': 600, u'\xe5': 600, u'\xe6': 600, u'\xe7': 600, u'\xe8': 600, u'\xe9': 600, u'\xea': 600, u'\xeb': 600, u'\xec': 600, u'\xed': 600, u'\xee': 600, u'\xef': 600, u'\xf0': 600, u'\xf1': 600, u'\xf2': 600, u'\xf3': 600, u'\xf4': 600, u'\xf5': 600, u'\xf6': 600, u'\xf7': 600, u'\xf8': 600, u'\xf9': 600, u'\xfa': 600, u'\xfb': 600, u'\xfc': 600, u'\xfd': 600, u'\xfe': 600, u'\xff': 600, u'\u0100': 600, u'\u0101': 600, u'\u0102': 600, u'\u0103': 600, u'\u0104': 600, u'\u0105': 600, u'\u0106': 600, u'\u0107': 600, u'\u010c': 600, u'\u010d': 600, u'\u010e': 600, u'\u010f': 600, u'\u0110': 600, u'\u0111': 600, u'\u0112': 600, u'\u0113': 600, u'\u0116': 600, u'\u0117': 600, u'\u0118': 600, u'\u0119': 600, u'\u011a': 600, u'\u011b': 600, u'\u011e': 600, u'\u011f': 600, u'\u0122': 600, u'\u0123': 600, u'\u012a': 600, u'\u012b': 600, u'\u012e': 600, u'\u012f': 600, u'\u0130': 600, u'\u0131': 600, u'\u0136': 600, u'\u0137': 600, u'\u0139': 600, u'\u013a': 600, u'\u013b': 600, u'\u013c': 600, u'\u013d': 600, u'\u013e': 600, u'\u0141': 600, u'\u0142': 600, u'\u0143': 600, u'\u0144': 600, u'\u0145': 600, u'\u0146': 600, u'\u0147': 600, u'\u0148': 600, u'\u014c': 600, u'\u014d': 600, u'\u0150': 600, u'\u0151': 600, u'\u0152': 600, u'\u0153': 600, u'\u0154': 600, u'\u0155': 600, u'\u0156': 600, u'\u0157': 600, u'\u0158': 600, u'\u0159': 600, u'\u015a': 600, u'\u015b': 600, u'\u015e': 600, u'\u015f': 600, u'\u0160': 600, u'\u0161': 600, u'\u0162': 600, u'\u0163': 600, u'\u0164': 600, u'\u0165': 600, u'\u016a': 600, u'\u016b': 600, u'\u016e': 600, u'\u016f': 600, u'\u0170': 600, u'\u0171': 600, u'\u0172': 600, u'\u0173': 600, u'\u0178': 600, u'\u0179': 600, u'\u017a': 600, u'\u017b': 600, u'\u017c': 600, u'\u017d': 600, u'\u017e': 600, u'\u0192': 600, u'\u0218': 600, u'\u0219': 600, u'\u02c6': 600, u'\u02c7': 600, u'\u02d8': 600, u'\u02d9': 600, u'\u02da': 600, u'\u02db': 600, u'\u02dc': 600, u'\u02dd': 600, u'\u2013': 600, u'\u2014': 600, u'\u2018': 600, u'\u2019': 600, u'\u201a': 600, u'\u201c': 600, u'\u201d': 600, u'\u201e': 600, u'\u2020': 600, u'\u2021': 600, u'\u2022': 600, u'\u2026': 600, u'\u2030': 600, u'\u2039': 600, u'\u203a': 600, u'\u2044': 600, u'\u2122': 600, u'\u2202': 600, u'\u2206': 600, u'\u2211': 600, u'\u2212': 600, u'\u221a': 600, u'\u2260': 600, u'\u2264': 600, u'\u2265': 600, u'\u25ca': 600, u'\uf6c3': 600, u'\ufb01': 600, u'\ufb02': 600}), + 'Helvetica': ({'FontName': 'Helvetica', 'Descent': -207.0, 'FontBBox': (-166.0, -225.0, 1000.0, 931.0), 'FontWeight': 'Medium', 'CapHeight': 718.0, 'FontFamily': 'Helvetica', 'Flags': 0, 'XHeight': 523.0, 'ItalicAngle': 0.0, 'Ascent': 718.0}, {u' ': 278, u'!': 278, u'"': 355, u'#': 556, u'$': 556, u'%': 889, u'&': 667, u"'": 191, u'(': 333, u')': 333, u'*': 389, u'+': 584, u',': 278, u'-': 333, u'.': 278, u'/': 278, u'0': 556, u'1': 556, u'2': 556, u'3': 556, u'4': 556, u'5': 556, u'6': 556, u'7': 556, u'8': 556, u'9': 556, u':': 278, u';': 278, u'<': 584, u'=': 584, u'>': 584, u'?': 556, u'@': 1015, u'A': 667, u'B': 667, u'C': 722, u'D': 722, u'E': 667, u'F': 611, u'G': 778, u'H': 722, u'I': 278, u'J': 500, u'K': 667, u'L': 556, u'M': 833, u'N': 722, u'O': 778, u'P': 667, u'Q': 778, u'R': 722, u'S': 667, u'T': 611, u'U': 722, u'V': 667, u'W': 944, u'X': 667, u'Y': 667, u'Z': 611, u'[': 278, u'\\': 278, u']': 278, u'^': 469, u'_': 556, u'`': 333, u'a': 556, u'b': 556, u'c': 500, u'd': 556, u'e': 556, u'f': 278, u'g': 556, u'h': 556, u'i': 222, u'j': 222, u'k': 500, u'l': 222, u'm': 833, u'n': 556, u'o': 556, u'p': 556, u'q': 556, u'r': 333, u's': 500, u't': 278, u'u': 556, u'v': 500, u'w': 722, u'x': 500, u'y': 500, u'z': 500, u'{': 334, u'|': 260, u'}': 334, u'~': 584, u'\xa1': 333, u'\xa2': 556, u'\xa3': 556, u'\xa4': 556, u'\xa5': 556, u'\xa6': 260, u'\xa7': 556, u'\xa8': 333, u'\xa9': 737, u'\xaa': 370, u'\xab': 556, u'\xac': 584, u'\xae': 737, u'\xaf': 333, u'\xb0': 400, u'\xb1': 584, u'\xb2': 333, u'\xb3': 333, u'\xb4': 333, u'\xb5': 556, u'\xb6': 537, u'\xb7': 278, u'\xb8': 333, u'\xb9': 333, u'\xba': 365, u'\xbb': 556, u'\xbc': 834, u'\xbd': 834, u'\xbe': 834, u'\xbf': 611, u'\xc0': 667, u'\xc1': 667, u'\xc2': 667, u'\xc3': 667, u'\xc4': 667, u'\xc5': 667, u'\xc6': 1000, u'\xc7': 722, u'\xc8': 667, u'\xc9': 667, u'\xca': 667, u'\xcb': 667, u'\xcc': 278, u'\xcd': 278, u'\xce': 278, u'\xcf': 278, u'\xd0': 722, u'\xd1': 722, u'\xd2': 778, u'\xd3': 778, u'\xd4': 778, u'\xd5': 778, u'\xd6': 778, u'\xd7': 584, u'\xd8': 778, u'\xd9': 722, u'\xda': 722, u'\xdb': 722, u'\xdc': 722, u'\xdd': 667, u'\xde': 667, u'\xdf': 611, u'\xe0': 556, u'\xe1': 556, u'\xe2': 556, u'\xe3': 556, u'\xe4': 556, u'\xe5': 556, u'\xe6': 889, u'\xe7': 500, u'\xe8': 556, u'\xe9': 556, u'\xea': 556, u'\xeb': 556, u'\xec': 278, u'\xed': 278, u'\xee': 278, u'\xef': 278, u'\xf0': 556, u'\xf1': 556, u'\xf2': 556, u'\xf3': 556, u'\xf4': 556, u'\xf5': 556, u'\xf6': 556, u'\xf7': 584, u'\xf8': 611, u'\xf9': 556, u'\xfa': 556, u'\xfb': 556, u'\xfc': 556, u'\xfd': 500, u'\xfe': 556, u'\xff': 500, u'\u0100': 667, u'\u0101': 556, u'\u0102': 667, u'\u0103': 556, u'\u0104': 667, u'\u0105': 556, u'\u0106': 722, u'\u0107': 500, u'\u010c': 722, u'\u010d': 500, u'\u010e': 722, u'\u010f': 643, u'\u0110': 722, u'\u0111': 556, u'\u0112': 667, u'\u0113': 556, u'\u0116': 667, u'\u0117': 556, u'\u0118': 667, u'\u0119': 556, u'\u011a': 667, u'\u011b': 556, u'\u011e': 778, u'\u011f': 556, u'\u0122': 778, u'\u0123': 556, u'\u012a': 278, u'\u012b': 278, u'\u012e': 278, u'\u012f': 222, u'\u0130': 278, u'\u0131': 278, u'\u0136': 667, u'\u0137': 500, u'\u0139': 556, u'\u013a': 222, u'\u013b': 556, u'\u013c': 222, u'\u013d': 556, u'\u013e': 299, u'\u0141': 556, u'\u0142': 222, u'\u0143': 722, u'\u0144': 556, u'\u0145': 722, u'\u0146': 556, u'\u0147': 722, u'\u0148': 556, u'\u014c': 778, u'\u014d': 556, u'\u0150': 778, u'\u0151': 556, u'\u0152': 1000, u'\u0153': 944, u'\u0154': 722, u'\u0155': 333, u'\u0156': 722, u'\u0157': 333, u'\u0158': 722, u'\u0159': 333, u'\u015a': 667, u'\u015b': 500, u'\u015e': 667, u'\u015f': 500, u'\u0160': 667, u'\u0161': 500, u'\u0162': 611, u'\u0163': 278, u'\u0164': 611, u'\u0165': 317, u'\u016a': 722, u'\u016b': 556, u'\u016e': 722, u'\u016f': 556, u'\u0170': 722, u'\u0171': 556, u'\u0172': 722, u'\u0173': 556, u'\u0178': 667, u'\u0179': 611, u'\u017a': 500, u'\u017b': 611, u'\u017c': 500, u'\u017d': 611, u'\u017e': 500, u'\u0192': 556, u'\u0218': 667, u'\u0219': 500, u'\u02c6': 333, u'\u02c7': 333, u'\u02d8': 333, u'\u02d9': 333, u'\u02da': 333, u'\u02db': 333, u'\u02dc': 333, u'\u02dd': 333, u'\u2013': 556, u'\u2014': 1000, u'\u2018': 222, u'\u2019': 222, u'\u201a': 222, u'\u201c': 333, u'\u201d': 333, u'\u201e': 333, u'\u2020': 556, u'\u2021': 556, u'\u2022': 350, u'\u2026': 1000, u'\u2030': 1000, u'\u2039': 333, u'\u203a': 333, u'\u2044': 167, u'\u2122': 1000, u'\u2202': 476, u'\u2206': 612, u'\u2211': 600, u'\u2212': 584, u'\u221a': 453, u'\u2260': 549, u'\u2264': 549, u'\u2265': 549, u'\u25ca': 471, u'\uf6c3': 250, u'\ufb01': 500, u'\ufb02': 500}), + 'Helvetica-Bold': ({'FontName': 'Helvetica-Bold', 'Descent': -207.0, 'FontBBox': (-170.0, -228.0, 1003.0, 962.0), 'FontWeight': 'Bold', 'CapHeight': 718.0, 'FontFamily': 'Helvetica', 'Flags': 0, 'XHeight': 532.0, 'ItalicAngle': 0.0, 'Ascent': 718.0}, {u' ': 278, u'!': 333, u'"': 474, u'#': 556, u'$': 556, u'%': 889, u'&': 722, u"'": 238, u'(': 333, u')': 333, u'*': 389, u'+': 584, u',': 278, u'-': 333, u'.': 278, u'/': 278, u'0': 556, u'1': 556, u'2': 556, u'3': 556, u'4': 556, u'5': 556, u'6': 556, u'7': 556, u'8': 556, u'9': 556, u':': 333, u';': 333, u'<': 584, u'=': 584, u'>': 584, u'?': 611, u'@': 975, u'A': 722, u'B': 722, u'C': 722, u'D': 722, u'E': 667, u'F': 611, u'G': 778, u'H': 722, u'I': 278, u'J': 556, u'K': 722, u'L': 611, u'M': 833, u'N': 722, u'O': 778, u'P': 667, u'Q': 778, u'R': 722, u'S': 667, u'T': 611, u'U': 722, u'V': 667, u'W': 944, u'X': 667, u'Y': 667, u'Z': 611, u'[': 333, u'\\': 278, u']': 333, u'^': 584, u'_': 556, u'`': 333, u'a': 556, u'b': 611, u'c': 556, u'd': 611, u'e': 556, u'f': 333, u'g': 611, u'h': 611, u'i': 278, u'j': 278, u'k': 556, u'l': 278, u'm': 889, u'n': 611, u'o': 611, u'p': 611, u'q': 611, u'r': 389, u's': 556, u't': 333, u'u': 611, u'v': 556, u'w': 778, u'x': 556, u'y': 556, u'z': 500, u'{': 389, u'|': 280, u'}': 389, u'~': 584, u'\xa1': 333, u'\xa2': 556, u'\xa3': 556, u'\xa4': 556, u'\xa5': 556, u'\xa6': 280, u'\xa7': 556, u'\xa8': 333, u'\xa9': 737, u'\xaa': 370, u'\xab': 556, u'\xac': 584, u'\xae': 737, u'\xaf': 333, u'\xb0': 400, u'\xb1': 584, u'\xb2': 333, u'\xb3': 333, u'\xb4': 333, u'\xb5': 611, u'\xb6': 556, u'\xb7': 278, u'\xb8': 333, u'\xb9': 333, u'\xba': 365, u'\xbb': 556, u'\xbc': 834, u'\xbd': 834, u'\xbe': 834, u'\xbf': 611, u'\xc0': 722, u'\xc1': 722, u'\xc2': 722, u'\xc3': 722, u'\xc4': 722, u'\xc5': 722, u'\xc6': 1000, u'\xc7': 722, u'\xc8': 667, u'\xc9': 667, u'\xca': 667, u'\xcb': 667, u'\xcc': 278, u'\xcd': 278, u'\xce': 278, u'\xcf': 278, u'\xd0': 722, u'\xd1': 722, u'\xd2': 778, u'\xd3': 778, u'\xd4': 778, u'\xd5': 778, u'\xd6': 778, u'\xd7': 584, u'\xd8': 778, u'\xd9': 722, u'\xda': 722, u'\xdb': 722, u'\xdc': 722, u'\xdd': 667, u'\xde': 667, u'\xdf': 611, u'\xe0': 556, u'\xe1': 556, u'\xe2': 556, u'\xe3': 556, u'\xe4': 556, u'\xe5': 556, u'\xe6': 889, u'\xe7': 556, u'\xe8': 556, u'\xe9': 556, u'\xea': 556, u'\xeb': 556, u'\xec': 278, u'\xed': 278, u'\xee': 278, u'\xef': 278, u'\xf0': 611, u'\xf1': 611, u'\xf2': 611, u'\xf3': 611, u'\xf4': 611, u'\xf5': 611, u'\xf6': 611, u'\xf7': 584, u'\xf8': 611, u'\xf9': 611, u'\xfa': 611, u'\xfb': 611, u'\xfc': 611, u'\xfd': 556, u'\xfe': 611, u'\xff': 556, u'\u0100': 722, u'\u0101': 556, u'\u0102': 722, u'\u0103': 556, u'\u0104': 722, u'\u0105': 556, u'\u0106': 722, u'\u0107': 556, u'\u010c': 722, u'\u010d': 556, u'\u010e': 722, u'\u010f': 743, u'\u0110': 722, u'\u0111': 611, u'\u0112': 667, u'\u0113': 556, u'\u0116': 667, u'\u0117': 556, u'\u0118': 667, u'\u0119': 556, u'\u011a': 667, u'\u011b': 556, u'\u011e': 778, u'\u011f': 611, u'\u0122': 778, u'\u0123': 611, u'\u012a': 278, u'\u012b': 278, u'\u012e': 278, u'\u012f': 278, u'\u0130': 278, u'\u0131': 278, u'\u0136': 722, u'\u0137': 556, u'\u0139': 611, u'\u013a': 278, u'\u013b': 611, u'\u013c': 278, u'\u013d': 611, u'\u013e': 400, u'\u0141': 611, u'\u0142': 278, u'\u0143': 722, u'\u0144': 611, u'\u0145': 722, u'\u0146': 611, u'\u0147': 722, u'\u0148': 611, u'\u014c': 778, u'\u014d': 611, u'\u0150': 778, u'\u0151': 611, u'\u0152': 1000, u'\u0153': 944, u'\u0154': 722, u'\u0155': 389, u'\u0156': 722, u'\u0157': 389, u'\u0158': 722, u'\u0159': 389, u'\u015a': 667, u'\u015b': 556, u'\u015e': 667, u'\u015f': 556, u'\u0160': 667, u'\u0161': 556, u'\u0162': 611, u'\u0163': 333, u'\u0164': 611, u'\u0165': 389, u'\u016a': 722, u'\u016b': 611, u'\u016e': 722, u'\u016f': 611, u'\u0170': 722, u'\u0171': 611, u'\u0172': 722, u'\u0173': 611, u'\u0178': 667, u'\u0179': 611, u'\u017a': 500, u'\u017b': 611, u'\u017c': 500, u'\u017d': 611, u'\u017e': 500, u'\u0192': 556, u'\u0218': 667, u'\u0219': 556, u'\u02c6': 333, u'\u02c7': 333, u'\u02d8': 333, u'\u02d9': 333, u'\u02da': 333, u'\u02db': 333, u'\u02dc': 333, u'\u02dd': 333, u'\u2013': 556, u'\u2014': 1000, u'\u2018': 278, u'\u2019': 278, u'\u201a': 278, u'\u201c': 500, u'\u201d': 500, u'\u201e': 500, u'\u2020': 556, u'\u2021': 556, u'\u2022': 350, u'\u2026': 1000, u'\u2030': 1000, u'\u2039': 333, u'\u203a': 333, u'\u2044': 167, u'\u2122': 1000, u'\u2202': 494, u'\u2206': 612, u'\u2211': 600, u'\u2212': 584, u'\u221a': 549, u'\u2260': 549, u'\u2264': 549, u'\u2265': 549, u'\u25ca': 494, u'\uf6c3': 250, u'\ufb01': 611, u'\ufb02': 611}), + 'Helvetica-BoldOblique': ({'FontName': 'Helvetica-BoldOblique', 'Descent': -207.0, 'FontBBox': (-175.0, -228.0, 1114.0, 962.0), 'FontWeight': 'Bold', 'CapHeight': 718.0, 'FontFamily': 'Helvetica', 'Flags': 0, 'XHeight': 532.0, 'ItalicAngle': -12.0, 'Ascent': 718.0}, {u' ': 278, u'!': 333, u'"': 474, u'#': 556, u'$': 556, u'%': 889, u'&': 722, u"'": 238, u'(': 333, u')': 333, u'*': 389, u'+': 584, u',': 278, u'-': 333, u'.': 278, u'/': 278, u'0': 556, u'1': 556, u'2': 556, u'3': 556, u'4': 556, u'5': 556, u'6': 556, u'7': 556, u'8': 556, u'9': 556, u':': 333, u';': 333, u'<': 584, u'=': 584, u'>': 584, u'?': 611, u'@': 975, u'A': 722, u'B': 722, u'C': 722, u'D': 722, u'E': 667, u'F': 611, u'G': 778, u'H': 722, u'I': 278, u'J': 556, u'K': 722, u'L': 611, u'M': 833, u'N': 722, u'O': 778, u'P': 667, u'Q': 778, u'R': 722, u'S': 667, u'T': 611, u'U': 722, u'V': 667, u'W': 944, u'X': 667, u'Y': 667, u'Z': 611, u'[': 333, u'\\': 278, u']': 333, u'^': 584, u'_': 556, u'`': 333, u'a': 556, u'b': 611, u'c': 556, u'd': 611, u'e': 556, u'f': 333, u'g': 611, u'h': 611, u'i': 278, u'j': 278, u'k': 556, u'l': 278, u'm': 889, u'n': 611, u'o': 611, u'p': 611, u'q': 611, u'r': 389, u's': 556, u't': 333, u'u': 611, u'v': 556, u'w': 778, u'x': 556, u'y': 556, u'z': 500, u'{': 389, u'|': 280, u'}': 389, u'~': 584, u'\xa1': 333, u'\xa2': 556, u'\xa3': 556, u'\xa4': 556, u'\xa5': 556, u'\xa6': 280, u'\xa7': 556, u'\xa8': 333, u'\xa9': 737, u'\xaa': 370, u'\xab': 556, u'\xac': 584, u'\xae': 737, u'\xaf': 333, u'\xb0': 400, u'\xb1': 584, u'\xb2': 333, u'\xb3': 333, u'\xb4': 333, u'\xb5': 611, u'\xb6': 556, u'\xb7': 278, u'\xb8': 333, u'\xb9': 333, u'\xba': 365, u'\xbb': 556, u'\xbc': 834, u'\xbd': 834, u'\xbe': 834, u'\xbf': 611, u'\xc0': 722, u'\xc1': 722, u'\xc2': 722, u'\xc3': 722, u'\xc4': 722, u'\xc5': 722, u'\xc6': 1000, u'\xc7': 722, u'\xc8': 667, u'\xc9': 667, u'\xca': 667, u'\xcb': 667, u'\xcc': 278, u'\xcd': 278, u'\xce': 278, u'\xcf': 278, u'\xd0': 722, u'\xd1': 722, u'\xd2': 778, u'\xd3': 778, u'\xd4': 778, u'\xd5': 778, u'\xd6': 778, u'\xd7': 584, u'\xd8': 778, u'\xd9': 722, u'\xda': 722, u'\xdb': 722, u'\xdc': 722, u'\xdd': 667, u'\xde': 667, u'\xdf': 611, u'\xe0': 556, u'\xe1': 556, u'\xe2': 556, u'\xe3': 556, u'\xe4': 556, u'\xe5': 556, u'\xe6': 889, u'\xe7': 556, u'\xe8': 556, u'\xe9': 556, u'\xea': 556, u'\xeb': 556, u'\xec': 278, u'\xed': 278, u'\xee': 278, u'\xef': 278, u'\xf0': 611, u'\xf1': 611, u'\xf2': 611, u'\xf3': 611, u'\xf4': 611, u'\xf5': 611, u'\xf6': 611, u'\xf7': 584, u'\xf8': 611, u'\xf9': 611, u'\xfa': 611, u'\xfb': 611, u'\xfc': 611, u'\xfd': 556, u'\xfe': 611, u'\xff': 556, u'\u0100': 722, u'\u0101': 556, u'\u0102': 722, u'\u0103': 556, u'\u0104': 722, u'\u0105': 556, u'\u0106': 722, u'\u0107': 556, u'\u010c': 722, u'\u010d': 556, u'\u010e': 722, u'\u010f': 743, u'\u0110': 722, u'\u0111': 611, u'\u0112': 667, u'\u0113': 556, u'\u0116': 667, u'\u0117': 556, u'\u0118': 667, u'\u0119': 556, u'\u011a': 667, u'\u011b': 556, u'\u011e': 778, u'\u011f': 611, u'\u0122': 778, u'\u0123': 611, u'\u012a': 278, u'\u012b': 278, u'\u012e': 278, u'\u012f': 278, u'\u0130': 278, u'\u0131': 278, u'\u0136': 722, u'\u0137': 556, u'\u0139': 611, u'\u013a': 278, u'\u013b': 611, u'\u013c': 278, u'\u013d': 611, u'\u013e': 400, u'\u0141': 611, u'\u0142': 278, u'\u0143': 722, u'\u0144': 611, u'\u0145': 722, u'\u0146': 611, u'\u0147': 722, u'\u0148': 611, u'\u014c': 778, u'\u014d': 611, u'\u0150': 778, u'\u0151': 611, u'\u0152': 1000, u'\u0153': 944, u'\u0154': 722, u'\u0155': 389, u'\u0156': 722, u'\u0157': 389, u'\u0158': 722, u'\u0159': 389, u'\u015a': 667, u'\u015b': 556, u'\u015e': 667, u'\u015f': 556, u'\u0160': 667, u'\u0161': 556, u'\u0162': 611, u'\u0163': 333, u'\u0164': 611, u'\u0165': 389, u'\u016a': 722, u'\u016b': 611, u'\u016e': 722, u'\u016f': 611, u'\u0170': 722, u'\u0171': 611, u'\u0172': 722, u'\u0173': 611, u'\u0178': 667, u'\u0179': 611, u'\u017a': 500, u'\u017b': 611, u'\u017c': 500, u'\u017d': 611, u'\u017e': 500, u'\u0192': 556, u'\u0218': 667, u'\u0219': 556, u'\u02c6': 333, u'\u02c7': 333, u'\u02d8': 333, u'\u02d9': 333, u'\u02da': 333, u'\u02db': 333, u'\u02dc': 333, u'\u02dd': 333, u'\u2013': 556, u'\u2014': 1000, u'\u2018': 278, u'\u2019': 278, u'\u201a': 278, u'\u201c': 500, u'\u201d': 500, u'\u201e': 500, u'\u2020': 556, u'\u2021': 556, u'\u2022': 350, u'\u2026': 1000, u'\u2030': 1000, u'\u2039': 333, u'\u203a': 333, u'\u2044': 167, u'\u2122': 1000, u'\u2202': 494, u'\u2206': 612, u'\u2211': 600, u'\u2212': 584, u'\u221a': 549, u'\u2260': 549, u'\u2264': 549, u'\u2265': 549, u'\u25ca': 494, u'\uf6c3': 250, u'\ufb01': 611, u'\ufb02': 611}), + 'Helvetica-Oblique': ({'FontName': 'Helvetica-Oblique', 'Descent': -207.0, 'FontBBox': (-171.0, -225.0, 1116.0, 931.0), 'FontWeight': 'Medium', 'CapHeight': 718.0, 'FontFamily': 'Helvetica', 'Flags': 0, 'XHeight': 523.0, 'ItalicAngle': -12.0, 'Ascent': 718.0}, {u' ': 278, u'!': 278, u'"': 355, u'#': 556, u'$': 556, u'%': 889, u'&': 667, u"'": 191, u'(': 333, u')': 333, u'*': 389, u'+': 584, u',': 278, u'-': 333, u'.': 278, u'/': 278, u'0': 556, u'1': 556, u'2': 556, u'3': 556, u'4': 556, u'5': 556, u'6': 556, u'7': 556, u'8': 556, u'9': 556, u':': 278, u';': 278, u'<': 584, u'=': 584, u'>': 584, u'?': 556, u'@': 1015, u'A': 667, u'B': 667, u'C': 722, u'D': 722, u'E': 667, u'F': 611, u'G': 778, u'H': 722, u'I': 278, u'J': 500, u'K': 667, u'L': 556, u'M': 833, u'N': 722, u'O': 778, u'P': 667, u'Q': 778, u'R': 722, u'S': 667, u'T': 611, u'U': 722, u'V': 667, u'W': 944, u'X': 667, u'Y': 667, u'Z': 611, u'[': 278, u'\\': 278, u']': 278, u'^': 469, u'_': 556, u'`': 333, u'a': 556, u'b': 556, u'c': 500, u'd': 556, u'e': 556, u'f': 278, u'g': 556, u'h': 556, u'i': 222, u'j': 222, u'k': 500, u'l': 222, u'm': 833, u'n': 556, u'o': 556, u'p': 556, u'q': 556, u'r': 333, u's': 500, u't': 278, u'u': 556, u'v': 500, u'w': 722, u'x': 500, u'y': 500, u'z': 500, u'{': 334, u'|': 260, u'}': 334, u'~': 584, u'\xa1': 333, u'\xa2': 556, u'\xa3': 556, u'\xa4': 556, u'\xa5': 556, u'\xa6': 260, u'\xa7': 556, u'\xa8': 333, u'\xa9': 737, u'\xaa': 370, u'\xab': 556, u'\xac': 584, u'\xae': 737, u'\xaf': 333, u'\xb0': 400, u'\xb1': 584, u'\xb2': 333, u'\xb3': 333, u'\xb4': 333, u'\xb5': 556, u'\xb6': 537, u'\xb7': 278, u'\xb8': 333, u'\xb9': 333, u'\xba': 365, u'\xbb': 556, u'\xbc': 834, u'\xbd': 834, u'\xbe': 834, u'\xbf': 611, u'\xc0': 667, u'\xc1': 667, u'\xc2': 667, u'\xc3': 667, u'\xc4': 667, u'\xc5': 667, u'\xc6': 1000, u'\xc7': 722, u'\xc8': 667, u'\xc9': 667, u'\xca': 667, u'\xcb': 667, u'\xcc': 278, u'\xcd': 278, u'\xce': 278, u'\xcf': 278, u'\xd0': 722, u'\xd1': 722, u'\xd2': 778, u'\xd3': 778, u'\xd4': 778, u'\xd5': 778, u'\xd6': 778, u'\xd7': 584, u'\xd8': 778, u'\xd9': 722, u'\xda': 722, u'\xdb': 722, u'\xdc': 722, u'\xdd': 667, u'\xde': 667, u'\xdf': 611, u'\xe0': 556, u'\xe1': 556, u'\xe2': 556, u'\xe3': 556, u'\xe4': 556, u'\xe5': 556, u'\xe6': 889, u'\xe7': 500, u'\xe8': 556, u'\xe9': 556, u'\xea': 556, u'\xeb': 556, u'\xec': 278, u'\xed': 278, u'\xee': 278, u'\xef': 278, u'\xf0': 556, u'\xf1': 556, u'\xf2': 556, u'\xf3': 556, u'\xf4': 556, u'\xf5': 556, u'\xf6': 556, u'\xf7': 584, u'\xf8': 611, u'\xf9': 556, u'\xfa': 556, u'\xfb': 556, u'\xfc': 556, u'\xfd': 500, u'\xfe': 556, u'\xff': 500, u'\u0100': 667, u'\u0101': 556, u'\u0102': 667, u'\u0103': 556, u'\u0104': 667, u'\u0105': 556, u'\u0106': 722, u'\u0107': 500, u'\u010c': 722, u'\u010d': 500, u'\u010e': 722, u'\u010f': 643, u'\u0110': 722, u'\u0111': 556, u'\u0112': 667, u'\u0113': 556, u'\u0116': 667, u'\u0117': 556, u'\u0118': 667, u'\u0119': 556, u'\u011a': 667, u'\u011b': 556, u'\u011e': 778, u'\u011f': 556, u'\u0122': 778, u'\u0123': 556, u'\u012a': 278, u'\u012b': 278, u'\u012e': 278, u'\u012f': 222, u'\u0130': 278, u'\u0131': 278, u'\u0136': 667, u'\u0137': 500, u'\u0139': 556, u'\u013a': 222, u'\u013b': 556, u'\u013c': 222, u'\u013d': 556, u'\u013e': 299, u'\u0141': 556, u'\u0142': 222, u'\u0143': 722, u'\u0144': 556, u'\u0145': 722, u'\u0146': 556, u'\u0147': 722, u'\u0148': 556, u'\u014c': 778, u'\u014d': 556, u'\u0150': 778, u'\u0151': 556, u'\u0152': 1000, u'\u0153': 944, u'\u0154': 722, u'\u0155': 333, u'\u0156': 722, u'\u0157': 333, u'\u0158': 722, u'\u0159': 333, u'\u015a': 667, u'\u015b': 500, u'\u015e': 667, u'\u015f': 500, u'\u0160': 667, u'\u0161': 500, u'\u0162': 611, u'\u0163': 278, u'\u0164': 611, u'\u0165': 317, u'\u016a': 722, u'\u016b': 556, u'\u016e': 722, u'\u016f': 556, u'\u0170': 722, u'\u0171': 556, u'\u0172': 722, u'\u0173': 556, u'\u0178': 667, u'\u0179': 611, u'\u017a': 500, u'\u017b': 611, u'\u017c': 500, u'\u017d': 611, u'\u017e': 500, u'\u0192': 556, u'\u0218': 667, u'\u0219': 500, u'\u02c6': 333, u'\u02c7': 333, u'\u02d8': 333, u'\u02d9': 333, u'\u02da': 333, u'\u02db': 333, u'\u02dc': 333, u'\u02dd': 333, u'\u2013': 556, u'\u2014': 1000, u'\u2018': 222, u'\u2019': 222, u'\u201a': 222, u'\u201c': 333, u'\u201d': 333, u'\u201e': 333, u'\u2020': 556, u'\u2021': 556, u'\u2022': 350, u'\u2026': 1000, u'\u2030': 1000, u'\u2039': 333, u'\u203a': 333, u'\u2044': 167, u'\u2122': 1000, u'\u2202': 476, u'\u2206': 612, u'\u2211': 600, u'\u2212': 584, u'\u221a': 453, u'\u2260': 549, u'\u2264': 549, u'\u2265': 549, u'\u25ca': 471, u'\uf6c3': 250, u'\ufb01': 500, u'\ufb02': 500}), + 'Symbol': ({'FontName': 'Symbol', 'FontBBox': (-180.0, -293.0, 1090.0, 1010.0), 'FontWeight': 'Medium', 'FontFamily': 'Symbol', 'Flags': 0, 'ItalicAngle': 0.0}, {u' ': 250, u'!': 333, u'#': 500, u'%': 833, u'&': 778, u'(': 333, u')': 333, u'+': 549, u',': 250, u'.': 250, u'/': 278, u'0': 500, u'1': 500, u'2': 500, u'3': 500, u'4': 500, u'5': 500, u'6': 500, u'7': 500, u'8': 500, u'9': 500, u':': 278, u';': 278, u'<': 549, u'=': 549, u'>': 549, u'?': 444, u'[': 333, u']': 333, u'_': 500, u'{': 480, u'|': 200, u'}': 480, u'\xac': 713, u'\xb0': 400, u'\xb1': 549, u'\xb5': 576, u'\xd7': 549, u'\xf7': 549, u'\u0192': 500, u'\u0391': 722, u'\u0392': 667, u'\u0393': 603, u'\u0395': 611, u'\u0396': 611, u'\u0397': 722, u'\u0398': 741, u'\u0399': 333, u'\u039a': 722, u'\u039b': 686, u'\u039c': 889, u'\u039d': 722, u'\u039e': 645, u'\u039f': 722, u'\u03a0': 768, u'\u03a1': 556, u'\u03a3': 592, u'\u03a4': 611, u'\u03a5': 690, u'\u03a6': 763, u'\u03a7': 722, u'\u03a8': 795, u'\u03b1': 631, u'\u03b2': 549, u'\u03b3': 411, u'\u03b4': 494, u'\u03b5': 439, u'\u03b6': 494, u'\u03b7': 603, u'\u03b8': 521, u'\u03b9': 329, u'\u03ba': 549, u'\u03bb': 549, u'\u03bd': 521, u'\u03be': 493, u'\u03bf': 549, u'\u03c0': 549, u'\u03c1': 549, u'\u03c2': 439, u'\u03c3': 603, u'\u03c4': 439, u'\u03c5': 576, u'\u03c6': 521, u'\u03c7': 549, u'\u03c8': 686, u'\u03c9': 686, u'\u03d1': 631, u'\u03d2': 620, u'\u03d5': 603, u'\u03d6': 713, u'\u2022': 460, u'\u2026': 1000, u'\u2032': 247, u'\u2033': 411, u'\u2044': 167, u'\u20ac': 750, u'\u2111': 686, u'\u2118': 987, u'\u211c': 795, u'\u2126': 768, u'\u2135': 823, u'\u2190': 987, u'\u2191': 603, u'\u2192': 987, u'\u2193': 603, u'\u2194': 1042, u'\u21b5': 658, u'\u21d0': 987, u'\u21d1': 603, u'\u21d2': 987, u'\u21d3': 603, u'\u21d4': 1042, u'\u2200': 713, u'\u2202': 494, u'\u2203': 549, u'\u2205': 823, u'\u2206': 612, u'\u2207': 713, u'\u2208': 713, u'\u2209': 713, u'\u220b': 439, u'\u220f': 823, u'\u2211': 713, u'\u2212': 549, u'\u2217': 500, u'\u221a': 549, u'\u221d': 713, u'\u221e': 713, u'\u2220': 768, u'\u2227': 603, u'\u2228': 603, u'\u2229': 768, u'\u222a': 768, u'\u222b': 274, u'\u2234': 863, u'\u223c': 549, u'\u2245': 549, u'\u2248': 549, u'\u2260': 549, u'\u2261': 549, u'\u2264': 549, u'\u2265': 549, u'\u2282': 713, u'\u2283': 713, u'\u2284': 713, u'\u2286': 713, u'\u2287': 713, u'\u2295': 768, u'\u2297': 768, u'\u22a5': 658, u'\u22c5': 250, u'\u2320': 686, u'\u2321': 686, u'\u2329': 329, u'\u232a': 329, u'\u25ca': 494, u'\u2660': 753, u'\u2663': 753, u'\u2665': 753, u'\u2666': 753, u'\uf6d9': 790, u'\uf6da': 790, u'\uf6db': 890, u'\uf8e5': 500, u'\uf8e6': 603, u'\uf8e7': 1000, u'\uf8e8': 790, u'\uf8e9': 790, u'\uf8ea': 786, u'\uf8eb': 384, u'\uf8ec': 384, u'\uf8ed': 384, u'\uf8ee': 384, u'\uf8ef': 384, u'\uf8f0': 384, u'\uf8f1': 494, u'\uf8f2': 494, u'\uf8f3': 494, u'\uf8f4': 494, u'\uf8f5': 686, u'\uf8f6': 384, u'\uf8f7': 384, u'\uf8f8': 384, u'\uf8f9': 384, u'\uf8fa': 384, u'\uf8fb': 384, u'\uf8fc': 494, u'\uf8fd': 494, u'\uf8fe': 494, u'\uf8ff': 790}), + 'Times-Bold': ({'FontName': 'Times-Bold', 'Descent': -217.0, 'FontBBox': (-168.0, -218.0, 1000.0, 935.0), 'FontWeight': 'Bold', 'CapHeight': 676.0, 'FontFamily': 'Times', 'Flags': 0, 'XHeight': 461.0, 'ItalicAngle': 0.0, 'Ascent': 683.0}, {u' ': 250, u'!': 333, u'"': 555, u'#': 500, u'$': 500, u'%': 1000, u'&': 833, u"'": 278, u'(': 333, u')': 333, u'*': 500, u'+': 570, u',': 250, u'-': 333, u'.': 250, u'/': 278, u'0': 500, u'1': 500, u'2': 500, u'3': 500, u'4': 500, u'5': 500, u'6': 500, u'7': 500, u'8': 500, u'9': 500, u':': 333, u';': 333, u'<': 570, u'=': 570, u'>': 570, u'?': 500, u'@': 930, u'A': 722, u'B': 667, u'C': 722, u'D': 722, u'E': 667, u'F': 611, u'G': 778, u'H': 778, u'I': 389, u'J': 500, u'K': 778, u'L': 667, u'M': 944, u'N': 722, u'O': 778, u'P': 611, u'Q': 778, u'R': 722, u'S': 556, u'T': 667, u'U': 722, u'V': 722, u'W': 1000, u'X': 722, u'Y': 722, u'Z': 667, u'[': 333, u'\\': 278, u']': 333, u'^': 581, u'_': 500, u'`': 333, u'a': 500, u'b': 556, u'c': 444, u'd': 556, u'e': 444, u'f': 333, u'g': 500, u'h': 556, u'i': 278, u'j': 333, u'k': 556, u'l': 278, u'm': 833, u'n': 556, u'o': 500, u'p': 556, u'q': 556, u'r': 444, u's': 389, u't': 333, u'u': 556, u'v': 500, u'w': 722, u'x': 500, u'y': 500, u'z': 444, u'{': 394, u'|': 220, u'}': 394, u'~': 520, u'\xa1': 333, u'\xa2': 500, u'\xa3': 500, u'\xa4': 500, u'\xa5': 500, u'\xa6': 220, u'\xa7': 500, u'\xa8': 333, u'\xa9': 747, u'\xaa': 300, u'\xab': 500, u'\xac': 570, u'\xae': 747, u'\xaf': 333, u'\xb0': 400, u'\xb1': 570, u'\xb2': 300, u'\xb3': 300, u'\xb4': 333, u'\xb5': 556, u'\xb6': 540, u'\xb7': 250, u'\xb8': 333, u'\xb9': 300, u'\xba': 330, u'\xbb': 500, u'\xbc': 750, u'\xbd': 750, u'\xbe': 750, u'\xbf': 500, u'\xc0': 722, u'\xc1': 722, u'\xc2': 722, u'\xc3': 722, u'\xc4': 722, u'\xc5': 722, u'\xc6': 1000, u'\xc7': 722, u'\xc8': 667, u'\xc9': 667, u'\xca': 667, u'\xcb': 667, u'\xcc': 389, u'\xcd': 389, u'\xce': 389, u'\xcf': 389, u'\xd0': 722, u'\xd1': 722, u'\xd2': 778, u'\xd3': 778, u'\xd4': 778, u'\xd5': 778, u'\xd6': 778, u'\xd7': 570, u'\xd8': 778, u'\xd9': 722, u'\xda': 722, u'\xdb': 722, u'\xdc': 722, u'\xdd': 722, u'\xde': 611, u'\xdf': 556, u'\xe0': 500, u'\xe1': 500, u'\xe2': 500, u'\xe3': 500, u'\xe4': 500, u'\xe5': 500, u'\xe6': 722, u'\xe7': 444, u'\xe8': 444, u'\xe9': 444, u'\xea': 444, u'\xeb': 444, u'\xec': 278, u'\xed': 278, u'\xee': 278, u'\xef': 278, u'\xf0': 500, u'\xf1': 556, u'\xf2': 500, u'\xf3': 500, u'\xf4': 500, u'\xf5': 500, u'\xf6': 500, u'\xf7': 570, u'\xf8': 500, u'\xf9': 556, u'\xfa': 556, u'\xfb': 556, u'\xfc': 556, u'\xfd': 500, u'\xfe': 556, u'\xff': 500, u'\u0100': 722, u'\u0101': 500, u'\u0102': 722, u'\u0103': 500, u'\u0104': 722, u'\u0105': 500, u'\u0106': 722, u'\u0107': 444, u'\u010c': 722, u'\u010d': 444, u'\u010e': 722, u'\u010f': 672, u'\u0110': 722, u'\u0111': 556, u'\u0112': 667, u'\u0113': 444, u'\u0116': 667, u'\u0117': 444, u'\u0118': 667, u'\u0119': 444, u'\u011a': 667, u'\u011b': 444, u'\u011e': 778, u'\u011f': 500, u'\u0122': 778, u'\u0123': 500, u'\u012a': 389, u'\u012b': 278, u'\u012e': 389, u'\u012f': 278, u'\u0130': 389, u'\u0131': 278, u'\u0136': 778, u'\u0137': 556, u'\u0139': 667, u'\u013a': 278, u'\u013b': 667, u'\u013c': 278, u'\u013d': 667, u'\u013e': 394, u'\u0141': 667, u'\u0142': 278, u'\u0143': 722, u'\u0144': 556, u'\u0145': 722, u'\u0146': 556, u'\u0147': 722, u'\u0148': 556, u'\u014c': 778, u'\u014d': 500, u'\u0150': 778, u'\u0151': 500, u'\u0152': 1000, u'\u0153': 722, u'\u0154': 722, u'\u0155': 444, u'\u0156': 722, u'\u0157': 444, u'\u0158': 722, u'\u0159': 444, u'\u015a': 556, u'\u015b': 389, u'\u015e': 556, u'\u015f': 389, u'\u0160': 556, u'\u0161': 389, u'\u0162': 667, u'\u0163': 333, u'\u0164': 667, u'\u0165': 416, u'\u016a': 722, u'\u016b': 556, u'\u016e': 722, u'\u016f': 556, u'\u0170': 722, u'\u0171': 556, u'\u0172': 722, u'\u0173': 556, u'\u0178': 722, u'\u0179': 667, u'\u017a': 444, u'\u017b': 667, u'\u017c': 444, u'\u017d': 667, u'\u017e': 444, u'\u0192': 500, u'\u0218': 556, u'\u0219': 389, u'\u02c6': 333, u'\u02c7': 333, u'\u02d8': 333, u'\u02d9': 333, u'\u02da': 333, u'\u02db': 333, u'\u02dc': 333, u'\u02dd': 333, u'\u2013': 500, u'\u2014': 1000, u'\u2018': 333, u'\u2019': 333, u'\u201a': 333, u'\u201c': 500, u'\u201d': 500, u'\u201e': 500, u'\u2020': 500, u'\u2021': 500, u'\u2022': 350, u'\u2026': 1000, u'\u2030': 1000, u'\u2039': 333, u'\u203a': 333, u'\u2044': 167, u'\u2122': 1000, u'\u2202': 494, u'\u2206': 612, u'\u2211': 600, u'\u2212': 570, u'\u221a': 549, u'\u2260': 549, u'\u2264': 549, u'\u2265': 549, u'\u25ca': 494, u'\uf6c3': 250, u'\ufb01': 556, u'\ufb02': 556}), + 'Times-BoldItalic': ({'FontName': 'Times-BoldItalic', 'Descent': -217.0, 'FontBBox': (-200.0, -218.0, 996.0, 921.0), 'FontWeight': 'Bold', 'CapHeight': 669.0, 'FontFamily': 'Times', 'Flags': 0, 'XHeight': 462.0, 'ItalicAngle': -15.0, 'Ascent': 683.0}, {u' ': 250, u'!': 389, u'"': 555, u'#': 500, u'$': 500, u'%': 833, u'&': 778, u"'": 278, u'(': 333, u')': 333, u'*': 500, u'+': 570, u',': 250, u'-': 333, u'.': 250, u'/': 278, u'0': 500, u'1': 500, u'2': 500, u'3': 500, u'4': 500, u'5': 500, u'6': 500, u'7': 500, u'8': 500, u'9': 500, u':': 333, u';': 333, u'<': 570, u'=': 570, u'>': 570, u'?': 500, u'@': 832, u'A': 667, u'B': 667, u'C': 667, u'D': 722, u'E': 667, u'F': 667, u'G': 722, u'H': 778, u'I': 389, u'J': 500, u'K': 667, u'L': 611, u'M': 889, u'N': 722, u'O': 722, u'P': 611, u'Q': 722, u'R': 667, u'S': 556, u'T': 611, u'U': 722, u'V': 667, u'W': 889, u'X': 667, u'Y': 611, u'Z': 611, u'[': 333, u'\\': 278, u']': 333, u'^': 570, u'_': 500, u'`': 333, u'a': 500, u'b': 500, u'c': 444, u'd': 500, u'e': 444, u'f': 333, u'g': 500, u'h': 556, u'i': 278, u'j': 278, u'k': 500, u'l': 278, u'm': 778, u'n': 556, u'o': 500, u'p': 500, u'q': 500, u'r': 389, u's': 389, u't': 278, u'u': 556, u'v': 444, u'w': 667, u'x': 500, u'y': 444, u'z': 389, u'{': 348, u'|': 220, u'}': 348, u'~': 570, u'\xa1': 389, u'\xa2': 500, u'\xa3': 500, u'\xa4': 500, u'\xa5': 500, u'\xa6': 220, u'\xa7': 500, u'\xa8': 333, u'\xa9': 747, u'\xaa': 266, u'\xab': 500, u'\xac': 606, u'\xae': 747, u'\xaf': 333, u'\xb0': 400, u'\xb1': 570, u'\xb2': 300, u'\xb3': 300, u'\xb4': 333, u'\xb5': 576, u'\xb6': 500, u'\xb7': 250, u'\xb8': 333, u'\xb9': 300, u'\xba': 300, u'\xbb': 500, u'\xbc': 750, u'\xbd': 750, u'\xbe': 750, u'\xbf': 500, u'\xc0': 667, u'\xc1': 667, u'\xc2': 667, u'\xc3': 667, u'\xc4': 667, u'\xc5': 667, u'\xc6': 944, u'\xc7': 667, u'\xc8': 667, u'\xc9': 667, u'\xca': 667, u'\xcb': 667, u'\xcc': 389, u'\xcd': 389, u'\xce': 389, u'\xcf': 389, u'\xd0': 722, u'\xd1': 722, u'\xd2': 722, u'\xd3': 722, u'\xd4': 722, u'\xd5': 722, u'\xd6': 722, u'\xd7': 570, u'\xd8': 722, u'\xd9': 722, u'\xda': 722, u'\xdb': 722, u'\xdc': 722, u'\xdd': 611, u'\xde': 611, u'\xdf': 500, u'\xe0': 500, u'\xe1': 500, u'\xe2': 500, u'\xe3': 500, u'\xe4': 500, u'\xe5': 500, u'\xe6': 722, u'\xe7': 444, u'\xe8': 444, u'\xe9': 444, u'\xea': 444, u'\xeb': 444, u'\xec': 278, u'\xed': 278, u'\xee': 278, u'\xef': 278, u'\xf0': 500, u'\xf1': 556, u'\xf2': 500, u'\xf3': 500, u'\xf4': 500, u'\xf5': 500, u'\xf6': 500, u'\xf7': 570, u'\xf8': 500, u'\xf9': 556, u'\xfa': 556, u'\xfb': 556, u'\xfc': 556, u'\xfd': 444, u'\xfe': 500, u'\xff': 444, u'\u0100': 667, u'\u0101': 500, u'\u0102': 667, u'\u0103': 500, u'\u0104': 667, u'\u0105': 500, u'\u0106': 667, u'\u0107': 444, u'\u010c': 667, u'\u010d': 444, u'\u010e': 722, u'\u010f': 608, u'\u0110': 722, u'\u0111': 500, u'\u0112': 667, u'\u0113': 444, u'\u0116': 667, u'\u0117': 444, u'\u0118': 667, u'\u0119': 444, u'\u011a': 667, u'\u011b': 444, u'\u011e': 722, u'\u011f': 500, u'\u0122': 722, u'\u0123': 500, u'\u012a': 389, u'\u012b': 278, u'\u012e': 389, u'\u012f': 278, u'\u0130': 389, u'\u0131': 278, u'\u0136': 667, u'\u0137': 500, u'\u0139': 611, u'\u013a': 278, u'\u013b': 611, u'\u013c': 278, u'\u013d': 611, u'\u013e': 382, u'\u0141': 611, u'\u0142': 278, u'\u0143': 722, u'\u0144': 556, u'\u0145': 722, u'\u0146': 556, u'\u0147': 722, u'\u0148': 556, u'\u014c': 722, u'\u014d': 500, u'\u0150': 722, u'\u0151': 500, u'\u0152': 944, u'\u0153': 722, u'\u0154': 667, u'\u0155': 389, u'\u0156': 667, u'\u0157': 389, u'\u0158': 667, u'\u0159': 389, u'\u015a': 556, u'\u015b': 389, u'\u015e': 556, u'\u015f': 389, u'\u0160': 556, u'\u0161': 389, u'\u0162': 611, u'\u0163': 278, u'\u0164': 611, u'\u0165': 366, u'\u016a': 722, u'\u016b': 556, u'\u016e': 722, u'\u016f': 556, u'\u0170': 722, u'\u0171': 556, u'\u0172': 722, u'\u0173': 556, u'\u0178': 611, u'\u0179': 611, u'\u017a': 389, u'\u017b': 611, u'\u017c': 389, u'\u017d': 611, u'\u017e': 389, u'\u0192': 500, u'\u0218': 556, u'\u0219': 389, u'\u02c6': 333, u'\u02c7': 333, u'\u02d8': 333, u'\u02d9': 333, u'\u02da': 333, u'\u02db': 333, u'\u02dc': 333, u'\u02dd': 333, u'\u2013': 500, u'\u2014': 1000, u'\u2018': 333, u'\u2019': 333, u'\u201a': 333, u'\u201c': 500, u'\u201d': 500, u'\u201e': 500, u'\u2020': 500, u'\u2021': 500, u'\u2022': 350, u'\u2026': 1000, u'\u2030': 1000, u'\u2039': 333, u'\u203a': 333, u'\u2044': 167, u'\u2122': 1000, u'\u2202': 494, u'\u2206': 612, u'\u2211': 600, u'\u2212': 606, u'\u221a': 549, u'\u2260': 549, u'\u2264': 549, u'\u2265': 549, u'\u25ca': 494, u'\uf6c3': 250, u'\ufb01': 556, u'\ufb02': 556}), + 'Times-Italic': ({'FontName': 'Times-Italic', 'Descent': -217.0, 'FontBBox': (-169.0, -217.0, 1010.0, 883.0), 'FontWeight': 'Medium', 'CapHeight': 653.0, 'FontFamily': 'Times', 'Flags': 0, 'XHeight': 441.0, 'ItalicAngle': -15.5, 'Ascent': 683.0}, {u' ': 250, u'!': 333, u'"': 420, u'#': 500, u'$': 500, u'%': 833, u'&': 778, u"'": 214, u'(': 333, u')': 333, u'*': 500, u'+': 675, u',': 250, u'-': 333, u'.': 250, u'/': 278, u'0': 500, u'1': 500, u'2': 500, u'3': 500, u'4': 500, u'5': 500, u'6': 500, u'7': 500, u'8': 500, u'9': 500, u':': 333, u';': 333, u'<': 675, u'=': 675, u'>': 675, u'?': 500, u'@': 920, u'A': 611, u'B': 611, u'C': 667, u'D': 722, u'E': 611, u'F': 611, u'G': 722, u'H': 722, u'I': 333, u'J': 444, u'K': 667, u'L': 556, u'M': 833, u'N': 667, u'O': 722, u'P': 611, u'Q': 722, u'R': 611, u'S': 500, u'T': 556, u'U': 722, u'V': 611, u'W': 833, u'X': 611, u'Y': 556, u'Z': 556, u'[': 389, u'\\': 278, u']': 389, u'^': 422, u'_': 500, u'`': 333, u'a': 500, u'b': 500, u'c': 444, u'd': 500, u'e': 444, u'f': 278, u'g': 500, u'h': 500, u'i': 278, u'j': 278, u'k': 444, u'l': 278, u'm': 722, u'n': 500, u'o': 500, u'p': 500, u'q': 500, u'r': 389, u's': 389, u't': 278, u'u': 500, u'v': 444, u'w': 667, u'x': 444, u'y': 444, u'z': 389, u'{': 400, u'|': 275, u'}': 400, u'~': 541, u'\xa1': 389, u'\xa2': 500, u'\xa3': 500, u'\xa4': 500, u'\xa5': 500, u'\xa6': 275, u'\xa7': 500, u'\xa8': 333, u'\xa9': 760, u'\xaa': 276, u'\xab': 500, u'\xac': 675, u'\xae': 760, u'\xaf': 333, u'\xb0': 400, u'\xb1': 675, u'\xb2': 300, u'\xb3': 300, u'\xb4': 333, u'\xb5': 500, u'\xb6': 523, u'\xb7': 250, u'\xb8': 333, u'\xb9': 300, u'\xba': 310, u'\xbb': 500, u'\xbc': 750, u'\xbd': 750, u'\xbe': 750, u'\xbf': 500, u'\xc0': 611, u'\xc1': 611, u'\xc2': 611, u'\xc3': 611, u'\xc4': 611, u'\xc5': 611, u'\xc6': 889, u'\xc7': 667, u'\xc8': 611, u'\xc9': 611, u'\xca': 611, u'\xcb': 611, u'\xcc': 333, u'\xcd': 333, u'\xce': 333, u'\xcf': 333, u'\xd0': 722, u'\xd1': 667, u'\xd2': 722, u'\xd3': 722, u'\xd4': 722, u'\xd5': 722, u'\xd6': 722, u'\xd7': 675, u'\xd8': 722, u'\xd9': 722, u'\xda': 722, u'\xdb': 722, u'\xdc': 722, u'\xdd': 556, u'\xde': 611, u'\xdf': 500, u'\xe0': 500, u'\xe1': 500, u'\xe2': 500, u'\xe3': 500, u'\xe4': 500, u'\xe5': 500, u'\xe6': 667, u'\xe7': 444, u'\xe8': 444, u'\xe9': 444, u'\xea': 444, u'\xeb': 444, u'\xec': 278, u'\xed': 278, u'\xee': 278, u'\xef': 278, u'\xf0': 500, u'\xf1': 500, u'\xf2': 500, u'\xf3': 500, u'\xf4': 500, u'\xf5': 500, u'\xf6': 500, u'\xf7': 675, u'\xf8': 500, u'\xf9': 500, u'\xfa': 500, u'\xfb': 500, u'\xfc': 500, u'\xfd': 444, u'\xfe': 500, u'\xff': 444, u'\u0100': 611, u'\u0101': 500, u'\u0102': 611, u'\u0103': 500, u'\u0104': 611, u'\u0105': 500, u'\u0106': 667, u'\u0107': 444, u'\u010c': 667, u'\u010d': 444, u'\u010e': 722, u'\u010f': 544, u'\u0110': 722, u'\u0111': 500, u'\u0112': 611, u'\u0113': 444, u'\u0116': 611, u'\u0117': 444, u'\u0118': 611, u'\u0119': 444, u'\u011a': 611, u'\u011b': 444, u'\u011e': 722, u'\u011f': 500, u'\u0122': 722, u'\u0123': 500, u'\u012a': 333, u'\u012b': 278, u'\u012e': 333, u'\u012f': 278, u'\u0130': 333, u'\u0131': 278, u'\u0136': 667, u'\u0137': 444, u'\u0139': 556, u'\u013a': 278, u'\u013b': 556, u'\u013c': 278, u'\u013d': 611, u'\u013e': 300, u'\u0141': 556, u'\u0142': 278, u'\u0143': 667, u'\u0144': 500, u'\u0145': 667, u'\u0146': 500, u'\u0147': 667, u'\u0148': 500, u'\u014c': 722, u'\u014d': 500, u'\u0150': 722, u'\u0151': 500, u'\u0152': 944, u'\u0153': 667, u'\u0154': 611, u'\u0155': 389, u'\u0156': 611, u'\u0157': 389, u'\u0158': 611, u'\u0159': 389, u'\u015a': 500, u'\u015b': 389, u'\u015e': 500, u'\u015f': 389, u'\u0160': 500, u'\u0161': 389, u'\u0162': 556, u'\u0163': 278, u'\u0164': 556, u'\u0165': 300, u'\u016a': 722, u'\u016b': 500, u'\u016e': 722, u'\u016f': 500, u'\u0170': 722, u'\u0171': 500, u'\u0172': 722, u'\u0173': 500, u'\u0178': 556, u'\u0179': 556, u'\u017a': 389, u'\u017b': 556, u'\u017c': 389, u'\u017d': 556, u'\u017e': 389, u'\u0192': 500, u'\u0218': 500, u'\u0219': 389, u'\u02c6': 333, u'\u02c7': 333, u'\u02d8': 333, u'\u02d9': 333, u'\u02da': 333, u'\u02db': 333, u'\u02dc': 333, u'\u02dd': 333, u'\u2013': 500, u'\u2014': 889, u'\u2018': 333, u'\u2019': 333, u'\u201a': 333, u'\u201c': 556, u'\u201d': 556, u'\u201e': 556, u'\u2020': 500, u'\u2021': 500, u'\u2022': 350, u'\u2026': 889, u'\u2030': 1000, u'\u2039': 333, u'\u203a': 333, u'\u2044': 167, u'\u2122': 980, u'\u2202': 476, u'\u2206': 612, u'\u2211': 600, u'\u2212': 675, u'\u221a': 453, u'\u2260': 549, u'\u2264': 549, u'\u2265': 549, u'\u25ca': 471, u'\uf6c3': 250, u'\ufb01': 500, u'\ufb02': 500}), + 'Times-Roman': ({'FontName': 'Times-Roman', 'Descent': -217.0, 'FontBBox': (-168.0, -218.0, 1000.0, 898.0), 'FontWeight': 'Roman', 'CapHeight': 662.0, 'FontFamily': 'Times', 'Flags': 0, 'XHeight': 450.0, 'ItalicAngle': 0.0, 'Ascent': 683.0}, {u' ': 250, u'!': 333, u'"': 408, u'#': 500, u'$': 500, u'%': 833, u'&': 778, u"'": 180, u'(': 333, u')': 333, u'*': 500, u'+': 564, u',': 250, u'-': 333, u'.': 250, u'/': 278, u'0': 500, u'1': 500, u'2': 500, u'3': 500, u'4': 500, u'5': 500, u'6': 500, u'7': 500, u'8': 500, u'9': 500, u':': 278, u';': 278, u'<': 564, u'=': 564, u'>': 564, u'?': 444, u'@': 921, u'A': 722, u'B': 667, u'C': 667, u'D': 722, u'E': 611, u'F': 556, u'G': 722, u'H': 722, u'I': 333, u'J': 389, u'K': 722, u'L': 611, u'M': 889, u'N': 722, u'O': 722, u'P': 556, u'Q': 722, u'R': 667, u'S': 556, u'T': 611, u'U': 722, u'V': 722, u'W': 944, u'X': 722, u'Y': 722, u'Z': 611, u'[': 333, u'\\': 278, u']': 333, u'^': 469, u'_': 500, u'`': 333, u'a': 444, u'b': 500, u'c': 444, u'd': 500, u'e': 444, u'f': 333, u'g': 500, u'h': 500, u'i': 278, u'j': 278, u'k': 500, u'l': 278, u'm': 778, u'n': 500, u'o': 500, u'p': 500, u'q': 500, u'r': 333, u's': 389, u't': 278, u'u': 500, u'v': 500, u'w': 722, u'x': 500, u'y': 500, u'z': 444, u'{': 480, u'|': 200, u'}': 480, u'~': 541, u'\xa1': 333, u'\xa2': 500, u'\xa3': 500, u'\xa4': 500, u'\xa5': 500, u'\xa6': 200, u'\xa7': 500, u'\xa8': 333, u'\xa9': 760, u'\xaa': 276, u'\xab': 500, u'\xac': 564, u'\xae': 760, u'\xaf': 333, u'\xb0': 400, u'\xb1': 564, u'\xb2': 300, u'\xb3': 300, u'\xb4': 333, u'\xb5': 500, u'\xb6': 453, u'\xb7': 250, u'\xb8': 333, u'\xb9': 300, u'\xba': 310, u'\xbb': 500, u'\xbc': 750, u'\xbd': 750, u'\xbe': 750, u'\xbf': 444, u'\xc0': 722, u'\xc1': 722, u'\xc2': 722, u'\xc3': 722, u'\xc4': 722, u'\xc5': 722, u'\xc6': 889, u'\xc7': 667, u'\xc8': 611, u'\xc9': 611, u'\xca': 611, u'\xcb': 611, u'\xcc': 333, u'\xcd': 333, u'\xce': 333, u'\xcf': 333, u'\xd0': 722, u'\xd1': 722, u'\xd2': 722, u'\xd3': 722, u'\xd4': 722, u'\xd5': 722, u'\xd6': 722, u'\xd7': 564, u'\xd8': 722, u'\xd9': 722, u'\xda': 722, u'\xdb': 722, u'\xdc': 722, u'\xdd': 722, u'\xde': 556, u'\xdf': 500, u'\xe0': 444, u'\xe1': 444, u'\xe2': 444, u'\xe3': 444, u'\xe4': 444, u'\xe5': 444, u'\xe6': 667, u'\xe7': 444, u'\xe8': 444, u'\xe9': 444, u'\xea': 444, u'\xeb': 444, u'\xec': 278, u'\xed': 278, u'\xee': 278, u'\xef': 278, u'\xf0': 500, u'\xf1': 500, u'\xf2': 500, u'\xf3': 500, u'\xf4': 500, u'\xf5': 500, u'\xf6': 500, u'\xf7': 564, u'\xf8': 500, u'\xf9': 500, u'\xfa': 500, u'\xfb': 500, u'\xfc': 500, u'\xfd': 500, u'\xfe': 500, u'\xff': 500, u'\u0100': 722, u'\u0101': 444, u'\u0102': 722, u'\u0103': 444, u'\u0104': 722, u'\u0105': 444, u'\u0106': 667, u'\u0107': 444, u'\u010c': 667, u'\u010d': 444, u'\u010e': 722, u'\u010f': 588, u'\u0110': 722, u'\u0111': 500, u'\u0112': 611, u'\u0113': 444, u'\u0116': 611, u'\u0117': 444, u'\u0118': 611, u'\u0119': 444, u'\u011a': 611, u'\u011b': 444, u'\u011e': 722, u'\u011f': 500, u'\u0122': 722, u'\u0123': 500, u'\u012a': 333, u'\u012b': 278, u'\u012e': 333, u'\u012f': 278, u'\u0130': 333, u'\u0131': 278, u'\u0136': 722, u'\u0137': 500, u'\u0139': 611, u'\u013a': 278, u'\u013b': 611, u'\u013c': 278, u'\u013d': 611, u'\u013e': 344, u'\u0141': 611, u'\u0142': 278, u'\u0143': 722, u'\u0144': 500, u'\u0145': 722, u'\u0146': 500, u'\u0147': 722, u'\u0148': 500, u'\u014c': 722, u'\u014d': 500, u'\u0150': 722, u'\u0151': 500, u'\u0152': 889, u'\u0153': 722, u'\u0154': 667, u'\u0155': 333, u'\u0156': 667, u'\u0157': 333, u'\u0158': 667, u'\u0159': 333, u'\u015a': 556, u'\u015b': 389, u'\u015e': 556, u'\u015f': 389, u'\u0160': 556, u'\u0161': 389, u'\u0162': 611, u'\u0163': 278, u'\u0164': 611, u'\u0165': 326, u'\u016a': 722, u'\u016b': 500, u'\u016e': 722, u'\u016f': 500, u'\u0170': 722, u'\u0171': 500, u'\u0172': 722, u'\u0173': 500, u'\u0178': 722, u'\u0179': 611, u'\u017a': 444, u'\u017b': 611, u'\u017c': 444, u'\u017d': 611, u'\u017e': 444, u'\u0192': 500, u'\u0218': 556, u'\u0219': 389, u'\u02c6': 333, u'\u02c7': 333, u'\u02d8': 333, u'\u02d9': 333, u'\u02da': 333, u'\u02db': 333, u'\u02dc': 333, u'\u02dd': 333, u'\u2013': 500, u'\u2014': 1000, u'\u2018': 333, u'\u2019': 333, u'\u201a': 333, u'\u201c': 444, u'\u201d': 444, u'\u201e': 444, u'\u2020': 500, u'\u2021': 500, u'\u2022': 350, u'\u2026': 1000, u'\u2030': 1000, u'\u2039': 333, u'\u203a': 333, u'\u2044': 167, u'\u2122': 980, u'\u2202': 476, u'\u2206': 612, u'\u2211': 600, u'\u2212': 564, u'\u221a': 453, u'\u2260': 549, u'\u2264': 549, u'\u2265': 549, u'\u25ca': 471, u'\uf6c3': 250, u'\ufb01': 556, u'\ufb02': 556}), + 'ZapfDingbats': ({'FontName': 'ZapfDingbats', 'FontBBox': (-1.0, -143.0, 981.0, 820.0), 'FontWeight': 'Medium', 'FontFamily': 'ITC', 'Flags': 0, 'ItalicAngle': 0.0}, {u'\x01': 974, u'\x02': 961, u'\x03': 980, u'\x04': 719, u'\x05': 789, u'\x06': 494, u'\x07': 552, u'\x08': 537, u'\t': 577, u'\n': 692, u'\x0b': 960, u'\x0c': 939, u'\r': 549, u'\x0e': 855, u'\x0f': 911, u'\x10': 933, u'\x11': 945, u'\x12': 974, u'\x13': 755, u'\x14': 846, u'\x15': 762, u'\x16': 761, u'\x17': 571, u'\x18': 677, u'\x19': 763, u'\x1a': 760, u'\x1b': 759, u'\x1c': 754, u'\x1d': 786, u'\x1e': 788, u'\x1f': 788, u' ': 790, u'!': 793, u'"': 794, u'#': 816, u'$': 823, u'%': 789, u'&': 841, u"'": 823, u'(': 833, u')': 816, u'*': 831, u'+': 923, u',': 744, u'-': 723, u'.': 749, u'/': 790, u'0': 792, u'1': 695, u'2': 776, u'3': 768, u'4': 792, u'5': 759, u'6': 707, u'7': 708, u'8': 682, u'9': 701, u':': 826, u';': 815, u'<': 789, u'=': 789, u'>': 707, u'?': 687, u'@': 696, u'A': 689, u'B': 786, u'C': 787, u'D': 713, u'E': 791, u'F': 785, u'G': 791, u'H': 873, u'I': 761, u'J': 762, u'K': 759, u'L': 892, u'M': 892, u'N': 788, u'O': 784, u'Q': 438, u'R': 138, u'S': 277, u'T': 415, u'U': 509, u'V': 410, u'W': 234, u'X': 234, u'Y': 390, u'Z': 390, u'[': 276, u'\\': 276, u']': 317, u'^': 317, u'_': 334, u'`': 334, u'a': 392, u'b': 392, u'c': 668, u'd': 668, u'e': 732, u'f': 544, u'g': 544, u'h': 910, u'i': 911, u'j': 667, u'k': 760, u'l': 760, u'm': 626, u'n': 694, u'o': 595, u'p': 776, u'u': 690, u'v': 791, u'w': 790, u'x': 788, u'y': 788, u'z': 788, u'{': 788, u'|': 788, u'}': 788, u'~': 788, u'\x7f': 788, u'\x80': 788, u'\x81': 788, u'\x82': 788, u'\x83': 788, u'\x84': 788, u'\x85': 788, u'\x86': 788, u'\x87': 788, u'\x88': 788, u'\x89': 788, u'\x8a': 788, u'\x8b': 788, u'\x8c': 788, u'\x8d': 788, u'\x8e': 788, u'\x8f': 788, u'\x90': 788, u'\x91': 788, u'\x92': 788, u'\x93': 788, u'\x94': 788, u'\x95': 788, u'\x96': 788, u'\x97': 788, u'\x98': 788, u'\x99': 788, u'\x9a': 788, u'\x9b': 788, u'\x9c': 788, u'\x9d': 788, u'\x9e': 788, u'\x9f': 788, u'\xa0': 894, u'\xa1': 838, u'\xa2': 924, u'\xa3': 1016, u'\xa4': 458, u'\xa5': 924, u'\xa6': 918, u'\xa7': 927, u'\xa8': 928, u'\xa9': 928, u'\xaa': 834, u'\xab': 873, u'\xac': 828, u'\xad': 924, u'\xae': 917, u'\xaf': 930, u'\xb0': 931, u'\xb1': 463, u'\xb2': 883, u'\xb3': 836, u'\xb4': 867, u'\xb5': 696, u'\xb6': 874, u'\xb7': 760, u'\xb8': 946, u'\xb9': 865, u'\xba': 967, u'\xbb': 831, u'\xbc': 873, u'\xbd': 927, u'\xbe': 970, u'\xbf': 918, u'\xc0': 748, u'\xc1': 836, u'\xc2': 771, u'\xc3': 888, u'\xc4': 748, u'\xc5': 771, u'\xc6': 888, u'\xc7': 867, u'\xc8': 696, u'\xc9': 874, u'\xca': 974, u'\xcb': 762, u'\xcc': 759, u'\xcd': 509, u'\xce': 410}), } diff --git a/venv/Lib/site-packages/pdfminer/glyphlist.py b/venv/Lib/site-packages/pdfminer/glyphlist.py index 28c90dd..10e1008 100644 --- a/venv/Lib/site-packages/pdfminer/glyphlist.py +++ b/venv/Lib/site-packages/pdfminer/glyphlist.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python """ Mappings from Adobe glyph names to Unicode characters. @@ -7,12 +7,11 @@ Unicode characters instead of using decimal/hex character code. The following data was taken by - $ wget http://www.adobe.com/devnet/opentype/archives/glyphlist.txt + $ wget https://partners.adobe.com/public/developer/en/opentype/glyphlist.txt $ python tools/conv_glyphlist.py glyphlist.txt > glyphlist.py """ - # ################################################################################### # Copyright (c) 1997,1998,2002,2007 Adobe Systems Incorporated # @@ -55,4286 +54,4286 @@ The following data was taken by # (2) Unicode scalar value glyphname2unicode = { - 'A': '\u0041', - 'AE': '\u00C6', - 'AEacute': '\u01FC', - 'AEmacron': '\u01E2', - 'AEsmall': '\uF7E6', - 'Aacute': '\u00C1', - 'Aacutesmall': '\uF7E1', - 'Abreve': '\u0102', - 'Abreveacute': '\u1EAE', - 'Abrevecyrillic': '\u04D0', - 'Abrevedotbelow': '\u1EB6', - 'Abrevegrave': '\u1EB0', - 'Abrevehookabove': '\u1EB2', - 'Abrevetilde': '\u1EB4', - 'Acaron': '\u01CD', - 'Acircle': '\u24B6', - 'Acircumflex': '\u00C2', - 'Acircumflexacute': '\u1EA4', - 'Acircumflexdotbelow': '\u1EAC', - 'Acircumflexgrave': '\u1EA6', - 'Acircumflexhookabove': '\u1EA8', - 'Acircumflexsmall': '\uF7E2', - 'Acircumflextilde': '\u1EAA', - 'Acute': '\uF6C9', - 'Acutesmall': '\uF7B4', - 'Acyrillic': '\u0410', - 'Adblgrave': '\u0200', - 'Adieresis': '\u00C4', - 'Adieresiscyrillic': '\u04D2', - 'Adieresismacron': '\u01DE', - 'Adieresissmall': '\uF7E4', - 'Adotbelow': '\u1EA0', - 'Adotmacron': '\u01E0', - 'Agrave': '\u00C0', - 'Agravesmall': '\uF7E0', - 'Ahookabove': '\u1EA2', - 'Aiecyrillic': '\u04D4', - 'Ainvertedbreve': '\u0202', - 'Alpha': '\u0391', - 'Alphatonos': '\u0386', - 'Amacron': '\u0100', - 'Amonospace': '\uFF21', - 'Aogonek': '\u0104', - 'Aring': '\u00C5', - 'Aringacute': '\u01FA', - 'Aringbelow': '\u1E00', - 'Aringsmall': '\uF7E5', - 'Asmall': '\uF761', - 'Atilde': '\u00C3', - 'Atildesmall': '\uF7E3', - 'Aybarmenian': '\u0531', - 'B': '\u0042', - 'Bcircle': '\u24B7', - 'Bdotaccent': '\u1E02', - 'Bdotbelow': '\u1E04', - 'Becyrillic': '\u0411', - 'Benarmenian': '\u0532', - 'Beta': '\u0392', - 'Bhook': '\u0181', - 'Blinebelow': '\u1E06', - 'Bmonospace': '\uFF22', - 'Brevesmall': '\uF6F4', - 'Bsmall': '\uF762', - 'Btopbar': '\u0182', - 'C': '\u0043', - 'Caarmenian': '\u053E', - 'Cacute': '\u0106', - 'Caron': '\uF6CA', - 'Caronsmall': '\uF6F5', - 'Ccaron': '\u010C', - 'Ccedilla': '\u00C7', - 'Ccedillaacute': '\u1E08', - 'Ccedillasmall': '\uF7E7', - 'Ccircle': '\u24B8', - 'Ccircumflex': '\u0108', - 'Cdot': '\u010A', - 'Cdotaccent': '\u010A', - 'Cedillasmall': '\uF7B8', - 'Chaarmenian': '\u0549', - 'Cheabkhasiancyrillic': '\u04BC', - 'Checyrillic': '\u0427', - 'Chedescenderabkhasiancyrillic': '\u04BE', - 'Chedescendercyrillic': '\u04B6', - 'Chedieresiscyrillic': '\u04F4', - 'Cheharmenian': '\u0543', - 'Chekhakassiancyrillic': '\u04CB', - 'Cheverticalstrokecyrillic': '\u04B8', - 'Chi': '\u03A7', - 'Chook': '\u0187', - 'Circumflexsmall': '\uF6F6', - 'Cmonospace': '\uFF23', - 'Coarmenian': '\u0551', - 'Csmall': '\uF763', - 'D': '\u0044', - 'DZ': '\u01F1', - 'DZcaron': '\u01C4', - 'Daarmenian': '\u0534', - 'Dafrican': '\u0189', - 'Dcaron': '\u010E', - 'Dcedilla': '\u1E10', - 'Dcircle': '\u24B9', - 'Dcircumflexbelow': '\u1E12', - 'Dcroat': '\u0110', - 'Ddotaccent': '\u1E0A', - 'Ddotbelow': '\u1E0C', - 'Decyrillic': '\u0414', - 'Deicoptic': '\u03EE', - 'Delta': '\u2206', - 'Deltagreek': '\u0394', - 'Dhook': '\u018A', - 'Dieresis': '\uF6CB', - 'DieresisAcute': '\uF6CC', - 'DieresisGrave': '\uF6CD', - 'Dieresissmall': '\uF7A8', - 'Digammagreek': '\u03DC', - 'Djecyrillic': '\u0402', - 'Dlinebelow': '\u1E0E', - 'Dmonospace': '\uFF24', - 'Dotaccentsmall': '\uF6F7', - 'Dslash': '\u0110', - 'Dsmall': '\uF764', - 'Dtopbar': '\u018B', - 'Dz': '\u01F2', - 'Dzcaron': '\u01C5', - 'Dzeabkhasiancyrillic': '\u04E0', - 'Dzecyrillic': '\u0405', - 'Dzhecyrillic': '\u040F', - 'E': '\u0045', - 'Eacute': '\u00C9', - 'Eacutesmall': '\uF7E9', - 'Ebreve': '\u0114', - 'Ecaron': '\u011A', - 'Ecedillabreve': '\u1E1C', - 'Echarmenian': '\u0535', - 'Ecircle': '\u24BA', - 'Ecircumflex': '\u00CA', - 'Ecircumflexacute': '\u1EBE', - 'Ecircumflexbelow': '\u1E18', - 'Ecircumflexdotbelow': '\u1EC6', - 'Ecircumflexgrave': '\u1EC0', - 'Ecircumflexhookabove': '\u1EC2', - 'Ecircumflexsmall': '\uF7EA', - 'Ecircumflextilde': '\u1EC4', - 'Ecyrillic': '\u0404', - 'Edblgrave': '\u0204', - 'Edieresis': '\u00CB', - 'Edieresissmall': '\uF7EB', - 'Edot': '\u0116', - 'Edotaccent': '\u0116', - 'Edotbelow': '\u1EB8', - 'Efcyrillic': '\u0424', - 'Egrave': '\u00C8', - 'Egravesmall': '\uF7E8', - 'Eharmenian': '\u0537', - 'Ehookabove': '\u1EBA', - 'Eightroman': '\u2167', - 'Einvertedbreve': '\u0206', - 'Eiotifiedcyrillic': '\u0464', - 'Elcyrillic': '\u041B', - 'Elevenroman': '\u216A', - 'Emacron': '\u0112', - 'Emacronacute': '\u1E16', - 'Emacrongrave': '\u1E14', - 'Emcyrillic': '\u041C', - 'Emonospace': '\uFF25', - 'Encyrillic': '\u041D', - 'Endescendercyrillic': '\u04A2', - 'Eng': '\u014A', - 'Enghecyrillic': '\u04A4', - 'Enhookcyrillic': '\u04C7', - 'Eogonek': '\u0118', - 'Eopen': '\u0190', - 'Epsilon': '\u0395', - 'Epsilontonos': '\u0388', - 'Ercyrillic': '\u0420', - 'Ereversed': '\u018E', - 'Ereversedcyrillic': '\u042D', - 'Escyrillic': '\u0421', - 'Esdescendercyrillic': '\u04AA', - 'Esh': '\u01A9', - 'Esmall': '\uF765', - 'Eta': '\u0397', - 'Etarmenian': '\u0538', - 'Etatonos': '\u0389', - 'Eth': '\u00D0', - 'Ethsmall': '\uF7F0', - 'Etilde': '\u1EBC', - 'Etildebelow': '\u1E1A', - 'Euro': '\u20AC', - 'Ezh': '\u01B7', - 'Ezhcaron': '\u01EE', - 'Ezhreversed': '\u01B8', - 'F': '\u0046', - 'Fcircle': '\u24BB', - 'Fdotaccent': '\u1E1E', - 'Feharmenian': '\u0556', - 'Feicoptic': '\u03E4', - 'Fhook': '\u0191', - 'Fitacyrillic': '\u0472', - 'Fiveroman': '\u2164', - 'Fmonospace': '\uFF26', - 'Fourroman': '\u2163', - 'Fsmall': '\uF766', - 'G': '\u0047', - 'GBsquare': '\u3387', - 'Gacute': '\u01F4', - 'Gamma': '\u0393', - 'Gammaafrican': '\u0194', - 'Gangiacoptic': '\u03EA', - 'Gbreve': '\u011E', - 'Gcaron': '\u01E6', - 'Gcedilla': '\u0122', - 'Gcircle': '\u24BC', - 'Gcircumflex': '\u011C', - 'Gcommaaccent': '\u0122', - 'Gdot': '\u0120', - 'Gdotaccent': '\u0120', - 'Gecyrillic': '\u0413', - 'Ghadarmenian': '\u0542', - 'Ghemiddlehookcyrillic': '\u0494', - 'Ghestrokecyrillic': '\u0492', - 'Gheupturncyrillic': '\u0490', - 'Ghook': '\u0193', - 'Gimarmenian': '\u0533', - 'Gjecyrillic': '\u0403', - 'Gmacron': '\u1E20', - 'Gmonospace': '\uFF27', - 'Grave': '\uF6CE', - 'Gravesmall': '\uF760', - 'Gsmall': '\uF767', - 'Gsmallhook': '\u029B', - 'Gstroke': '\u01E4', - 'H': '\u0048', - 'H18533': '\u25CF', - 'H18543': '\u25AA', - 'H18551': '\u25AB', - 'H22073': '\u25A1', - 'HPsquare': '\u33CB', - 'Haabkhasiancyrillic': '\u04A8', - 'Hadescendercyrillic': '\u04B2', - 'Hardsigncyrillic': '\u042A', - 'Hbar': '\u0126', - 'Hbrevebelow': '\u1E2A', - 'Hcedilla': '\u1E28', - 'Hcircle': '\u24BD', - 'Hcircumflex': '\u0124', - 'Hdieresis': '\u1E26', - 'Hdotaccent': '\u1E22', - 'Hdotbelow': '\u1E24', - 'Hmonospace': '\uFF28', - 'Hoarmenian': '\u0540', - 'Horicoptic': '\u03E8', - 'Hsmall': '\uF768', - 'Hungarumlaut': '\uF6CF', - 'Hungarumlautsmall': '\uF6F8', - 'Hzsquare': '\u3390', - 'I': '\u0049', - 'IAcyrillic': '\u042F', - 'IJ': '\u0132', - 'IUcyrillic': '\u042E', - 'Iacute': '\u00CD', - 'Iacutesmall': '\uF7ED', - 'Ibreve': '\u012C', - 'Icaron': '\u01CF', - 'Icircle': '\u24BE', - 'Icircumflex': '\u00CE', - 'Icircumflexsmall': '\uF7EE', - 'Icyrillic': '\u0406', - 'Idblgrave': '\u0208', - 'Idieresis': '\u00CF', - 'Idieresisacute': '\u1E2E', - 'Idieresiscyrillic': '\u04E4', - 'Idieresissmall': '\uF7EF', - 'Idot': '\u0130', - 'Idotaccent': '\u0130', - 'Idotbelow': '\u1ECA', - 'Iebrevecyrillic': '\u04D6', - 'Iecyrillic': '\u0415', - 'Ifraktur': '\u2111', - 'Igrave': '\u00CC', - 'Igravesmall': '\uF7EC', - 'Ihookabove': '\u1EC8', - 'Iicyrillic': '\u0418', - 'Iinvertedbreve': '\u020A', - 'Iishortcyrillic': '\u0419', - 'Imacron': '\u012A', - 'Imacroncyrillic': '\u04E2', - 'Imonospace': '\uFF29', - 'Iniarmenian': '\u053B', - 'Iocyrillic': '\u0401', - 'Iogonek': '\u012E', - 'Iota': '\u0399', - 'Iotaafrican': '\u0196', - 'Iotadieresis': '\u03AA', - 'Iotatonos': '\u038A', - 'Ismall': '\uF769', - 'Istroke': '\u0197', - 'Itilde': '\u0128', - 'Itildebelow': '\u1E2C', - 'Izhitsacyrillic': '\u0474', - 'Izhitsadblgravecyrillic': '\u0476', - 'J': '\u004A', - 'Jaarmenian': '\u0541', - 'Jcircle': '\u24BF', - 'Jcircumflex': '\u0134', - 'Jecyrillic': '\u0408', - 'Jheharmenian': '\u054B', - 'Jmonospace': '\uFF2A', - 'Jsmall': '\uF76A', - 'K': '\u004B', - 'KBsquare': '\u3385', - 'KKsquare': '\u33CD', - 'Kabashkircyrillic': '\u04A0', - 'Kacute': '\u1E30', - 'Kacyrillic': '\u041A', - 'Kadescendercyrillic': '\u049A', - 'Kahookcyrillic': '\u04C3', - 'Kappa': '\u039A', - 'Kastrokecyrillic': '\u049E', - 'Kaverticalstrokecyrillic': '\u049C', - 'Kcaron': '\u01E8', - 'Kcedilla': '\u0136', - 'Kcircle': '\u24C0', - 'Kcommaaccent': '\u0136', - 'Kdotbelow': '\u1E32', - 'Keharmenian': '\u0554', - 'Kenarmenian': '\u053F', - 'Khacyrillic': '\u0425', - 'Kheicoptic': '\u03E6', - 'Khook': '\u0198', - 'Kjecyrillic': '\u040C', - 'Klinebelow': '\u1E34', - 'Kmonospace': '\uFF2B', - 'Koppacyrillic': '\u0480', - 'Koppagreek': '\u03DE', - 'Ksicyrillic': '\u046E', - 'Ksmall': '\uF76B', - 'L': '\u004C', - 'LJ': '\u01C7', - 'LL': '\uF6BF', - 'Lacute': '\u0139', - 'Lambda': '\u039B', - 'Lcaron': '\u013D', - 'Lcedilla': '\u013B', - 'Lcircle': '\u24C1', - 'Lcircumflexbelow': '\u1E3C', - 'Lcommaaccent': '\u013B', - 'Ldot': '\u013F', - 'Ldotaccent': '\u013F', - 'Ldotbelow': '\u1E36', - 'Ldotbelowmacron': '\u1E38', - 'Liwnarmenian': '\u053C', - 'Lj': '\u01C8', - 'Ljecyrillic': '\u0409', - 'Llinebelow': '\u1E3A', - 'Lmonospace': '\uFF2C', - 'Lslash': '\u0141', - 'Lslashsmall': '\uF6F9', - 'Lsmall': '\uF76C', - 'M': '\u004D', - 'MBsquare': '\u3386', - 'Macron': '\uF6D0', - 'Macronsmall': '\uF7AF', - 'Macute': '\u1E3E', - 'Mcircle': '\u24C2', - 'Mdotaccent': '\u1E40', - 'Mdotbelow': '\u1E42', - 'Menarmenian': '\u0544', - 'Mmonospace': '\uFF2D', - 'Msmall': '\uF76D', - 'Mturned': '\u019C', - 'Mu': '\u039C', - 'N': '\u004E', - 'NJ': '\u01CA', - 'Nacute': '\u0143', - 'Ncaron': '\u0147', - 'Ncedilla': '\u0145', - 'Ncircle': '\u24C3', - 'Ncircumflexbelow': '\u1E4A', - 'Ncommaaccent': '\u0145', - 'Ndotaccent': '\u1E44', - 'Ndotbelow': '\u1E46', - 'Nhookleft': '\u019D', - 'Nineroman': '\u2168', - 'Nj': '\u01CB', - 'Njecyrillic': '\u040A', - 'Nlinebelow': '\u1E48', - 'Nmonospace': '\uFF2E', - 'Nowarmenian': '\u0546', - 'Nsmall': '\uF76E', - 'Ntilde': '\u00D1', - 'Ntildesmall': '\uF7F1', - 'Nu': '\u039D', - 'O': '\u004F', - 'OE': '\u0152', - 'OEsmall': '\uF6FA', - 'Oacute': '\u00D3', - 'Oacutesmall': '\uF7F3', - 'Obarredcyrillic': '\u04E8', - 'Obarreddieresiscyrillic': '\u04EA', - 'Obreve': '\u014E', - 'Ocaron': '\u01D1', - 'Ocenteredtilde': '\u019F', - 'Ocircle': '\u24C4', - 'Ocircumflex': '\u00D4', - 'Ocircumflexacute': '\u1ED0', - 'Ocircumflexdotbelow': '\u1ED8', - 'Ocircumflexgrave': '\u1ED2', - 'Ocircumflexhookabove': '\u1ED4', - 'Ocircumflexsmall': '\uF7F4', - 'Ocircumflextilde': '\u1ED6', - 'Ocyrillic': '\u041E', - 'Odblacute': '\u0150', - 'Odblgrave': '\u020C', - 'Odieresis': '\u00D6', - 'Odieresiscyrillic': '\u04E6', - 'Odieresissmall': '\uF7F6', - 'Odotbelow': '\u1ECC', - 'Ogoneksmall': '\uF6FB', - 'Ograve': '\u00D2', - 'Ogravesmall': '\uF7F2', - 'Oharmenian': '\u0555', - 'Ohm': '\u2126', - 'Ohookabove': '\u1ECE', - 'Ohorn': '\u01A0', - 'Ohornacute': '\u1EDA', - 'Ohorndotbelow': '\u1EE2', - 'Ohorngrave': '\u1EDC', - 'Ohornhookabove': '\u1EDE', - 'Ohorntilde': '\u1EE0', - 'Ohungarumlaut': '\u0150', - 'Oi': '\u01A2', - 'Oinvertedbreve': '\u020E', - 'Omacron': '\u014C', - 'Omacronacute': '\u1E52', - 'Omacrongrave': '\u1E50', - 'Omega': '\u2126', - 'Omegacyrillic': '\u0460', - 'Omegagreek': '\u03A9', - 'Omegaroundcyrillic': '\u047A', - 'Omegatitlocyrillic': '\u047C', - 'Omegatonos': '\u038F', - 'Omicron': '\u039F', - 'Omicrontonos': '\u038C', - 'Omonospace': '\uFF2F', - 'Oneroman': '\u2160', - 'Oogonek': '\u01EA', - 'Oogonekmacron': '\u01EC', - 'Oopen': '\u0186', - 'Oslash': '\u00D8', - 'Oslashacute': '\u01FE', - 'Oslashsmall': '\uF7F8', - 'Osmall': '\uF76F', - 'Ostrokeacute': '\u01FE', - 'Otcyrillic': '\u047E', - 'Otilde': '\u00D5', - 'Otildeacute': '\u1E4C', - 'Otildedieresis': '\u1E4E', - 'Otildesmall': '\uF7F5', - 'P': '\u0050', - 'Pacute': '\u1E54', - 'Pcircle': '\u24C5', - 'Pdotaccent': '\u1E56', - 'Pecyrillic': '\u041F', - 'Peharmenian': '\u054A', - 'Pemiddlehookcyrillic': '\u04A6', - 'Phi': '\u03A6', - 'Phook': '\u01A4', - 'Pi': '\u03A0', - 'Piwrarmenian': '\u0553', - 'Pmonospace': '\uFF30', - 'Psi': '\u03A8', - 'Psicyrillic': '\u0470', - 'Psmall': '\uF770', - 'Q': '\u0051', - 'Qcircle': '\u24C6', - 'Qmonospace': '\uFF31', - 'Qsmall': '\uF771', - 'R': '\u0052', - 'Raarmenian': '\u054C', - 'Racute': '\u0154', - 'Rcaron': '\u0158', - 'Rcedilla': '\u0156', - 'Rcircle': '\u24C7', - 'Rcommaaccent': '\u0156', - 'Rdblgrave': '\u0210', - 'Rdotaccent': '\u1E58', - 'Rdotbelow': '\u1E5A', - 'Rdotbelowmacron': '\u1E5C', - 'Reharmenian': '\u0550', - 'Rfraktur': '\u211C', - 'Rho': '\u03A1', - 'Ringsmall': '\uF6FC', - 'Rinvertedbreve': '\u0212', - 'Rlinebelow': '\u1E5E', - 'Rmonospace': '\uFF32', - 'Rsmall': '\uF772', - 'Rsmallinverted': '\u0281', - 'Rsmallinvertedsuperior': '\u02B6', - 'S': '\u0053', - 'SF010000': '\u250C', - 'SF020000': '\u2514', - 'SF030000': '\u2510', - 'SF040000': '\u2518', - 'SF050000': '\u253C', - 'SF060000': '\u252C', - 'SF070000': '\u2534', - 'SF080000': '\u251C', - 'SF090000': '\u2524', - 'SF100000': '\u2500', - 'SF110000': '\u2502', - 'SF190000': '\u2561', - 'SF200000': '\u2562', - 'SF210000': '\u2556', - 'SF220000': '\u2555', - 'SF230000': '\u2563', - 'SF240000': '\u2551', - 'SF250000': '\u2557', - 'SF260000': '\u255D', - 'SF270000': '\u255C', - 'SF280000': '\u255B', - 'SF360000': '\u255E', - 'SF370000': '\u255F', - 'SF380000': '\u255A', - 'SF390000': '\u2554', - 'SF400000': '\u2569', - 'SF410000': '\u2566', - 'SF420000': '\u2560', - 'SF430000': '\u2550', - 'SF440000': '\u256C', - 'SF450000': '\u2567', - 'SF460000': '\u2568', - 'SF470000': '\u2564', - 'SF480000': '\u2565', - 'SF490000': '\u2559', - 'SF500000': '\u2558', - 'SF510000': '\u2552', - 'SF520000': '\u2553', - 'SF530000': '\u256B', - 'SF540000': '\u256A', - 'Sacute': '\u015A', - 'Sacutedotaccent': '\u1E64', - 'Sampigreek': '\u03E0', - 'Scaron': '\u0160', - 'Scarondotaccent': '\u1E66', - 'Scaronsmall': '\uF6FD', - 'Scedilla': '\u015E', - 'Schwa': '\u018F', - 'Schwacyrillic': '\u04D8', - 'Schwadieresiscyrillic': '\u04DA', - 'Scircle': '\u24C8', - 'Scircumflex': '\u015C', - 'Scommaaccent': '\u0218', - 'Sdotaccent': '\u1E60', - 'Sdotbelow': '\u1E62', - 'Sdotbelowdotaccent': '\u1E68', - 'Seharmenian': '\u054D', - 'Sevenroman': '\u2166', - 'Shaarmenian': '\u0547', - 'Shacyrillic': '\u0428', - 'Shchacyrillic': '\u0429', - 'Sheicoptic': '\u03E2', - 'Shhacyrillic': '\u04BA', - 'Shimacoptic': '\u03EC', - 'Sigma': '\u03A3', - 'Sixroman': '\u2165', - 'Smonospace': '\uFF33', - 'Softsigncyrillic': '\u042C', - 'Ssmall': '\uF773', - 'Stigmagreek': '\u03DA', - 'T': '\u0054', - 'Tau': '\u03A4', - 'Tbar': '\u0166', - 'Tcaron': '\u0164', - 'Tcedilla': '\u0162', - 'Tcircle': '\u24C9', - 'Tcircumflexbelow': '\u1E70', - 'Tcommaaccent': '\u0162', - 'Tdotaccent': '\u1E6A', - 'Tdotbelow': '\u1E6C', - 'Tecyrillic': '\u0422', - 'Tedescendercyrillic': '\u04AC', - 'Tenroman': '\u2169', - 'Tetsecyrillic': '\u04B4', - 'Theta': '\u0398', - 'Thook': '\u01AC', - 'Thorn': '\u00DE', - 'Thornsmall': '\uF7FE', - 'Threeroman': '\u2162', - 'Tildesmall': '\uF6FE', - 'Tiwnarmenian': '\u054F', - 'Tlinebelow': '\u1E6E', - 'Tmonospace': '\uFF34', - 'Toarmenian': '\u0539', - 'Tonefive': '\u01BC', - 'Tonesix': '\u0184', - 'Tonetwo': '\u01A7', - 'Tretroflexhook': '\u01AE', - 'Tsecyrillic': '\u0426', - 'Tshecyrillic': '\u040B', - 'Tsmall': '\uF774', - 'Twelveroman': '\u216B', - 'Tworoman': '\u2161', - 'U': '\u0055', - 'Uacute': '\u00DA', - 'Uacutesmall': '\uF7FA', - 'Ubreve': '\u016C', - 'Ucaron': '\u01D3', - 'Ucircle': '\u24CA', - 'Ucircumflex': '\u00DB', - 'Ucircumflexbelow': '\u1E76', - 'Ucircumflexsmall': '\uF7FB', - 'Ucyrillic': '\u0423', - 'Udblacute': '\u0170', - 'Udblgrave': '\u0214', - 'Udieresis': '\u00DC', - 'Udieresisacute': '\u01D7', - 'Udieresisbelow': '\u1E72', - 'Udieresiscaron': '\u01D9', - 'Udieresiscyrillic': '\u04F0', - 'Udieresisgrave': '\u01DB', - 'Udieresismacron': '\u01D5', - 'Udieresissmall': '\uF7FC', - 'Udotbelow': '\u1EE4', - 'Ugrave': '\u00D9', - 'Ugravesmall': '\uF7F9', - 'Uhookabove': '\u1EE6', - 'Uhorn': '\u01AF', - 'Uhornacute': '\u1EE8', - 'Uhorndotbelow': '\u1EF0', - 'Uhorngrave': '\u1EEA', - 'Uhornhookabove': '\u1EEC', - 'Uhorntilde': '\u1EEE', - 'Uhungarumlaut': '\u0170', - 'Uhungarumlautcyrillic': '\u04F2', - 'Uinvertedbreve': '\u0216', - 'Ukcyrillic': '\u0478', - 'Umacron': '\u016A', - 'Umacroncyrillic': '\u04EE', - 'Umacrondieresis': '\u1E7A', - 'Umonospace': '\uFF35', - 'Uogonek': '\u0172', - 'Upsilon': '\u03A5', - 'Upsilon1': '\u03D2', - 'Upsilonacutehooksymbolgreek': '\u03D3', - 'Upsilonafrican': '\u01B1', - 'Upsilondieresis': '\u03AB', - 'Upsilondieresishooksymbolgreek': '\u03D4', - 'Upsilonhooksymbol': '\u03D2', - 'Upsilontonos': '\u038E', - 'Uring': '\u016E', - 'Ushortcyrillic': '\u040E', - 'Usmall': '\uF775', - 'Ustraightcyrillic': '\u04AE', - 'Ustraightstrokecyrillic': '\u04B0', - 'Utilde': '\u0168', - 'Utildeacute': '\u1E78', - 'Utildebelow': '\u1E74', - 'V': '\u0056', - 'Vcircle': '\u24CB', - 'Vdotbelow': '\u1E7E', - 'Vecyrillic': '\u0412', - 'Vewarmenian': '\u054E', - 'Vhook': '\u01B2', - 'Vmonospace': '\uFF36', - 'Voarmenian': '\u0548', - 'Vsmall': '\uF776', - 'Vtilde': '\u1E7C', - 'W': '\u0057', - 'Wacute': '\u1E82', - 'Wcircle': '\u24CC', - 'Wcircumflex': '\u0174', - 'Wdieresis': '\u1E84', - 'Wdotaccent': '\u1E86', - 'Wdotbelow': '\u1E88', - 'Wgrave': '\u1E80', - 'Wmonospace': '\uFF37', - 'Wsmall': '\uF777', - 'X': '\u0058', - 'Xcircle': '\u24CD', - 'Xdieresis': '\u1E8C', - 'Xdotaccent': '\u1E8A', - 'Xeharmenian': '\u053D', - 'Xi': '\u039E', - 'Xmonospace': '\uFF38', - 'Xsmall': '\uF778', - 'Y': '\u0059', - 'Yacute': '\u00DD', - 'Yacutesmall': '\uF7FD', - 'Yatcyrillic': '\u0462', - 'Ycircle': '\u24CE', - 'Ycircumflex': '\u0176', - 'Ydieresis': '\u0178', - 'Ydieresissmall': '\uF7FF', - 'Ydotaccent': '\u1E8E', - 'Ydotbelow': '\u1EF4', - 'Yericyrillic': '\u042B', - 'Yerudieresiscyrillic': '\u04F8', - 'Ygrave': '\u1EF2', - 'Yhook': '\u01B3', - 'Yhookabove': '\u1EF6', - 'Yiarmenian': '\u0545', - 'Yicyrillic': '\u0407', - 'Yiwnarmenian': '\u0552', - 'Ymonospace': '\uFF39', - 'Ysmall': '\uF779', - 'Ytilde': '\u1EF8', - 'Yusbigcyrillic': '\u046A', - 'Yusbigiotifiedcyrillic': '\u046C', - 'Yuslittlecyrillic': '\u0466', - 'Yuslittleiotifiedcyrillic': '\u0468', - 'Z': '\u005A', - 'Zaarmenian': '\u0536', - 'Zacute': '\u0179', - 'Zcaron': '\u017D', - 'Zcaronsmall': '\uF6FF', - 'Zcircle': '\u24CF', - 'Zcircumflex': '\u1E90', - 'Zdot': '\u017B', - 'Zdotaccent': '\u017B', - 'Zdotbelow': '\u1E92', - 'Zecyrillic': '\u0417', - 'Zedescendercyrillic': '\u0498', - 'Zedieresiscyrillic': '\u04DE', - 'Zeta': '\u0396', - 'Zhearmenian': '\u053A', - 'Zhebrevecyrillic': '\u04C1', - 'Zhecyrillic': '\u0416', - 'Zhedescendercyrillic': '\u0496', - 'Zhedieresiscyrillic': '\u04DC', - 'Zlinebelow': '\u1E94', - 'Zmonospace': '\uFF3A', - 'Zsmall': '\uF77A', - 'Zstroke': '\u01B5', - 'a': '\u0061', - 'aabengali': '\u0986', - 'aacute': '\u00E1', - 'aadeva': '\u0906', - 'aagujarati': '\u0A86', - 'aagurmukhi': '\u0A06', - 'aamatragurmukhi': '\u0A3E', - 'aarusquare': '\u3303', - 'aavowelsignbengali': '\u09BE', - 'aavowelsigndeva': '\u093E', - 'aavowelsigngujarati': '\u0ABE', - 'abbreviationmarkarmenian': '\u055F', - 'abbreviationsigndeva': '\u0970', - 'abengali': '\u0985', - 'abopomofo': '\u311A', - 'abreve': '\u0103', - 'abreveacute': '\u1EAF', - 'abrevecyrillic': '\u04D1', - 'abrevedotbelow': '\u1EB7', - 'abrevegrave': '\u1EB1', - 'abrevehookabove': '\u1EB3', - 'abrevetilde': '\u1EB5', - 'acaron': '\u01CE', - 'acircle': '\u24D0', - 'acircumflex': '\u00E2', - 'acircumflexacute': '\u1EA5', - 'acircumflexdotbelow': '\u1EAD', - 'acircumflexgrave': '\u1EA7', - 'acircumflexhookabove': '\u1EA9', - 'acircumflextilde': '\u1EAB', - 'acute': '\u00B4', - 'acutebelowcmb': '\u0317', - 'acutecmb': '\u0301', - 'acutecomb': '\u0301', - 'acutedeva': '\u0954', - 'acutelowmod': '\u02CF', - 'acutetonecmb': '\u0341', - 'acyrillic': '\u0430', - 'adblgrave': '\u0201', - 'addakgurmukhi': '\u0A71', - 'adeva': '\u0905', - 'adieresis': '\u00E4', - 'adieresiscyrillic': '\u04D3', - 'adieresismacron': '\u01DF', - 'adotbelow': '\u1EA1', - 'adotmacron': '\u01E1', - 'ae': '\u00E6', - 'aeacute': '\u01FD', - 'aekorean': '\u3150', - 'aemacron': '\u01E3', - 'afii00208': '\u2015', - 'afii08941': '\u20A4', - 'afii10017': '\u0410', - 'afii10018': '\u0411', - 'afii10019': '\u0412', - 'afii10020': '\u0413', - 'afii10021': '\u0414', - 'afii10022': '\u0415', - 'afii10023': '\u0401', - 'afii10024': '\u0416', - 'afii10025': '\u0417', - 'afii10026': '\u0418', - 'afii10027': '\u0419', - 'afii10028': '\u041A', - 'afii10029': '\u041B', - 'afii10030': '\u041C', - 'afii10031': '\u041D', - 'afii10032': '\u041E', - 'afii10033': '\u041F', - 'afii10034': '\u0420', - 'afii10035': '\u0421', - 'afii10036': '\u0422', - 'afii10037': '\u0423', - 'afii10038': '\u0424', - 'afii10039': '\u0425', - 'afii10040': '\u0426', - 'afii10041': '\u0427', - 'afii10042': '\u0428', - 'afii10043': '\u0429', - 'afii10044': '\u042A', - 'afii10045': '\u042B', - 'afii10046': '\u042C', - 'afii10047': '\u042D', - 'afii10048': '\u042E', - 'afii10049': '\u042F', - 'afii10050': '\u0490', - 'afii10051': '\u0402', - 'afii10052': '\u0403', - 'afii10053': '\u0404', - 'afii10054': '\u0405', - 'afii10055': '\u0406', - 'afii10056': '\u0407', - 'afii10057': '\u0408', - 'afii10058': '\u0409', - 'afii10059': '\u040A', - 'afii10060': '\u040B', - 'afii10061': '\u040C', - 'afii10062': '\u040E', - 'afii10063': '\uF6C4', - 'afii10064': '\uF6C5', - 'afii10065': '\u0430', - 'afii10066': '\u0431', - 'afii10067': '\u0432', - 'afii10068': '\u0433', - 'afii10069': '\u0434', - 'afii10070': '\u0435', - 'afii10071': '\u0451', - 'afii10072': '\u0436', - 'afii10073': '\u0437', - 'afii10074': '\u0438', - 'afii10075': '\u0439', - 'afii10076': '\u043A', - 'afii10077': '\u043B', - 'afii10078': '\u043C', - 'afii10079': '\u043D', - 'afii10080': '\u043E', - 'afii10081': '\u043F', - 'afii10082': '\u0440', - 'afii10083': '\u0441', - 'afii10084': '\u0442', - 'afii10085': '\u0443', - 'afii10086': '\u0444', - 'afii10087': '\u0445', - 'afii10088': '\u0446', - 'afii10089': '\u0447', - 'afii10090': '\u0448', - 'afii10091': '\u0449', - 'afii10092': '\u044A', - 'afii10093': '\u044B', - 'afii10094': '\u044C', - 'afii10095': '\u044D', - 'afii10096': '\u044E', - 'afii10097': '\u044F', - 'afii10098': '\u0491', - 'afii10099': '\u0452', - 'afii10100': '\u0453', - 'afii10101': '\u0454', - 'afii10102': '\u0455', - 'afii10103': '\u0456', - 'afii10104': '\u0457', - 'afii10105': '\u0458', - 'afii10106': '\u0459', - 'afii10107': '\u045A', - 'afii10108': '\u045B', - 'afii10109': '\u045C', - 'afii10110': '\u045E', - 'afii10145': '\u040F', - 'afii10146': '\u0462', - 'afii10147': '\u0472', - 'afii10148': '\u0474', - 'afii10192': '\uF6C6', - 'afii10193': '\u045F', - 'afii10194': '\u0463', - 'afii10195': '\u0473', - 'afii10196': '\u0475', - 'afii10831': '\uF6C7', - 'afii10832': '\uF6C8', - 'afii10846': '\u04D9', - 'afii299': '\u200E', - 'afii300': '\u200F', - 'afii301': '\u200D', - 'afii57381': '\u066A', - 'afii57388': '\u060C', - 'afii57392': '\u0660', - 'afii57393': '\u0661', - 'afii57394': '\u0662', - 'afii57395': '\u0663', - 'afii57396': '\u0664', - 'afii57397': '\u0665', - 'afii57398': '\u0666', - 'afii57399': '\u0667', - 'afii57400': '\u0668', - 'afii57401': '\u0669', - 'afii57403': '\u061B', - 'afii57407': '\u061F', - 'afii57409': '\u0621', - 'afii57410': '\u0622', - 'afii57411': '\u0623', - 'afii57412': '\u0624', - 'afii57413': '\u0625', - 'afii57414': '\u0626', - 'afii57415': '\u0627', - 'afii57416': '\u0628', - 'afii57417': '\u0629', - 'afii57418': '\u062A', - 'afii57419': '\u062B', - 'afii57420': '\u062C', - 'afii57421': '\u062D', - 'afii57422': '\u062E', - 'afii57423': '\u062F', - 'afii57424': '\u0630', - 'afii57425': '\u0631', - 'afii57426': '\u0632', - 'afii57427': '\u0633', - 'afii57428': '\u0634', - 'afii57429': '\u0635', - 'afii57430': '\u0636', - 'afii57431': '\u0637', - 'afii57432': '\u0638', - 'afii57433': '\u0639', - 'afii57434': '\u063A', - 'afii57440': '\u0640', - 'afii57441': '\u0641', - 'afii57442': '\u0642', - 'afii57443': '\u0643', - 'afii57444': '\u0644', - 'afii57445': '\u0645', - 'afii57446': '\u0646', - 'afii57448': '\u0648', - 'afii57449': '\u0649', - 'afii57450': '\u064A', - 'afii57451': '\u064B', - 'afii57452': '\u064C', - 'afii57453': '\u064D', - 'afii57454': '\u064E', - 'afii57455': '\u064F', - 'afii57456': '\u0650', - 'afii57457': '\u0651', - 'afii57458': '\u0652', - 'afii57470': '\u0647', - 'afii57505': '\u06A4', - 'afii57506': '\u067E', - 'afii57507': '\u0686', - 'afii57508': '\u0698', - 'afii57509': '\u06AF', - 'afii57511': '\u0679', - 'afii57512': '\u0688', - 'afii57513': '\u0691', - 'afii57514': '\u06BA', - 'afii57519': '\u06D2', - 'afii57534': '\u06D5', - 'afii57636': '\u20AA', - 'afii57645': '\u05BE', - 'afii57658': '\u05C3', - 'afii57664': '\u05D0', - 'afii57665': '\u05D1', - 'afii57666': '\u05D2', - 'afii57667': '\u05D3', - 'afii57668': '\u05D4', - 'afii57669': '\u05D5', - 'afii57670': '\u05D6', - 'afii57671': '\u05D7', - 'afii57672': '\u05D8', - 'afii57673': '\u05D9', - 'afii57674': '\u05DA', - 'afii57675': '\u05DB', - 'afii57676': '\u05DC', - 'afii57677': '\u05DD', - 'afii57678': '\u05DE', - 'afii57679': '\u05DF', - 'afii57680': '\u05E0', - 'afii57681': '\u05E1', - 'afii57682': '\u05E2', - 'afii57683': '\u05E3', - 'afii57684': '\u05E4', - 'afii57685': '\u05E5', - 'afii57686': '\u05E6', - 'afii57687': '\u05E7', - 'afii57688': '\u05E8', - 'afii57689': '\u05E9', - 'afii57690': '\u05EA', - 'afii57694': '\uFB2A', - 'afii57695': '\uFB2B', - 'afii57700': '\uFB4B', - 'afii57705': '\uFB1F', - 'afii57716': '\u05F0', - 'afii57717': '\u05F1', - 'afii57718': '\u05F2', - 'afii57723': '\uFB35', - 'afii57793': '\u05B4', - 'afii57794': '\u05B5', - 'afii57795': '\u05B6', - 'afii57796': '\u05BB', - 'afii57797': '\u05B8', - 'afii57798': '\u05B7', - 'afii57799': '\u05B0', - 'afii57800': '\u05B2', - 'afii57801': '\u05B1', - 'afii57802': '\u05B3', - 'afii57803': '\u05C2', - 'afii57804': '\u05C1', - 'afii57806': '\u05B9', - 'afii57807': '\u05BC', - 'afii57839': '\u05BD', - 'afii57841': '\u05BF', - 'afii57842': '\u05C0', - 'afii57929': '\u02BC', - 'afii61248': '\u2105', - 'afii61289': '\u2113', - 'afii61352': '\u2116', - 'afii61573': '\u202C', - 'afii61574': '\u202D', - 'afii61575': '\u202E', - 'afii61664': '\u200C', - 'afii63167': '\u066D', - 'afii64937': '\u02BD', - 'agrave': '\u00E0', - 'agujarati': '\u0A85', - 'agurmukhi': '\u0A05', - 'ahiragana': '\u3042', - 'ahookabove': '\u1EA3', - 'aibengali': '\u0990', - 'aibopomofo': '\u311E', - 'aideva': '\u0910', - 'aiecyrillic': '\u04D5', - 'aigujarati': '\u0A90', - 'aigurmukhi': '\u0A10', - 'aimatragurmukhi': '\u0A48', - 'ainarabic': '\u0639', - 'ainfinalarabic': '\uFECA', - 'aininitialarabic': '\uFECB', - 'ainmedialarabic': '\uFECC', - 'ainvertedbreve': '\u0203', - 'aivowelsignbengali': '\u09C8', - 'aivowelsigndeva': '\u0948', - 'aivowelsigngujarati': '\u0AC8', - 'akatakana': '\u30A2', - 'akatakanahalfwidth': '\uFF71', - 'akorean': '\u314F', - 'alef': '\u05D0', - 'alefarabic': '\u0627', - 'alefdageshhebrew': '\uFB30', - 'aleffinalarabic': '\uFE8E', - 'alefhamzaabovearabic': '\u0623', - 'alefhamzaabovefinalarabic': '\uFE84', - 'alefhamzabelowarabic': '\u0625', - 'alefhamzabelowfinalarabic': '\uFE88', - 'alefhebrew': '\u05D0', - 'aleflamedhebrew': '\uFB4F', - 'alefmaddaabovearabic': '\u0622', - 'alefmaddaabovefinalarabic': '\uFE82', - 'alefmaksuraarabic': '\u0649', - 'alefmaksurafinalarabic': '\uFEF0', - 'alefmaksurainitialarabic': '\uFEF3', - 'alefmaksuramedialarabic': '\uFEF4', - 'alefpatahhebrew': '\uFB2E', - 'alefqamatshebrew': '\uFB2F', - 'aleph': '\u2135', - 'allequal': '\u224C', - 'alpha': '\u03B1', - 'alphatonos': '\u03AC', - 'amacron': '\u0101', - 'amonospace': '\uFF41', - 'ampersand': '\u0026', - 'ampersandmonospace': '\uFF06', - 'ampersandsmall': '\uF726', - 'amsquare': '\u33C2', - 'anbopomofo': '\u3122', - 'angbopomofo': '\u3124', - 'angkhankhuthai': '\u0E5A', - 'angle': '\u2220', - 'anglebracketleft': '\u3008', - 'anglebracketleftvertical': '\uFE3F', - 'anglebracketright': '\u3009', - 'anglebracketrightvertical': '\uFE40', - 'angleleft': '\u2329', - 'angleright': '\u232A', - 'angstrom': '\u212B', - 'anoteleia': '\u0387', - 'anudattadeva': '\u0952', - 'anusvarabengali': '\u0982', - 'anusvaradeva': '\u0902', - 'anusvaragujarati': '\u0A82', - 'aogonek': '\u0105', - 'apaatosquare': '\u3300', - 'aparen': '\u249C', - 'apostrophearmenian': '\u055A', - 'apostrophemod': '\u02BC', - 'apple': '\uF8FF', - 'approaches': '\u2250', - 'approxequal': '\u2248', - 'approxequalorimage': '\u2252', - 'approximatelyequal': '\u2245', - 'araeaekorean': '\u318E', - 'araeakorean': '\u318D', - 'arc': '\u2312', - 'arighthalfring': '\u1E9A', - 'aring': '\u00E5', - 'aringacute': '\u01FB', - 'aringbelow': '\u1E01', - 'arrowboth': '\u2194', - 'arrowdashdown': '\u21E3', - 'arrowdashleft': '\u21E0', - 'arrowdashright': '\u21E2', - 'arrowdashup': '\u21E1', - 'arrowdblboth': '\u21D4', - 'arrowdbldown': '\u21D3', - 'arrowdblleft': '\u21D0', - 'arrowdblright': '\u21D2', - 'arrowdblup': '\u21D1', - 'arrowdown': '\u2193', - 'arrowdownleft': '\u2199', - 'arrowdownright': '\u2198', - 'arrowdownwhite': '\u21E9', - 'arrowheaddownmod': '\u02C5', - 'arrowheadleftmod': '\u02C2', - 'arrowheadrightmod': '\u02C3', - 'arrowheadupmod': '\u02C4', - 'arrowhorizex': '\uF8E7', - 'arrowleft': '\u2190', - 'arrowleftdbl': '\u21D0', - 'arrowleftdblstroke': '\u21CD', - 'arrowleftoverright': '\u21C6', - 'arrowleftwhite': '\u21E6', - 'arrowright': '\u2192', - 'arrowrightdblstroke': '\u21CF', - 'arrowrightheavy': '\u279E', - 'arrowrightoverleft': '\u21C4', - 'arrowrightwhite': '\u21E8', - 'arrowtableft': '\u21E4', - 'arrowtabright': '\u21E5', - 'arrowup': '\u2191', - 'arrowupdn': '\u2195', - 'arrowupdnbse': '\u21A8', - 'arrowupdownbase': '\u21A8', - 'arrowupleft': '\u2196', - 'arrowupleftofdown': '\u21C5', - 'arrowupright': '\u2197', - 'arrowupwhite': '\u21E7', - 'arrowvertex': '\uF8E6', - 'asciicircum': '\u005E', - 'asciicircummonospace': '\uFF3E', - 'asciitilde': '\u007E', - 'asciitildemonospace': '\uFF5E', - 'ascript': '\u0251', - 'ascriptturned': '\u0252', - 'asmallhiragana': '\u3041', - 'asmallkatakana': '\u30A1', - 'asmallkatakanahalfwidth': '\uFF67', - 'asterisk': '\u002A', - 'asteriskaltonearabic': '\u066D', - 'asteriskarabic': '\u066D', - 'asteriskmath': '\u2217', - 'asteriskmonospace': '\uFF0A', - 'asterisksmall': '\uFE61', - 'asterism': '\u2042', - 'asuperior': '\uF6E9', - 'asymptoticallyequal': '\u2243', - 'at': '\u0040', - 'atilde': '\u00E3', - 'atmonospace': '\uFF20', - 'atsmall': '\uFE6B', - 'aturned': '\u0250', - 'aubengali': '\u0994', - 'aubopomofo': '\u3120', - 'audeva': '\u0914', - 'augujarati': '\u0A94', - 'augurmukhi': '\u0A14', - 'aulengthmarkbengali': '\u09D7', - 'aumatragurmukhi': '\u0A4C', - 'auvowelsignbengali': '\u09CC', - 'auvowelsigndeva': '\u094C', - 'auvowelsigngujarati': '\u0ACC', - 'avagrahadeva': '\u093D', - 'aybarmenian': '\u0561', - 'ayin': '\u05E2', - 'ayinaltonehebrew': '\uFB20', - 'ayinhebrew': '\u05E2', - 'b': '\u0062', - 'babengali': '\u09AC', - 'backslash': '\u005C', - 'backslashmonospace': '\uFF3C', - 'badeva': '\u092C', - 'bagujarati': '\u0AAC', - 'bagurmukhi': '\u0A2C', - 'bahiragana': '\u3070', - 'bahtthai': '\u0E3F', - 'bakatakana': '\u30D0', - 'bar': '\u007C', - 'barmonospace': '\uFF5C', - 'bbopomofo': '\u3105', - 'bcircle': '\u24D1', - 'bdotaccent': '\u1E03', - 'bdotbelow': '\u1E05', - 'beamedsixteenthnotes': '\u266C', - 'because': '\u2235', - 'becyrillic': '\u0431', - 'beharabic': '\u0628', - 'behfinalarabic': '\uFE90', - 'behinitialarabic': '\uFE91', - 'behiragana': '\u3079', - 'behmedialarabic': '\uFE92', - 'behmeeminitialarabic': '\uFC9F', - 'behmeemisolatedarabic': '\uFC08', - 'behnoonfinalarabic': '\uFC6D', - 'bekatakana': '\u30D9', - 'benarmenian': '\u0562', - 'bet': '\u05D1', - 'beta': '\u03B2', - 'betasymbolgreek': '\u03D0', - 'betdagesh': '\uFB31', - 'betdageshhebrew': '\uFB31', - 'bethebrew': '\u05D1', - 'betrafehebrew': '\uFB4C', - 'bhabengali': '\u09AD', - 'bhadeva': '\u092D', - 'bhagujarati': '\u0AAD', - 'bhagurmukhi': '\u0A2D', - 'bhook': '\u0253', - 'bihiragana': '\u3073', - 'bikatakana': '\u30D3', - 'bilabialclick': '\u0298', - 'bindigurmukhi': '\u0A02', - 'birusquare': '\u3331', - 'blackcircle': '\u25CF', - 'blackdiamond': '\u25C6', - 'blackdownpointingtriangle': '\u25BC', - 'blackleftpointingpointer': '\u25C4', - 'blackleftpointingtriangle': '\u25C0', - 'blacklenticularbracketleft': '\u3010', - 'blacklenticularbracketleftvertical': '\uFE3B', - 'blacklenticularbracketright': '\u3011', - 'blacklenticularbracketrightvertical': '\uFE3C', - 'blacklowerlefttriangle': '\u25E3', - 'blacklowerrighttriangle': '\u25E2', - 'blackrectangle': '\u25AC', - 'blackrightpointingpointer': '\u25BA', - 'blackrightpointingtriangle': '\u25B6', - 'blacksmallsquare': '\u25AA', - 'blacksmilingface': '\u263B', - 'blacksquare': '\u25A0', - 'blackstar': '\u2605', - 'blackupperlefttriangle': '\u25E4', - 'blackupperrighttriangle': '\u25E5', - 'blackuppointingsmalltriangle': '\u25B4', - 'blackuppointingtriangle': '\u25B2', - 'blank': '\u2423', - 'blinebelow': '\u1E07', - 'block': '\u2588', - 'bmonospace': '\uFF42', - 'bobaimaithai': '\u0E1A', - 'bohiragana': '\u307C', - 'bokatakana': '\u30DC', - 'bparen': '\u249D', - 'bqsquare': '\u33C3', - 'braceex': '\uF8F4', - 'braceleft': '\u007B', - 'braceleftbt': '\uF8F3', - 'braceleftmid': '\uF8F2', - 'braceleftmonospace': '\uFF5B', - 'braceleftsmall': '\uFE5B', - 'bracelefttp': '\uF8F1', - 'braceleftvertical': '\uFE37', - 'braceright': '\u007D', - 'bracerightbt': '\uF8FE', - 'bracerightmid': '\uF8FD', - 'bracerightmonospace': '\uFF5D', - 'bracerightsmall': '\uFE5C', - 'bracerighttp': '\uF8FC', - 'bracerightvertical': '\uFE38', - 'bracketleft': '\u005B', - 'bracketleftbt': '\uF8F0', - 'bracketleftex': '\uF8EF', - 'bracketleftmonospace': '\uFF3B', - 'bracketlefttp': '\uF8EE', - 'bracketright': '\u005D', - 'bracketrightbt': '\uF8FB', - 'bracketrightex': '\uF8FA', - 'bracketrightmonospace': '\uFF3D', - 'bracketrighttp': '\uF8F9', - 'breve': '\u02D8', - 'brevebelowcmb': '\u032E', - 'brevecmb': '\u0306', - 'breveinvertedbelowcmb': '\u032F', - 'breveinvertedcmb': '\u0311', - 'breveinverteddoublecmb': '\u0361', - 'bridgebelowcmb': '\u032A', - 'bridgeinvertedbelowcmb': '\u033A', - 'brokenbar': '\u00A6', - 'bstroke': '\u0180', - 'bsuperior': '\uF6EA', - 'btopbar': '\u0183', - 'buhiragana': '\u3076', - 'bukatakana': '\u30D6', - 'bullet': '\u2022', - 'bulletinverse': '\u25D8', - 'bulletoperator': '\u2219', - 'bullseye': '\u25CE', - 'c': '\u0063', - 'caarmenian': '\u056E', - 'cabengali': '\u099A', - 'cacute': '\u0107', - 'cadeva': '\u091A', - 'cagujarati': '\u0A9A', - 'cagurmukhi': '\u0A1A', - 'calsquare': '\u3388', - 'candrabindubengali': '\u0981', - 'candrabinducmb': '\u0310', - 'candrabindudeva': '\u0901', - 'candrabindugujarati': '\u0A81', - 'capslock': '\u21EA', - 'careof': '\u2105', - 'caron': '\u02C7', - 'caronbelowcmb': '\u032C', - 'caroncmb': '\u030C', - 'carriagereturn': '\u21B5', - 'cbopomofo': '\u3118', - 'ccaron': '\u010D', - 'ccedilla': '\u00E7', - 'ccedillaacute': '\u1E09', - 'ccircle': '\u24D2', - 'ccircumflex': '\u0109', - 'ccurl': '\u0255', - 'cdot': '\u010B', - 'cdotaccent': '\u010B', - 'cdsquare': '\u33C5', - 'cedilla': '\u00B8', - 'cedillacmb': '\u0327', - 'cent': '\u00A2', - 'centigrade': '\u2103', - 'centinferior': '\uF6DF', - 'centmonospace': '\uFFE0', - 'centoldstyle': '\uF7A2', - 'centsuperior': '\uF6E0', - 'chaarmenian': '\u0579', - 'chabengali': '\u099B', - 'chadeva': '\u091B', - 'chagujarati': '\u0A9B', - 'chagurmukhi': '\u0A1B', - 'chbopomofo': '\u3114', - 'cheabkhasiancyrillic': '\u04BD', - 'checkmark': '\u2713', - 'checyrillic': '\u0447', - 'chedescenderabkhasiancyrillic': '\u04BF', - 'chedescendercyrillic': '\u04B7', - 'chedieresiscyrillic': '\u04F5', - 'cheharmenian': '\u0573', - 'chekhakassiancyrillic': '\u04CC', - 'cheverticalstrokecyrillic': '\u04B9', - 'chi': '\u03C7', - 'chieuchacirclekorean': '\u3277', - 'chieuchaparenkorean': '\u3217', - 'chieuchcirclekorean': '\u3269', - 'chieuchkorean': '\u314A', - 'chieuchparenkorean': '\u3209', - 'chochangthai': '\u0E0A', - 'chochanthai': '\u0E08', - 'chochingthai': '\u0E09', - 'chochoethai': '\u0E0C', - 'chook': '\u0188', - 'cieucacirclekorean': '\u3276', - 'cieucaparenkorean': '\u3216', - 'cieuccirclekorean': '\u3268', - 'cieuckorean': '\u3148', - 'cieucparenkorean': '\u3208', - 'cieucuparenkorean': '\u321C', - 'circle': '\u25CB', - 'circlemultiply': '\u2297', - 'circleot': '\u2299', - 'circleplus': '\u2295', - 'circlepostalmark': '\u3036', - 'circlewithlefthalfblack': '\u25D0', - 'circlewithrighthalfblack': '\u25D1', - 'circumflex': '\u02C6', - 'circumflexbelowcmb': '\u032D', - 'circumflexcmb': '\u0302', - 'clear': '\u2327', - 'clickalveolar': '\u01C2', - 'clickdental': '\u01C0', - 'clicklateral': '\u01C1', - 'clickretroflex': '\u01C3', - 'club': '\u2663', - 'clubsuitblack': '\u2663', - 'clubsuitwhite': '\u2667', - 'cmcubedsquare': '\u33A4', - 'cmonospace': '\uFF43', - 'cmsquaredsquare': '\u33A0', - 'coarmenian': '\u0581', - 'colon': '\u003A', - 'colonmonetary': '\u20A1', - 'colonmonospace': '\uFF1A', - 'colonsign': '\u20A1', - 'colonsmall': '\uFE55', - 'colontriangularhalfmod': '\u02D1', - 'colontriangularmod': '\u02D0', - 'comma': '\u002C', - 'commaabovecmb': '\u0313', - 'commaaboverightcmb': '\u0315', - 'commaaccent': '\uF6C3', - 'commaarabic': '\u060C', - 'commaarmenian': '\u055D', - 'commainferior': '\uF6E1', - 'commamonospace': '\uFF0C', - 'commareversedabovecmb': '\u0314', - 'commareversedmod': '\u02BD', - 'commasmall': '\uFE50', - 'commasuperior': '\uF6E2', - 'commaturnedabovecmb': '\u0312', - 'commaturnedmod': '\u02BB', - 'compass': '\u263C', - 'congruent': '\u2245', - 'contourintegral': '\u222E', - 'control': '\u2303', - 'controlACK': '\u0006', - 'controlBEL': '\u0007', - 'controlBS': '\u0008', - 'controlCAN': '\u0018', - 'controlCR': '\u000D', - 'controlDC1': '\u0011', - 'controlDC2': '\u0012', - 'controlDC3': '\u0013', - 'controlDC4': '\u0014', - 'controlDEL': '\u007F', - 'controlDLE': '\u0010', - 'controlEM': '\u0019', - 'controlENQ': '\u0005', - 'controlEOT': '\u0004', - 'controlESC': '\u001B', - 'controlETB': '\u0017', - 'controlETX': '\u0003', - 'controlFF': '\u000C', - 'controlFS': '\u001C', - 'controlGS': '\u001D', - 'controlHT': '\u0009', - 'controlLF': '\u000A', - 'controlNAK': '\u0015', - 'controlRS': '\u001E', - 'controlSI': '\u000F', - 'controlSO': '\u000E', - 'controlSOT': '\u0002', - 'controlSTX': '\u0001', - 'controlSUB': '\u001A', - 'controlSYN': '\u0016', - 'controlUS': '\u001F', - 'controlVT': '\u000B', - 'copyright': '\u00A9', - 'copyrightsans': '\uF8E9', - 'copyrightserif': '\uF6D9', - 'cornerbracketleft': '\u300C', - 'cornerbracketlefthalfwidth': '\uFF62', - 'cornerbracketleftvertical': '\uFE41', - 'cornerbracketright': '\u300D', - 'cornerbracketrighthalfwidth': '\uFF63', - 'cornerbracketrightvertical': '\uFE42', - 'corporationsquare': '\u337F', - 'cosquare': '\u33C7', - 'coverkgsquare': '\u33C6', - 'cparen': '\u249E', - 'cruzeiro': '\u20A2', - 'cstretched': '\u0297', - 'curlyand': '\u22CF', - 'curlyor': '\u22CE', - 'currency': '\u00A4', - 'cyrBreve': '\uF6D1', - 'cyrFlex': '\uF6D2', - 'cyrbreve': '\uF6D4', - 'cyrflex': '\uF6D5', - 'd': '\u0064', - 'daarmenian': '\u0564', - 'dabengali': '\u09A6', - 'dadarabic': '\u0636', - 'dadeva': '\u0926', - 'dadfinalarabic': '\uFEBE', - 'dadinitialarabic': '\uFEBF', - 'dadmedialarabic': '\uFEC0', - 'dagesh': '\u05BC', - 'dageshhebrew': '\u05BC', - 'dagger': '\u2020', - 'daggerdbl': '\u2021', - 'dagujarati': '\u0AA6', - 'dagurmukhi': '\u0A26', - 'dahiragana': '\u3060', - 'dakatakana': '\u30C0', - 'dalarabic': '\u062F', - 'dalet': '\u05D3', - 'daletdagesh': '\uFB33', - 'daletdageshhebrew': '\uFB33', - 'dalethatafpatah': '\u05D3\u05B2', - 'dalethatafpatahhebrew': '\u05D3\u05B2', - 'dalethatafsegol': '\u05D3\u05B1', - 'dalethatafsegolhebrew': '\u05D3\u05B1', - 'dalethebrew': '\u05D3', - 'dalethiriq': '\u05D3\u05B4', - 'dalethiriqhebrew': '\u05D3\u05B4', - 'daletholam': '\u05D3\u05B9', - 'daletholamhebrew': '\u05D3\u05B9', - 'daletpatah': '\u05D3\u05B7', - 'daletpatahhebrew': '\u05D3\u05B7', - 'daletqamats': '\u05D3\u05B8', - 'daletqamatshebrew': '\u05D3\u05B8', - 'daletqubuts': '\u05D3\u05BB', - 'daletqubutshebrew': '\u05D3\u05BB', - 'daletsegol': '\u05D3\u05B6', - 'daletsegolhebrew': '\u05D3\u05B6', - 'daletsheva': '\u05D3\u05B0', - 'daletshevahebrew': '\u05D3\u05B0', - 'dalettsere': '\u05D3\u05B5', - 'dalettserehebrew': '\u05D3\u05B5', - 'dalfinalarabic': '\uFEAA', - 'dammaarabic': '\u064F', - 'dammalowarabic': '\u064F', - 'dammatanaltonearabic': '\u064C', - 'dammatanarabic': '\u064C', - 'danda': '\u0964', - 'dargahebrew': '\u05A7', - 'dargalefthebrew': '\u05A7', - 'dasiapneumatacyrilliccmb': '\u0485', - 'dblGrave': '\uF6D3', - 'dblanglebracketleft': '\u300A', - 'dblanglebracketleftvertical': '\uFE3D', - 'dblanglebracketright': '\u300B', - 'dblanglebracketrightvertical': '\uFE3E', - 'dblarchinvertedbelowcmb': '\u032B', - 'dblarrowleft': '\u21D4', - 'dblarrowright': '\u21D2', - 'dbldanda': '\u0965', - 'dblgrave': '\uF6D6', - 'dblgravecmb': '\u030F', - 'dblintegral': '\u222C', - 'dbllowline': '\u2017', - 'dbllowlinecmb': '\u0333', - 'dbloverlinecmb': '\u033F', - 'dblprimemod': '\u02BA', - 'dblverticalbar': '\u2016', - 'dblverticallineabovecmb': '\u030E', - 'dbopomofo': '\u3109', - 'dbsquare': '\u33C8', - 'dcaron': '\u010F', - 'dcedilla': '\u1E11', - 'dcircle': '\u24D3', - 'dcircumflexbelow': '\u1E13', - 'dcroat': '\u0111', - 'ddabengali': '\u09A1', - 'ddadeva': '\u0921', - 'ddagujarati': '\u0AA1', - 'ddagurmukhi': '\u0A21', - 'ddalarabic': '\u0688', - 'ddalfinalarabic': '\uFB89', - 'dddhadeva': '\u095C', - 'ddhabengali': '\u09A2', - 'ddhadeva': '\u0922', - 'ddhagujarati': '\u0AA2', - 'ddhagurmukhi': '\u0A22', - 'ddotaccent': '\u1E0B', - 'ddotbelow': '\u1E0D', - 'decimalseparatorarabic': '\u066B', - 'decimalseparatorpersian': '\u066B', - 'decyrillic': '\u0434', - 'degree': '\u00B0', - 'dehihebrew': '\u05AD', - 'dehiragana': '\u3067', - 'deicoptic': '\u03EF', - 'dekatakana': '\u30C7', - 'deleteleft': '\u232B', - 'deleteright': '\u2326', - 'delta': '\u03B4', - 'deltaturned': '\u018D', - 'denominatorminusonenumeratorbengali': '\u09F8', - 'dezh': '\u02A4', - 'dhabengali': '\u09A7', - 'dhadeva': '\u0927', - 'dhagujarati': '\u0AA7', - 'dhagurmukhi': '\u0A27', - 'dhook': '\u0257', - 'dialytikatonos': '\u0385', - 'dialytikatonoscmb': '\u0344', - 'diamond': '\u2666', - 'diamondsuitwhite': '\u2662', - 'dieresis': '\u00A8', - 'dieresisacute': '\uF6D7', - 'dieresisbelowcmb': '\u0324', - 'dieresiscmb': '\u0308', - 'dieresisgrave': '\uF6D8', - 'dieresistonos': '\u0385', - 'dihiragana': '\u3062', - 'dikatakana': '\u30C2', - 'dittomark': '\u3003', - 'divide': '\u00F7', - 'divides': '\u2223', - 'divisionslash': '\u2215', - 'djecyrillic': '\u0452', - 'dkshade': '\u2593', - 'dlinebelow': '\u1E0F', - 'dlsquare': '\u3397', - 'dmacron': '\u0111', - 'dmonospace': '\uFF44', - 'dnblock': '\u2584', - 'dochadathai': '\u0E0E', - 'dodekthai': '\u0E14', - 'dohiragana': '\u3069', - 'dokatakana': '\u30C9', - 'dollar': '\u0024', - 'dollarinferior': '\uF6E3', - 'dollarmonospace': '\uFF04', - 'dollaroldstyle': '\uF724', - 'dollarsmall': '\uFE69', - 'dollarsuperior': '\uF6E4', - 'dong': '\u20AB', - 'dorusquare': '\u3326', - 'dotaccent': '\u02D9', - 'dotaccentcmb': '\u0307', - 'dotbelowcmb': '\u0323', - 'dotbelowcomb': '\u0323', - 'dotkatakana': '\u30FB', - 'dotlessi': '\u0131', - 'dotlessj': '\uF6BE', - 'dotlessjstrokehook': '\u0284', - 'dotmath': '\u22C5', - 'dottedcircle': '\u25CC', - 'doubleyodpatah': '\uFB1F', - 'doubleyodpatahhebrew': '\uFB1F', - 'downtackbelowcmb': '\u031E', - 'downtackmod': '\u02D5', - 'dparen': '\u249F', - 'dsuperior': '\uF6EB', - 'dtail': '\u0256', - 'dtopbar': '\u018C', - 'duhiragana': '\u3065', - 'dukatakana': '\u30C5', - 'dz': '\u01F3', - 'dzaltone': '\u02A3', - 'dzcaron': '\u01C6', - 'dzcurl': '\u02A5', - 'dzeabkhasiancyrillic': '\u04E1', - 'dzecyrillic': '\u0455', - 'dzhecyrillic': '\u045F', - 'e': '\u0065', - 'eacute': '\u00E9', - 'earth': '\u2641', - 'ebengali': '\u098F', - 'ebopomofo': '\u311C', - 'ebreve': '\u0115', - 'ecandradeva': '\u090D', - 'ecandragujarati': '\u0A8D', - 'ecandravowelsigndeva': '\u0945', - 'ecandravowelsigngujarati': '\u0AC5', - 'ecaron': '\u011B', - 'ecedillabreve': '\u1E1D', - 'echarmenian': '\u0565', - 'echyiwnarmenian': '\u0587', - 'ecircle': '\u24D4', - 'ecircumflex': '\u00EA', - 'ecircumflexacute': '\u1EBF', - 'ecircumflexbelow': '\u1E19', - 'ecircumflexdotbelow': '\u1EC7', - 'ecircumflexgrave': '\u1EC1', - 'ecircumflexhookabove': '\u1EC3', - 'ecircumflextilde': '\u1EC5', - 'ecyrillic': '\u0454', - 'edblgrave': '\u0205', - 'edeva': '\u090F', - 'edieresis': '\u00EB', - 'edot': '\u0117', - 'edotaccent': '\u0117', - 'edotbelow': '\u1EB9', - 'eegurmukhi': '\u0A0F', - 'eematragurmukhi': '\u0A47', - 'efcyrillic': '\u0444', - 'egrave': '\u00E8', - 'egujarati': '\u0A8F', - 'eharmenian': '\u0567', - 'ehbopomofo': '\u311D', - 'ehiragana': '\u3048', - 'ehookabove': '\u1EBB', - 'eibopomofo': '\u311F', - 'eight': '\u0038', - 'eightarabic': '\u0668', - 'eightbengali': '\u09EE', - 'eightcircle': '\u2467', - 'eightcircleinversesansserif': '\u2791', - 'eightdeva': '\u096E', - 'eighteencircle': '\u2471', - 'eighteenparen': '\u2485', - 'eighteenperiod': '\u2499', - 'eightgujarati': '\u0AEE', - 'eightgurmukhi': '\u0A6E', - 'eighthackarabic': '\u0668', - 'eighthangzhou': '\u3028', - 'eighthnotebeamed': '\u266B', - 'eightideographicparen': '\u3227', - 'eightinferior': '\u2088', - 'eightmonospace': '\uFF18', - 'eightoldstyle': '\uF738', - 'eightparen': '\u247B', - 'eightperiod': '\u248F', - 'eightpersian': '\u06F8', - 'eightroman': '\u2177', - 'eightsuperior': '\u2078', - 'eightthai': '\u0E58', - 'einvertedbreve': '\u0207', - 'eiotifiedcyrillic': '\u0465', - 'ekatakana': '\u30A8', - 'ekatakanahalfwidth': '\uFF74', - 'ekonkargurmukhi': '\u0A74', - 'ekorean': '\u3154', - 'elcyrillic': '\u043B', - 'element': '\u2208', - 'elevencircle': '\u246A', - 'elevenparen': '\u247E', - 'elevenperiod': '\u2492', - 'elevenroman': '\u217A', - 'ellipsis': '\u2026', - 'ellipsisvertical': '\u22EE', - 'emacron': '\u0113', - 'emacronacute': '\u1E17', - 'emacrongrave': '\u1E15', - 'emcyrillic': '\u043C', - 'emdash': '\u2014', - 'emdashvertical': '\uFE31', - 'emonospace': '\uFF45', - 'emphasismarkarmenian': '\u055B', - 'emptyset': '\u2205', - 'enbopomofo': '\u3123', - 'encyrillic': '\u043D', - 'endash': '\u2013', - 'endashvertical': '\uFE32', - 'endescendercyrillic': '\u04A3', - 'eng': '\u014B', - 'engbopomofo': '\u3125', - 'enghecyrillic': '\u04A5', - 'enhookcyrillic': '\u04C8', - 'enspace': '\u2002', - 'eogonek': '\u0119', - 'eokorean': '\u3153', - 'eopen': '\u025B', - 'eopenclosed': '\u029A', - 'eopenreversed': '\u025C', - 'eopenreversedclosed': '\u025E', - 'eopenreversedhook': '\u025D', - 'eparen': '\u24A0', - 'epsilon': '\u03B5', - 'epsilontonos': '\u03AD', - 'equal': '\u003D', - 'equalmonospace': '\uFF1D', - 'equalsmall': '\uFE66', - 'equalsuperior': '\u207C', - 'equivalence': '\u2261', - 'erbopomofo': '\u3126', - 'ercyrillic': '\u0440', - 'ereversed': '\u0258', - 'ereversedcyrillic': '\u044D', - 'escyrillic': '\u0441', - 'esdescendercyrillic': '\u04AB', - 'esh': '\u0283', - 'eshcurl': '\u0286', - 'eshortdeva': '\u090E', - 'eshortvowelsigndeva': '\u0946', - 'eshreversedloop': '\u01AA', - 'eshsquatreversed': '\u0285', - 'esmallhiragana': '\u3047', - 'esmallkatakana': '\u30A7', - 'esmallkatakanahalfwidth': '\uFF6A', - 'estimated': '\u212E', - 'esuperior': '\uF6EC', - 'eta': '\u03B7', - 'etarmenian': '\u0568', - 'etatonos': '\u03AE', - 'eth': '\u00F0', - 'etilde': '\u1EBD', - 'etildebelow': '\u1E1B', - 'etnahtafoukhhebrew': '\u0591', - 'etnahtafoukhlefthebrew': '\u0591', - 'etnahtahebrew': '\u0591', - 'etnahtalefthebrew': '\u0591', - 'eturned': '\u01DD', - 'eukorean': '\u3161', - 'euro': '\u20AC', - 'evowelsignbengali': '\u09C7', - 'evowelsigndeva': '\u0947', - 'evowelsigngujarati': '\u0AC7', - 'exclam': '\u0021', - 'exclamarmenian': '\u055C', - 'exclamdbl': '\u203C', - 'exclamdown': '\u00A1', - 'exclamdownsmall': '\uF7A1', - 'exclammonospace': '\uFF01', - 'exclamsmall': '\uF721', - 'existential': '\u2203', - 'ezh': '\u0292', - 'ezhcaron': '\u01EF', - 'ezhcurl': '\u0293', - 'ezhreversed': '\u01B9', - 'ezhtail': '\u01BA', - 'f': '\u0066', - 'fadeva': '\u095E', - 'fagurmukhi': '\u0A5E', - 'fahrenheit': '\u2109', - 'fathaarabic': '\u064E', - 'fathalowarabic': '\u064E', - 'fathatanarabic': '\u064B', - 'fbopomofo': '\u3108', - 'fcircle': '\u24D5', - 'fdotaccent': '\u1E1F', - 'feharabic': '\u0641', - 'feharmenian': '\u0586', - 'fehfinalarabic': '\uFED2', - 'fehinitialarabic': '\uFED3', - 'fehmedialarabic': '\uFED4', - 'feicoptic': '\u03E5', - 'female': '\u2640', - 'ff': '\uFB00', - 'ffi': '\uFB03', - 'ffl': '\uFB04', - 'fi': '\uFB01', - 'fifteencircle': '\u246E', - 'fifteenparen': '\u2482', - 'fifteenperiod': '\u2496', - 'figuredash': '\u2012', - 'filledbox': '\u25A0', - 'filledrect': '\u25AC', - 'finalkaf': '\u05DA', - 'finalkafdagesh': '\uFB3A', - 'finalkafdageshhebrew': '\uFB3A', - 'finalkafhebrew': '\u05DA', - 'finalkafqamats': '\u05DA\u05B8', - 'finalkafqamatshebrew': '\u05DA\u05B8', - 'finalkafsheva': '\u05DA\u05B0', - 'finalkafshevahebrew': '\u05DA\u05B0', - 'finalmem': '\u05DD', - 'finalmemhebrew': '\u05DD', - 'finalnun': '\u05DF', - 'finalnunhebrew': '\u05DF', - 'finalpe': '\u05E3', - 'finalpehebrew': '\u05E3', - 'finaltsadi': '\u05E5', - 'finaltsadihebrew': '\u05E5', - 'firsttonechinese': '\u02C9', - 'fisheye': '\u25C9', - 'fitacyrillic': '\u0473', - 'five': '\u0035', - 'fivearabic': '\u0665', - 'fivebengali': '\u09EB', - 'fivecircle': '\u2464', - 'fivecircleinversesansserif': '\u278E', - 'fivedeva': '\u096B', - 'fiveeighths': '\u215D', - 'fivegujarati': '\u0AEB', - 'fivegurmukhi': '\u0A6B', - 'fivehackarabic': '\u0665', - 'fivehangzhou': '\u3025', - 'fiveideographicparen': '\u3224', - 'fiveinferior': '\u2085', - 'fivemonospace': '\uFF15', - 'fiveoldstyle': '\uF735', - 'fiveparen': '\u2478', - 'fiveperiod': '\u248C', - 'fivepersian': '\u06F5', - 'fiveroman': '\u2174', - 'fivesuperior': '\u2075', - 'fivethai': '\u0E55', - 'fl': '\uFB02', - 'florin': '\u0192', - 'fmonospace': '\uFF46', - 'fmsquare': '\u3399', - 'fofanthai': '\u0E1F', - 'fofathai': '\u0E1D', - 'fongmanthai': '\u0E4F', - 'forall': '\u2200', - 'four': '\u0034', - 'fourarabic': '\u0664', - 'fourbengali': '\u09EA', - 'fourcircle': '\u2463', - 'fourcircleinversesansserif': '\u278D', - 'fourdeva': '\u096A', - 'fourgujarati': '\u0AEA', - 'fourgurmukhi': '\u0A6A', - 'fourhackarabic': '\u0664', - 'fourhangzhou': '\u3024', - 'fourideographicparen': '\u3223', - 'fourinferior': '\u2084', - 'fourmonospace': '\uFF14', - 'fournumeratorbengali': '\u09F7', - 'fouroldstyle': '\uF734', - 'fourparen': '\u2477', - 'fourperiod': '\u248B', - 'fourpersian': '\u06F4', - 'fourroman': '\u2173', - 'foursuperior': '\u2074', - 'fourteencircle': '\u246D', - 'fourteenparen': '\u2481', - 'fourteenperiod': '\u2495', - 'fourthai': '\u0E54', - 'fourthtonechinese': '\u02CB', - 'fparen': '\u24A1', - 'fraction': '\u2044', - 'franc': '\u20A3', - 'g': '\u0067', - 'gabengali': '\u0997', - 'gacute': '\u01F5', - 'gadeva': '\u0917', - 'gafarabic': '\u06AF', - 'gaffinalarabic': '\uFB93', - 'gafinitialarabic': '\uFB94', - 'gafmedialarabic': '\uFB95', - 'gagujarati': '\u0A97', - 'gagurmukhi': '\u0A17', - 'gahiragana': '\u304C', - 'gakatakana': '\u30AC', - 'gamma': '\u03B3', - 'gammalatinsmall': '\u0263', - 'gammasuperior': '\u02E0', - 'gangiacoptic': '\u03EB', - 'gbopomofo': '\u310D', - 'gbreve': '\u011F', - 'gcaron': '\u01E7', - 'gcedilla': '\u0123', - 'gcircle': '\u24D6', - 'gcircumflex': '\u011D', - 'gcommaaccent': '\u0123', - 'gdot': '\u0121', - 'gdotaccent': '\u0121', - 'gecyrillic': '\u0433', - 'gehiragana': '\u3052', - 'gekatakana': '\u30B2', - 'geometricallyequal': '\u2251', - 'gereshaccenthebrew': '\u059C', - 'gereshhebrew': '\u05F3', - 'gereshmuqdamhebrew': '\u059D', - 'germandbls': '\u00DF', - 'gershayimaccenthebrew': '\u059E', - 'gershayimhebrew': '\u05F4', - 'getamark': '\u3013', - 'ghabengali': '\u0998', - 'ghadarmenian': '\u0572', - 'ghadeva': '\u0918', - 'ghagujarati': '\u0A98', - 'ghagurmukhi': '\u0A18', - 'ghainarabic': '\u063A', - 'ghainfinalarabic': '\uFECE', - 'ghaininitialarabic': '\uFECF', - 'ghainmedialarabic': '\uFED0', - 'ghemiddlehookcyrillic': '\u0495', - 'ghestrokecyrillic': '\u0493', - 'gheupturncyrillic': '\u0491', - 'ghhadeva': '\u095A', - 'ghhagurmukhi': '\u0A5A', - 'ghook': '\u0260', - 'ghzsquare': '\u3393', - 'gihiragana': '\u304E', - 'gikatakana': '\u30AE', - 'gimarmenian': '\u0563', - 'gimel': '\u05D2', - 'gimeldagesh': '\uFB32', - 'gimeldageshhebrew': '\uFB32', - 'gimelhebrew': '\u05D2', - 'gjecyrillic': '\u0453', - 'glottalinvertedstroke': '\u01BE', - 'glottalstop': '\u0294', - 'glottalstopinverted': '\u0296', - 'glottalstopmod': '\u02C0', - 'glottalstopreversed': '\u0295', - 'glottalstopreversedmod': '\u02C1', - 'glottalstopreversedsuperior': '\u02E4', - 'glottalstopstroke': '\u02A1', - 'glottalstopstrokereversed': '\u02A2', - 'gmacron': '\u1E21', - 'gmonospace': '\uFF47', - 'gohiragana': '\u3054', - 'gokatakana': '\u30B4', - 'gparen': '\u24A2', - 'gpasquare': '\u33AC', - 'gradient': '\u2207', - 'grave': '\u0060', - 'gravebelowcmb': '\u0316', - 'gravecmb': '\u0300', - 'gravecomb': '\u0300', - 'gravedeva': '\u0953', - 'gravelowmod': '\u02CE', - 'gravemonospace': '\uFF40', - 'gravetonecmb': '\u0340', - 'greater': '\u003E', - 'greaterequal': '\u2265', - 'greaterequalorless': '\u22DB', - 'greatermonospace': '\uFF1E', - 'greaterorequivalent': '\u2273', - 'greaterorless': '\u2277', - 'greateroverequal': '\u2267', - 'greatersmall': '\uFE65', - 'gscript': '\u0261', - 'gstroke': '\u01E5', - 'guhiragana': '\u3050', - 'guillemotleft': '\u00AB', - 'guillemotright': '\u00BB', - 'guilsinglleft': '\u2039', - 'guilsinglright': '\u203A', - 'gukatakana': '\u30B0', - 'guramusquare': '\u3318', - 'gysquare': '\u33C9', - 'h': '\u0068', - 'haabkhasiancyrillic': '\u04A9', - 'haaltonearabic': '\u06C1', - 'habengali': '\u09B9', - 'hadescendercyrillic': '\u04B3', - 'hadeva': '\u0939', - 'hagujarati': '\u0AB9', - 'hagurmukhi': '\u0A39', - 'haharabic': '\u062D', - 'hahfinalarabic': '\uFEA2', - 'hahinitialarabic': '\uFEA3', - 'hahiragana': '\u306F', - 'hahmedialarabic': '\uFEA4', - 'haitusquare': '\u332A', - 'hakatakana': '\u30CF', - 'hakatakanahalfwidth': '\uFF8A', - 'halantgurmukhi': '\u0A4D', - 'hamzaarabic': '\u0621', - 'hamzadammaarabic': '\u0621\u064F', - 'hamzadammatanarabic': '\u0621\u064C', - 'hamzafathaarabic': '\u0621\u064E', - 'hamzafathatanarabic': '\u0621\u064B', - 'hamzalowarabic': '\u0621', - 'hamzalowkasraarabic': '\u0621\u0650', - 'hamzalowkasratanarabic': '\u0621\u064D', - 'hamzasukunarabic': '\u0621\u0652', - 'hangulfiller': '\u3164', - 'hardsigncyrillic': '\u044A', - 'harpoonleftbarbup': '\u21BC', - 'harpoonrightbarbup': '\u21C0', - 'hasquare': '\u33CA', - 'hatafpatah': '\u05B2', - 'hatafpatah16': '\u05B2', - 'hatafpatah23': '\u05B2', - 'hatafpatah2f': '\u05B2', - 'hatafpatahhebrew': '\u05B2', - 'hatafpatahnarrowhebrew': '\u05B2', - 'hatafpatahquarterhebrew': '\u05B2', - 'hatafpatahwidehebrew': '\u05B2', - 'hatafqamats': '\u05B3', - 'hatafqamats1b': '\u05B3', - 'hatafqamats28': '\u05B3', - 'hatafqamats34': '\u05B3', - 'hatafqamatshebrew': '\u05B3', - 'hatafqamatsnarrowhebrew': '\u05B3', - 'hatafqamatsquarterhebrew': '\u05B3', - 'hatafqamatswidehebrew': '\u05B3', - 'hatafsegol': '\u05B1', - 'hatafsegol17': '\u05B1', - 'hatafsegol24': '\u05B1', - 'hatafsegol30': '\u05B1', - 'hatafsegolhebrew': '\u05B1', - 'hatafsegolnarrowhebrew': '\u05B1', - 'hatafsegolquarterhebrew': '\u05B1', - 'hatafsegolwidehebrew': '\u05B1', - 'hbar': '\u0127', - 'hbopomofo': '\u310F', - 'hbrevebelow': '\u1E2B', - 'hcedilla': '\u1E29', - 'hcircle': '\u24D7', - 'hcircumflex': '\u0125', - 'hdieresis': '\u1E27', - 'hdotaccent': '\u1E23', - 'hdotbelow': '\u1E25', - 'he': '\u05D4', - 'heart': '\u2665', - 'heartsuitblack': '\u2665', - 'heartsuitwhite': '\u2661', - 'hedagesh': '\uFB34', - 'hedageshhebrew': '\uFB34', - 'hehaltonearabic': '\u06C1', - 'heharabic': '\u0647', - 'hehebrew': '\u05D4', - 'hehfinalaltonearabic': '\uFBA7', - 'hehfinalalttwoarabic': '\uFEEA', - 'hehfinalarabic': '\uFEEA', - 'hehhamzaabovefinalarabic': '\uFBA5', - 'hehhamzaaboveisolatedarabic': '\uFBA4', - 'hehinitialaltonearabic': '\uFBA8', - 'hehinitialarabic': '\uFEEB', - 'hehiragana': '\u3078', - 'hehmedialaltonearabic': '\uFBA9', - 'hehmedialarabic': '\uFEEC', - 'heiseierasquare': '\u337B', - 'hekatakana': '\u30D8', - 'hekatakanahalfwidth': '\uFF8D', - 'hekutaarusquare': '\u3336', - 'henghook': '\u0267', - 'herutusquare': '\u3339', - 'het': '\u05D7', - 'hethebrew': '\u05D7', - 'hhook': '\u0266', - 'hhooksuperior': '\u02B1', - 'hieuhacirclekorean': '\u327B', - 'hieuhaparenkorean': '\u321B', - 'hieuhcirclekorean': '\u326D', - 'hieuhkorean': '\u314E', - 'hieuhparenkorean': '\u320D', - 'hihiragana': '\u3072', - 'hikatakana': '\u30D2', - 'hikatakanahalfwidth': '\uFF8B', - 'hiriq': '\u05B4', - 'hiriq14': '\u05B4', - 'hiriq21': '\u05B4', - 'hiriq2d': '\u05B4', - 'hiriqhebrew': '\u05B4', - 'hiriqnarrowhebrew': '\u05B4', - 'hiriqquarterhebrew': '\u05B4', - 'hiriqwidehebrew': '\u05B4', - 'hlinebelow': '\u1E96', - 'hmonospace': '\uFF48', - 'hoarmenian': '\u0570', - 'hohipthai': '\u0E2B', - 'hohiragana': '\u307B', - 'hokatakana': '\u30DB', - 'hokatakanahalfwidth': '\uFF8E', - 'holam': '\u05B9', - 'holam19': '\u05B9', - 'holam26': '\u05B9', - 'holam32': '\u05B9', - 'holamhebrew': '\u05B9', - 'holamnarrowhebrew': '\u05B9', - 'holamquarterhebrew': '\u05B9', - 'holamwidehebrew': '\u05B9', - 'honokhukthai': '\u0E2E', - 'hookabovecomb': '\u0309', - 'hookcmb': '\u0309', - 'hookpalatalizedbelowcmb': '\u0321', - 'hookretroflexbelowcmb': '\u0322', - 'hoonsquare': '\u3342', - 'horicoptic': '\u03E9', - 'horizontalbar': '\u2015', - 'horncmb': '\u031B', - 'hotsprings': '\u2668', - 'house': '\u2302', - 'hparen': '\u24A3', - 'hsuperior': '\u02B0', - 'hturned': '\u0265', - 'huhiragana': '\u3075', - 'huiitosquare': '\u3333', - 'hukatakana': '\u30D5', - 'hukatakanahalfwidth': '\uFF8C', - 'hungarumlaut': '\u02DD', - 'hungarumlautcmb': '\u030B', - 'hv': '\u0195', - 'hyphen': '\u002D', - 'hypheninferior': '\uF6E5', - 'hyphenmonospace': '\uFF0D', - 'hyphensmall': '\uFE63', - 'hyphensuperior': '\uF6E6', - 'hyphentwo': '\u2010', - 'i': '\u0069', - 'iacute': '\u00ED', - 'iacyrillic': '\u044F', - 'ibengali': '\u0987', - 'ibopomofo': '\u3127', - 'ibreve': '\u012D', - 'icaron': '\u01D0', - 'icircle': '\u24D8', - 'icircumflex': '\u00EE', - 'icyrillic': '\u0456', - 'idblgrave': '\u0209', - 'ideographearthcircle': '\u328F', - 'ideographfirecircle': '\u328B', - 'ideographicallianceparen': '\u323F', - 'ideographiccallparen': '\u323A', - 'ideographiccentrecircle': '\u32A5', - 'ideographicclose': '\u3006', - 'ideographiccomma': '\u3001', - 'ideographiccommaleft': '\uFF64', - 'ideographiccongratulationparen': '\u3237', - 'ideographiccorrectcircle': '\u32A3', - 'ideographicearthparen': '\u322F', - 'ideographicenterpriseparen': '\u323D', - 'ideographicexcellentcircle': '\u329D', - 'ideographicfestivalparen': '\u3240', - 'ideographicfinancialcircle': '\u3296', - 'ideographicfinancialparen': '\u3236', - 'ideographicfireparen': '\u322B', - 'ideographichaveparen': '\u3232', - 'ideographichighcircle': '\u32A4', - 'ideographiciterationmark': '\u3005', - 'ideographiclaborcircle': '\u3298', - 'ideographiclaborparen': '\u3238', - 'ideographicleftcircle': '\u32A7', - 'ideographiclowcircle': '\u32A6', - 'ideographicmedicinecircle': '\u32A9', - 'ideographicmetalparen': '\u322E', - 'ideographicmoonparen': '\u322A', - 'ideographicnameparen': '\u3234', - 'ideographicperiod': '\u3002', - 'ideographicprintcircle': '\u329E', - 'ideographicreachparen': '\u3243', - 'ideographicrepresentparen': '\u3239', - 'ideographicresourceparen': '\u323E', - 'ideographicrightcircle': '\u32A8', - 'ideographicsecretcircle': '\u3299', - 'ideographicselfparen': '\u3242', - 'ideographicsocietyparen': '\u3233', - 'ideographicspace': '\u3000', - 'ideographicspecialparen': '\u3235', - 'ideographicstockparen': '\u3231', - 'ideographicstudyparen': '\u323B', - 'ideographicsunparen': '\u3230', - 'ideographicsuperviseparen': '\u323C', - 'ideographicwaterparen': '\u322C', - 'ideographicwoodparen': '\u322D', - 'ideographiczero': '\u3007', - 'ideographmetalcircle': '\u328E', - 'ideographmooncircle': '\u328A', - 'ideographnamecircle': '\u3294', - 'ideographsuncircle': '\u3290', - 'ideographwatercircle': '\u328C', - 'ideographwoodcircle': '\u328D', - 'ideva': '\u0907', - 'idieresis': '\u00EF', - 'idieresisacute': '\u1E2F', - 'idieresiscyrillic': '\u04E5', - 'idotbelow': '\u1ECB', - 'iebrevecyrillic': '\u04D7', - 'iecyrillic': '\u0435', - 'ieungacirclekorean': '\u3275', - 'ieungaparenkorean': '\u3215', - 'ieungcirclekorean': '\u3267', - 'ieungkorean': '\u3147', - 'ieungparenkorean': '\u3207', - 'igrave': '\u00EC', - 'igujarati': '\u0A87', - 'igurmukhi': '\u0A07', - 'ihiragana': '\u3044', - 'ihookabove': '\u1EC9', - 'iibengali': '\u0988', - 'iicyrillic': '\u0438', - 'iideva': '\u0908', - 'iigujarati': '\u0A88', - 'iigurmukhi': '\u0A08', - 'iimatragurmukhi': '\u0A40', - 'iinvertedbreve': '\u020B', - 'iishortcyrillic': '\u0439', - 'iivowelsignbengali': '\u09C0', - 'iivowelsigndeva': '\u0940', - 'iivowelsigngujarati': '\u0AC0', - 'ij': '\u0133', - 'ikatakana': '\u30A4', - 'ikatakanahalfwidth': '\uFF72', - 'ikorean': '\u3163', - 'ilde': '\u02DC', - 'iluyhebrew': '\u05AC', - 'imacron': '\u012B', - 'imacroncyrillic': '\u04E3', - 'imageorapproximatelyequal': '\u2253', - 'imatragurmukhi': '\u0A3F', - 'imonospace': '\uFF49', - 'increment': '\u2206', - 'infinity': '\u221E', - 'iniarmenian': '\u056B', - 'integral': '\u222B', - 'integralbottom': '\u2321', - 'integralbt': '\u2321', - 'integralex': '\uF8F5', - 'integraltop': '\u2320', - 'integraltp': '\u2320', - 'intersection': '\u2229', - 'intisquare': '\u3305', - 'invbullet': '\u25D8', - 'invcircle': '\u25D9', - 'invsmileface': '\u263B', - 'iocyrillic': '\u0451', - 'iogonek': '\u012F', - 'iota': '\u03B9', - 'iotadieresis': '\u03CA', - 'iotadieresistonos': '\u0390', - 'iotalatin': '\u0269', - 'iotatonos': '\u03AF', - 'iparen': '\u24A4', - 'irigurmukhi': '\u0A72', - 'ismallhiragana': '\u3043', - 'ismallkatakana': '\u30A3', - 'ismallkatakanahalfwidth': '\uFF68', - 'issharbengali': '\u09FA', - 'istroke': '\u0268', - 'isuperior': '\uF6ED', - 'iterationhiragana': '\u309D', - 'iterationkatakana': '\u30FD', - 'itilde': '\u0129', - 'itildebelow': '\u1E2D', - 'iubopomofo': '\u3129', - 'iucyrillic': '\u044E', - 'ivowelsignbengali': '\u09BF', - 'ivowelsigndeva': '\u093F', - 'ivowelsigngujarati': '\u0ABF', - 'izhitsacyrillic': '\u0475', - 'izhitsadblgravecyrillic': '\u0477', - 'j': '\u006A', - 'jaarmenian': '\u0571', - 'jabengali': '\u099C', - 'jadeva': '\u091C', - 'jagujarati': '\u0A9C', - 'jagurmukhi': '\u0A1C', - 'jbopomofo': '\u3110', - 'jcaron': '\u01F0', - 'jcircle': '\u24D9', - 'jcircumflex': '\u0135', - 'jcrossedtail': '\u029D', - 'jdotlessstroke': '\u025F', - 'jecyrillic': '\u0458', - 'jeemarabic': '\u062C', - 'jeemfinalarabic': '\uFE9E', - 'jeeminitialarabic': '\uFE9F', - 'jeemmedialarabic': '\uFEA0', - 'jeharabic': '\u0698', - 'jehfinalarabic': '\uFB8B', - 'jhabengali': '\u099D', - 'jhadeva': '\u091D', - 'jhagujarati': '\u0A9D', - 'jhagurmukhi': '\u0A1D', - 'jheharmenian': '\u057B', - 'jis': '\u3004', - 'jmonospace': '\uFF4A', - 'jparen': '\u24A5', - 'jsuperior': '\u02B2', - 'k': '\u006B', - 'kabashkircyrillic': '\u04A1', - 'kabengali': '\u0995', - 'kacute': '\u1E31', - 'kacyrillic': '\u043A', - 'kadescendercyrillic': '\u049B', - 'kadeva': '\u0915', - 'kaf': '\u05DB', - 'kafarabic': '\u0643', - 'kafdagesh': '\uFB3B', - 'kafdageshhebrew': '\uFB3B', - 'kaffinalarabic': '\uFEDA', - 'kafhebrew': '\u05DB', - 'kafinitialarabic': '\uFEDB', - 'kafmedialarabic': '\uFEDC', - 'kafrafehebrew': '\uFB4D', - 'kagujarati': '\u0A95', - 'kagurmukhi': '\u0A15', - 'kahiragana': '\u304B', - 'kahookcyrillic': '\u04C4', - 'kakatakana': '\u30AB', - 'kakatakanahalfwidth': '\uFF76', - 'kappa': '\u03BA', - 'kappasymbolgreek': '\u03F0', - 'kapyeounmieumkorean': '\u3171', - 'kapyeounphieuphkorean': '\u3184', - 'kapyeounpieupkorean': '\u3178', - 'kapyeounssangpieupkorean': '\u3179', - 'karoriisquare': '\u330D', - 'kashidaautoarabic': '\u0640', - 'kashidaautonosidebearingarabic': '\u0640', - 'kasmallkatakana': '\u30F5', - 'kasquare': '\u3384', - 'kasraarabic': '\u0650', - 'kasratanarabic': '\u064D', - 'kastrokecyrillic': '\u049F', - 'katahiraprolongmarkhalfwidth': '\uFF70', - 'kaverticalstrokecyrillic': '\u049D', - 'kbopomofo': '\u310E', - 'kcalsquare': '\u3389', - 'kcaron': '\u01E9', - 'kcedilla': '\u0137', - 'kcircle': '\u24DA', - 'kcommaaccent': '\u0137', - 'kdotbelow': '\u1E33', - 'keharmenian': '\u0584', - 'kehiragana': '\u3051', - 'kekatakana': '\u30B1', - 'kekatakanahalfwidth': '\uFF79', - 'kenarmenian': '\u056F', - 'kesmallkatakana': '\u30F6', - 'kgreenlandic': '\u0138', - 'khabengali': '\u0996', - 'khacyrillic': '\u0445', - 'khadeva': '\u0916', - 'khagujarati': '\u0A96', - 'khagurmukhi': '\u0A16', - 'khaharabic': '\u062E', - 'khahfinalarabic': '\uFEA6', - 'khahinitialarabic': '\uFEA7', - 'khahmedialarabic': '\uFEA8', - 'kheicoptic': '\u03E7', - 'khhadeva': '\u0959', - 'khhagurmukhi': '\u0A59', - 'khieukhacirclekorean': '\u3278', - 'khieukhaparenkorean': '\u3218', - 'khieukhcirclekorean': '\u326A', - 'khieukhkorean': '\u314B', - 'khieukhparenkorean': '\u320A', - 'khokhaithai': '\u0E02', - 'khokhonthai': '\u0E05', - 'khokhuatthai': '\u0E03', - 'khokhwaithai': '\u0E04', - 'khomutthai': '\u0E5B', - 'khook': '\u0199', - 'khorakhangthai': '\u0E06', - 'khzsquare': '\u3391', - 'kihiragana': '\u304D', - 'kikatakana': '\u30AD', - 'kikatakanahalfwidth': '\uFF77', - 'kiroguramusquare': '\u3315', - 'kiromeetorusquare': '\u3316', - 'kirosquare': '\u3314', - 'kiyeokacirclekorean': '\u326E', - 'kiyeokaparenkorean': '\u320E', - 'kiyeokcirclekorean': '\u3260', - 'kiyeokkorean': '\u3131', - 'kiyeokparenkorean': '\u3200', - 'kiyeoksioskorean': '\u3133', - 'kjecyrillic': '\u045C', - 'klinebelow': '\u1E35', - 'klsquare': '\u3398', - 'kmcubedsquare': '\u33A6', - 'kmonospace': '\uFF4B', - 'kmsquaredsquare': '\u33A2', - 'kohiragana': '\u3053', - 'kohmsquare': '\u33C0', - 'kokaithai': '\u0E01', - 'kokatakana': '\u30B3', - 'kokatakanahalfwidth': '\uFF7A', - 'kooposquare': '\u331E', - 'koppacyrillic': '\u0481', - 'koreanstandardsymbol': '\u327F', - 'koroniscmb': '\u0343', - 'kparen': '\u24A6', - 'kpasquare': '\u33AA', - 'ksicyrillic': '\u046F', - 'ktsquare': '\u33CF', - 'kturned': '\u029E', - 'kuhiragana': '\u304F', - 'kukatakana': '\u30AF', - 'kukatakanahalfwidth': '\uFF78', - 'kvsquare': '\u33B8', - 'kwsquare': '\u33BE', - 'l': '\u006C', - 'labengali': '\u09B2', - 'lacute': '\u013A', - 'ladeva': '\u0932', - 'lagujarati': '\u0AB2', - 'lagurmukhi': '\u0A32', - 'lakkhangyaothai': '\u0E45', - 'lamaleffinalarabic': '\uFEFC', - 'lamalefhamzaabovefinalarabic': '\uFEF8', - 'lamalefhamzaaboveisolatedarabic': '\uFEF7', - 'lamalefhamzabelowfinalarabic': '\uFEFA', - 'lamalefhamzabelowisolatedarabic': '\uFEF9', - 'lamalefisolatedarabic': '\uFEFB', - 'lamalefmaddaabovefinalarabic': '\uFEF6', - 'lamalefmaddaaboveisolatedarabic': '\uFEF5', - 'lamarabic': '\u0644', - 'lambda': '\u03BB', - 'lambdastroke': '\u019B', - 'lamed': '\u05DC', - 'lameddagesh': '\uFB3C', - 'lameddageshhebrew': '\uFB3C', - 'lamedhebrew': '\u05DC', - 'lamedholam': '\u05DC\u05B9', - 'lamedholamdagesh': '\u05DC\u05B9\u05BC', - 'lamedholamdageshhebrew': '\u05DC\u05B9\u05BC', - 'lamedholamhebrew': '\u05DC\u05B9', - 'lamfinalarabic': '\uFEDE', - 'lamhahinitialarabic': '\uFCCA', - 'laminitialarabic': '\uFEDF', - 'lamjeeminitialarabic': '\uFCC9', - 'lamkhahinitialarabic': '\uFCCB', - 'lamlamhehisolatedarabic': '\uFDF2', - 'lammedialarabic': '\uFEE0', - 'lammeemhahinitialarabic': '\uFD88', - 'lammeeminitialarabic': '\uFCCC', - 'lammeemjeeminitialarabic': '\uFEDF\uFEE4\uFEA0', - 'lammeemkhahinitialarabic': '\uFEDF\uFEE4\uFEA8', - 'largecircle': '\u25EF', - 'lbar': '\u019A', - 'lbelt': '\u026C', - 'lbopomofo': '\u310C', - 'lcaron': '\u013E', - 'lcedilla': '\u013C', - 'lcircle': '\u24DB', - 'lcircumflexbelow': '\u1E3D', - 'lcommaaccent': '\u013C', - 'ldot': '\u0140', - 'ldotaccent': '\u0140', - 'ldotbelow': '\u1E37', - 'ldotbelowmacron': '\u1E39', - 'leftangleabovecmb': '\u031A', - 'lefttackbelowcmb': '\u0318', - 'less': '\u003C', - 'lessequal': '\u2264', - 'lessequalorgreater': '\u22DA', - 'lessmonospace': '\uFF1C', - 'lessorequivalent': '\u2272', - 'lessorgreater': '\u2276', - 'lessoverequal': '\u2266', - 'lesssmall': '\uFE64', - 'lezh': '\u026E', - 'lfblock': '\u258C', - 'lhookretroflex': '\u026D', - 'lira': '\u20A4', - 'liwnarmenian': '\u056C', - 'lj': '\u01C9', - 'ljecyrillic': '\u0459', - 'll': '\uF6C0', - 'lladeva': '\u0933', - 'llagujarati': '\u0AB3', - 'llinebelow': '\u1E3B', - 'llladeva': '\u0934', - 'llvocalicbengali': '\u09E1', - 'llvocalicdeva': '\u0961', - 'llvocalicvowelsignbengali': '\u09E3', - 'llvocalicvowelsigndeva': '\u0963', - 'lmiddletilde': '\u026B', - 'lmonospace': '\uFF4C', - 'lmsquare': '\u33D0', - 'lochulathai': '\u0E2C', - 'logicaland': '\u2227', - 'logicalnot': '\u00AC', - 'logicalnotreversed': '\u2310', - 'logicalor': '\u2228', - 'lolingthai': '\u0E25', - 'longs': '\u017F', - 'lowlinecenterline': '\uFE4E', - 'lowlinecmb': '\u0332', - 'lowlinedashed': '\uFE4D', - 'lozenge': '\u25CA', - 'lparen': '\u24A7', - 'lslash': '\u0142', - 'lsquare': '\u2113', - 'lsuperior': '\uF6EE', - 'ltshade': '\u2591', - 'luthai': '\u0E26', - 'lvocalicbengali': '\u098C', - 'lvocalicdeva': '\u090C', - 'lvocalicvowelsignbengali': '\u09E2', - 'lvocalicvowelsigndeva': '\u0962', - 'lxsquare': '\u33D3', - 'm': '\u006D', - 'mabengali': '\u09AE', - 'macron': '\u00AF', - 'macronbelowcmb': '\u0331', - 'macroncmb': '\u0304', - 'macronlowmod': '\u02CD', - 'macronmonospace': '\uFFE3', - 'macute': '\u1E3F', - 'madeva': '\u092E', - 'magujarati': '\u0AAE', - 'magurmukhi': '\u0A2E', - 'mahapakhhebrew': '\u05A4', - 'mahapakhlefthebrew': '\u05A4', - 'mahiragana': '\u307E', - 'maichattawalowleftthai': '\uF895', - 'maichattawalowrightthai': '\uF894', - 'maichattawathai': '\u0E4B', - 'maichattawaupperleftthai': '\uF893', - 'maieklowleftthai': '\uF88C', - 'maieklowrightthai': '\uF88B', - 'maiekthai': '\u0E48', - 'maiekupperleftthai': '\uF88A', - 'maihanakatleftthai': '\uF884', - 'maihanakatthai': '\u0E31', - 'maitaikhuleftthai': '\uF889', - 'maitaikhuthai': '\u0E47', - 'maitholowleftthai': '\uF88F', - 'maitholowrightthai': '\uF88E', - 'maithothai': '\u0E49', - 'maithoupperleftthai': '\uF88D', - 'maitrilowleftthai': '\uF892', - 'maitrilowrightthai': '\uF891', - 'maitrithai': '\u0E4A', - 'maitriupperleftthai': '\uF890', - 'maiyamokthai': '\u0E46', - 'makatakana': '\u30DE', - 'makatakanahalfwidth': '\uFF8F', - 'male': '\u2642', - 'mansyonsquare': '\u3347', - 'maqafhebrew': '\u05BE', - 'mars': '\u2642', - 'masoracirclehebrew': '\u05AF', - 'masquare': '\u3383', - 'mbopomofo': '\u3107', - 'mbsquare': '\u33D4', - 'mcircle': '\u24DC', - 'mcubedsquare': '\u33A5', - 'mdotaccent': '\u1E41', - 'mdotbelow': '\u1E43', - 'meemarabic': '\u0645', - 'meemfinalarabic': '\uFEE2', - 'meeminitialarabic': '\uFEE3', - 'meemmedialarabic': '\uFEE4', - 'meemmeeminitialarabic': '\uFCD1', - 'meemmeemisolatedarabic': '\uFC48', - 'meetorusquare': '\u334D', - 'mehiragana': '\u3081', - 'meizierasquare': '\u337E', - 'mekatakana': '\u30E1', - 'mekatakanahalfwidth': '\uFF92', - 'mem': '\u05DE', - 'memdagesh': '\uFB3E', - 'memdageshhebrew': '\uFB3E', - 'memhebrew': '\u05DE', - 'menarmenian': '\u0574', - 'merkhahebrew': '\u05A5', - 'merkhakefulahebrew': '\u05A6', - 'merkhakefulalefthebrew': '\u05A6', - 'merkhalefthebrew': '\u05A5', - 'mhook': '\u0271', - 'mhzsquare': '\u3392', - 'middledotkatakanahalfwidth': '\uFF65', - 'middot': '\u00B7', - 'mieumacirclekorean': '\u3272', - 'mieumaparenkorean': '\u3212', - 'mieumcirclekorean': '\u3264', - 'mieumkorean': '\u3141', - 'mieumpansioskorean': '\u3170', - 'mieumparenkorean': '\u3204', - 'mieumpieupkorean': '\u316E', - 'mieumsioskorean': '\u316F', - 'mihiragana': '\u307F', - 'mikatakana': '\u30DF', - 'mikatakanahalfwidth': '\uFF90', - 'minus': '\u2212', - 'minusbelowcmb': '\u0320', - 'minuscircle': '\u2296', - 'minusmod': '\u02D7', - 'minusplus': '\u2213', - 'minute': '\u2032', - 'miribaarusquare': '\u334A', - 'mirisquare': '\u3349', - 'mlonglegturned': '\u0270', - 'mlsquare': '\u3396', - 'mmcubedsquare': '\u33A3', - 'mmonospace': '\uFF4D', - 'mmsquaredsquare': '\u339F', - 'mohiragana': '\u3082', - 'mohmsquare': '\u33C1', - 'mokatakana': '\u30E2', - 'mokatakanahalfwidth': '\uFF93', - 'molsquare': '\u33D6', - 'momathai': '\u0E21', - 'moverssquare': '\u33A7', - 'moverssquaredsquare': '\u33A8', - 'mparen': '\u24A8', - 'mpasquare': '\u33AB', - 'mssquare': '\u33B3', - 'msuperior': '\uF6EF', - 'mturned': '\u026F', - 'mu': '\u00B5', - 'mu1': '\u00B5', - 'muasquare': '\u3382', - 'muchgreater': '\u226B', - 'muchless': '\u226A', - 'mufsquare': '\u338C', - 'mugreek': '\u03BC', - 'mugsquare': '\u338D', - 'muhiragana': '\u3080', - 'mukatakana': '\u30E0', - 'mukatakanahalfwidth': '\uFF91', - 'mulsquare': '\u3395', - 'multiply': '\u00D7', - 'mumsquare': '\u339B', - 'munahhebrew': '\u05A3', - 'munahlefthebrew': '\u05A3', - 'musicalnote': '\u266A', - 'musicalnotedbl': '\u266B', - 'musicflatsign': '\u266D', - 'musicsharpsign': '\u266F', - 'mussquare': '\u33B2', - 'muvsquare': '\u33B6', - 'muwsquare': '\u33BC', - 'mvmegasquare': '\u33B9', - 'mvsquare': '\u33B7', - 'mwmegasquare': '\u33BF', - 'mwsquare': '\u33BD', - 'n': '\u006E', - 'nabengali': '\u09A8', - 'nabla': '\u2207', - 'nacute': '\u0144', - 'nadeva': '\u0928', - 'nagujarati': '\u0AA8', - 'nagurmukhi': '\u0A28', - 'nahiragana': '\u306A', - 'nakatakana': '\u30CA', - 'nakatakanahalfwidth': '\uFF85', - 'napostrophe': '\u0149', - 'nasquare': '\u3381', - 'nbopomofo': '\u310B', - 'nbspace': '\u00A0', - 'ncaron': '\u0148', - 'ncedilla': '\u0146', - 'ncircle': '\u24DD', - 'ncircumflexbelow': '\u1E4B', - 'ncommaaccent': '\u0146', - 'ndotaccent': '\u1E45', - 'ndotbelow': '\u1E47', - 'nehiragana': '\u306D', - 'nekatakana': '\u30CD', - 'nekatakanahalfwidth': '\uFF88', - 'newsheqelsign': '\u20AA', - 'nfsquare': '\u338B', - 'ngabengali': '\u0999', - 'ngadeva': '\u0919', - 'ngagujarati': '\u0A99', - 'ngagurmukhi': '\u0A19', - 'ngonguthai': '\u0E07', - 'nhiragana': '\u3093', - 'nhookleft': '\u0272', - 'nhookretroflex': '\u0273', - 'nieunacirclekorean': '\u326F', - 'nieunaparenkorean': '\u320F', - 'nieuncieuckorean': '\u3135', - 'nieuncirclekorean': '\u3261', - 'nieunhieuhkorean': '\u3136', - 'nieunkorean': '\u3134', - 'nieunpansioskorean': '\u3168', - 'nieunparenkorean': '\u3201', - 'nieunsioskorean': '\u3167', - 'nieuntikeutkorean': '\u3166', - 'nihiragana': '\u306B', - 'nikatakana': '\u30CB', - 'nikatakanahalfwidth': '\uFF86', - 'nikhahitleftthai': '\uF899', - 'nikhahitthai': '\u0E4D', - 'nine': '\u0039', - 'ninearabic': '\u0669', - 'ninebengali': '\u09EF', - 'ninecircle': '\u2468', - 'ninecircleinversesansserif': '\u2792', - 'ninedeva': '\u096F', - 'ninegujarati': '\u0AEF', - 'ninegurmukhi': '\u0A6F', - 'ninehackarabic': '\u0669', - 'ninehangzhou': '\u3029', - 'nineideographicparen': '\u3228', - 'nineinferior': '\u2089', - 'ninemonospace': '\uFF19', - 'nineoldstyle': '\uF739', - 'nineparen': '\u247C', - 'nineperiod': '\u2490', - 'ninepersian': '\u06F9', - 'nineroman': '\u2178', - 'ninesuperior': '\u2079', - 'nineteencircle': '\u2472', - 'nineteenparen': '\u2486', - 'nineteenperiod': '\u249A', - 'ninethai': '\u0E59', - 'nj': '\u01CC', - 'njecyrillic': '\u045A', - 'nkatakana': '\u30F3', - 'nkatakanahalfwidth': '\uFF9D', - 'nlegrightlong': '\u019E', - 'nlinebelow': '\u1E49', - 'nmonospace': '\uFF4E', - 'nmsquare': '\u339A', - 'nnabengali': '\u09A3', - 'nnadeva': '\u0923', - 'nnagujarati': '\u0AA3', - 'nnagurmukhi': '\u0A23', - 'nnnadeva': '\u0929', - 'nohiragana': '\u306E', - 'nokatakana': '\u30CE', - 'nokatakanahalfwidth': '\uFF89', - 'nonbreakingspace': '\u00A0', - 'nonenthai': '\u0E13', - 'nonuthai': '\u0E19', - 'noonarabic': '\u0646', - 'noonfinalarabic': '\uFEE6', - 'noonghunnaarabic': '\u06BA', - 'noonghunnafinalarabic': '\uFB9F', - 'noonhehinitialarabic': '\uFEE7\uFEEC', - 'nooninitialarabic': '\uFEE7', - 'noonjeeminitialarabic': '\uFCD2', - 'noonjeemisolatedarabic': '\uFC4B', - 'noonmedialarabic': '\uFEE8', - 'noonmeeminitialarabic': '\uFCD5', - 'noonmeemisolatedarabic': '\uFC4E', - 'noonnoonfinalarabic': '\uFC8D', - 'notcontains': '\u220C', - 'notelement': '\u2209', - 'notelementof': '\u2209', - 'notequal': '\u2260', - 'notgreater': '\u226F', - 'notgreaternorequal': '\u2271', - 'notgreaternorless': '\u2279', - 'notidentical': '\u2262', - 'notless': '\u226E', - 'notlessnorequal': '\u2270', - 'notparallel': '\u2226', - 'notprecedes': '\u2280', - 'notsubset': '\u2284', - 'notsucceeds': '\u2281', - 'notsuperset': '\u2285', - 'nowarmenian': '\u0576', - 'nparen': '\u24A9', - 'nssquare': '\u33B1', - 'nsuperior': '\u207F', - 'ntilde': '\u00F1', - 'nu': '\u03BD', - 'nuhiragana': '\u306C', - 'nukatakana': '\u30CC', - 'nukatakanahalfwidth': '\uFF87', - 'nuktabengali': '\u09BC', - 'nuktadeva': '\u093C', - 'nuktagujarati': '\u0ABC', - 'nuktagurmukhi': '\u0A3C', - 'numbersign': '\u0023', - 'numbersignmonospace': '\uFF03', - 'numbersignsmall': '\uFE5F', - 'numeralsigngreek': '\u0374', - 'numeralsignlowergreek': '\u0375', - 'numero': '\u2116', - 'nun': '\u05E0', - 'nundagesh': '\uFB40', - 'nundageshhebrew': '\uFB40', - 'nunhebrew': '\u05E0', - 'nvsquare': '\u33B5', - 'nwsquare': '\u33BB', - 'nyabengali': '\u099E', - 'nyadeva': '\u091E', - 'nyagujarati': '\u0A9E', - 'nyagurmukhi': '\u0A1E', - 'o': '\u006F', - 'oacute': '\u00F3', - 'oangthai': '\u0E2D', - 'obarred': '\u0275', - 'obarredcyrillic': '\u04E9', - 'obarreddieresiscyrillic': '\u04EB', - 'obengali': '\u0993', - 'obopomofo': '\u311B', - 'obreve': '\u014F', - 'ocandradeva': '\u0911', - 'ocandragujarati': '\u0A91', - 'ocandravowelsigndeva': '\u0949', - 'ocandravowelsigngujarati': '\u0AC9', - 'ocaron': '\u01D2', - 'ocircle': '\u24DE', - 'ocircumflex': '\u00F4', - 'ocircumflexacute': '\u1ED1', - 'ocircumflexdotbelow': '\u1ED9', - 'ocircumflexgrave': '\u1ED3', - 'ocircumflexhookabove': '\u1ED5', - 'ocircumflextilde': '\u1ED7', - 'ocyrillic': '\u043E', - 'odblacute': '\u0151', - 'odblgrave': '\u020D', - 'odeva': '\u0913', - 'odieresis': '\u00F6', - 'odieresiscyrillic': '\u04E7', - 'odotbelow': '\u1ECD', - 'oe': '\u0153', - 'oekorean': '\u315A', - 'ogonek': '\u02DB', - 'ogonekcmb': '\u0328', - 'ograve': '\u00F2', - 'ogujarati': '\u0A93', - 'oharmenian': '\u0585', - 'ohiragana': '\u304A', - 'ohookabove': '\u1ECF', - 'ohorn': '\u01A1', - 'ohornacute': '\u1EDB', - 'ohorndotbelow': '\u1EE3', - 'ohorngrave': '\u1EDD', - 'ohornhookabove': '\u1EDF', - 'ohorntilde': '\u1EE1', - 'ohungarumlaut': '\u0151', - 'oi': '\u01A3', - 'oinvertedbreve': '\u020F', - 'okatakana': '\u30AA', - 'okatakanahalfwidth': '\uFF75', - 'okorean': '\u3157', - 'olehebrew': '\u05AB', - 'omacron': '\u014D', - 'omacronacute': '\u1E53', - 'omacrongrave': '\u1E51', - 'omdeva': '\u0950', - 'omega': '\u03C9', - 'omega1': '\u03D6', - 'omegacyrillic': '\u0461', - 'omegalatinclosed': '\u0277', - 'omegaroundcyrillic': '\u047B', - 'omegatitlocyrillic': '\u047D', - 'omegatonos': '\u03CE', - 'omgujarati': '\u0AD0', - 'omicron': '\u03BF', - 'omicrontonos': '\u03CC', - 'omonospace': '\uFF4F', - 'one': '\u0031', - 'onearabic': '\u0661', - 'onebengali': '\u09E7', - 'onecircle': '\u2460', - 'onecircleinversesansserif': '\u278A', - 'onedeva': '\u0967', - 'onedotenleader': '\u2024', - 'oneeighth': '\u215B', - 'onefitted': '\uF6DC', - 'onegujarati': '\u0AE7', - 'onegurmukhi': '\u0A67', - 'onehackarabic': '\u0661', - 'onehalf': '\u00BD', - 'onehangzhou': '\u3021', - 'oneideographicparen': '\u3220', - 'oneinferior': '\u2081', - 'onemonospace': '\uFF11', - 'onenumeratorbengali': '\u09F4', - 'oneoldstyle': '\uF731', - 'oneparen': '\u2474', - 'oneperiod': '\u2488', - 'onepersian': '\u06F1', - 'onequarter': '\u00BC', - 'oneroman': '\u2170', - 'onesuperior': '\u00B9', - 'onethai': '\u0E51', - 'onethird': '\u2153', - 'oogonek': '\u01EB', - 'oogonekmacron': '\u01ED', - 'oogurmukhi': '\u0A13', - 'oomatragurmukhi': '\u0A4B', - 'oopen': '\u0254', - 'oparen': '\u24AA', - 'openbullet': '\u25E6', - 'option': '\u2325', - 'ordfeminine': '\u00AA', - 'ordmasculine': '\u00BA', - 'orthogonal': '\u221F', - 'oshortdeva': '\u0912', - 'oshortvowelsigndeva': '\u094A', - 'oslash': '\u00F8', - 'oslashacute': '\u01FF', - 'osmallhiragana': '\u3049', - 'osmallkatakana': '\u30A9', - 'osmallkatakanahalfwidth': '\uFF6B', - 'ostrokeacute': '\u01FF', - 'osuperior': '\uF6F0', - 'otcyrillic': '\u047F', - 'otilde': '\u00F5', - 'otildeacute': '\u1E4D', - 'otildedieresis': '\u1E4F', - 'oubopomofo': '\u3121', - 'overline': '\u203E', - 'overlinecenterline': '\uFE4A', - 'overlinecmb': '\u0305', - 'overlinedashed': '\uFE49', - 'overlinedblwavy': '\uFE4C', - 'overlinewavy': '\uFE4B', - 'overscore': '\u00AF', - 'ovowelsignbengali': '\u09CB', - 'ovowelsigndeva': '\u094B', - 'ovowelsigngujarati': '\u0ACB', - 'p': '\u0070', - 'paampssquare': '\u3380', - 'paasentosquare': '\u332B', - 'pabengali': '\u09AA', - 'pacute': '\u1E55', - 'padeva': '\u092A', - 'pagedown': '\u21DF', - 'pageup': '\u21DE', - 'pagujarati': '\u0AAA', - 'pagurmukhi': '\u0A2A', - 'pahiragana': '\u3071', - 'paiyannoithai': '\u0E2F', - 'pakatakana': '\u30D1', - 'palatalizationcyrilliccmb': '\u0484', - 'palochkacyrillic': '\u04C0', - 'pansioskorean': '\u317F', - 'paragraph': '\u00B6', - 'parallel': '\u2225', - 'parenleft': '\u0028', - 'parenleftaltonearabic': '\uFD3E', - 'parenleftbt': '\uF8ED', - 'parenleftex': '\uF8EC', - 'parenleftinferior': '\u208D', - 'parenleftmonospace': '\uFF08', - 'parenleftsmall': '\uFE59', - 'parenleftsuperior': '\u207D', - 'parenlefttp': '\uF8EB', - 'parenleftvertical': '\uFE35', - 'parenright': '\u0029', - 'parenrightaltonearabic': '\uFD3F', - 'parenrightbt': '\uF8F8', - 'parenrightex': '\uF8F7', - 'parenrightinferior': '\u208E', - 'parenrightmonospace': '\uFF09', - 'parenrightsmall': '\uFE5A', - 'parenrightsuperior': '\u207E', - 'parenrighttp': '\uF8F6', - 'parenrightvertical': '\uFE36', - 'partialdiff': '\u2202', - 'paseqhebrew': '\u05C0', - 'pashtahebrew': '\u0599', - 'pasquare': '\u33A9', - 'patah': '\u05B7', - 'patah11': '\u05B7', - 'patah1d': '\u05B7', - 'patah2a': '\u05B7', - 'patahhebrew': '\u05B7', - 'patahnarrowhebrew': '\u05B7', - 'patahquarterhebrew': '\u05B7', - 'patahwidehebrew': '\u05B7', - 'pazerhebrew': '\u05A1', - 'pbopomofo': '\u3106', - 'pcircle': '\u24DF', - 'pdotaccent': '\u1E57', - 'pe': '\u05E4', - 'pecyrillic': '\u043F', - 'pedagesh': '\uFB44', - 'pedageshhebrew': '\uFB44', - 'peezisquare': '\u333B', - 'pefinaldageshhebrew': '\uFB43', - 'peharabic': '\u067E', - 'peharmenian': '\u057A', - 'pehebrew': '\u05E4', - 'pehfinalarabic': '\uFB57', - 'pehinitialarabic': '\uFB58', - 'pehiragana': '\u307A', - 'pehmedialarabic': '\uFB59', - 'pekatakana': '\u30DA', - 'pemiddlehookcyrillic': '\u04A7', - 'perafehebrew': '\uFB4E', - 'percent': '\u0025', - 'percentarabic': '\u066A', - 'percentmonospace': '\uFF05', - 'percentsmall': '\uFE6A', - 'period': '\u002E', - 'periodarmenian': '\u0589', - 'periodcentered': '\u00B7', - 'periodhalfwidth': '\uFF61', - 'periodinferior': '\uF6E7', - 'periodmonospace': '\uFF0E', - 'periodsmall': '\uFE52', - 'periodsuperior': '\uF6E8', - 'perispomenigreekcmb': '\u0342', - 'perpendicular': '\u22A5', - 'perthousand': '\u2030', - 'peseta': '\u20A7', - 'pfsquare': '\u338A', - 'phabengali': '\u09AB', - 'phadeva': '\u092B', - 'phagujarati': '\u0AAB', - 'phagurmukhi': '\u0A2B', - 'phi': '\u03C6', - 'phi1': '\u03D5', - 'phieuphacirclekorean': '\u327A', - 'phieuphaparenkorean': '\u321A', - 'phieuphcirclekorean': '\u326C', - 'phieuphkorean': '\u314D', - 'phieuphparenkorean': '\u320C', - 'philatin': '\u0278', - 'phinthuthai': '\u0E3A', - 'phisymbolgreek': '\u03D5', - 'phook': '\u01A5', - 'phophanthai': '\u0E1E', - 'phophungthai': '\u0E1C', - 'phosamphaothai': '\u0E20', - 'pi': '\u03C0', - 'pieupacirclekorean': '\u3273', - 'pieupaparenkorean': '\u3213', - 'pieupcieuckorean': '\u3176', - 'pieupcirclekorean': '\u3265', - 'pieupkiyeokkorean': '\u3172', - 'pieupkorean': '\u3142', - 'pieupparenkorean': '\u3205', - 'pieupsioskiyeokkorean': '\u3174', - 'pieupsioskorean': '\u3144', - 'pieupsiostikeutkorean': '\u3175', - 'pieupthieuthkorean': '\u3177', - 'pieuptikeutkorean': '\u3173', - 'pihiragana': '\u3074', - 'pikatakana': '\u30D4', - 'pisymbolgreek': '\u03D6', - 'piwrarmenian': '\u0583', - 'plus': '\u002B', - 'plusbelowcmb': '\u031F', - 'pluscircle': '\u2295', - 'plusminus': '\u00B1', - 'plusmod': '\u02D6', - 'plusmonospace': '\uFF0B', - 'plussmall': '\uFE62', - 'plussuperior': '\u207A', - 'pmonospace': '\uFF50', - 'pmsquare': '\u33D8', - 'pohiragana': '\u307D', - 'pointingindexdownwhite': '\u261F', - 'pointingindexleftwhite': '\u261C', - 'pointingindexrightwhite': '\u261E', - 'pointingindexupwhite': '\u261D', - 'pokatakana': '\u30DD', - 'poplathai': '\u0E1B', - 'postalmark': '\u3012', - 'postalmarkface': '\u3020', - 'pparen': '\u24AB', - 'precedes': '\u227A', - 'prescription': '\u211E', - 'primemod': '\u02B9', - 'primereversed': '\u2035', - 'product': '\u220F', - 'projective': '\u2305', - 'prolongedkana': '\u30FC', - 'propellor': '\u2318', - 'propersubset': '\u2282', - 'propersuperset': '\u2283', - 'proportion': '\u2237', - 'proportional': '\u221D', - 'psi': '\u03C8', - 'psicyrillic': '\u0471', - 'psilipneumatacyrilliccmb': '\u0486', - 'pssquare': '\u33B0', - 'puhiragana': '\u3077', - 'pukatakana': '\u30D7', - 'pvsquare': '\u33B4', - 'pwsquare': '\u33BA', - 'q': '\u0071', - 'qadeva': '\u0958', - 'qadmahebrew': '\u05A8', - 'qafarabic': '\u0642', - 'qaffinalarabic': '\uFED6', - 'qafinitialarabic': '\uFED7', - 'qafmedialarabic': '\uFED8', - 'qamats': '\u05B8', - 'qamats10': '\u05B8', - 'qamats1a': '\u05B8', - 'qamats1c': '\u05B8', - 'qamats27': '\u05B8', - 'qamats29': '\u05B8', - 'qamats33': '\u05B8', - 'qamatsde': '\u05B8', - 'qamatshebrew': '\u05B8', - 'qamatsnarrowhebrew': '\u05B8', - 'qamatsqatanhebrew': '\u05B8', - 'qamatsqatannarrowhebrew': '\u05B8', - 'qamatsqatanquarterhebrew': '\u05B8', - 'qamatsqatanwidehebrew': '\u05B8', - 'qamatsquarterhebrew': '\u05B8', - 'qamatswidehebrew': '\u05B8', - 'qarneyparahebrew': '\u059F', - 'qbopomofo': '\u3111', - 'qcircle': '\u24E0', - 'qhook': '\u02A0', - 'qmonospace': '\uFF51', - 'qof': '\u05E7', - 'qofdagesh': '\uFB47', - 'qofdageshhebrew': '\uFB47', - 'qofhatafpatah': '\u05E7\u05B2', - 'qofhatafpatahhebrew': '\u05E7\u05B2', - 'qofhatafsegol': '\u05E7\u05B1', - 'qofhatafsegolhebrew': '\u05E7\u05B1', - 'qofhebrew': '\u05E7', - 'qofhiriq': '\u05E7\u05B4', - 'qofhiriqhebrew': '\u05E7\u05B4', - 'qofholam': '\u05E7\u05B9', - 'qofholamhebrew': '\u05E7\u05B9', - 'qofpatah': '\u05E7\u05B7', - 'qofpatahhebrew': '\u05E7\u05B7', - 'qofqamats': '\u05E7\u05B8', - 'qofqamatshebrew': '\u05E7\u05B8', - 'qofqubuts': '\u05E7\u05BB', - 'qofqubutshebrew': '\u05E7\u05BB', - 'qofsegol': '\u05E7\u05B6', - 'qofsegolhebrew': '\u05E7\u05B6', - 'qofsheva': '\u05E7\u05B0', - 'qofshevahebrew': '\u05E7\u05B0', - 'qoftsere': '\u05E7\u05B5', - 'qoftserehebrew': '\u05E7\u05B5', - 'qparen': '\u24AC', - 'quarternote': '\u2669', - 'qubuts': '\u05BB', - 'qubuts18': '\u05BB', - 'qubuts25': '\u05BB', - 'qubuts31': '\u05BB', - 'qubutshebrew': '\u05BB', - 'qubutsnarrowhebrew': '\u05BB', - 'qubutsquarterhebrew': '\u05BB', - 'qubutswidehebrew': '\u05BB', - 'question': '\u003F', - 'questionarabic': '\u061F', - 'questionarmenian': '\u055E', - 'questiondown': '\u00BF', - 'questiondownsmall': '\uF7BF', - 'questiongreek': '\u037E', - 'questionmonospace': '\uFF1F', - 'questionsmall': '\uF73F', - 'quotedbl': '\u0022', - 'quotedblbase': '\u201E', - 'quotedblleft': '\u201C', - 'quotedblmonospace': '\uFF02', - 'quotedblprime': '\u301E', - 'quotedblprimereversed': '\u301D', - 'quotedblright': '\u201D', - 'quoteleft': '\u2018', - 'quoteleftreversed': '\u201B', - 'quotereversed': '\u201B', - 'quoteright': '\u2019', - 'quoterightn': '\u0149', - 'quotesinglbase': '\u201A', - 'quotesingle': '\u0027', - 'quotesinglemonospace': '\uFF07', - 'r': '\u0072', - 'raarmenian': '\u057C', - 'rabengali': '\u09B0', - 'racute': '\u0155', - 'radeva': '\u0930', - 'radical': '\u221A', - 'radicalex': '\uF8E5', - 'radoverssquare': '\u33AE', - 'radoverssquaredsquare': '\u33AF', - 'radsquare': '\u33AD', - 'rafe': '\u05BF', - 'rafehebrew': '\u05BF', - 'ragujarati': '\u0AB0', - 'ragurmukhi': '\u0A30', - 'rahiragana': '\u3089', - 'rakatakana': '\u30E9', - 'rakatakanahalfwidth': '\uFF97', - 'ralowerdiagonalbengali': '\u09F1', - 'ramiddlediagonalbengali': '\u09F0', - 'ramshorn': '\u0264', - 'ratio': '\u2236', - 'rbopomofo': '\u3116', - 'rcaron': '\u0159', - 'rcedilla': '\u0157', - 'rcircle': '\u24E1', - 'rcommaaccent': '\u0157', - 'rdblgrave': '\u0211', - 'rdotaccent': '\u1E59', - 'rdotbelow': '\u1E5B', - 'rdotbelowmacron': '\u1E5D', - 'referencemark': '\u203B', - 'reflexsubset': '\u2286', - 'reflexsuperset': '\u2287', - 'registered': '\u00AE', - 'registersans': '\uF8E8', - 'registerserif': '\uF6DA', - 'reharabic': '\u0631', - 'reharmenian': '\u0580', - 'rehfinalarabic': '\uFEAE', - 'rehiragana': '\u308C', - 'rehyehaleflamarabic': '\u0631\uFEF3\uFE8E\u0644', - 'rekatakana': '\u30EC', - 'rekatakanahalfwidth': '\uFF9A', - 'resh': '\u05E8', - 'reshdageshhebrew': '\uFB48', - 'reshhatafpatah': '\u05E8\u05B2', - 'reshhatafpatahhebrew': '\u05E8\u05B2', - 'reshhatafsegol': '\u05E8\u05B1', - 'reshhatafsegolhebrew': '\u05E8\u05B1', - 'reshhebrew': '\u05E8', - 'reshhiriq': '\u05E8\u05B4', - 'reshhiriqhebrew': '\u05E8\u05B4', - 'reshholam': '\u05E8\u05B9', - 'reshholamhebrew': '\u05E8\u05B9', - 'reshpatah': '\u05E8\u05B7', - 'reshpatahhebrew': '\u05E8\u05B7', - 'reshqamats': '\u05E8\u05B8', - 'reshqamatshebrew': '\u05E8\u05B8', - 'reshqubuts': '\u05E8\u05BB', - 'reshqubutshebrew': '\u05E8\u05BB', - 'reshsegol': '\u05E8\u05B6', - 'reshsegolhebrew': '\u05E8\u05B6', - 'reshsheva': '\u05E8\u05B0', - 'reshshevahebrew': '\u05E8\u05B0', - 'reshtsere': '\u05E8\u05B5', - 'reshtserehebrew': '\u05E8\u05B5', - 'reversedtilde': '\u223D', - 'reviahebrew': '\u0597', - 'reviamugrashhebrew': '\u0597', - 'revlogicalnot': '\u2310', - 'rfishhook': '\u027E', - 'rfishhookreversed': '\u027F', - 'rhabengali': '\u09DD', - 'rhadeva': '\u095D', - 'rho': '\u03C1', - 'rhook': '\u027D', - 'rhookturned': '\u027B', - 'rhookturnedsuperior': '\u02B5', - 'rhosymbolgreek': '\u03F1', - 'rhotichookmod': '\u02DE', - 'rieulacirclekorean': '\u3271', - 'rieulaparenkorean': '\u3211', - 'rieulcirclekorean': '\u3263', - 'rieulhieuhkorean': '\u3140', - 'rieulkiyeokkorean': '\u313A', - 'rieulkiyeoksioskorean': '\u3169', - 'rieulkorean': '\u3139', - 'rieulmieumkorean': '\u313B', - 'rieulpansioskorean': '\u316C', - 'rieulparenkorean': '\u3203', - 'rieulphieuphkorean': '\u313F', - 'rieulpieupkorean': '\u313C', - 'rieulpieupsioskorean': '\u316B', - 'rieulsioskorean': '\u313D', - 'rieulthieuthkorean': '\u313E', - 'rieultikeutkorean': '\u316A', - 'rieulyeorinhieuhkorean': '\u316D', - 'rightangle': '\u221F', - 'righttackbelowcmb': '\u0319', - 'righttriangle': '\u22BF', - 'rihiragana': '\u308A', - 'rikatakana': '\u30EA', - 'rikatakanahalfwidth': '\uFF98', - 'ring': '\u02DA', - 'ringbelowcmb': '\u0325', - 'ringcmb': '\u030A', - 'ringhalfleft': '\u02BF', - 'ringhalfleftarmenian': '\u0559', - 'ringhalfleftbelowcmb': '\u031C', - 'ringhalfleftcentered': '\u02D3', - 'ringhalfright': '\u02BE', - 'ringhalfrightbelowcmb': '\u0339', - 'ringhalfrightcentered': '\u02D2', - 'rinvertedbreve': '\u0213', - 'rittorusquare': '\u3351', - 'rlinebelow': '\u1E5F', - 'rlongleg': '\u027C', - 'rlonglegturned': '\u027A', - 'rmonospace': '\uFF52', - 'rohiragana': '\u308D', - 'rokatakana': '\u30ED', - 'rokatakanahalfwidth': '\uFF9B', - 'roruathai': '\u0E23', - 'rparen': '\u24AD', - 'rrabengali': '\u09DC', - 'rradeva': '\u0931', - 'rragurmukhi': '\u0A5C', - 'rreharabic': '\u0691', - 'rrehfinalarabic': '\uFB8D', - 'rrvocalicbengali': '\u09E0', - 'rrvocalicdeva': '\u0960', - 'rrvocalicgujarati': '\u0AE0', - 'rrvocalicvowelsignbengali': '\u09C4', - 'rrvocalicvowelsigndeva': '\u0944', - 'rrvocalicvowelsigngujarati': '\u0AC4', - 'rsuperior': '\uF6F1', - 'rtblock': '\u2590', - 'rturned': '\u0279', - 'rturnedsuperior': '\u02B4', - 'ruhiragana': '\u308B', - 'rukatakana': '\u30EB', - 'rukatakanahalfwidth': '\uFF99', - 'rupeemarkbengali': '\u09F2', - 'rupeesignbengali': '\u09F3', - 'rupiah': '\uF6DD', - 'ruthai': '\u0E24', - 'rvocalicbengali': '\u098B', - 'rvocalicdeva': '\u090B', - 'rvocalicgujarati': '\u0A8B', - 'rvocalicvowelsignbengali': '\u09C3', - 'rvocalicvowelsigndeva': '\u0943', - 'rvocalicvowelsigngujarati': '\u0AC3', - 's': '\u0073', - 'sabengali': '\u09B8', - 'sacute': '\u015B', - 'sacutedotaccent': '\u1E65', - 'sadarabic': '\u0635', - 'sadeva': '\u0938', - 'sadfinalarabic': '\uFEBA', - 'sadinitialarabic': '\uFEBB', - 'sadmedialarabic': '\uFEBC', - 'sagujarati': '\u0AB8', - 'sagurmukhi': '\u0A38', - 'sahiragana': '\u3055', - 'sakatakana': '\u30B5', - 'sakatakanahalfwidth': '\uFF7B', - 'sallallahoualayhewasallamarabic': '\uFDFA', - 'samekh': '\u05E1', - 'samekhdagesh': '\uFB41', - 'samekhdageshhebrew': '\uFB41', - 'samekhhebrew': '\u05E1', - 'saraaathai': '\u0E32', - 'saraaethai': '\u0E41', - 'saraaimaimalaithai': '\u0E44', - 'saraaimaimuanthai': '\u0E43', - 'saraamthai': '\u0E33', - 'saraathai': '\u0E30', - 'saraethai': '\u0E40', - 'saraiileftthai': '\uF886', - 'saraiithai': '\u0E35', - 'saraileftthai': '\uF885', - 'saraithai': '\u0E34', - 'saraothai': '\u0E42', - 'saraueeleftthai': '\uF888', - 'saraueethai': '\u0E37', - 'saraueleftthai': '\uF887', - 'sarauethai': '\u0E36', - 'sarauthai': '\u0E38', - 'sarauuthai': '\u0E39', - 'sbopomofo': '\u3119', - 'scaron': '\u0161', - 'scarondotaccent': '\u1E67', - 'scedilla': '\u015F', - 'schwa': '\u0259', - 'schwacyrillic': '\u04D9', - 'schwadieresiscyrillic': '\u04DB', - 'schwahook': '\u025A', - 'scircle': '\u24E2', - 'scircumflex': '\u015D', - 'scommaaccent': '\u0219', - 'sdotaccent': '\u1E61', - 'sdotbelow': '\u1E63', - 'sdotbelowdotaccent': '\u1E69', - 'seagullbelowcmb': '\u033C', - 'second': '\u2033', - 'secondtonechinese': '\u02CA', - 'section': '\u00A7', - 'seenarabic': '\u0633', - 'seenfinalarabic': '\uFEB2', - 'seeninitialarabic': '\uFEB3', - 'seenmedialarabic': '\uFEB4', - 'segol': '\u05B6', - 'segol13': '\u05B6', - 'segol1f': '\u05B6', - 'segol2c': '\u05B6', - 'segolhebrew': '\u05B6', - 'segolnarrowhebrew': '\u05B6', - 'segolquarterhebrew': '\u05B6', - 'segoltahebrew': '\u0592', - 'segolwidehebrew': '\u05B6', - 'seharmenian': '\u057D', - 'sehiragana': '\u305B', - 'sekatakana': '\u30BB', - 'sekatakanahalfwidth': '\uFF7E', - 'semicolon': '\u003B', - 'semicolonarabic': '\u061B', - 'semicolonmonospace': '\uFF1B', - 'semicolonsmall': '\uFE54', - 'semivoicedmarkkana': '\u309C', - 'semivoicedmarkkanahalfwidth': '\uFF9F', - 'sentisquare': '\u3322', - 'sentosquare': '\u3323', - 'seven': '\u0037', - 'sevenarabic': '\u0667', - 'sevenbengali': '\u09ED', - 'sevencircle': '\u2466', - 'sevencircleinversesansserif': '\u2790', - 'sevendeva': '\u096D', - 'seveneighths': '\u215E', - 'sevengujarati': '\u0AED', - 'sevengurmukhi': '\u0A6D', - 'sevenhackarabic': '\u0667', - 'sevenhangzhou': '\u3027', - 'sevenideographicparen': '\u3226', - 'seveninferior': '\u2087', - 'sevenmonospace': '\uFF17', - 'sevenoldstyle': '\uF737', - 'sevenparen': '\u247A', - 'sevenperiod': '\u248E', - 'sevenpersian': '\u06F7', - 'sevenroman': '\u2176', - 'sevensuperior': '\u2077', - 'seventeencircle': '\u2470', - 'seventeenparen': '\u2484', - 'seventeenperiod': '\u2498', - 'seventhai': '\u0E57', - 'sfthyphen': '\u00AD', - 'shaarmenian': '\u0577', - 'shabengali': '\u09B6', - 'shacyrillic': '\u0448', - 'shaddaarabic': '\u0651', - 'shaddadammaarabic': '\uFC61', - 'shaddadammatanarabic': '\uFC5E', - 'shaddafathaarabic': '\uFC60', - 'shaddafathatanarabic': '\u0651\u064B', - 'shaddakasraarabic': '\uFC62', - 'shaddakasratanarabic': '\uFC5F', - 'shade': '\u2592', - 'shadedark': '\u2593', - 'shadelight': '\u2591', - 'shademedium': '\u2592', - 'shadeva': '\u0936', - 'shagujarati': '\u0AB6', - 'shagurmukhi': '\u0A36', - 'shalshelethebrew': '\u0593', - 'shbopomofo': '\u3115', - 'shchacyrillic': '\u0449', - 'sheenarabic': '\u0634', - 'sheenfinalarabic': '\uFEB6', - 'sheeninitialarabic': '\uFEB7', - 'sheenmedialarabic': '\uFEB8', - 'sheicoptic': '\u03E3', - 'sheqel': '\u20AA', - 'sheqelhebrew': '\u20AA', - 'sheva': '\u05B0', - 'sheva115': '\u05B0', - 'sheva15': '\u05B0', - 'sheva22': '\u05B0', - 'sheva2e': '\u05B0', - 'shevahebrew': '\u05B0', - 'shevanarrowhebrew': '\u05B0', - 'shevaquarterhebrew': '\u05B0', - 'shevawidehebrew': '\u05B0', - 'shhacyrillic': '\u04BB', - 'shimacoptic': '\u03ED', - 'shin': '\u05E9', - 'shindagesh': '\uFB49', - 'shindageshhebrew': '\uFB49', - 'shindageshshindot': '\uFB2C', - 'shindageshshindothebrew': '\uFB2C', - 'shindageshsindot': '\uFB2D', - 'shindageshsindothebrew': '\uFB2D', - 'shindothebrew': '\u05C1', - 'shinhebrew': '\u05E9', - 'shinshindot': '\uFB2A', - 'shinshindothebrew': '\uFB2A', - 'shinsindot': '\uFB2B', - 'shinsindothebrew': '\uFB2B', - 'shook': '\u0282', - 'sigma': '\u03C3', - 'sigma1': '\u03C2', - 'sigmafinal': '\u03C2', - 'sigmalunatesymbolgreek': '\u03F2', - 'sihiragana': '\u3057', - 'sikatakana': '\u30B7', - 'sikatakanahalfwidth': '\uFF7C', - 'siluqhebrew': '\u05BD', - 'siluqlefthebrew': '\u05BD', - 'similar': '\u223C', - 'sindothebrew': '\u05C2', - 'siosacirclekorean': '\u3274', - 'siosaparenkorean': '\u3214', - 'sioscieuckorean': '\u317E', - 'sioscirclekorean': '\u3266', - 'sioskiyeokkorean': '\u317A', - 'sioskorean': '\u3145', - 'siosnieunkorean': '\u317B', - 'siosparenkorean': '\u3206', - 'siospieupkorean': '\u317D', - 'siostikeutkorean': '\u317C', - 'six': '\u0036', - 'sixarabic': '\u0666', - 'sixbengali': '\u09EC', - 'sixcircle': '\u2465', - 'sixcircleinversesansserif': '\u278F', - 'sixdeva': '\u096C', - 'sixgujarati': '\u0AEC', - 'sixgurmukhi': '\u0A6C', - 'sixhackarabic': '\u0666', - 'sixhangzhou': '\u3026', - 'sixideographicparen': '\u3225', - 'sixinferior': '\u2086', - 'sixmonospace': '\uFF16', - 'sixoldstyle': '\uF736', - 'sixparen': '\u2479', - 'sixperiod': '\u248D', - 'sixpersian': '\u06F6', - 'sixroman': '\u2175', - 'sixsuperior': '\u2076', - 'sixteencircle': '\u246F', - 'sixteencurrencydenominatorbengali': '\u09F9', - 'sixteenparen': '\u2483', - 'sixteenperiod': '\u2497', - 'sixthai': '\u0E56', - 'slash': '\u002F', - 'slashmonospace': '\uFF0F', - 'slong': '\u017F', - 'slongdotaccent': '\u1E9B', - 'smileface': '\u263A', - 'smonospace': '\uFF53', - 'sofpasuqhebrew': '\u05C3', - 'softhyphen': '\u00AD', - 'softsigncyrillic': '\u044C', - 'sohiragana': '\u305D', - 'sokatakana': '\u30BD', - 'sokatakanahalfwidth': '\uFF7F', - 'soliduslongoverlaycmb': '\u0338', - 'solidusshortoverlaycmb': '\u0337', - 'sorusithai': '\u0E29', - 'sosalathai': '\u0E28', - 'sosothai': '\u0E0B', - 'sosuathai': '\u0E2A', - 'space': '\u0020', - 'spacehackarabic': '\u0020', - 'spade': '\u2660', - 'spadesuitblack': '\u2660', - 'spadesuitwhite': '\u2664', - 'sparen': '\u24AE', - 'squarebelowcmb': '\u033B', - 'squarecc': '\u33C4', - 'squarecm': '\u339D', - 'squarediagonalcrosshatchfill': '\u25A9', - 'squarehorizontalfill': '\u25A4', - 'squarekg': '\u338F', - 'squarekm': '\u339E', - 'squarekmcapital': '\u33CE', - 'squareln': '\u33D1', - 'squarelog': '\u33D2', - 'squaremg': '\u338E', - 'squaremil': '\u33D5', - 'squaremm': '\u339C', - 'squaremsquared': '\u33A1', - 'squareorthogonalcrosshatchfill': '\u25A6', - 'squareupperlefttolowerrightfill': '\u25A7', - 'squareupperrighttolowerleftfill': '\u25A8', - 'squareverticalfill': '\u25A5', - 'squarewhitewithsmallblack': '\u25A3', - 'srsquare': '\u33DB', - 'ssabengali': '\u09B7', - 'ssadeva': '\u0937', - 'ssagujarati': '\u0AB7', - 'ssangcieuckorean': '\u3149', - 'ssanghieuhkorean': '\u3185', - 'ssangieungkorean': '\u3180', - 'ssangkiyeokkorean': '\u3132', - 'ssangnieunkorean': '\u3165', - 'ssangpieupkorean': '\u3143', - 'ssangsioskorean': '\u3146', - 'ssangtikeutkorean': '\u3138', - 'ssuperior': '\uF6F2', - 'sterling': '\u00A3', - 'sterlingmonospace': '\uFFE1', - 'strokelongoverlaycmb': '\u0336', - 'strokeshortoverlaycmb': '\u0335', - 'subset': '\u2282', - 'subsetnotequal': '\u228A', - 'subsetorequal': '\u2286', - 'succeeds': '\u227B', - 'suchthat': '\u220B', - 'suhiragana': '\u3059', - 'sukatakana': '\u30B9', - 'sukatakanahalfwidth': '\uFF7D', - 'sukunarabic': '\u0652', - 'summation': '\u2211', - 'sun': '\u263C', - 'superset': '\u2283', - 'supersetnotequal': '\u228B', - 'supersetorequal': '\u2287', - 'svsquare': '\u33DC', - 'syouwaerasquare': '\u337C', - 't': '\u0074', - 'tabengali': '\u09A4', - 'tackdown': '\u22A4', - 'tackleft': '\u22A3', - 'tadeva': '\u0924', - 'tagujarati': '\u0AA4', - 'tagurmukhi': '\u0A24', - 'taharabic': '\u0637', - 'tahfinalarabic': '\uFEC2', - 'tahinitialarabic': '\uFEC3', - 'tahiragana': '\u305F', - 'tahmedialarabic': '\uFEC4', - 'taisyouerasquare': '\u337D', - 'takatakana': '\u30BF', - 'takatakanahalfwidth': '\uFF80', - 'tatweelarabic': '\u0640', - 'tau': '\u03C4', - 'tav': '\u05EA', - 'tavdages': '\uFB4A', - 'tavdagesh': '\uFB4A', - 'tavdageshhebrew': '\uFB4A', - 'tavhebrew': '\u05EA', - 'tbar': '\u0167', - 'tbopomofo': '\u310A', - 'tcaron': '\u0165', - 'tccurl': '\u02A8', - 'tcedilla': '\u0163', - 'tcheharabic': '\u0686', - 'tchehfinalarabic': '\uFB7B', - 'tchehinitialarabic': '\uFB7C', - 'tchehmedialarabic': '\uFB7D', - 'tchehmeeminitialarabic': '\uFB7C\uFEE4', - 'tcircle': '\u24E3', - 'tcircumflexbelow': '\u1E71', - 'tcommaaccent': '\u0163', - 'tdieresis': '\u1E97', - 'tdotaccent': '\u1E6B', - 'tdotbelow': '\u1E6D', - 'tecyrillic': '\u0442', - 'tedescendercyrillic': '\u04AD', - 'teharabic': '\u062A', - 'tehfinalarabic': '\uFE96', - 'tehhahinitialarabic': '\uFCA2', - 'tehhahisolatedarabic': '\uFC0C', - 'tehinitialarabic': '\uFE97', - 'tehiragana': '\u3066', - 'tehjeeminitialarabic': '\uFCA1', - 'tehjeemisolatedarabic': '\uFC0B', - 'tehmarbutaarabic': '\u0629', - 'tehmarbutafinalarabic': '\uFE94', - 'tehmedialarabic': '\uFE98', - 'tehmeeminitialarabic': '\uFCA4', - 'tehmeemisolatedarabic': '\uFC0E', - 'tehnoonfinalarabic': '\uFC73', - 'tekatakana': '\u30C6', - 'tekatakanahalfwidth': '\uFF83', - 'telephone': '\u2121', - 'telephoneblack': '\u260E', - 'telishagedolahebrew': '\u05A0', - 'telishaqetanahebrew': '\u05A9', - 'tencircle': '\u2469', - 'tenideographicparen': '\u3229', - 'tenparen': '\u247D', - 'tenperiod': '\u2491', - 'tenroman': '\u2179', - 'tesh': '\u02A7', - 'tet': '\u05D8', - 'tetdagesh': '\uFB38', - 'tetdageshhebrew': '\uFB38', - 'tethebrew': '\u05D8', - 'tetsecyrillic': '\u04B5', - 'tevirhebrew': '\u059B', - 'tevirlefthebrew': '\u059B', - 'thabengali': '\u09A5', - 'thadeva': '\u0925', - 'thagujarati': '\u0AA5', - 'thagurmukhi': '\u0A25', - 'thalarabic': '\u0630', - 'thalfinalarabic': '\uFEAC', - 'thanthakhatlowleftthai': '\uF898', - 'thanthakhatlowrightthai': '\uF897', - 'thanthakhatthai': '\u0E4C', - 'thanthakhatupperleftthai': '\uF896', - 'theharabic': '\u062B', - 'thehfinalarabic': '\uFE9A', - 'thehinitialarabic': '\uFE9B', - 'thehmedialarabic': '\uFE9C', - 'thereexists': '\u2203', - 'therefore': '\u2234', - 'theta': '\u03B8', - 'theta1': '\u03D1', - 'thetasymbolgreek': '\u03D1', - 'thieuthacirclekorean': '\u3279', - 'thieuthaparenkorean': '\u3219', - 'thieuthcirclekorean': '\u326B', - 'thieuthkorean': '\u314C', - 'thieuthparenkorean': '\u320B', - 'thirteencircle': '\u246C', - 'thirteenparen': '\u2480', - 'thirteenperiod': '\u2494', - 'thonangmonthothai': '\u0E11', - 'thook': '\u01AD', - 'thophuthaothai': '\u0E12', - 'thorn': '\u00FE', - 'thothahanthai': '\u0E17', - 'thothanthai': '\u0E10', - 'thothongthai': '\u0E18', - 'thothungthai': '\u0E16', - 'thousandcyrillic': '\u0482', - 'thousandsseparatorarabic': '\u066C', - 'thousandsseparatorpersian': '\u066C', - 'three': '\u0033', - 'threearabic': '\u0663', - 'threebengali': '\u09E9', - 'threecircle': '\u2462', - 'threecircleinversesansserif': '\u278C', - 'threedeva': '\u0969', - 'threeeighths': '\u215C', - 'threegujarati': '\u0AE9', - 'threegurmukhi': '\u0A69', - 'threehackarabic': '\u0663', - 'threehangzhou': '\u3023', - 'threeideographicparen': '\u3222', - 'threeinferior': '\u2083', - 'threemonospace': '\uFF13', - 'threenumeratorbengali': '\u09F6', - 'threeoldstyle': '\uF733', - 'threeparen': '\u2476', - 'threeperiod': '\u248A', - 'threepersian': '\u06F3', - 'threequarters': '\u00BE', - 'threequartersemdash': '\uF6DE', - 'threeroman': '\u2172', - 'threesuperior': '\u00B3', - 'threethai': '\u0E53', - 'thzsquare': '\u3394', - 'tihiragana': '\u3061', - 'tikatakana': '\u30C1', - 'tikatakanahalfwidth': '\uFF81', - 'tikeutacirclekorean': '\u3270', - 'tikeutaparenkorean': '\u3210', - 'tikeutcirclekorean': '\u3262', - 'tikeutkorean': '\u3137', - 'tikeutparenkorean': '\u3202', - 'tilde': '\u02DC', - 'tildebelowcmb': '\u0330', - 'tildecmb': '\u0303', - 'tildecomb': '\u0303', - 'tildedoublecmb': '\u0360', - 'tildeoperator': '\u223C', - 'tildeoverlaycmb': '\u0334', - 'tildeverticalcmb': '\u033E', - 'timescircle': '\u2297', - 'tipehahebrew': '\u0596', - 'tipehalefthebrew': '\u0596', - 'tippigurmukhi': '\u0A70', - 'titlocyrilliccmb': '\u0483', - 'tiwnarmenian': '\u057F', - 'tlinebelow': '\u1E6F', - 'tmonospace': '\uFF54', - 'toarmenian': '\u0569', - 'tohiragana': '\u3068', - 'tokatakana': '\u30C8', - 'tokatakanahalfwidth': '\uFF84', - 'tonebarextrahighmod': '\u02E5', - 'tonebarextralowmod': '\u02E9', - 'tonebarhighmod': '\u02E6', - 'tonebarlowmod': '\u02E8', - 'tonebarmidmod': '\u02E7', - 'tonefive': '\u01BD', - 'tonesix': '\u0185', - 'tonetwo': '\u01A8', - 'tonos': '\u0384', - 'tonsquare': '\u3327', - 'topatakthai': '\u0E0F', - 'tortoiseshellbracketleft': '\u3014', - 'tortoiseshellbracketleftsmall': '\uFE5D', - 'tortoiseshellbracketleftvertical': '\uFE39', - 'tortoiseshellbracketright': '\u3015', - 'tortoiseshellbracketrightsmall': '\uFE5E', - 'tortoiseshellbracketrightvertical': '\uFE3A', - 'totaothai': '\u0E15', - 'tpalatalhook': '\u01AB', - 'tparen': '\u24AF', - 'trademark': '\u2122', - 'trademarksans': '\uF8EA', - 'trademarkserif': '\uF6DB', - 'tretroflexhook': '\u0288', - 'triagdn': '\u25BC', - 'triaglf': '\u25C4', - 'triagrt': '\u25BA', - 'triagup': '\u25B2', - 'ts': '\u02A6', - 'tsadi': '\u05E6', - 'tsadidagesh': '\uFB46', - 'tsadidageshhebrew': '\uFB46', - 'tsadihebrew': '\u05E6', - 'tsecyrillic': '\u0446', - 'tsere': '\u05B5', - 'tsere12': '\u05B5', - 'tsere1e': '\u05B5', - 'tsere2b': '\u05B5', - 'tserehebrew': '\u05B5', - 'tserenarrowhebrew': '\u05B5', - 'tserequarterhebrew': '\u05B5', - 'tserewidehebrew': '\u05B5', - 'tshecyrillic': '\u045B', - 'tsuperior': '\uF6F3', - 'ttabengali': '\u099F', - 'ttadeva': '\u091F', - 'ttagujarati': '\u0A9F', - 'ttagurmukhi': '\u0A1F', - 'tteharabic': '\u0679', - 'ttehfinalarabic': '\uFB67', - 'ttehinitialarabic': '\uFB68', - 'ttehmedialarabic': '\uFB69', - 'tthabengali': '\u09A0', - 'tthadeva': '\u0920', - 'tthagujarati': '\u0AA0', - 'tthagurmukhi': '\u0A20', - 'tturned': '\u0287', - 'tuhiragana': '\u3064', - 'tukatakana': '\u30C4', - 'tukatakanahalfwidth': '\uFF82', - 'tusmallhiragana': '\u3063', - 'tusmallkatakana': '\u30C3', - 'tusmallkatakanahalfwidth': '\uFF6F', - 'twelvecircle': '\u246B', - 'twelveparen': '\u247F', - 'twelveperiod': '\u2493', - 'twelveroman': '\u217B', - 'twentycircle': '\u2473', - 'twentyhangzhou': '\u5344', - 'twentyparen': '\u2487', - 'twentyperiod': '\u249B', - 'two': '\u0032', - 'twoarabic': '\u0662', - 'twobengali': '\u09E8', - 'twocircle': '\u2461', - 'twocircleinversesansserif': '\u278B', - 'twodeva': '\u0968', - 'twodotenleader': '\u2025', - 'twodotleader': '\u2025', - 'twodotleadervertical': '\uFE30', - 'twogujarati': '\u0AE8', - 'twogurmukhi': '\u0A68', - 'twohackarabic': '\u0662', - 'twohangzhou': '\u3022', - 'twoideographicparen': '\u3221', - 'twoinferior': '\u2082', - 'twomonospace': '\uFF12', - 'twonumeratorbengali': '\u09F5', - 'twooldstyle': '\uF732', - 'twoparen': '\u2475', - 'twoperiod': '\u2489', - 'twopersian': '\u06F2', - 'tworoman': '\u2171', - 'twostroke': '\u01BB', - 'twosuperior': '\u00B2', - 'twothai': '\u0E52', - 'twothirds': '\u2154', - 'u': '\u0075', - 'uacute': '\u00FA', - 'ubar': '\u0289', - 'ubengali': '\u0989', - 'ubopomofo': '\u3128', - 'ubreve': '\u016D', - 'ucaron': '\u01D4', - 'ucircle': '\u24E4', - 'ucircumflex': '\u00FB', - 'ucircumflexbelow': '\u1E77', - 'ucyrillic': '\u0443', - 'udattadeva': '\u0951', - 'udblacute': '\u0171', - 'udblgrave': '\u0215', - 'udeva': '\u0909', - 'udieresis': '\u00FC', - 'udieresisacute': '\u01D8', - 'udieresisbelow': '\u1E73', - 'udieresiscaron': '\u01DA', - 'udieresiscyrillic': '\u04F1', - 'udieresisgrave': '\u01DC', - 'udieresismacron': '\u01D6', - 'udotbelow': '\u1EE5', - 'ugrave': '\u00F9', - 'ugujarati': '\u0A89', - 'ugurmukhi': '\u0A09', - 'uhiragana': '\u3046', - 'uhookabove': '\u1EE7', - 'uhorn': '\u01B0', - 'uhornacute': '\u1EE9', - 'uhorndotbelow': '\u1EF1', - 'uhorngrave': '\u1EEB', - 'uhornhookabove': '\u1EED', - 'uhorntilde': '\u1EEF', - 'uhungarumlaut': '\u0171', - 'uhungarumlautcyrillic': '\u04F3', - 'uinvertedbreve': '\u0217', - 'ukatakana': '\u30A6', - 'ukatakanahalfwidth': '\uFF73', - 'ukcyrillic': '\u0479', - 'ukorean': '\u315C', - 'umacron': '\u016B', - 'umacroncyrillic': '\u04EF', - 'umacrondieresis': '\u1E7B', - 'umatragurmukhi': '\u0A41', - 'umonospace': '\uFF55', - 'underscore': '\u005F', - 'underscoredbl': '\u2017', - 'underscoremonospace': '\uFF3F', - 'underscorevertical': '\uFE33', - 'underscorewavy': '\uFE4F', - 'union': '\u222A', - 'universal': '\u2200', - 'uogonek': '\u0173', - 'uparen': '\u24B0', - 'upblock': '\u2580', - 'upperdothebrew': '\u05C4', - 'upsilon': '\u03C5', - 'upsilondieresis': '\u03CB', - 'upsilondieresistonos': '\u03B0', - 'upsilonlatin': '\u028A', - 'upsilontonos': '\u03CD', - 'uptackbelowcmb': '\u031D', - 'uptackmod': '\u02D4', - 'uragurmukhi': '\u0A73', - 'uring': '\u016F', - 'ushortcyrillic': '\u045E', - 'usmallhiragana': '\u3045', - 'usmallkatakana': '\u30A5', - 'usmallkatakanahalfwidth': '\uFF69', - 'ustraightcyrillic': '\u04AF', - 'ustraightstrokecyrillic': '\u04B1', - 'utilde': '\u0169', - 'utildeacute': '\u1E79', - 'utildebelow': '\u1E75', - 'uubengali': '\u098A', - 'uudeva': '\u090A', - 'uugujarati': '\u0A8A', - 'uugurmukhi': '\u0A0A', - 'uumatragurmukhi': '\u0A42', - 'uuvowelsignbengali': '\u09C2', - 'uuvowelsigndeva': '\u0942', - 'uuvowelsigngujarati': '\u0AC2', - 'uvowelsignbengali': '\u09C1', - 'uvowelsigndeva': '\u0941', - 'uvowelsigngujarati': '\u0AC1', - 'v': '\u0076', - 'vadeva': '\u0935', - 'vagujarati': '\u0AB5', - 'vagurmukhi': '\u0A35', - 'vakatakana': '\u30F7', - 'vav': '\u05D5', - 'vavdagesh': '\uFB35', - 'vavdagesh65': '\uFB35', - 'vavdageshhebrew': '\uFB35', - 'vavhebrew': '\u05D5', - 'vavholam': '\uFB4B', - 'vavholamhebrew': '\uFB4B', - 'vavvavhebrew': '\u05F0', - 'vavyodhebrew': '\u05F1', - 'vcircle': '\u24E5', - 'vdotbelow': '\u1E7F', - 'vecyrillic': '\u0432', - 'veharabic': '\u06A4', - 'vehfinalarabic': '\uFB6B', - 'vehinitialarabic': '\uFB6C', - 'vehmedialarabic': '\uFB6D', - 'vekatakana': '\u30F9', - 'venus': '\u2640', - 'verticalbar': '\u007C', - 'verticallineabovecmb': '\u030D', - 'verticallinebelowcmb': '\u0329', - 'verticallinelowmod': '\u02CC', - 'verticallinemod': '\u02C8', - 'vewarmenian': '\u057E', - 'vhook': '\u028B', - 'vikatakana': '\u30F8', - 'viramabengali': '\u09CD', - 'viramadeva': '\u094D', - 'viramagujarati': '\u0ACD', - 'visargabengali': '\u0983', - 'visargadeva': '\u0903', - 'visargagujarati': '\u0A83', - 'vmonospace': '\uFF56', - 'voarmenian': '\u0578', - 'voicediterationhiragana': '\u309E', - 'voicediterationkatakana': '\u30FE', - 'voicedmarkkana': '\u309B', - 'voicedmarkkanahalfwidth': '\uFF9E', - 'vokatakana': '\u30FA', - 'vparen': '\u24B1', - 'vtilde': '\u1E7D', - 'vturned': '\u028C', - 'vuhiragana': '\u3094', - 'vukatakana': '\u30F4', - 'w': '\u0077', - 'wacute': '\u1E83', - 'waekorean': '\u3159', - 'wahiragana': '\u308F', - 'wakatakana': '\u30EF', - 'wakatakanahalfwidth': '\uFF9C', - 'wakorean': '\u3158', - 'wasmallhiragana': '\u308E', - 'wasmallkatakana': '\u30EE', - 'wattosquare': '\u3357', - 'wavedash': '\u301C', - 'wavyunderscorevertical': '\uFE34', - 'wawarabic': '\u0648', - 'wawfinalarabic': '\uFEEE', - 'wawhamzaabovearabic': '\u0624', - 'wawhamzaabovefinalarabic': '\uFE86', - 'wbsquare': '\u33DD', - 'wcircle': '\u24E6', - 'wcircumflex': '\u0175', - 'wdieresis': '\u1E85', - 'wdotaccent': '\u1E87', - 'wdotbelow': '\u1E89', - 'wehiragana': '\u3091', - 'weierstrass': '\u2118', - 'wekatakana': '\u30F1', - 'wekorean': '\u315E', - 'weokorean': '\u315D', - 'wgrave': '\u1E81', - 'whitebullet': '\u25E6', - 'whitecircle': '\u25CB', - 'whitecircleinverse': '\u25D9', - 'whitecornerbracketleft': '\u300E', - 'whitecornerbracketleftvertical': '\uFE43', - 'whitecornerbracketright': '\u300F', - 'whitecornerbracketrightvertical': '\uFE44', - 'whitediamond': '\u25C7', - 'whitediamondcontainingblacksmalldiamond': '\u25C8', - 'whitedownpointingsmalltriangle': '\u25BF', - 'whitedownpointingtriangle': '\u25BD', - 'whiteleftpointingsmalltriangle': '\u25C3', - 'whiteleftpointingtriangle': '\u25C1', - 'whitelenticularbracketleft': '\u3016', - 'whitelenticularbracketright': '\u3017', - 'whiterightpointingsmalltriangle': '\u25B9', - 'whiterightpointingtriangle': '\u25B7', - 'whitesmallsquare': '\u25AB', - 'whitesmilingface': '\u263A', - 'whitesquare': '\u25A1', - 'whitestar': '\u2606', - 'whitetelephone': '\u260F', - 'whitetortoiseshellbracketleft': '\u3018', - 'whitetortoiseshellbracketright': '\u3019', - 'whiteuppointingsmalltriangle': '\u25B5', - 'whiteuppointingtriangle': '\u25B3', - 'wihiragana': '\u3090', - 'wikatakana': '\u30F0', - 'wikorean': '\u315F', - 'wmonospace': '\uFF57', - 'wohiragana': '\u3092', - 'wokatakana': '\u30F2', - 'wokatakanahalfwidth': '\uFF66', - 'won': '\u20A9', - 'wonmonospace': '\uFFE6', - 'wowaenthai': '\u0E27', - 'wparen': '\u24B2', - 'wring': '\u1E98', - 'wsuperior': '\u02B7', - 'wturned': '\u028D', - 'wynn': '\u01BF', - 'x': '\u0078', - 'xabovecmb': '\u033D', - 'xbopomofo': '\u3112', - 'xcircle': '\u24E7', - 'xdieresis': '\u1E8D', - 'xdotaccent': '\u1E8B', - 'xeharmenian': '\u056D', - 'xi': '\u03BE', - 'xmonospace': '\uFF58', - 'xparen': '\u24B3', - 'xsuperior': '\u02E3', - 'y': '\u0079', - 'yaadosquare': '\u334E', - 'yabengali': '\u09AF', - 'yacute': '\u00FD', - 'yadeva': '\u092F', - 'yaekorean': '\u3152', - 'yagujarati': '\u0AAF', - 'yagurmukhi': '\u0A2F', - 'yahiragana': '\u3084', - 'yakatakana': '\u30E4', - 'yakatakanahalfwidth': '\uFF94', - 'yakorean': '\u3151', - 'yamakkanthai': '\u0E4E', - 'yasmallhiragana': '\u3083', - 'yasmallkatakana': '\u30E3', - 'yasmallkatakanahalfwidth': '\uFF6C', - 'yatcyrillic': '\u0463', - 'ycircle': '\u24E8', - 'ycircumflex': '\u0177', - 'ydieresis': '\u00FF', - 'ydotaccent': '\u1E8F', - 'ydotbelow': '\u1EF5', - 'yeharabic': '\u064A', - 'yehbarreearabic': '\u06D2', - 'yehbarreefinalarabic': '\uFBAF', - 'yehfinalarabic': '\uFEF2', - 'yehhamzaabovearabic': '\u0626', - 'yehhamzaabovefinalarabic': '\uFE8A', - 'yehhamzaaboveinitialarabic': '\uFE8B', - 'yehhamzaabovemedialarabic': '\uFE8C', - 'yehinitialarabic': '\uFEF3', - 'yehmedialarabic': '\uFEF4', - 'yehmeeminitialarabic': '\uFCDD', - 'yehmeemisolatedarabic': '\uFC58', - 'yehnoonfinalarabic': '\uFC94', - 'yehthreedotsbelowarabic': '\u06D1', - 'yekorean': '\u3156', - 'yen': '\u00A5', - 'yenmonospace': '\uFFE5', - 'yeokorean': '\u3155', - 'yeorinhieuhkorean': '\u3186', - 'yerahbenyomohebrew': '\u05AA', - 'yerahbenyomolefthebrew': '\u05AA', - 'yericyrillic': '\u044B', - 'yerudieresiscyrillic': '\u04F9', - 'yesieungkorean': '\u3181', - 'yesieungpansioskorean': '\u3183', - 'yesieungsioskorean': '\u3182', - 'yetivhebrew': '\u059A', - 'ygrave': '\u1EF3', - 'yhook': '\u01B4', - 'yhookabove': '\u1EF7', - 'yiarmenian': '\u0575', - 'yicyrillic': '\u0457', - 'yikorean': '\u3162', - 'yinyang': '\u262F', - 'yiwnarmenian': '\u0582', - 'ymonospace': '\uFF59', - 'yod': '\u05D9', - 'yoddagesh': '\uFB39', - 'yoddageshhebrew': '\uFB39', - 'yodhebrew': '\u05D9', - 'yodyodhebrew': '\u05F2', - 'yodyodpatahhebrew': '\uFB1F', - 'yohiragana': '\u3088', - 'yoikorean': '\u3189', - 'yokatakana': '\u30E8', - 'yokatakanahalfwidth': '\uFF96', - 'yokorean': '\u315B', - 'yosmallhiragana': '\u3087', - 'yosmallkatakana': '\u30E7', - 'yosmallkatakanahalfwidth': '\uFF6E', - 'yotgreek': '\u03F3', - 'yoyaekorean': '\u3188', - 'yoyakorean': '\u3187', - 'yoyakthai': '\u0E22', - 'yoyingthai': '\u0E0D', - 'yparen': '\u24B4', - 'ypogegrammeni': '\u037A', - 'ypogegrammenigreekcmb': '\u0345', - 'yr': '\u01A6', - 'yring': '\u1E99', - 'ysuperior': '\u02B8', - 'ytilde': '\u1EF9', - 'yturned': '\u028E', - 'yuhiragana': '\u3086', - 'yuikorean': '\u318C', - 'yukatakana': '\u30E6', - 'yukatakanahalfwidth': '\uFF95', - 'yukorean': '\u3160', - 'yusbigcyrillic': '\u046B', - 'yusbigiotifiedcyrillic': '\u046D', - 'yuslittlecyrillic': '\u0467', - 'yuslittleiotifiedcyrillic': '\u0469', - 'yusmallhiragana': '\u3085', - 'yusmallkatakana': '\u30E5', - 'yusmallkatakanahalfwidth': '\uFF6D', - 'yuyekorean': '\u318B', - 'yuyeokorean': '\u318A', - 'yyabengali': '\u09DF', - 'yyadeva': '\u095F', - 'z': '\u007A', - 'zaarmenian': '\u0566', - 'zacute': '\u017A', - 'zadeva': '\u095B', - 'zagurmukhi': '\u0A5B', - 'zaharabic': '\u0638', - 'zahfinalarabic': '\uFEC6', - 'zahinitialarabic': '\uFEC7', - 'zahiragana': '\u3056', - 'zahmedialarabic': '\uFEC8', - 'zainarabic': '\u0632', - 'zainfinalarabic': '\uFEB0', - 'zakatakana': '\u30B6', - 'zaqefgadolhebrew': '\u0595', - 'zaqefqatanhebrew': '\u0594', - 'zarqahebrew': '\u0598', - 'zayin': '\u05D6', - 'zayindagesh': '\uFB36', - 'zayindageshhebrew': '\uFB36', - 'zayinhebrew': '\u05D6', - 'zbopomofo': '\u3117', - 'zcaron': '\u017E', - 'zcircle': '\u24E9', - 'zcircumflex': '\u1E91', - 'zcurl': '\u0291', - 'zdot': '\u017C', - 'zdotaccent': '\u017C', - 'zdotbelow': '\u1E93', - 'zecyrillic': '\u0437', - 'zedescendercyrillic': '\u0499', - 'zedieresiscyrillic': '\u04DF', - 'zehiragana': '\u305C', - 'zekatakana': '\u30BC', - 'zero': '\u0030', - 'zeroarabic': '\u0660', - 'zerobengali': '\u09E6', - 'zerodeva': '\u0966', - 'zerogujarati': '\u0AE6', - 'zerogurmukhi': '\u0A66', - 'zerohackarabic': '\u0660', - 'zeroinferior': '\u2080', - 'zeromonospace': '\uFF10', - 'zerooldstyle': '\uF730', - 'zeropersian': '\u06F0', - 'zerosuperior': '\u2070', - 'zerothai': '\u0E50', - 'zerowidthjoiner': '\uFEFF', - 'zerowidthnonjoiner': '\u200C', - 'zerowidthspace': '\u200B', - 'zeta': '\u03B6', - 'zhbopomofo': '\u3113', - 'zhearmenian': '\u056A', - 'zhebrevecyrillic': '\u04C2', - 'zhecyrillic': '\u0436', - 'zhedescendercyrillic': '\u0497', - 'zhedieresiscyrillic': '\u04DD', - 'zihiragana': '\u3058', - 'zikatakana': '\u30B8', - 'zinorhebrew': '\u05AE', - 'zlinebelow': '\u1E95', - 'zmonospace': '\uFF5A', - 'zohiragana': '\u305E', - 'zokatakana': '\u30BE', - 'zparen': '\u24B5', - 'zretroflexhook': '\u0290', - 'zstroke': '\u01B6', - 'zuhiragana': '\u305A', - 'zukatakana': '\u30BA', + 'A': u'\u0041', + 'AE': u'\u00C6', + 'AEacute': u'\u01FC', + 'AEmacron': u'\u01E2', + 'AEsmall': u'\uF7E6', + 'Aacute': u'\u00C1', + 'Aacutesmall': u'\uF7E1', + 'Abreve': u'\u0102', + 'Abreveacute': u'\u1EAE', + 'Abrevecyrillic': u'\u04D0', + 'Abrevedotbelow': u'\u1EB6', + 'Abrevegrave': u'\u1EB0', + 'Abrevehookabove': u'\u1EB2', + 'Abrevetilde': u'\u1EB4', + 'Acaron': u'\u01CD', + 'Acircle': u'\u24B6', + 'Acircumflex': u'\u00C2', + 'Acircumflexacute': u'\u1EA4', + 'Acircumflexdotbelow': u'\u1EAC', + 'Acircumflexgrave': u'\u1EA6', + 'Acircumflexhookabove': u'\u1EA8', + 'Acircumflexsmall': u'\uF7E2', + 'Acircumflextilde': u'\u1EAA', + 'Acute': u'\uF6C9', + 'Acutesmall': u'\uF7B4', + 'Acyrillic': u'\u0410', + 'Adblgrave': u'\u0200', + 'Adieresis': u'\u00C4', + 'Adieresiscyrillic': u'\u04D2', + 'Adieresismacron': u'\u01DE', + 'Adieresissmall': u'\uF7E4', + 'Adotbelow': u'\u1EA0', + 'Adotmacron': u'\u01E0', + 'Agrave': u'\u00C0', + 'Agravesmall': u'\uF7E0', + 'Ahookabove': u'\u1EA2', + 'Aiecyrillic': u'\u04D4', + 'Ainvertedbreve': u'\u0202', + 'Alpha': u'\u0391', + 'Alphatonos': u'\u0386', + 'Amacron': u'\u0100', + 'Amonospace': u'\uFF21', + 'Aogonek': u'\u0104', + 'Aring': u'\u00C5', + 'Aringacute': u'\u01FA', + 'Aringbelow': u'\u1E00', + 'Aringsmall': u'\uF7E5', + 'Asmall': u'\uF761', + 'Atilde': u'\u00C3', + 'Atildesmall': u'\uF7E3', + 'Aybarmenian': u'\u0531', + 'B': u'\u0042', + 'Bcircle': u'\u24B7', + 'Bdotaccent': u'\u1E02', + 'Bdotbelow': u'\u1E04', + 'Becyrillic': u'\u0411', + 'Benarmenian': u'\u0532', + 'Beta': u'\u0392', + 'Bhook': u'\u0181', + 'Blinebelow': u'\u1E06', + 'Bmonospace': u'\uFF22', + 'Brevesmall': u'\uF6F4', + 'Bsmall': u'\uF762', + 'Btopbar': u'\u0182', + 'C': u'\u0043', + 'Caarmenian': u'\u053E', + 'Cacute': u'\u0106', + 'Caron': u'\uF6CA', + 'Caronsmall': u'\uF6F5', + 'Ccaron': u'\u010C', + 'Ccedilla': u'\u00C7', + 'Ccedillaacute': u'\u1E08', + 'Ccedillasmall': u'\uF7E7', + 'Ccircle': u'\u24B8', + 'Ccircumflex': u'\u0108', + 'Cdot': u'\u010A', + 'Cdotaccent': u'\u010A', + 'Cedillasmall': u'\uF7B8', + 'Chaarmenian': u'\u0549', + 'Cheabkhasiancyrillic': u'\u04BC', + 'Checyrillic': u'\u0427', + 'Chedescenderabkhasiancyrillic': u'\u04BE', + 'Chedescendercyrillic': u'\u04B6', + 'Chedieresiscyrillic': u'\u04F4', + 'Cheharmenian': u'\u0543', + 'Chekhakassiancyrillic': u'\u04CB', + 'Cheverticalstrokecyrillic': u'\u04B8', + 'Chi': u'\u03A7', + 'Chook': u'\u0187', + 'Circumflexsmall': u'\uF6F6', + 'Cmonospace': u'\uFF23', + 'Coarmenian': u'\u0551', + 'Csmall': u'\uF763', + 'D': u'\u0044', + 'DZ': u'\u01F1', + 'DZcaron': u'\u01C4', + 'Daarmenian': u'\u0534', + 'Dafrican': u'\u0189', + 'Dcaron': u'\u010E', + 'Dcedilla': u'\u1E10', + 'Dcircle': u'\u24B9', + 'Dcircumflexbelow': u'\u1E12', + 'Dcroat': u'\u0110', + 'Ddotaccent': u'\u1E0A', + 'Ddotbelow': u'\u1E0C', + 'Decyrillic': u'\u0414', + 'Deicoptic': u'\u03EE', + 'Delta': u'\u2206', + 'Deltagreek': u'\u0394', + 'Dhook': u'\u018A', + 'Dieresis': u'\uF6CB', + 'DieresisAcute': u'\uF6CC', + 'DieresisGrave': u'\uF6CD', + 'Dieresissmall': u'\uF7A8', + 'Digammagreek': u'\u03DC', + 'Djecyrillic': u'\u0402', + 'Dlinebelow': u'\u1E0E', + 'Dmonospace': u'\uFF24', + 'Dotaccentsmall': u'\uF6F7', + 'Dslash': u'\u0110', + 'Dsmall': u'\uF764', + 'Dtopbar': u'\u018B', + 'Dz': u'\u01F2', + 'Dzcaron': u'\u01C5', + 'Dzeabkhasiancyrillic': u'\u04E0', + 'Dzecyrillic': u'\u0405', + 'Dzhecyrillic': u'\u040F', + 'E': u'\u0045', + 'Eacute': u'\u00C9', + 'Eacutesmall': u'\uF7E9', + 'Ebreve': u'\u0114', + 'Ecaron': u'\u011A', + 'Ecedillabreve': u'\u1E1C', + 'Echarmenian': u'\u0535', + 'Ecircle': u'\u24BA', + 'Ecircumflex': u'\u00CA', + 'Ecircumflexacute': u'\u1EBE', + 'Ecircumflexbelow': u'\u1E18', + 'Ecircumflexdotbelow': u'\u1EC6', + 'Ecircumflexgrave': u'\u1EC0', + 'Ecircumflexhookabove': u'\u1EC2', + 'Ecircumflexsmall': u'\uF7EA', + 'Ecircumflextilde': u'\u1EC4', + 'Ecyrillic': u'\u0404', + 'Edblgrave': u'\u0204', + 'Edieresis': u'\u00CB', + 'Edieresissmall': u'\uF7EB', + 'Edot': u'\u0116', + 'Edotaccent': u'\u0116', + 'Edotbelow': u'\u1EB8', + 'Efcyrillic': u'\u0424', + 'Egrave': u'\u00C8', + 'Egravesmall': u'\uF7E8', + 'Eharmenian': u'\u0537', + 'Ehookabove': u'\u1EBA', + 'Eightroman': u'\u2167', + 'Einvertedbreve': u'\u0206', + 'Eiotifiedcyrillic': u'\u0464', + 'Elcyrillic': u'\u041B', + 'Elevenroman': u'\u216A', + 'Emacron': u'\u0112', + 'Emacronacute': u'\u1E16', + 'Emacrongrave': u'\u1E14', + 'Emcyrillic': u'\u041C', + 'Emonospace': u'\uFF25', + 'Encyrillic': u'\u041D', + 'Endescendercyrillic': u'\u04A2', + 'Eng': u'\u014A', + 'Enghecyrillic': u'\u04A4', + 'Enhookcyrillic': u'\u04C7', + 'Eogonek': u'\u0118', + 'Eopen': u'\u0190', + 'Epsilon': u'\u0395', + 'Epsilontonos': u'\u0388', + 'Ercyrillic': u'\u0420', + 'Ereversed': u'\u018E', + 'Ereversedcyrillic': u'\u042D', + 'Escyrillic': u'\u0421', + 'Esdescendercyrillic': u'\u04AA', + 'Esh': u'\u01A9', + 'Esmall': u'\uF765', + 'Eta': u'\u0397', + 'Etarmenian': u'\u0538', + 'Etatonos': u'\u0389', + 'Eth': u'\u00D0', + 'Ethsmall': u'\uF7F0', + 'Etilde': u'\u1EBC', + 'Etildebelow': u'\u1E1A', + 'Euro': u'\u20AC', + 'Ezh': u'\u01B7', + 'Ezhcaron': u'\u01EE', + 'Ezhreversed': u'\u01B8', + 'F': u'\u0046', + 'Fcircle': u'\u24BB', + 'Fdotaccent': u'\u1E1E', + 'Feharmenian': u'\u0556', + 'Feicoptic': u'\u03E4', + 'Fhook': u'\u0191', + 'Fitacyrillic': u'\u0472', + 'Fiveroman': u'\u2164', + 'Fmonospace': u'\uFF26', + 'Fourroman': u'\u2163', + 'Fsmall': u'\uF766', + 'G': u'\u0047', + 'GBsquare': u'\u3387', + 'Gacute': u'\u01F4', + 'Gamma': u'\u0393', + 'Gammaafrican': u'\u0194', + 'Gangiacoptic': u'\u03EA', + 'Gbreve': u'\u011E', + 'Gcaron': u'\u01E6', + 'Gcedilla': u'\u0122', + 'Gcircle': u'\u24BC', + 'Gcircumflex': u'\u011C', + 'Gcommaaccent': u'\u0122', + 'Gdot': u'\u0120', + 'Gdotaccent': u'\u0120', + 'Gecyrillic': u'\u0413', + 'Ghadarmenian': u'\u0542', + 'Ghemiddlehookcyrillic': u'\u0494', + 'Ghestrokecyrillic': u'\u0492', + 'Gheupturncyrillic': u'\u0490', + 'Ghook': u'\u0193', + 'Gimarmenian': u'\u0533', + 'Gjecyrillic': u'\u0403', + 'Gmacron': u'\u1E20', + 'Gmonospace': u'\uFF27', + 'Grave': u'\uF6CE', + 'Gravesmall': u'\uF760', + 'Gsmall': u'\uF767', + 'Gsmallhook': u'\u029B', + 'Gstroke': u'\u01E4', + 'H': u'\u0048', + 'H18533': u'\u25CF', + 'H18543': u'\u25AA', + 'H18551': u'\u25AB', + 'H22073': u'\u25A1', + 'HPsquare': u'\u33CB', + 'Haabkhasiancyrillic': u'\u04A8', + 'Hadescendercyrillic': u'\u04B2', + 'Hardsigncyrillic': u'\u042A', + 'Hbar': u'\u0126', + 'Hbrevebelow': u'\u1E2A', + 'Hcedilla': u'\u1E28', + 'Hcircle': u'\u24BD', + 'Hcircumflex': u'\u0124', + 'Hdieresis': u'\u1E26', + 'Hdotaccent': u'\u1E22', + 'Hdotbelow': u'\u1E24', + 'Hmonospace': u'\uFF28', + 'Hoarmenian': u'\u0540', + 'Horicoptic': u'\u03E8', + 'Hsmall': u'\uF768', + 'Hungarumlaut': u'\uF6CF', + 'Hungarumlautsmall': u'\uF6F8', + 'Hzsquare': u'\u3390', + 'I': u'\u0049', + 'IAcyrillic': u'\u042F', + 'IJ': u'\u0132', + 'IUcyrillic': u'\u042E', + 'Iacute': u'\u00CD', + 'Iacutesmall': u'\uF7ED', + 'Ibreve': u'\u012C', + 'Icaron': u'\u01CF', + 'Icircle': u'\u24BE', + 'Icircumflex': u'\u00CE', + 'Icircumflexsmall': u'\uF7EE', + 'Icyrillic': u'\u0406', + 'Idblgrave': u'\u0208', + 'Idieresis': u'\u00CF', + 'Idieresisacute': u'\u1E2E', + 'Idieresiscyrillic': u'\u04E4', + 'Idieresissmall': u'\uF7EF', + 'Idot': u'\u0130', + 'Idotaccent': u'\u0130', + 'Idotbelow': u'\u1ECA', + 'Iebrevecyrillic': u'\u04D6', + 'Iecyrillic': u'\u0415', + 'Ifraktur': u'\u2111', + 'Igrave': u'\u00CC', + 'Igravesmall': u'\uF7EC', + 'Ihookabove': u'\u1EC8', + 'Iicyrillic': u'\u0418', + 'Iinvertedbreve': u'\u020A', + 'Iishortcyrillic': u'\u0419', + 'Imacron': u'\u012A', + 'Imacroncyrillic': u'\u04E2', + 'Imonospace': u'\uFF29', + 'Iniarmenian': u'\u053B', + 'Iocyrillic': u'\u0401', + 'Iogonek': u'\u012E', + 'Iota': u'\u0399', + 'Iotaafrican': u'\u0196', + 'Iotadieresis': u'\u03AA', + 'Iotatonos': u'\u038A', + 'Ismall': u'\uF769', + 'Istroke': u'\u0197', + 'Itilde': u'\u0128', + 'Itildebelow': u'\u1E2C', + 'Izhitsacyrillic': u'\u0474', + 'Izhitsadblgravecyrillic': u'\u0476', + 'J': u'\u004A', + 'Jaarmenian': u'\u0541', + 'Jcircle': u'\u24BF', + 'Jcircumflex': u'\u0134', + 'Jecyrillic': u'\u0408', + 'Jheharmenian': u'\u054B', + 'Jmonospace': u'\uFF2A', + 'Jsmall': u'\uF76A', + 'K': u'\u004B', + 'KBsquare': u'\u3385', + 'KKsquare': u'\u33CD', + 'Kabashkircyrillic': u'\u04A0', + 'Kacute': u'\u1E30', + 'Kacyrillic': u'\u041A', + 'Kadescendercyrillic': u'\u049A', + 'Kahookcyrillic': u'\u04C3', + 'Kappa': u'\u039A', + 'Kastrokecyrillic': u'\u049E', + 'Kaverticalstrokecyrillic': u'\u049C', + 'Kcaron': u'\u01E8', + 'Kcedilla': u'\u0136', + 'Kcircle': u'\u24C0', + 'Kcommaaccent': u'\u0136', + 'Kdotbelow': u'\u1E32', + 'Keharmenian': u'\u0554', + 'Kenarmenian': u'\u053F', + 'Khacyrillic': u'\u0425', + 'Kheicoptic': u'\u03E6', + 'Khook': u'\u0198', + 'Kjecyrillic': u'\u040C', + 'Klinebelow': u'\u1E34', + 'Kmonospace': u'\uFF2B', + 'Koppacyrillic': u'\u0480', + 'Koppagreek': u'\u03DE', + 'Ksicyrillic': u'\u046E', + 'Ksmall': u'\uF76B', + 'L': u'\u004C', + 'LJ': u'\u01C7', + 'LL': u'\uF6BF', + 'Lacute': u'\u0139', + 'Lambda': u'\u039B', + 'Lcaron': u'\u013D', + 'Lcedilla': u'\u013B', + 'Lcircle': u'\u24C1', + 'Lcircumflexbelow': u'\u1E3C', + 'Lcommaaccent': u'\u013B', + 'Ldot': u'\u013F', + 'Ldotaccent': u'\u013F', + 'Ldotbelow': u'\u1E36', + 'Ldotbelowmacron': u'\u1E38', + 'Liwnarmenian': u'\u053C', + 'Lj': u'\u01C8', + 'Ljecyrillic': u'\u0409', + 'Llinebelow': u'\u1E3A', + 'Lmonospace': u'\uFF2C', + 'Lslash': u'\u0141', + 'Lslashsmall': u'\uF6F9', + 'Lsmall': u'\uF76C', + 'M': u'\u004D', + 'MBsquare': u'\u3386', + 'Macron': u'\uF6D0', + 'Macronsmall': u'\uF7AF', + 'Macute': u'\u1E3E', + 'Mcircle': u'\u24C2', + 'Mdotaccent': u'\u1E40', + 'Mdotbelow': u'\u1E42', + 'Menarmenian': u'\u0544', + 'Mmonospace': u'\uFF2D', + 'Msmall': u'\uF76D', + 'Mturned': u'\u019C', + 'Mu': u'\u039C', + 'N': u'\u004E', + 'NJ': u'\u01CA', + 'Nacute': u'\u0143', + 'Ncaron': u'\u0147', + 'Ncedilla': u'\u0145', + 'Ncircle': u'\u24C3', + 'Ncircumflexbelow': u'\u1E4A', + 'Ncommaaccent': u'\u0145', + 'Ndotaccent': u'\u1E44', + 'Ndotbelow': u'\u1E46', + 'Nhookleft': u'\u019D', + 'Nineroman': u'\u2168', + 'Nj': u'\u01CB', + 'Njecyrillic': u'\u040A', + 'Nlinebelow': u'\u1E48', + 'Nmonospace': u'\uFF2E', + 'Nowarmenian': u'\u0546', + 'Nsmall': u'\uF76E', + 'Ntilde': u'\u00D1', + 'Ntildesmall': u'\uF7F1', + 'Nu': u'\u039D', + 'O': u'\u004F', + 'OE': u'\u0152', + 'OEsmall': u'\uF6FA', + 'Oacute': u'\u00D3', + 'Oacutesmall': u'\uF7F3', + 'Obarredcyrillic': u'\u04E8', + 'Obarreddieresiscyrillic': u'\u04EA', + 'Obreve': u'\u014E', + 'Ocaron': u'\u01D1', + 'Ocenteredtilde': u'\u019F', + 'Ocircle': u'\u24C4', + 'Ocircumflex': u'\u00D4', + 'Ocircumflexacute': u'\u1ED0', + 'Ocircumflexdotbelow': u'\u1ED8', + 'Ocircumflexgrave': u'\u1ED2', + 'Ocircumflexhookabove': u'\u1ED4', + 'Ocircumflexsmall': u'\uF7F4', + 'Ocircumflextilde': u'\u1ED6', + 'Ocyrillic': u'\u041E', + 'Odblacute': u'\u0150', + 'Odblgrave': u'\u020C', + 'Odieresis': u'\u00D6', + 'Odieresiscyrillic': u'\u04E6', + 'Odieresissmall': u'\uF7F6', + 'Odotbelow': u'\u1ECC', + 'Ogoneksmall': u'\uF6FB', + 'Ograve': u'\u00D2', + 'Ogravesmall': u'\uF7F2', + 'Oharmenian': u'\u0555', + 'Ohm': u'\u2126', + 'Ohookabove': u'\u1ECE', + 'Ohorn': u'\u01A0', + 'Ohornacute': u'\u1EDA', + 'Ohorndotbelow': u'\u1EE2', + 'Ohorngrave': u'\u1EDC', + 'Ohornhookabove': u'\u1EDE', + 'Ohorntilde': u'\u1EE0', + 'Ohungarumlaut': u'\u0150', + 'Oi': u'\u01A2', + 'Oinvertedbreve': u'\u020E', + 'Omacron': u'\u014C', + 'Omacronacute': u'\u1E52', + 'Omacrongrave': u'\u1E50', + 'Omega': u'\u2126', + 'Omegacyrillic': u'\u0460', + 'Omegagreek': u'\u03A9', + 'Omegaroundcyrillic': u'\u047A', + 'Omegatitlocyrillic': u'\u047C', + 'Omegatonos': u'\u038F', + 'Omicron': u'\u039F', + 'Omicrontonos': u'\u038C', + 'Omonospace': u'\uFF2F', + 'Oneroman': u'\u2160', + 'Oogonek': u'\u01EA', + 'Oogonekmacron': u'\u01EC', + 'Oopen': u'\u0186', + 'Oslash': u'\u00D8', + 'Oslashacute': u'\u01FE', + 'Oslashsmall': u'\uF7F8', + 'Osmall': u'\uF76F', + 'Ostrokeacute': u'\u01FE', + 'Otcyrillic': u'\u047E', + 'Otilde': u'\u00D5', + 'Otildeacute': u'\u1E4C', + 'Otildedieresis': u'\u1E4E', + 'Otildesmall': u'\uF7F5', + 'P': u'\u0050', + 'Pacute': u'\u1E54', + 'Pcircle': u'\u24C5', + 'Pdotaccent': u'\u1E56', + 'Pecyrillic': u'\u041F', + 'Peharmenian': u'\u054A', + 'Pemiddlehookcyrillic': u'\u04A6', + 'Phi': u'\u03A6', + 'Phook': u'\u01A4', + 'Pi': u'\u03A0', + 'Piwrarmenian': u'\u0553', + 'Pmonospace': u'\uFF30', + 'Psi': u'\u03A8', + 'Psicyrillic': u'\u0470', + 'Psmall': u'\uF770', + 'Q': u'\u0051', + 'Qcircle': u'\u24C6', + 'Qmonospace': u'\uFF31', + 'Qsmall': u'\uF771', + 'R': u'\u0052', + 'Raarmenian': u'\u054C', + 'Racute': u'\u0154', + 'Rcaron': u'\u0158', + 'Rcedilla': u'\u0156', + 'Rcircle': u'\u24C7', + 'Rcommaaccent': u'\u0156', + 'Rdblgrave': u'\u0210', + 'Rdotaccent': u'\u1E58', + 'Rdotbelow': u'\u1E5A', + 'Rdotbelowmacron': u'\u1E5C', + 'Reharmenian': u'\u0550', + 'Rfraktur': u'\u211C', + 'Rho': u'\u03A1', + 'Ringsmall': u'\uF6FC', + 'Rinvertedbreve': u'\u0212', + 'Rlinebelow': u'\u1E5E', + 'Rmonospace': u'\uFF32', + 'Rsmall': u'\uF772', + 'Rsmallinverted': u'\u0281', + 'Rsmallinvertedsuperior': u'\u02B6', + 'S': u'\u0053', + 'SF010000': u'\u250C', + 'SF020000': u'\u2514', + 'SF030000': u'\u2510', + 'SF040000': u'\u2518', + 'SF050000': u'\u253C', + 'SF060000': u'\u252C', + 'SF070000': u'\u2534', + 'SF080000': u'\u251C', + 'SF090000': u'\u2524', + 'SF100000': u'\u2500', + 'SF110000': u'\u2502', + 'SF190000': u'\u2561', + 'SF200000': u'\u2562', + 'SF210000': u'\u2556', + 'SF220000': u'\u2555', + 'SF230000': u'\u2563', + 'SF240000': u'\u2551', + 'SF250000': u'\u2557', + 'SF260000': u'\u255D', + 'SF270000': u'\u255C', + 'SF280000': u'\u255B', + 'SF360000': u'\u255E', + 'SF370000': u'\u255F', + 'SF380000': u'\u255A', + 'SF390000': u'\u2554', + 'SF400000': u'\u2569', + 'SF410000': u'\u2566', + 'SF420000': u'\u2560', + 'SF430000': u'\u2550', + 'SF440000': u'\u256C', + 'SF450000': u'\u2567', + 'SF460000': u'\u2568', + 'SF470000': u'\u2564', + 'SF480000': u'\u2565', + 'SF490000': u'\u2559', + 'SF500000': u'\u2558', + 'SF510000': u'\u2552', + 'SF520000': u'\u2553', + 'SF530000': u'\u256B', + 'SF540000': u'\u256A', + 'Sacute': u'\u015A', + 'Sacutedotaccent': u'\u1E64', + 'Sampigreek': u'\u03E0', + 'Scaron': u'\u0160', + 'Scarondotaccent': u'\u1E66', + 'Scaronsmall': u'\uF6FD', + 'Scedilla': u'\u015E', + 'Schwa': u'\u018F', + 'Schwacyrillic': u'\u04D8', + 'Schwadieresiscyrillic': u'\u04DA', + 'Scircle': u'\u24C8', + 'Scircumflex': u'\u015C', + 'Scommaaccent': u'\u0218', + 'Sdotaccent': u'\u1E60', + 'Sdotbelow': u'\u1E62', + 'Sdotbelowdotaccent': u'\u1E68', + 'Seharmenian': u'\u054D', + 'Sevenroman': u'\u2166', + 'Shaarmenian': u'\u0547', + 'Shacyrillic': u'\u0428', + 'Shchacyrillic': u'\u0429', + 'Sheicoptic': u'\u03E2', + 'Shhacyrillic': u'\u04BA', + 'Shimacoptic': u'\u03EC', + 'Sigma': u'\u03A3', + 'Sixroman': u'\u2165', + 'Smonospace': u'\uFF33', + 'Softsigncyrillic': u'\u042C', + 'Ssmall': u'\uF773', + 'Stigmagreek': u'\u03DA', + 'T': u'\u0054', + 'Tau': u'\u03A4', + 'Tbar': u'\u0166', + 'Tcaron': u'\u0164', + 'Tcedilla': u'\u0162', + 'Tcircle': u'\u24C9', + 'Tcircumflexbelow': u'\u1E70', + 'Tcommaaccent': u'\u0162', + 'Tdotaccent': u'\u1E6A', + 'Tdotbelow': u'\u1E6C', + 'Tecyrillic': u'\u0422', + 'Tedescendercyrillic': u'\u04AC', + 'Tenroman': u'\u2169', + 'Tetsecyrillic': u'\u04B4', + 'Theta': u'\u0398', + 'Thook': u'\u01AC', + 'Thorn': u'\u00DE', + 'Thornsmall': u'\uF7FE', + 'Threeroman': u'\u2162', + 'Tildesmall': u'\uF6FE', + 'Tiwnarmenian': u'\u054F', + 'Tlinebelow': u'\u1E6E', + 'Tmonospace': u'\uFF34', + 'Toarmenian': u'\u0539', + 'Tonefive': u'\u01BC', + 'Tonesix': u'\u0184', + 'Tonetwo': u'\u01A7', + 'Tretroflexhook': u'\u01AE', + 'Tsecyrillic': u'\u0426', + 'Tshecyrillic': u'\u040B', + 'Tsmall': u'\uF774', + 'Twelveroman': u'\u216B', + 'Tworoman': u'\u2161', + 'U': u'\u0055', + 'Uacute': u'\u00DA', + 'Uacutesmall': u'\uF7FA', + 'Ubreve': u'\u016C', + 'Ucaron': u'\u01D3', + 'Ucircle': u'\u24CA', + 'Ucircumflex': u'\u00DB', + 'Ucircumflexbelow': u'\u1E76', + 'Ucircumflexsmall': u'\uF7FB', + 'Ucyrillic': u'\u0423', + 'Udblacute': u'\u0170', + 'Udblgrave': u'\u0214', + 'Udieresis': u'\u00DC', + 'Udieresisacute': u'\u01D7', + 'Udieresisbelow': u'\u1E72', + 'Udieresiscaron': u'\u01D9', + 'Udieresiscyrillic': u'\u04F0', + 'Udieresisgrave': u'\u01DB', + 'Udieresismacron': u'\u01D5', + 'Udieresissmall': u'\uF7FC', + 'Udotbelow': u'\u1EE4', + 'Ugrave': u'\u00D9', + 'Ugravesmall': u'\uF7F9', + 'Uhookabove': u'\u1EE6', + 'Uhorn': u'\u01AF', + 'Uhornacute': u'\u1EE8', + 'Uhorndotbelow': u'\u1EF0', + 'Uhorngrave': u'\u1EEA', + 'Uhornhookabove': u'\u1EEC', + 'Uhorntilde': u'\u1EEE', + 'Uhungarumlaut': u'\u0170', + 'Uhungarumlautcyrillic': u'\u04F2', + 'Uinvertedbreve': u'\u0216', + 'Ukcyrillic': u'\u0478', + 'Umacron': u'\u016A', + 'Umacroncyrillic': u'\u04EE', + 'Umacrondieresis': u'\u1E7A', + 'Umonospace': u'\uFF35', + 'Uogonek': u'\u0172', + 'Upsilon': u'\u03A5', + 'Upsilon1': u'\u03D2', + 'Upsilonacutehooksymbolgreek': u'\u03D3', + 'Upsilonafrican': u'\u01B1', + 'Upsilondieresis': u'\u03AB', + 'Upsilondieresishooksymbolgreek': u'\u03D4', + 'Upsilonhooksymbol': u'\u03D2', + 'Upsilontonos': u'\u038E', + 'Uring': u'\u016E', + 'Ushortcyrillic': u'\u040E', + 'Usmall': u'\uF775', + 'Ustraightcyrillic': u'\u04AE', + 'Ustraightstrokecyrillic': u'\u04B0', + 'Utilde': u'\u0168', + 'Utildeacute': u'\u1E78', + 'Utildebelow': u'\u1E74', + 'V': u'\u0056', + 'Vcircle': u'\u24CB', + 'Vdotbelow': u'\u1E7E', + 'Vecyrillic': u'\u0412', + 'Vewarmenian': u'\u054E', + 'Vhook': u'\u01B2', + 'Vmonospace': u'\uFF36', + 'Voarmenian': u'\u0548', + 'Vsmall': u'\uF776', + 'Vtilde': u'\u1E7C', + 'W': u'\u0057', + 'Wacute': u'\u1E82', + 'Wcircle': u'\u24CC', + 'Wcircumflex': u'\u0174', + 'Wdieresis': u'\u1E84', + 'Wdotaccent': u'\u1E86', + 'Wdotbelow': u'\u1E88', + 'Wgrave': u'\u1E80', + 'Wmonospace': u'\uFF37', + 'Wsmall': u'\uF777', + 'X': u'\u0058', + 'Xcircle': u'\u24CD', + 'Xdieresis': u'\u1E8C', + 'Xdotaccent': u'\u1E8A', + 'Xeharmenian': u'\u053D', + 'Xi': u'\u039E', + 'Xmonospace': u'\uFF38', + 'Xsmall': u'\uF778', + 'Y': u'\u0059', + 'Yacute': u'\u00DD', + 'Yacutesmall': u'\uF7FD', + 'Yatcyrillic': u'\u0462', + 'Ycircle': u'\u24CE', + 'Ycircumflex': u'\u0176', + 'Ydieresis': u'\u0178', + 'Ydieresissmall': u'\uF7FF', + 'Ydotaccent': u'\u1E8E', + 'Ydotbelow': u'\u1EF4', + 'Yericyrillic': u'\u042B', + 'Yerudieresiscyrillic': u'\u04F8', + 'Ygrave': u'\u1EF2', + 'Yhook': u'\u01B3', + 'Yhookabove': u'\u1EF6', + 'Yiarmenian': u'\u0545', + 'Yicyrillic': u'\u0407', + 'Yiwnarmenian': u'\u0552', + 'Ymonospace': u'\uFF39', + 'Ysmall': u'\uF779', + 'Ytilde': u'\u1EF8', + 'Yusbigcyrillic': u'\u046A', + 'Yusbigiotifiedcyrillic': u'\u046C', + 'Yuslittlecyrillic': u'\u0466', + 'Yuslittleiotifiedcyrillic': u'\u0468', + 'Z': u'\u005A', + 'Zaarmenian': u'\u0536', + 'Zacute': u'\u0179', + 'Zcaron': u'\u017D', + 'Zcaronsmall': u'\uF6FF', + 'Zcircle': u'\u24CF', + 'Zcircumflex': u'\u1E90', + 'Zdot': u'\u017B', + 'Zdotaccent': u'\u017B', + 'Zdotbelow': u'\u1E92', + 'Zecyrillic': u'\u0417', + 'Zedescendercyrillic': u'\u0498', + 'Zedieresiscyrillic': u'\u04DE', + 'Zeta': u'\u0396', + 'Zhearmenian': u'\u053A', + 'Zhebrevecyrillic': u'\u04C1', + 'Zhecyrillic': u'\u0416', + 'Zhedescendercyrillic': u'\u0496', + 'Zhedieresiscyrillic': u'\u04DC', + 'Zlinebelow': u'\u1E94', + 'Zmonospace': u'\uFF3A', + 'Zsmall': u'\uF77A', + 'Zstroke': u'\u01B5', + 'a': u'\u0061', + 'aabengali': u'\u0986', + 'aacute': u'\u00E1', + 'aadeva': u'\u0906', + 'aagujarati': u'\u0A86', + 'aagurmukhi': u'\u0A06', + 'aamatragurmukhi': u'\u0A3E', + 'aarusquare': u'\u3303', + 'aavowelsignbengali': u'\u09BE', + 'aavowelsigndeva': u'\u093E', + 'aavowelsigngujarati': u'\u0ABE', + 'abbreviationmarkarmenian': u'\u055F', + 'abbreviationsigndeva': u'\u0970', + 'abengali': u'\u0985', + 'abopomofo': u'\u311A', + 'abreve': u'\u0103', + 'abreveacute': u'\u1EAF', + 'abrevecyrillic': u'\u04D1', + 'abrevedotbelow': u'\u1EB7', + 'abrevegrave': u'\u1EB1', + 'abrevehookabove': u'\u1EB3', + 'abrevetilde': u'\u1EB5', + 'acaron': u'\u01CE', + 'acircle': u'\u24D0', + 'acircumflex': u'\u00E2', + 'acircumflexacute': u'\u1EA5', + 'acircumflexdotbelow': u'\u1EAD', + 'acircumflexgrave': u'\u1EA7', + 'acircumflexhookabove': u'\u1EA9', + 'acircumflextilde': u'\u1EAB', + 'acute': u'\u00B4', + 'acutebelowcmb': u'\u0317', + 'acutecmb': u'\u0301', + 'acutecomb': u'\u0301', + 'acutedeva': u'\u0954', + 'acutelowmod': u'\u02CF', + 'acutetonecmb': u'\u0341', + 'acyrillic': u'\u0430', + 'adblgrave': u'\u0201', + 'addakgurmukhi': u'\u0A71', + 'adeva': u'\u0905', + 'adieresis': u'\u00E4', + 'adieresiscyrillic': u'\u04D3', + 'adieresismacron': u'\u01DF', + 'adotbelow': u'\u1EA1', + 'adotmacron': u'\u01E1', + 'ae': u'\u00E6', + 'aeacute': u'\u01FD', + 'aekorean': u'\u3150', + 'aemacron': u'\u01E3', + 'afii00208': u'\u2015', + 'afii08941': u'\u20A4', + 'afii10017': u'\u0410', + 'afii10018': u'\u0411', + 'afii10019': u'\u0412', + 'afii10020': u'\u0413', + 'afii10021': u'\u0414', + 'afii10022': u'\u0415', + 'afii10023': u'\u0401', + 'afii10024': u'\u0416', + 'afii10025': u'\u0417', + 'afii10026': u'\u0418', + 'afii10027': u'\u0419', + 'afii10028': u'\u041A', + 'afii10029': u'\u041B', + 'afii10030': u'\u041C', + 'afii10031': u'\u041D', + 'afii10032': u'\u041E', + 'afii10033': u'\u041F', + 'afii10034': u'\u0420', + 'afii10035': u'\u0421', + 'afii10036': u'\u0422', + 'afii10037': u'\u0423', + 'afii10038': u'\u0424', + 'afii10039': u'\u0425', + 'afii10040': u'\u0426', + 'afii10041': u'\u0427', + 'afii10042': u'\u0428', + 'afii10043': u'\u0429', + 'afii10044': u'\u042A', + 'afii10045': u'\u042B', + 'afii10046': u'\u042C', + 'afii10047': u'\u042D', + 'afii10048': u'\u042E', + 'afii10049': u'\u042F', + 'afii10050': u'\u0490', + 'afii10051': u'\u0402', + 'afii10052': u'\u0403', + 'afii10053': u'\u0404', + 'afii10054': u'\u0405', + 'afii10055': u'\u0406', + 'afii10056': u'\u0407', + 'afii10057': u'\u0408', + 'afii10058': u'\u0409', + 'afii10059': u'\u040A', + 'afii10060': u'\u040B', + 'afii10061': u'\u040C', + 'afii10062': u'\u040E', + 'afii10063': u'\uF6C4', + 'afii10064': u'\uF6C5', + 'afii10065': u'\u0430', + 'afii10066': u'\u0431', + 'afii10067': u'\u0432', + 'afii10068': u'\u0433', + 'afii10069': u'\u0434', + 'afii10070': u'\u0435', + 'afii10071': u'\u0451', + 'afii10072': u'\u0436', + 'afii10073': u'\u0437', + 'afii10074': u'\u0438', + 'afii10075': u'\u0439', + 'afii10076': u'\u043A', + 'afii10077': u'\u043B', + 'afii10078': u'\u043C', + 'afii10079': u'\u043D', + 'afii10080': u'\u043E', + 'afii10081': u'\u043F', + 'afii10082': u'\u0440', + 'afii10083': u'\u0441', + 'afii10084': u'\u0442', + 'afii10085': u'\u0443', + 'afii10086': u'\u0444', + 'afii10087': u'\u0445', + 'afii10088': u'\u0446', + 'afii10089': u'\u0447', + 'afii10090': u'\u0448', + 'afii10091': u'\u0449', + 'afii10092': u'\u044A', + 'afii10093': u'\u044B', + 'afii10094': u'\u044C', + 'afii10095': u'\u044D', + 'afii10096': u'\u044E', + 'afii10097': u'\u044F', + 'afii10098': u'\u0491', + 'afii10099': u'\u0452', + 'afii10100': u'\u0453', + 'afii10101': u'\u0454', + 'afii10102': u'\u0455', + 'afii10103': u'\u0456', + 'afii10104': u'\u0457', + 'afii10105': u'\u0458', + 'afii10106': u'\u0459', + 'afii10107': u'\u045A', + 'afii10108': u'\u045B', + 'afii10109': u'\u045C', + 'afii10110': u'\u045E', + 'afii10145': u'\u040F', + 'afii10146': u'\u0462', + 'afii10147': u'\u0472', + 'afii10148': u'\u0474', + 'afii10192': u'\uF6C6', + 'afii10193': u'\u045F', + 'afii10194': u'\u0463', + 'afii10195': u'\u0473', + 'afii10196': u'\u0475', + 'afii10831': u'\uF6C7', + 'afii10832': u'\uF6C8', + 'afii10846': u'\u04D9', + 'afii299': u'\u200E', + 'afii300': u'\u200F', + 'afii301': u'\u200D', + 'afii57381': u'\u066A', + 'afii57388': u'\u060C', + 'afii57392': u'\u0660', + 'afii57393': u'\u0661', + 'afii57394': u'\u0662', + 'afii57395': u'\u0663', + 'afii57396': u'\u0664', + 'afii57397': u'\u0665', + 'afii57398': u'\u0666', + 'afii57399': u'\u0667', + 'afii57400': u'\u0668', + 'afii57401': u'\u0669', + 'afii57403': u'\u061B', + 'afii57407': u'\u061F', + 'afii57409': u'\u0621', + 'afii57410': u'\u0622', + 'afii57411': u'\u0623', + 'afii57412': u'\u0624', + 'afii57413': u'\u0625', + 'afii57414': u'\u0626', + 'afii57415': u'\u0627', + 'afii57416': u'\u0628', + 'afii57417': u'\u0629', + 'afii57418': u'\u062A', + 'afii57419': u'\u062B', + 'afii57420': u'\u062C', + 'afii57421': u'\u062D', + 'afii57422': u'\u062E', + 'afii57423': u'\u062F', + 'afii57424': u'\u0630', + 'afii57425': u'\u0631', + 'afii57426': u'\u0632', + 'afii57427': u'\u0633', + 'afii57428': u'\u0634', + 'afii57429': u'\u0635', + 'afii57430': u'\u0636', + 'afii57431': u'\u0637', + 'afii57432': u'\u0638', + 'afii57433': u'\u0639', + 'afii57434': u'\u063A', + 'afii57440': u'\u0640', + 'afii57441': u'\u0641', + 'afii57442': u'\u0642', + 'afii57443': u'\u0643', + 'afii57444': u'\u0644', + 'afii57445': u'\u0645', + 'afii57446': u'\u0646', + 'afii57448': u'\u0648', + 'afii57449': u'\u0649', + 'afii57450': u'\u064A', + 'afii57451': u'\u064B', + 'afii57452': u'\u064C', + 'afii57453': u'\u064D', + 'afii57454': u'\u064E', + 'afii57455': u'\u064F', + 'afii57456': u'\u0650', + 'afii57457': u'\u0651', + 'afii57458': u'\u0652', + 'afii57470': u'\u0647', + 'afii57505': u'\u06A4', + 'afii57506': u'\u067E', + 'afii57507': u'\u0686', + 'afii57508': u'\u0698', + 'afii57509': u'\u06AF', + 'afii57511': u'\u0679', + 'afii57512': u'\u0688', + 'afii57513': u'\u0691', + 'afii57514': u'\u06BA', + 'afii57519': u'\u06D2', + 'afii57534': u'\u06D5', + 'afii57636': u'\u20AA', + 'afii57645': u'\u05BE', + 'afii57658': u'\u05C3', + 'afii57664': u'\u05D0', + 'afii57665': u'\u05D1', + 'afii57666': u'\u05D2', + 'afii57667': u'\u05D3', + 'afii57668': u'\u05D4', + 'afii57669': u'\u05D5', + 'afii57670': u'\u05D6', + 'afii57671': u'\u05D7', + 'afii57672': u'\u05D8', + 'afii57673': u'\u05D9', + 'afii57674': u'\u05DA', + 'afii57675': u'\u05DB', + 'afii57676': u'\u05DC', + 'afii57677': u'\u05DD', + 'afii57678': u'\u05DE', + 'afii57679': u'\u05DF', + 'afii57680': u'\u05E0', + 'afii57681': u'\u05E1', + 'afii57682': u'\u05E2', + 'afii57683': u'\u05E3', + 'afii57684': u'\u05E4', + 'afii57685': u'\u05E5', + 'afii57686': u'\u05E6', + 'afii57687': u'\u05E7', + 'afii57688': u'\u05E8', + 'afii57689': u'\u05E9', + 'afii57690': u'\u05EA', + 'afii57694': u'\uFB2A', + 'afii57695': u'\uFB2B', + 'afii57700': u'\uFB4B', + 'afii57705': u'\uFB1F', + 'afii57716': u'\u05F0', + 'afii57717': u'\u05F1', + 'afii57718': u'\u05F2', + 'afii57723': u'\uFB35', + 'afii57793': u'\u05B4', + 'afii57794': u'\u05B5', + 'afii57795': u'\u05B6', + 'afii57796': u'\u05BB', + 'afii57797': u'\u05B8', + 'afii57798': u'\u05B7', + 'afii57799': u'\u05B0', + 'afii57800': u'\u05B2', + 'afii57801': u'\u05B1', + 'afii57802': u'\u05B3', + 'afii57803': u'\u05C2', + 'afii57804': u'\u05C1', + 'afii57806': u'\u05B9', + 'afii57807': u'\u05BC', + 'afii57839': u'\u05BD', + 'afii57841': u'\u05BF', + 'afii57842': u'\u05C0', + 'afii57929': u'\u02BC', + 'afii61248': u'\u2105', + 'afii61289': u'\u2113', + 'afii61352': u'\u2116', + 'afii61573': u'\u202C', + 'afii61574': u'\u202D', + 'afii61575': u'\u202E', + 'afii61664': u'\u200C', + 'afii63167': u'\u066D', + 'afii64937': u'\u02BD', + 'agrave': u'\u00E0', + 'agujarati': u'\u0A85', + 'agurmukhi': u'\u0A05', + 'ahiragana': u'\u3042', + 'ahookabove': u'\u1EA3', + 'aibengali': u'\u0990', + 'aibopomofo': u'\u311E', + 'aideva': u'\u0910', + 'aiecyrillic': u'\u04D5', + 'aigujarati': u'\u0A90', + 'aigurmukhi': u'\u0A10', + 'aimatragurmukhi': u'\u0A48', + 'ainarabic': u'\u0639', + 'ainfinalarabic': u'\uFECA', + 'aininitialarabic': u'\uFECB', + 'ainmedialarabic': u'\uFECC', + 'ainvertedbreve': u'\u0203', + 'aivowelsignbengali': u'\u09C8', + 'aivowelsigndeva': u'\u0948', + 'aivowelsigngujarati': u'\u0AC8', + 'akatakana': u'\u30A2', + 'akatakanahalfwidth': u'\uFF71', + 'akorean': u'\u314F', + 'alef': u'\u05D0', + 'alefarabic': u'\u0627', + 'alefdageshhebrew': u'\uFB30', + 'aleffinalarabic': u'\uFE8E', + 'alefhamzaabovearabic': u'\u0623', + 'alefhamzaabovefinalarabic': u'\uFE84', + 'alefhamzabelowarabic': u'\u0625', + 'alefhamzabelowfinalarabic': u'\uFE88', + 'alefhebrew': u'\u05D0', + 'aleflamedhebrew': u'\uFB4F', + 'alefmaddaabovearabic': u'\u0622', + 'alefmaddaabovefinalarabic': u'\uFE82', + 'alefmaksuraarabic': u'\u0649', + 'alefmaksurafinalarabic': u'\uFEF0', + 'alefmaksurainitialarabic': u'\uFEF3', + 'alefmaksuramedialarabic': u'\uFEF4', + 'alefpatahhebrew': u'\uFB2E', + 'alefqamatshebrew': u'\uFB2F', + 'aleph': u'\u2135', + 'allequal': u'\u224C', + 'alpha': u'\u03B1', + 'alphatonos': u'\u03AC', + 'amacron': u'\u0101', + 'amonospace': u'\uFF41', + 'ampersand': u'\u0026', + 'ampersandmonospace': u'\uFF06', + 'ampersandsmall': u'\uF726', + 'amsquare': u'\u33C2', + 'anbopomofo': u'\u3122', + 'angbopomofo': u'\u3124', + 'angkhankhuthai': u'\u0E5A', + 'angle': u'\u2220', + 'anglebracketleft': u'\u3008', + 'anglebracketleftvertical': u'\uFE3F', + 'anglebracketright': u'\u3009', + 'anglebracketrightvertical': u'\uFE40', + 'angleleft': u'\u2329', + 'angleright': u'\u232A', + 'angstrom': u'\u212B', + 'anoteleia': u'\u0387', + 'anudattadeva': u'\u0952', + 'anusvarabengali': u'\u0982', + 'anusvaradeva': u'\u0902', + 'anusvaragujarati': u'\u0A82', + 'aogonek': u'\u0105', + 'apaatosquare': u'\u3300', + 'aparen': u'\u249C', + 'apostrophearmenian': u'\u055A', + 'apostrophemod': u'\u02BC', + 'apple': u'\uF8FF', + 'approaches': u'\u2250', + 'approxequal': u'\u2248', + 'approxequalorimage': u'\u2252', + 'approximatelyequal': u'\u2245', + 'araeaekorean': u'\u318E', + 'araeakorean': u'\u318D', + 'arc': u'\u2312', + 'arighthalfring': u'\u1E9A', + 'aring': u'\u00E5', + 'aringacute': u'\u01FB', + 'aringbelow': u'\u1E01', + 'arrowboth': u'\u2194', + 'arrowdashdown': u'\u21E3', + 'arrowdashleft': u'\u21E0', + 'arrowdashright': u'\u21E2', + 'arrowdashup': u'\u21E1', + 'arrowdblboth': u'\u21D4', + 'arrowdbldown': u'\u21D3', + 'arrowdblleft': u'\u21D0', + 'arrowdblright': u'\u21D2', + 'arrowdblup': u'\u21D1', + 'arrowdown': u'\u2193', + 'arrowdownleft': u'\u2199', + 'arrowdownright': u'\u2198', + 'arrowdownwhite': u'\u21E9', + 'arrowheaddownmod': u'\u02C5', + 'arrowheadleftmod': u'\u02C2', + 'arrowheadrightmod': u'\u02C3', + 'arrowheadupmod': u'\u02C4', + 'arrowhorizex': u'\uF8E7', + 'arrowleft': u'\u2190', + 'arrowleftdbl': u'\u21D0', + 'arrowleftdblstroke': u'\u21CD', + 'arrowleftoverright': u'\u21C6', + 'arrowleftwhite': u'\u21E6', + 'arrowright': u'\u2192', + 'arrowrightdblstroke': u'\u21CF', + 'arrowrightheavy': u'\u279E', + 'arrowrightoverleft': u'\u21C4', + 'arrowrightwhite': u'\u21E8', + 'arrowtableft': u'\u21E4', + 'arrowtabright': u'\u21E5', + 'arrowup': u'\u2191', + 'arrowupdn': u'\u2195', + 'arrowupdnbse': u'\u21A8', + 'arrowupdownbase': u'\u21A8', + 'arrowupleft': u'\u2196', + 'arrowupleftofdown': u'\u21C5', + 'arrowupright': u'\u2197', + 'arrowupwhite': u'\u21E7', + 'arrowvertex': u'\uF8E6', + 'asciicircum': u'\u005E', + 'asciicircummonospace': u'\uFF3E', + 'asciitilde': u'\u007E', + 'asciitildemonospace': u'\uFF5E', + 'ascript': u'\u0251', + 'ascriptturned': u'\u0252', + 'asmallhiragana': u'\u3041', + 'asmallkatakana': u'\u30A1', + 'asmallkatakanahalfwidth': u'\uFF67', + 'asterisk': u'\u002A', + 'asteriskaltonearabic': u'\u066D', + 'asteriskarabic': u'\u066D', + 'asteriskmath': u'\u2217', + 'asteriskmonospace': u'\uFF0A', + 'asterisksmall': u'\uFE61', + 'asterism': u'\u2042', + 'asuperior': u'\uF6E9', + 'asymptoticallyequal': u'\u2243', + 'at': u'\u0040', + 'atilde': u'\u00E3', + 'atmonospace': u'\uFF20', + 'atsmall': u'\uFE6B', + 'aturned': u'\u0250', + 'aubengali': u'\u0994', + 'aubopomofo': u'\u3120', + 'audeva': u'\u0914', + 'augujarati': u'\u0A94', + 'augurmukhi': u'\u0A14', + 'aulengthmarkbengali': u'\u09D7', + 'aumatragurmukhi': u'\u0A4C', + 'auvowelsignbengali': u'\u09CC', + 'auvowelsigndeva': u'\u094C', + 'auvowelsigngujarati': u'\u0ACC', + 'avagrahadeva': u'\u093D', + 'aybarmenian': u'\u0561', + 'ayin': u'\u05E2', + 'ayinaltonehebrew': u'\uFB20', + 'ayinhebrew': u'\u05E2', + 'b': u'\u0062', + 'babengali': u'\u09AC', + 'backslash': u'\u005C', + 'backslashmonospace': u'\uFF3C', + 'badeva': u'\u092C', + 'bagujarati': u'\u0AAC', + 'bagurmukhi': u'\u0A2C', + 'bahiragana': u'\u3070', + 'bahtthai': u'\u0E3F', + 'bakatakana': u'\u30D0', + 'bar': u'\u007C', + 'barmonospace': u'\uFF5C', + 'bbopomofo': u'\u3105', + 'bcircle': u'\u24D1', + 'bdotaccent': u'\u1E03', + 'bdotbelow': u'\u1E05', + 'beamedsixteenthnotes': u'\u266C', + 'because': u'\u2235', + 'becyrillic': u'\u0431', + 'beharabic': u'\u0628', + 'behfinalarabic': u'\uFE90', + 'behinitialarabic': u'\uFE91', + 'behiragana': u'\u3079', + 'behmedialarabic': u'\uFE92', + 'behmeeminitialarabic': u'\uFC9F', + 'behmeemisolatedarabic': u'\uFC08', + 'behnoonfinalarabic': u'\uFC6D', + 'bekatakana': u'\u30D9', + 'benarmenian': u'\u0562', + 'bet': u'\u05D1', + 'beta': u'\u03B2', + 'betasymbolgreek': u'\u03D0', + 'betdagesh': u'\uFB31', + 'betdageshhebrew': u'\uFB31', + 'bethebrew': u'\u05D1', + 'betrafehebrew': u'\uFB4C', + 'bhabengali': u'\u09AD', + 'bhadeva': u'\u092D', + 'bhagujarati': u'\u0AAD', + 'bhagurmukhi': u'\u0A2D', + 'bhook': u'\u0253', + 'bihiragana': u'\u3073', + 'bikatakana': u'\u30D3', + 'bilabialclick': u'\u0298', + 'bindigurmukhi': u'\u0A02', + 'birusquare': u'\u3331', + 'blackcircle': u'\u25CF', + 'blackdiamond': u'\u25C6', + 'blackdownpointingtriangle': u'\u25BC', + 'blackleftpointingpointer': u'\u25C4', + 'blackleftpointingtriangle': u'\u25C0', + 'blacklenticularbracketleft': u'\u3010', + 'blacklenticularbracketleftvertical': u'\uFE3B', + 'blacklenticularbracketright': u'\u3011', + 'blacklenticularbracketrightvertical': u'\uFE3C', + 'blacklowerlefttriangle': u'\u25E3', + 'blacklowerrighttriangle': u'\u25E2', + 'blackrectangle': u'\u25AC', + 'blackrightpointingpointer': u'\u25BA', + 'blackrightpointingtriangle': u'\u25B6', + 'blacksmallsquare': u'\u25AA', + 'blacksmilingface': u'\u263B', + 'blacksquare': u'\u25A0', + 'blackstar': u'\u2605', + 'blackupperlefttriangle': u'\u25E4', + 'blackupperrighttriangle': u'\u25E5', + 'blackuppointingsmalltriangle': u'\u25B4', + 'blackuppointingtriangle': u'\u25B2', + 'blank': u'\u2423', + 'blinebelow': u'\u1E07', + 'block': u'\u2588', + 'bmonospace': u'\uFF42', + 'bobaimaithai': u'\u0E1A', + 'bohiragana': u'\u307C', + 'bokatakana': u'\u30DC', + 'bparen': u'\u249D', + 'bqsquare': u'\u33C3', + 'braceex': u'\uF8F4', + 'braceleft': u'\u007B', + 'braceleftbt': u'\uF8F3', + 'braceleftmid': u'\uF8F2', + 'braceleftmonospace': u'\uFF5B', + 'braceleftsmall': u'\uFE5B', + 'bracelefttp': u'\uF8F1', + 'braceleftvertical': u'\uFE37', + 'braceright': u'\u007D', + 'bracerightbt': u'\uF8FE', + 'bracerightmid': u'\uF8FD', + 'bracerightmonospace': u'\uFF5D', + 'bracerightsmall': u'\uFE5C', + 'bracerighttp': u'\uF8FC', + 'bracerightvertical': u'\uFE38', + 'bracketleft': u'\u005B', + 'bracketleftbt': u'\uF8F0', + 'bracketleftex': u'\uF8EF', + 'bracketleftmonospace': u'\uFF3B', + 'bracketlefttp': u'\uF8EE', + 'bracketright': u'\u005D', + 'bracketrightbt': u'\uF8FB', + 'bracketrightex': u'\uF8FA', + 'bracketrightmonospace': u'\uFF3D', + 'bracketrighttp': u'\uF8F9', + 'breve': u'\u02D8', + 'brevebelowcmb': u'\u032E', + 'brevecmb': u'\u0306', + 'breveinvertedbelowcmb': u'\u032F', + 'breveinvertedcmb': u'\u0311', + 'breveinverteddoublecmb': u'\u0361', + 'bridgebelowcmb': u'\u032A', + 'bridgeinvertedbelowcmb': u'\u033A', + 'brokenbar': u'\u00A6', + 'bstroke': u'\u0180', + 'bsuperior': u'\uF6EA', + 'btopbar': u'\u0183', + 'buhiragana': u'\u3076', + 'bukatakana': u'\u30D6', + 'bullet': u'\u2022', + 'bulletinverse': u'\u25D8', + 'bulletoperator': u'\u2219', + 'bullseye': u'\u25CE', + 'c': u'\u0063', + 'caarmenian': u'\u056E', + 'cabengali': u'\u099A', + 'cacute': u'\u0107', + 'cadeva': u'\u091A', + 'cagujarati': u'\u0A9A', + 'cagurmukhi': u'\u0A1A', + 'calsquare': u'\u3388', + 'candrabindubengali': u'\u0981', + 'candrabinducmb': u'\u0310', + 'candrabindudeva': u'\u0901', + 'candrabindugujarati': u'\u0A81', + 'capslock': u'\u21EA', + 'careof': u'\u2105', + 'caron': u'\u02C7', + 'caronbelowcmb': u'\u032C', + 'caroncmb': u'\u030C', + 'carriagereturn': u'\u21B5', + 'cbopomofo': u'\u3118', + 'ccaron': u'\u010D', + 'ccedilla': u'\u00E7', + 'ccedillaacute': u'\u1E09', + 'ccircle': u'\u24D2', + 'ccircumflex': u'\u0109', + 'ccurl': u'\u0255', + 'cdot': u'\u010B', + 'cdotaccent': u'\u010B', + 'cdsquare': u'\u33C5', + 'cedilla': u'\u00B8', + 'cedillacmb': u'\u0327', + 'cent': u'\u00A2', + 'centigrade': u'\u2103', + 'centinferior': u'\uF6DF', + 'centmonospace': u'\uFFE0', + 'centoldstyle': u'\uF7A2', + 'centsuperior': u'\uF6E0', + 'chaarmenian': u'\u0579', + 'chabengali': u'\u099B', + 'chadeva': u'\u091B', + 'chagujarati': u'\u0A9B', + 'chagurmukhi': u'\u0A1B', + 'chbopomofo': u'\u3114', + 'cheabkhasiancyrillic': u'\u04BD', + 'checkmark': u'\u2713', + 'checyrillic': u'\u0447', + 'chedescenderabkhasiancyrillic': u'\u04BF', + 'chedescendercyrillic': u'\u04B7', + 'chedieresiscyrillic': u'\u04F5', + 'cheharmenian': u'\u0573', + 'chekhakassiancyrillic': u'\u04CC', + 'cheverticalstrokecyrillic': u'\u04B9', + 'chi': u'\u03C7', + 'chieuchacirclekorean': u'\u3277', + 'chieuchaparenkorean': u'\u3217', + 'chieuchcirclekorean': u'\u3269', + 'chieuchkorean': u'\u314A', + 'chieuchparenkorean': u'\u3209', + 'chochangthai': u'\u0E0A', + 'chochanthai': u'\u0E08', + 'chochingthai': u'\u0E09', + 'chochoethai': u'\u0E0C', + 'chook': u'\u0188', + 'cieucacirclekorean': u'\u3276', + 'cieucaparenkorean': u'\u3216', + 'cieuccirclekorean': u'\u3268', + 'cieuckorean': u'\u3148', + 'cieucparenkorean': u'\u3208', + 'cieucuparenkorean': u'\u321C', + 'circle': u'\u25CB', + 'circlemultiply': u'\u2297', + 'circleot': u'\u2299', + 'circleplus': u'\u2295', + 'circlepostalmark': u'\u3036', + 'circlewithlefthalfblack': u'\u25D0', + 'circlewithrighthalfblack': u'\u25D1', + 'circumflex': u'\u02C6', + 'circumflexbelowcmb': u'\u032D', + 'circumflexcmb': u'\u0302', + 'clear': u'\u2327', + 'clickalveolar': u'\u01C2', + 'clickdental': u'\u01C0', + 'clicklateral': u'\u01C1', + 'clickretroflex': u'\u01C3', + 'club': u'\u2663', + 'clubsuitblack': u'\u2663', + 'clubsuitwhite': u'\u2667', + 'cmcubedsquare': u'\u33A4', + 'cmonospace': u'\uFF43', + 'cmsquaredsquare': u'\u33A0', + 'coarmenian': u'\u0581', + 'colon': u'\u003A', + 'colonmonetary': u'\u20A1', + 'colonmonospace': u'\uFF1A', + 'colonsign': u'\u20A1', + 'colonsmall': u'\uFE55', + 'colontriangularhalfmod': u'\u02D1', + 'colontriangularmod': u'\u02D0', + 'comma': u'\u002C', + 'commaabovecmb': u'\u0313', + 'commaaboverightcmb': u'\u0315', + 'commaaccent': u'\uF6C3', + 'commaarabic': u'\u060C', + 'commaarmenian': u'\u055D', + 'commainferior': u'\uF6E1', + 'commamonospace': u'\uFF0C', + 'commareversedabovecmb': u'\u0314', + 'commareversedmod': u'\u02BD', + 'commasmall': u'\uFE50', + 'commasuperior': u'\uF6E2', + 'commaturnedabovecmb': u'\u0312', + 'commaturnedmod': u'\u02BB', + 'compass': u'\u263C', + 'congruent': u'\u2245', + 'contourintegral': u'\u222E', + 'control': u'\u2303', + 'controlACK': u'\u0006', + 'controlBEL': u'\u0007', + 'controlBS': u'\u0008', + 'controlCAN': u'\u0018', + 'controlCR': u'\u000D', + 'controlDC1': u'\u0011', + 'controlDC2': u'\u0012', + 'controlDC3': u'\u0013', + 'controlDC4': u'\u0014', + 'controlDEL': u'\u007F', + 'controlDLE': u'\u0010', + 'controlEM': u'\u0019', + 'controlENQ': u'\u0005', + 'controlEOT': u'\u0004', + 'controlESC': u'\u001B', + 'controlETB': u'\u0017', + 'controlETX': u'\u0003', + 'controlFF': u'\u000C', + 'controlFS': u'\u001C', + 'controlGS': u'\u001D', + 'controlHT': u'\u0009', + 'controlLF': u'\u000A', + 'controlNAK': u'\u0015', + 'controlRS': u'\u001E', + 'controlSI': u'\u000F', + 'controlSO': u'\u000E', + 'controlSOT': u'\u0002', + 'controlSTX': u'\u0001', + 'controlSUB': u'\u001A', + 'controlSYN': u'\u0016', + 'controlUS': u'\u001F', + 'controlVT': u'\u000B', + 'copyright': u'\u00A9', + 'copyrightsans': u'\uF8E9', + 'copyrightserif': u'\uF6D9', + 'cornerbracketleft': u'\u300C', + 'cornerbracketlefthalfwidth': u'\uFF62', + 'cornerbracketleftvertical': u'\uFE41', + 'cornerbracketright': u'\u300D', + 'cornerbracketrighthalfwidth': u'\uFF63', + 'cornerbracketrightvertical': u'\uFE42', + 'corporationsquare': u'\u337F', + 'cosquare': u'\u33C7', + 'coverkgsquare': u'\u33C6', + 'cparen': u'\u249E', + 'cruzeiro': u'\u20A2', + 'cstretched': u'\u0297', + 'curlyand': u'\u22CF', + 'curlyor': u'\u22CE', + 'currency': u'\u00A4', + 'cyrBreve': u'\uF6D1', + 'cyrFlex': u'\uF6D2', + 'cyrbreve': u'\uF6D4', + 'cyrflex': u'\uF6D5', + 'd': u'\u0064', + 'daarmenian': u'\u0564', + 'dabengali': u'\u09A6', + 'dadarabic': u'\u0636', + 'dadeva': u'\u0926', + 'dadfinalarabic': u'\uFEBE', + 'dadinitialarabic': u'\uFEBF', + 'dadmedialarabic': u'\uFEC0', + 'dagesh': u'\u05BC', + 'dageshhebrew': u'\u05BC', + 'dagger': u'\u2020', + 'daggerdbl': u'\u2021', + 'dagujarati': u'\u0AA6', + 'dagurmukhi': u'\u0A26', + 'dahiragana': u'\u3060', + 'dakatakana': u'\u30C0', + 'dalarabic': u'\u062F', + 'dalet': u'\u05D3', + 'daletdagesh': u'\uFB33', + 'daletdageshhebrew': u'\uFB33', + 'dalethatafpatah': u'\u05D3\u05B2', + 'dalethatafpatahhebrew': u'\u05D3\u05B2', + 'dalethatafsegol': u'\u05D3\u05B1', + 'dalethatafsegolhebrew': u'\u05D3\u05B1', + 'dalethebrew': u'\u05D3', + 'dalethiriq': u'\u05D3\u05B4', + 'dalethiriqhebrew': u'\u05D3\u05B4', + 'daletholam': u'\u05D3\u05B9', + 'daletholamhebrew': u'\u05D3\u05B9', + 'daletpatah': u'\u05D3\u05B7', + 'daletpatahhebrew': u'\u05D3\u05B7', + 'daletqamats': u'\u05D3\u05B8', + 'daletqamatshebrew': u'\u05D3\u05B8', + 'daletqubuts': u'\u05D3\u05BB', + 'daletqubutshebrew': u'\u05D3\u05BB', + 'daletsegol': u'\u05D3\u05B6', + 'daletsegolhebrew': u'\u05D3\u05B6', + 'daletsheva': u'\u05D3\u05B0', + 'daletshevahebrew': u'\u05D3\u05B0', + 'dalettsere': u'\u05D3\u05B5', + 'dalettserehebrew': u'\u05D3\u05B5', + 'dalfinalarabic': u'\uFEAA', + 'dammaarabic': u'\u064F', + 'dammalowarabic': u'\u064F', + 'dammatanaltonearabic': u'\u064C', + 'dammatanarabic': u'\u064C', + 'danda': u'\u0964', + 'dargahebrew': u'\u05A7', + 'dargalefthebrew': u'\u05A7', + 'dasiapneumatacyrilliccmb': u'\u0485', + 'dblGrave': u'\uF6D3', + 'dblanglebracketleft': u'\u300A', + 'dblanglebracketleftvertical': u'\uFE3D', + 'dblanglebracketright': u'\u300B', + 'dblanglebracketrightvertical': u'\uFE3E', + 'dblarchinvertedbelowcmb': u'\u032B', + 'dblarrowleft': u'\u21D4', + 'dblarrowright': u'\u21D2', + 'dbldanda': u'\u0965', + 'dblgrave': u'\uF6D6', + 'dblgravecmb': u'\u030F', + 'dblintegral': u'\u222C', + 'dbllowline': u'\u2017', + 'dbllowlinecmb': u'\u0333', + 'dbloverlinecmb': u'\u033F', + 'dblprimemod': u'\u02BA', + 'dblverticalbar': u'\u2016', + 'dblverticallineabovecmb': u'\u030E', + 'dbopomofo': u'\u3109', + 'dbsquare': u'\u33C8', + 'dcaron': u'\u010F', + 'dcedilla': u'\u1E11', + 'dcircle': u'\u24D3', + 'dcircumflexbelow': u'\u1E13', + 'dcroat': u'\u0111', + 'ddabengali': u'\u09A1', + 'ddadeva': u'\u0921', + 'ddagujarati': u'\u0AA1', + 'ddagurmukhi': u'\u0A21', + 'ddalarabic': u'\u0688', + 'ddalfinalarabic': u'\uFB89', + 'dddhadeva': u'\u095C', + 'ddhabengali': u'\u09A2', + 'ddhadeva': u'\u0922', + 'ddhagujarati': u'\u0AA2', + 'ddhagurmukhi': u'\u0A22', + 'ddotaccent': u'\u1E0B', + 'ddotbelow': u'\u1E0D', + 'decimalseparatorarabic': u'\u066B', + 'decimalseparatorpersian': u'\u066B', + 'decyrillic': u'\u0434', + 'degree': u'\u00B0', + 'dehihebrew': u'\u05AD', + 'dehiragana': u'\u3067', + 'deicoptic': u'\u03EF', + 'dekatakana': u'\u30C7', + 'deleteleft': u'\u232B', + 'deleteright': u'\u2326', + 'delta': u'\u03B4', + 'deltaturned': u'\u018D', + 'denominatorminusonenumeratorbengali': u'\u09F8', + 'dezh': u'\u02A4', + 'dhabengali': u'\u09A7', + 'dhadeva': u'\u0927', + 'dhagujarati': u'\u0AA7', + 'dhagurmukhi': u'\u0A27', + 'dhook': u'\u0257', + 'dialytikatonos': u'\u0385', + 'dialytikatonoscmb': u'\u0344', + 'diamond': u'\u2666', + 'diamondsuitwhite': u'\u2662', + 'dieresis': u'\u00A8', + 'dieresisacute': u'\uF6D7', + 'dieresisbelowcmb': u'\u0324', + 'dieresiscmb': u'\u0308', + 'dieresisgrave': u'\uF6D8', + 'dieresistonos': u'\u0385', + 'dihiragana': u'\u3062', + 'dikatakana': u'\u30C2', + 'dittomark': u'\u3003', + 'divide': u'\u00F7', + 'divides': u'\u2223', + 'divisionslash': u'\u2215', + 'djecyrillic': u'\u0452', + 'dkshade': u'\u2593', + 'dlinebelow': u'\u1E0F', + 'dlsquare': u'\u3397', + 'dmacron': u'\u0111', + 'dmonospace': u'\uFF44', + 'dnblock': u'\u2584', + 'dochadathai': u'\u0E0E', + 'dodekthai': u'\u0E14', + 'dohiragana': u'\u3069', + 'dokatakana': u'\u30C9', + 'dollar': u'\u0024', + 'dollarinferior': u'\uF6E3', + 'dollarmonospace': u'\uFF04', + 'dollaroldstyle': u'\uF724', + 'dollarsmall': u'\uFE69', + 'dollarsuperior': u'\uF6E4', + 'dong': u'\u20AB', + 'dorusquare': u'\u3326', + 'dotaccent': u'\u02D9', + 'dotaccentcmb': u'\u0307', + 'dotbelowcmb': u'\u0323', + 'dotbelowcomb': u'\u0323', + 'dotkatakana': u'\u30FB', + 'dotlessi': u'\u0131', + 'dotlessj': u'\uF6BE', + 'dotlessjstrokehook': u'\u0284', + 'dotmath': u'\u22C5', + 'dottedcircle': u'\u25CC', + 'doubleyodpatah': u'\uFB1F', + 'doubleyodpatahhebrew': u'\uFB1F', + 'downtackbelowcmb': u'\u031E', + 'downtackmod': u'\u02D5', + 'dparen': u'\u249F', + 'dsuperior': u'\uF6EB', + 'dtail': u'\u0256', + 'dtopbar': u'\u018C', + 'duhiragana': u'\u3065', + 'dukatakana': u'\u30C5', + 'dz': u'\u01F3', + 'dzaltone': u'\u02A3', + 'dzcaron': u'\u01C6', + 'dzcurl': u'\u02A5', + 'dzeabkhasiancyrillic': u'\u04E1', + 'dzecyrillic': u'\u0455', + 'dzhecyrillic': u'\u045F', + 'e': u'\u0065', + 'eacute': u'\u00E9', + 'earth': u'\u2641', + 'ebengali': u'\u098F', + 'ebopomofo': u'\u311C', + 'ebreve': u'\u0115', + 'ecandradeva': u'\u090D', + 'ecandragujarati': u'\u0A8D', + 'ecandravowelsigndeva': u'\u0945', + 'ecandravowelsigngujarati': u'\u0AC5', + 'ecaron': u'\u011B', + 'ecedillabreve': u'\u1E1D', + 'echarmenian': u'\u0565', + 'echyiwnarmenian': u'\u0587', + 'ecircle': u'\u24D4', + 'ecircumflex': u'\u00EA', + 'ecircumflexacute': u'\u1EBF', + 'ecircumflexbelow': u'\u1E19', + 'ecircumflexdotbelow': u'\u1EC7', + 'ecircumflexgrave': u'\u1EC1', + 'ecircumflexhookabove': u'\u1EC3', + 'ecircumflextilde': u'\u1EC5', + 'ecyrillic': u'\u0454', + 'edblgrave': u'\u0205', + 'edeva': u'\u090F', + 'edieresis': u'\u00EB', + 'edot': u'\u0117', + 'edotaccent': u'\u0117', + 'edotbelow': u'\u1EB9', + 'eegurmukhi': u'\u0A0F', + 'eematragurmukhi': u'\u0A47', + 'efcyrillic': u'\u0444', + 'egrave': u'\u00E8', + 'egujarati': u'\u0A8F', + 'eharmenian': u'\u0567', + 'ehbopomofo': u'\u311D', + 'ehiragana': u'\u3048', + 'ehookabove': u'\u1EBB', + 'eibopomofo': u'\u311F', + 'eight': u'\u0038', + 'eightarabic': u'\u0668', + 'eightbengali': u'\u09EE', + 'eightcircle': u'\u2467', + 'eightcircleinversesansserif': u'\u2791', + 'eightdeva': u'\u096E', + 'eighteencircle': u'\u2471', + 'eighteenparen': u'\u2485', + 'eighteenperiod': u'\u2499', + 'eightgujarati': u'\u0AEE', + 'eightgurmukhi': u'\u0A6E', + 'eighthackarabic': u'\u0668', + 'eighthangzhou': u'\u3028', + 'eighthnotebeamed': u'\u266B', + 'eightideographicparen': u'\u3227', + 'eightinferior': u'\u2088', + 'eightmonospace': u'\uFF18', + 'eightoldstyle': u'\uF738', + 'eightparen': u'\u247B', + 'eightperiod': u'\u248F', + 'eightpersian': u'\u06F8', + 'eightroman': u'\u2177', + 'eightsuperior': u'\u2078', + 'eightthai': u'\u0E58', + 'einvertedbreve': u'\u0207', + 'eiotifiedcyrillic': u'\u0465', + 'ekatakana': u'\u30A8', + 'ekatakanahalfwidth': u'\uFF74', + 'ekonkargurmukhi': u'\u0A74', + 'ekorean': u'\u3154', + 'elcyrillic': u'\u043B', + 'element': u'\u2208', + 'elevencircle': u'\u246A', + 'elevenparen': u'\u247E', + 'elevenperiod': u'\u2492', + 'elevenroman': u'\u217A', + 'ellipsis': u'\u2026', + 'ellipsisvertical': u'\u22EE', + 'emacron': u'\u0113', + 'emacronacute': u'\u1E17', + 'emacrongrave': u'\u1E15', + 'emcyrillic': u'\u043C', + 'emdash': u'\u2014', + 'emdashvertical': u'\uFE31', + 'emonospace': u'\uFF45', + 'emphasismarkarmenian': u'\u055B', + 'emptyset': u'\u2205', + 'enbopomofo': u'\u3123', + 'encyrillic': u'\u043D', + 'endash': u'\u2013', + 'endashvertical': u'\uFE32', + 'endescendercyrillic': u'\u04A3', + 'eng': u'\u014B', + 'engbopomofo': u'\u3125', + 'enghecyrillic': u'\u04A5', + 'enhookcyrillic': u'\u04C8', + 'enspace': u'\u2002', + 'eogonek': u'\u0119', + 'eokorean': u'\u3153', + 'eopen': u'\u025B', + 'eopenclosed': u'\u029A', + 'eopenreversed': u'\u025C', + 'eopenreversedclosed': u'\u025E', + 'eopenreversedhook': u'\u025D', + 'eparen': u'\u24A0', + 'epsilon': u'\u03B5', + 'epsilontonos': u'\u03AD', + 'equal': u'\u003D', + 'equalmonospace': u'\uFF1D', + 'equalsmall': u'\uFE66', + 'equalsuperior': u'\u207C', + 'equivalence': u'\u2261', + 'erbopomofo': u'\u3126', + 'ercyrillic': u'\u0440', + 'ereversed': u'\u0258', + 'ereversedcyrillic': u'\u044D', + 'escyrillic': u'\u0441', + 'esdescendercyrillic': u'\u04AB', + 'esh': u'\u0283', + 'eshcurl': u'\u0286', + 'eshortdeva': u'\u090E', + 'eshortvowelsigndeva': u'\u0946', + 'eshreversedloop': u'\u01AA', + 'eshsquatreversed': u'\u0285', + 'esmallhiragana': u'\u3047', + 'esmallkatakana': u'\u30A7', + 'esmallkatakanahalfwidth': u'\uFF6A', + 'estimated': u'\u212E', + 'esuperior': u'\uF6EC', + 'eta': u'\u03B7', + 'etarmenian': u'\u0568', + 'etatonos': u'\u03AE', + 'eth': u'\u00F0', + 'etilde': u'\u1EBD', + 'etildebelow': u'\u1E1B', + 'etnahtafoukhhebrew': u'\u0591', + 'etnahtafoukhlefthebrew': u'\u0591', + 'etnahtahebrew': u'\u0591', + 'etnahtalefthebrew': u'\u0591', + 'eturned': u'\u01DD', + 'eukorean': u'\u3161', + 'euro': u'\u20AC', + 'evowelsignbengali': u'\u09C7', + 'evowelsigndeva': u'\u0947', + 'evowelsigngujarati': u'\u0AC7', + 'exclam': u'\u0021', + 'exclamarmenian': u'\u055C', + 'exclamdbl': u'\u203C', + 'exclamdown': u'\u00A1', + 'exclamdownsmall': u'\uF7A1', + 'exclammonospace': u'\uFF01', + 'exclamsmall': u'\uF721', + 'existential': u'\u2203', + 'ezh': u'\u0292', + 'ezhcaron': u'\u01EF', + 'ezhcurl': u'\u0293', + 'ezhreversed': u'\u01B9', + 'ezhtail': u'\u01BA', + 'f': u'\u0066', + 'fadeva': u'\u095E', + 'fagurmukhi': u'\u0A5E', + 'fahrenheit': u'\u2109', + 'fathaarabic': u'\u064E', + 'fathalowarabic': u'\u064E', + 'fathatanarabic': u'\u064B', + 'fbopomofo': u'\u3108', + 'fcircle': u'\u24D5', + 'fdotaccent': u'\u1E1F', + 'feharabic': u'\u0641', + 'feharmenian': u'\u0586', + 'fehfinalarabic': u'\uFED2', + 'fehinitialarabic': u'\uFED3', + 'fehmedialarabic': u'\uFED4', + 'feicoptic': u'\u03E5', + 'female': u'\u2640', + 'ff': u'\uFB00', + 'ffi': u'\uFB03', + 'ffl': u'\uFB04', + 'fi': u'\uFB01', + 'fifteencircle': u'\u246E', + 'fifteenparen': u'\u2482', + 'fifteenperiod': u'\u2496', + 'figuredash': u'\u2012', + 'filledbox': u'\u25A0', + 'filledrect': u'\u25AC', + 'finalkaf': u'\u05DA', + 'finalkafdagesh': u'\uFB3A', + 'finalkafdageshhebrew': u'\uFB3A', + 'finalkafhebrew': u'\u05DA', + 'finalkafqamats': u'\u05DA\u05B8', + 'finalkafqamatshebrew': u'\u05DA\u05B8', + 'finalkafsheva': u'\u05DA\u05B0', + 'finalkafshevahebrew': u'\u05DA\u05B0', + 'finalmem': u'\u05DD', + 'finalmemhebrew': u'\u05DD', + 'finalnun': u'\u05DF', + 'finalnunhebrew': u'\u05DF', + 'finalpe': u'\u05E3', + 'finalpehebrew': u'\u05E3', + 'finaltsadi': u'\u05E5', + 'finaltsadihebrew': u'\u05E5', + 'firsttonechinese': u'\u02C9', + 'fisheye': u'\u25C9', + 'fitacyrillic': u'\u0473', + 'five': u'\u0035', + 'fivearabic': u'\u0665', + 'fivebengali': u'\u09EB', + 'fivecircle': u'\u2464', + 'fivecircleinversesansserif': u'\u278E', + 'fivedeva': u'\u096B', + 'fiveeighths': u'\u215D', + 'fivegujarati': u'\u0AEB', + 'fivegurmukhi': u'\u0A6B', + 'fivehackarabic': u'\u0665', + 'fivehangzhou': u'\u3025', + 'fiveideographicparen': u'\u3224', + 'fiveinferior': u'\u2085', + 'fivemonospace': u'\uFF15', + 'fiveoldstyle': u'\uF735', + 'fiveparen': u'\u2478', + 'fiveperiod': u'\u248C', + 'fivepersian': u'\u06F5', + 'fiveroman': u'\u2174', + 'fivesuperior': u'\u2075', + 'fivethai': u'\u0E55', + 'fl': u'\uFB02', + 'florin': u'\u0192', + 'fmonospace': u'\uFF46', + 'fmsquare': u'\u3399', + 'fofanthai': u'\u0E1F', + 'fofathai': u'\u0E1D', + 'fongmanthai': u'\u0E4F', + 'forall': u'\u2200', + 'four': u'\u0034', + 'fourarabic': u'\u0664', + 'fourbengali': u'\u09EA', + 'fourcircle': u'\u2463', + 'fourcircleinversesansserif': u'\u278D', + 'fourdeva': u'\u096A', + 'fourgujarati': u'\u0AEA', + 'fourgurmukhi': u'\u0A6A', + 'fourhackarabic': u'\u0664', + 'fourhangzhou': u'\u3024', + 'fourideographicparen': u'\u3223', + 'fourinferior': u'\u2084', + 'fourmonospace': u'\uFF14', + 'fournumeratorbengali': u'\u09F7', + 'fouroldstyle': u'\uF734', + 'fourparen': u'\u2477', + 'fourperiod': u'\u248B', + 'fourpersian': u'\u06F4', + 'fourroman': u'\u2173', + 'foursuperior': u'\u2074', + 'fourteencircle': u'\u246D', + 'fourteenparen': u'\u2481', + 'fourteenperiod': u'\u2495', + 'fourthai': u'\u0E54', + 'fourthtonechinese': u'\u02CB', + 'fparen': u'\u24A1', + 'fraction': u'\u2044', + 'franc': u'\u20A3', + 'g': u'\u0067', + 'gabengali': u'\u0997', + 'gacute': u'\u01F5', + 'gadeva': u'\u0917', + 'gafarabic': u'\u06AF', + 'gaffinalarabic': u'\uFB93', + 'gafinitialarabic': u'\uFB94', + 'gafmedialarabic': u'\uFB95', + 'gagujarati': u'\u0A97', + 'gagurmukhi': u'\u0A17', + 'gahiragana': u'\u304C', + 'gakatakana': u'\u30AC', + 'gamma': u'\u03B3', + 'gammalatinsmall': u'\u0263', + 'gammasuperior': u'\u02E0', + 'gangiacoptic': u'\u03EB', + 'gbopomofo': u'\u310D', + 'gbreve': u'\u011F', + 'gcaron': u'\u01E7', + 'gcedilla': u'\u0123', + 'gcircle': u'\u24D6', + 'gcircumflex': u'\u011D', + 'gcommaaccent': u'\u0123', + 'gdot': u'\u0121', + 'gdotaccent': u'\u0121', + 'gecyrillic': u'\u0433', + 'gehiragana': u'\u3052', + 'gekatakana': u'\u30B2', + 'geometricallyequal': u'\u2251', + 'gereshaccenthebrew': u'\u059C', + 'gereshhebrew': u'\u05F3', + 'gereshmuqdamhebrew': u'\u059D', + 'germandbls': u'\u00DF', + 'gershayimaccenthebrew': u'\u059E', + 'gershayimhebrew': u'\u05F4', + 'getamark': u'\u3013', + 'ghabengali': u'\u0998', + 'ghadarmenian': u'\u0572', + 'ghadeva': u'\u0918', + 'ghagujarati': u'\u0A98', + 'ghagurmukhi': u'\u0A18', + 'ghainarabic': u'\u063A', + 'ghainfinalarabic': u'\uFECE', + 'ghaininitialarabic': u'\uFECF', + 'ghainmedialarabic': u'\uFED0', + 'ghemiddlehookcyrillic': u'\u0495', + 'ghestrokecyrillic': u'\u0493', + 'gheupturncyrillic': u'\u0491', + 'ghhadeva': u'\u095A', + 'ghhagurmukhi': u'\u0A5A', + 'ghook': u'\u0260', + 'ghzsquare': u'\u3393', + 'gihiragana': u'\u304E', + 'gikatakana': u'\u30AE', + 'gimarmenian': u'\u0563', + 'gimel': u'\u05D2', + 'gimeldagesh': u'\uFB32', + 'gimeldageshhebrew': u'\uFB32', + 'gimelhebrew': u'\u05D2', + 'gjecyrillic': u'\u0453', + 'glottalinvertedstroke': u'\u01BE', + 'glottalstop': u'\u0294', + 'glottalstopinverted': u'\u0296', + 'glottalstopmod': u'\u02C0', + 'glottalstopreversed': u'\u0295', + 'glottalstopreversedmod': u'\u02C1', + 'glottalstopreversedsuperior': u'\u02E4', + 'glottalstopstroke': u'\u02A1', + 'glottalstopstrokereversed': u'\u02A2', + 'gmacron': u'\u1E21', + 'gmonospace': u'\uFF47', + 'gohiragana': u'\u3054', + 'gokatakana': u'\u30B4', + 'gparen': u'\u24A2', + 'gpasquare': u'\u33AC', + 'gradient': u'\u2207', + 'grave': u'\u0060', + 'gravebelowcmb': u'\u0316', + 'gravecmb': u'\u0300', + 'gravecomb': u'\u0300', + 'gravedeva': u'\u0953', + 'gravelowmod': u'\u02CE', + 'gravemonospace': u'\uFF40', + 'gravetonecmb': u'\u0340', + 'greater': u'\u003E', + 'greaterequal': u'\u2265', + 'greaterequalorless': u'\u22DB', + 'greatermonospace': u'\uFF1E', + 'greaterorequivalent': u'\u2273', + 'greaterorless': u'\u2277', + 'greateroverequal': u'\u2267', + 'greatersmall': u'\uFE65', + 'gscript': u'\u0261', + 'gstroke': u'\u01E5', + 'guhiragana': u'\u3050', + 'guillemotleft': u'\u00AB', + 'guillemotright': u'\u00BB', + 'guilsinglleft': u'\u2039', + 'guilsinglright': u'\u203A', + 'gukatakana': u'\u30B0', + 'guramusquare': u'\u3318', + 'gysquare': u'\u33C9', + 'h': u'\u0068', + 'haabkhasiancyrillic': u'\u04A9', + 'haaltonearabic': u'\u06C1', + 'habengali': u'\u09B9', + 'hadescendercyrillic': u'\u04B3', + 'hadeva': u'\u0939', + 'hagujarati': u'\u0AB9', + 'hagurmukhi': u'\u0A39', + 'haharabic': u'\u062D', + 'hahfinalarabic': u'\uFEA2', + 'hahinitialarabic': u'\uFEA3', + 'hahiragana': u'\u306F', + 'hahmedialarabic': u'\uFEA4', + 'haitusquare': u'\u332A', + 'hakatakana': u'\u30CF', + 'hakatakanahalfwidth': u'\uFF8A', + 'halantgurmukhi': u'\u0A4D', + 'hamzaarabic': u'\u0621', + 'hamzadammaarabic': u'\u0621\u064F', + 'hamzadammatanarabic': u'\u0621\u064C', + 'hamzafathaarabic': u'\u0621\u064E', + 'hamzafathatanarabic': u'\u0621\u064B', + 'hamzalowarabic': u'\u0621', + 'hamzalowkasraarabic': u'\u0621\u0650', + 'hamzalowkasratanarabic': u'\u0621\u064D', + 'hamzasukunarabic': u'\u0621\u0652', + 'hangulfiller': u'\u3164', + 'hardsigncyrillic': u'\u044A', + 'harpoonleftbarbup': u'\u21BC', + 'harpoonrightbarbup': u'\u21C0', + 'hasquare': u'\u33CA', + 'hatafpatah': u'\u05B2', + 'hatafpatah16': u'\u05B2', + 'hatafpatah23': u'\u05B2', + 'hatafpatah2f': u'\u05B2', + 'hatafpatahhebrew': u'\u05B2', + 'hatafpatahnarrowhebrew': u'\u05B2', + 'hatafpatahquarterhebrew': u'\u05B2', + 'hatafpatahwidehebrew': u'\u05B2', + 'hatafqamats': u'\u05B3', + 'hatafqamats1b': u'\u05B3', + 'hatafqamats28': u'\u05B3', + 'hatafqamats34': u'\u05B3', + 'hatafqamatshebrew': u'\u05B3', + 'hatafqamatsnarrowhebrew': u'\u05B3', + 'hatafqamatsquarterhebrew': u'\u05B3', + 'hatafqamatswidehebrew': u'\u05B3', + 'hatafsegol': u'\u05B1', + 'hatafsegol17': u'\u05B1', + 'hatafsegol24': u'\u05B1', + 'hatafsegol30': u'\u05B1', + 'hatafsegolhebrew': u'\u05B1', + 'hatafsegolnarrowhebrew': u'\u05B1', + 'hatafsegolquarterhebrew': u'\u05B1', + 'hatafsegolwidehebrew': u'\u05B1', + 'hbar': u'\u0127', + 'hbopomofo': u'\u310F', + 'hbrevebelow': u'\u1E2B', + 'hcedilla': u'\u1E29', + 'hcircle': u'\u24D7', + 'hcircumflex': u'\u0125', + 'hdieresis': u'\u1E27', + 'hdotaccent': u'\u1E23', + 'hdotbelow': u'\u1E25', + 'he': u'\u05D4', + 'heart': u'\u2665', + 'heartsuitblack': u'\u2665', + 'heartsuitwhite': u'\u2661', + 'hedagesh': u'\uFB34', + 'hedageshhebrew': u'\uFB34', + 'hehaltonearabic': u'\u06C1', + 'heharabic': u'\u0647', + 'hehebrew': u'\u05D4', + 'hehfinalaltonearabic': u'\uFBA7', + 'hehfinalalttwoarabic': u'\uFEEA', + 'hehfinalarabic': u'\uFEEA', + 'hehhamzaabovefinalarabic': u'\uFBA5', + 'hehhamzaaboveisolatedarabic': u'\uFBA4', + 'hehinitialaltonearabic': u'\uFBA8', + 'hehinitialarabic': u'\uFEEB', + 'hehiragana': u'\u3078', + 'hehmedialaltonearabic': u'\uFBA9', + 'hehmedialarabic': u'\uFEEC', + 'heiseierasquare': u'\u337B', + 'hekatakana': u'\u30D8', + 'hekatakanahalfwidth': u'\uFF8D', + 'hekutaarusquare': u'\u3336', + 'henghook': u'\u0267', + 'herutusquare': u'\u3339', + 'het': u'\u05D7', + 'hethebrew': u'\u05D7', + 'hhook': u'\u0266', + 'hhooksuperior': u'\u02B1', + 'hieuhacirclekorean': u'\u327B', + 'hieuhaparenkorean': u'\u321B', + 'hieuhcirclekorean': u'\u326D', + 'hieuhkorean': u'\u314E', + 'hieuhparenkorean': u'\u320D', + 'hihiragana': u'\u3072', + 'hikatakana': u'\u30D2', + 'hikatakanahalfwidth': u'\uFF8B', + 'hiriq': u'\u05B4', + 'hiriq14': u'\u05B4', + 'hiriq21': u'\u05B4', + 'hiriq2d': u'\u05B4', + 'hiriqhebrew': u'\u05B4', + 'hiriqnarrowhebrew': u'\u05B4', + 'hiriqquarterhebrew': u'\u05B4', + 'hiriqwidehebrew': u'\u05B4', + 'hlinebelow': u'\u1E96', + 'hmonospace': u'\uFF48', + 'hoarmenian': u'\u0570', + 'hohipthai': u'\u0E2B', + 'hohiragana': u'\u307B', + 'hokatakana': u'\u30DB', + 'hokatakanahalfwidth': u'\uFF8E', + 'holam': u'\u05B9', + 'holam19': u'\u05B9', + 'holam26': u'\u05B9', + 'holam32': u'\u05B9', + 'holamhebrew': u'\u05B9', + 'holamnarrowhebrew': u'\u05B9', + 'holamquarterhebrew': u'\u05B9', + 'holamwidehebrew': u'\u05B9', + 'honokhukthai': u'\u0E2E', + 'hookabovecomb': u'\u0309', + 'hookcmb': u'\u0309', + 'hookpalatalizedbelowcmb': u'\u0321', + 'hookretroflexbelowcmb': u'\u0322', + 'hoonsquare': u'\u3342', + 'horicoptic': u'\u03E9', + 'horizontalbar': u'\u2015', + 'horncmb': u'\u031B', + 'hotsprings': u'\u2668', + 'house': u'\u2302', + 'hparen': u'\u24A3', + 'hsuperior': u'\u02B0', + 'hturned': u'\u0265', + 'huhiragana': u'\u3075', + 'huiitosquare': u'\u3333', + 'hukatakana': u'\u30D5', + 'hukatakanahalfwidth': u'\uFF8C', + 'hungarumlaut': u'\u02DD', + 'hungarumlautcmb': u'\u030B', + 'hv': u'\u0195', + 'hyphen': u'\u002D', + 'hypheninferior': u'\uF6E5', + 'hyphenmonospace': u'\uFF0D', + 'hyphensmall': u'\uFE63', + 'hyphensuperior': u'\uF6E6', + 'hyphentwo': u'\u2010', + 'i': u'\u0069', + 'iacute': u'\u00ED', + 'iacyrillic': u'\u044F', + 'ibengali': u'\u0987', + 'ibopomofo': u'\u3127', + 'ibreve': u'\u012D', + 'icaron': u'\u01D0', + 'icircle': u'\u24D8', + 'icircumflex': u'\u00EE', + 'icyrillic': u'\u0456', + 'idblgrave': u'\u0209', + 'ideographearthcircle': u'\u328F', + 'ideographfirecircle': u'\u328B', + 'ideographicallianceparen': u'\u323F', + 'ideographiccallparen': u'\u323A', + 'ideographiccentrecircle': u'\u32A5', + 'ideographicclose': u'\u3006', + 'ideographiccomma': u'\u3001', + 'ideographiccommaleft': u'\uFF64', + 'ideographiccongratulationparen': u'\u3237', + 'ideographiccorrectcircle': u'\u32A3', + 'ideographicearthparen': u'\u322F', + 'ideographicenterpriseparen': u'\u323D', + 'ideographicexcellentcircle': u'\u329D', + 'ideographicfestivalparen': u'\u3240', + 'ideographicfinancialcircle': u'\u3296', + 'ideographicfinancialparen': u'\u3236', + 'ideographicfireparen': u'\u322B', + 'ideographichaveparen': u'\u3232', + 'ideographichighcircle': u'\u32A4', + 'ideographiciterationmark': u'\u3005', + 'ideographiclaborcircle': u'\u3298', + 'ideographiclaborparen': u'\u3238', + 'ideographicleftcircle': u'\u32A7', + 'ideographiclowcircle': u'\u32A6', + 'ideographicmedicinecircle': u'\u32A9', + 'ideographicmetalparen': u'\u322E', + 'ideographicmoonparen': u'\u322A', + 'ideographicnameparen': u'\u3234', + 'ideographicperiod': u'\u3002', + 'ideographicprintcircle': u'\u329E', + 'ideographicreachparen': u'\u3243', + 'ideographicrepresentparen': u'\u3239', + 'ideographicresourceparen': u'\u323E', + 'ideographicrightcircle': u'\u32A8', + 'ideographicsecretcircle': u'\u3299', + 'ideographicselfparen': u'\u3242', + 'ideographicsocietyparen': u'\u3233', + 'ideographicspace': u'\u3000', + 'ideographicspecialparen': u'\u3235', + 'ideographicstockparen': u'\u3231', + 'ideographicstudyparen': u'\u323B', + 'ideographicsunparen': u'\u3230', + 'ideographicsuperviseparen': u'\u323C', + 'ideographicwaterparen': u'\u322C', + 'ideographicwoodparen': u'\u322D', + 'ideographiczero': u'\u3007', + 'ideographmetalcircle': u'\u328E', + 'ideographmooncircle': u'\u328A', + 'ideographnamecircle': u'\u3294', + 'ideographsuncircle': u'\u3290', + 'ideographwatercircle': u'\u328C', + 'ideographwoodcircle': u'\u328D', + 'ideva': u'\u0907', + 'idieresis': u'\u00EF', + 'idieresisacute': u'\u1E2F', + 'idieresiscyrillic': u'\u04E5', + 'idotbelow': u'\u1ECB', + 'iebrevecyrillic': u'\u04D7', + 'iecyrillic': u'\u0435', + 'ieungacirclekorean': u'\u3275', + 'ieungaparenkorean': u'\u3215', + 'ieungcirclekorean': u'\u3267', + 'ieungkorean': u'\u3147', + 'ieungparenkorean': u'\u3207', + 'igrave': u'\u00EC', + 'igujarati': u'\u0A87', + 'igurmukhi': u'\u0A07', + 'ihiragana': u'\u3044', + 'ihookabove': u'\u1EC9', + 'iibengali': u'\u0988', + 'iicyrillic': u'\u0438', + 'iideva': u'\u0908', + 'iigujarati': u'\u0A88', + 'iigurmukhi': u'\u0A08', + 'iimatragurmukhi': u'\u0A40', + 'iinvertedbreve': u'\u020B', + 'iishortcyrillic': u'\u0439', + 'iivowelsignbengali': u'\u09C0', + 'iivowelsigndeva': u'\u0940', + 'iivowelsigngujarati': u'\u0AC0', + 'ij': u'\u0133', + 'ikatakana': u'\u30A4', + 'ikatakanahalfwidth': u'\uFF72', + 'ikorean': u'\u3163', + 'ilde': u'\u02DC', + 'iluyhebrew': u'\u05AC', + 'imacron': u'\u012B', + 'imacroncyrillic': u'\u04E3', + 'imageorapproximatelyequal': u'\u2253', + 'imatragurmukhi': u'\u0A3F', + 'imonospace': u'\uFF49', + 'increment': u'\u2206', + 'infinity': u'\u221E', + 'iniarmenian': u'\u056B', + 'integral': u'\u222B', + 'integralbottom': u'\u2321', + 'integralbt': u'\u2321', + 'integralex': u'\uF8F5', + 'integraltop': u'\u2320', + 'integraltp': u'\u2320', + 'intersection': u'\u2229', + 'intisquare': u'\u3305', + 'invbullet': u'\u25D8', + 'invcircle': u'\u25D9', + 'invsmileface': u'\u263B', + 'iocyrillic': u'\u0451', + 'iogonek': u'\u012F', + 'iota': u'\u03B9', + 'iotadieresis': u'\u03CA', + 'iotadieresistonos': u'\u0390', + 'iotalatin': u'\u0269', + 'iotatonos': u'\u03AF', + 'iparen': u'\u24A4', + 'irigurmukhi': u'\u0A72', + 'ismallhiragana': u'\u3043', + 'ismallkatakana': u'\u30A3', + 'ismallkatakanahalfwidth': u'\uFF68', + 'issharbengali': u'\u09FA', + 'istroke': u'\u0268', + 'isuperior': u'\uF6ED', + 'iterationhiragana': u'\u309D', + 'iterationkatakana': u'\u30FD', + 'itilde': u'\u0129', + 'itildebelow': u'\u1E2D', + 'iubopomofo': u'\u3129', + 'iucyrillic': u'\u044E', + 'ivowelsignbengali': u'\u09BF', + 'ivowelsigndeva': u'\u093F', + 'ivowelsigngujarati': u'\u0ABF', + 'izhitsacyrillic': u'\u0475', + 'izhitsadblgravecyrillic': u'\u0477', + 'j': u'\u006A', + 'jaarmenian': u'\u0571', + 'jabengali': u'\u099C', + 'jadeva': u'\u091C', + 'jagujarati': u'\u0A9C', + 'jagurmukhi': u'\u0A1C', + 'jbopomofo': u'\u3110', + 'jcaron': u'\u01F0', + 'jcircle': u'\u24D9', + 'jcircumflex': u'\u0135', + 'jcrossedtail': u'\u029D', + 'jdotlessstroke': u'\u025F', + 'jecyrillic': u'\u0458', + 'jeemarabic': u'\u062C', + 'jeemfinalarabic': u'\uFE9E', + 'jeeminitialarabic': u'\uFE9F', + 'jeemmedialarabic': u'\uFEA0', + 'jeharabic': u'\u0698', + 'jehfinalarabic': u'\uFB8B', + 'jhabengali': u'\u099D', + 'jhadeva': u'\u091D', + 'jhagujarati': u'\u0A9D', + 'jhagurmukhi': u'\u0A1D', + 'jheharmenian': u'\u057B', + 'jis': u'\u3004', + 'jmonospace': u'\uFF4A', + 'jparen': u'\u24A5', + 'jsuperior': u'\u02B2', + 'k': u'\u006B', + 'kabashkircyrillic': u'\u04A1', + 'kabengali': u'\u0995', + 'kacute': u'\u1E31', + 'kacyrillic': u'\u043A', + 'kadescendercyrillic': u'\u049B', + 'kadeva': u'\u0915', + 'kaf': u'\u05DB', + 'kafarabic': u'\u0643', + 'kafdagesh': u'\uFB3B', + 'kafdageshhebrew': u'\uFB3B', + 'kaffinalarabic': u'\uFEDA', + 'kafhebrew': u'\u05DB', + 'kafinitialarabic': u'\uFEDB', + 'kafmedialarabic': u'\uFEDC', + 'kafrafehebrew': u'\uFB4D', + 'kagujarati': u'\u0A95', + 'kagurmukhi': u'\u0A15', + 'kahiragana': u'\u304B', + 'kahookcyrillic': u'\u04C4', + 'kakatakana': u'\u30AB', + 'kakatakanahalfwidth': u'\uFF76', + 'kappa': u'\u03BA', + 'kappasymbolgreek': u'\u03F0', + 'kapyeounmieumkorean': u'\u3171', + 'kapyeounphieuphkorean': u'\u3184', + 'kapyeounpieupkorean': u'\u3178', + 'kapyeounssangpieupkorean': u'\u3179', + 'karoriisquare': u'\u330D', + 'kashidaautoarabic': u'\u0640', + 'kashidaautonosidebearingarabic': u'\u0640', + 'kasmallkatakana': u'\u30F5', + 'kasquare': u'\u3384', + 'kasraarabic': u'\u0650', + 'kasratanarabic': u'\u064D', + 'kastrokecyrillic': u'\u049F', + 'katahiraprolongmarkhalfwidth': u'\uFF70', + 'kaverticalstrokecyrillic': u'\u049D', + 'kbopomofo': u'\u310E', + 'kcalsquare': u'\u3389', + 'kcaron': u'\u01E9', + 'kcedilla': u'\u0137', + 'kcircle': u'\u24DA', + 'kcommaaccent': u'\u0137', + 'kdotbelow': u'\u1E33', + 'keharmenian': u'\u0584', + 'kehiragana': u'\u3051', + 'kekatakana': u'\u30B1', + 'kekatakanahalfwidth': u'\uFF79', + 'kenarmenian': u'\u056F', + 'kesmallkatakana': u'\u30F6', + 'kgreenlandic': u'\u0138', + 'khabengali': u'\u0996', + 'khacyrillic': u'\u0445', + 'khadeva': u'\u0916', + 'khagujarati': u'\u0A96', + 'khagurmukhi': u'\u0A16', + 'khaharabic': u'\u062E', + 'khahfinalarabic': u'\uFEA6', + 'khahinitialarabic': u'\uFEA7', + 'khahmedialarabic': u'\uFEA8', + 'kheicoptic': u'\u03E7', + 'khhadeva': u'\u0959', + 'khhagurmukhi': u'\u0A59', + 'khieukhacirclekorean': u'\u3278', + 'khieukhaparenkorean': u'\u3218', + 'khieukhcirclekorean': u'\u326A', + 'khieukhkorean': u'\u314B', + 'khieukhparenkorean': u'\u320A', + 'khokhaithai': u'\u0E02', + 'khokhonthai': u'\u0E05', + 'khokhuatthai': u'\u0E03', + 'khokhwaithai': u'\u0E04', + 'khomutthai': u'\u0E5B', + 'khook': u'\u0199', + 'khorakhangthai': u'\u0E06', + 'khzsquare': u'\u3391', + 'kihiragana': u'\u304D', + 'kikatakana': u'\u30AD', + 'kikatakanahalfwidth': u'\uFF77', + 'kiroguramusquare': u'\u3315', + 'kiromeetorusquare': u'\u3316', + 'kirosquare': u'\u3314', + 'kiyeokacirclekorean': u'\u326E', + 'kiyeokaparenkorean': u'\u320E', + 'kiyeokcirclekorean': u'\u3260', + 'kiyeokkorean': u'\u3131', + 'kiyeokparenkorean': u'\u3200', + 'kiyeoksioskorean': u'\u3133', + 'kjecyrillic': u'\u045C', + 'klinebelow': u'\u1E35', + 'klsquare': u'\u3398', + 'kmcubedsquare': u'\u33A6', + 'kmonospace': u'\uFF4B', + 'kmsquaredsquare': u'\u33A2', + 'kohiragana': u'\u3053', + 'kohmsquare': u'\u33C0', + 'kokaithai': u'\u0E01', + 'kokatakana': u'\u30B3', + 'kokatakanahalfwidth': u'\uFF7A', + 'kooposquare': u'\u331E', + 'koppacyrillic': u'\u0481', + 'koreanstandardsymbol': u'\u327F', + 'koroniscmb': u'\u0343', + 'kparen': u'\u24A6', + 'kpasquare': u'\u33AA', + 'ksicyrillic': u'\u046F', + 'ktsquare': u'\u33CF', + 'kturned': u'\u029E', + 'kuhiragana': u'\u304F', + 'kukatakana': u'\u30AF', + 'kukatakanahalfwidth': u'\uFF78', + 'kvsquare': u'\u33B8', + 'kwsquare': u'\u33BE', + 'l': u'\u006C', + 'labengali': u'\u09B2', + 'lacute': u'\u013A', + 'ladeva': u'\u0932', + 'lagujarati': u'\u0AB2', + 'lagurmukhi': u'\u0A32', + 'lakkhangyaothai': u'\u0E45', + 'lamaleffinalarabic': u'\uFEFC', + 'lamalefhamzaabovefinalarabic': u'\uFEF8', + 'lamalefhamzaaboveisolatedarabic': u'\uFEF7', + 'lamalefhamzabelowfinalarabic': u'\uFEFA', + 'lamalefhamzabelowisolatedarabic': u'\uFEF9', + 'lamalefisolatedarabic': u'\uFEFB', + 'lamalefmaddaabovefinalarabic': u'\uFEF6', + 'lamalefmaddaaboveisolatedarabic': u'\uFEF5', + 'lamarabic': u'\u0644', + 'lambda': u'\u03BB', + 'lambdastroke': u'\u019B', + 'lamed': u'\u05DC', + 'lameddagesh': u'\uFB3C', + 'lameddageshhebrew': u'\uFB3C', + 'lamedhebrew': u'\u05DC', + 'lamedholam': u'\u05DC\u05B9', + 'lamedholamdagesh': u'\u05DC\u05B9\u05BC', + 'lamedholamdageshhebrew': u'\u05DC\u05B9\u05BC', + 'lamedholamhebrew': u'\u05DC\u05B9', + 'lamfinalarabic': u'\uFEDE', + 'lamhahinitialarabic': u'\uFCCA', + 'laminitialarabic': u'\uFEDF', + 'lamjeeminitialarabic': u'\uFCC9', + 'lamkhahinitialarabic': u'\uFCCB', + 'lamlamhehisolatedarabic': u'\uFDF2', + 'lammedialarabic': u'\uFEE0', + 'lammeemhahinitialarabic': u'\uFD88', + 'lammeeminitialarabic': u'\uFCCC', + 'lammeemjeeminitialarabic': u'\uFEDF\uFEE4\uFEA0', + 'lammeemkhahinitialarabic': u'\uFEDF\uFEE4\uFEA8', + 'largecircle': u'\u25EF', + 'lbar': u'\u019A', + 'lbelt': u'\u026C', + 'lbopomofo': u'\u310C', + 'lcaron': u'\u013E', + 'lcedilla': u'\u013C', + 'lcircle': u'\u24DB', + 'lcircumflexbelow': u'\u1E3D', + 'lcommaaccent': u'\u013C', + 'ldot': u'\u0140', + 'ldotaccent': u'\u0140', + 'ldotbelow': u'\u1E37', + 'ldotbelowmacron': u'\u1E39', + 'leftangleabovecmb': u'\u031A', + 'lefttackbelowcmb': u'\u0318', + 'less': u'\u003C', + 'lessequal': u'\u2264', + 'lessequalorgreater': u'\u22DA', + 'lessmonospace': u'\uFF1C', + 'lessorequivalent': u'\u2272', + 'lessorgreater': u'\u2276', + 'lessoverequal': u'\u2266', + 'lesssmall': u'\uFE64', + 'lezh': u'\u026E', + 'lfblock': u'\u258C', + 'lhookretroflex': u'\u026D', + 'lira': u'\u20A4', + 'liwnarmenian': u'\u056C', + 'lj': u'\u01C9', + 'ljecyrillic': u'\u0459', + 'll': u'\uF6C0', + 'lladeva': u'\u0933', + 'llagujarati': u'\u0AB3', + 'llinebelow': u'\u1E3B', + 'llladeva': u'\u0934', + 'llvocalicbengali': u'\u09E1', + 'llvocalicdeva': u'\u0961', + 'llvocalicvowelsignbengali': u'\u09E3', + 'llvocalicvowelsigndeva': u'\u0963', + 'lmiddletilde': u'\u026B', + 'lmonospace': u'\uFF4C', + 'lmsquare': u'\u33D0', + 'lochulathai': u'\u0E2C', + 'logicaland': u'\u2227', + 'logicalnot': u'\u00AC', + 'logicalnotreversed': u'\u2310', + 'logicalor': u'\u2228', + 'lolingthai': u'\u0E25', + 'longs': u'\u017F', + 'lowlinecenterline': u'\uFE4E', + 'lowlinecmb': u'\u0332', + 'lowlinedashed': u'\uFE4D', + 'lozenge': u'\u25CA', + 'lparen': u'\u24A7', + 'lslash': u'\u0142', + 'lsquare': u'\u2113', + 'lsuperior': u'\uF6EE', + 'ltshade': u'\u2591', + 'luthai': u'\u0E26', + 'lvocalicbengali': u'\u098C', + 'lvocalicdeva': u'\u090C', + 'lvocalicvowelsignbengali': u'\u09E2', + 'lvocalicvowelsigndeva': u'\u0962', + 'lxsquare': u'\u33D3', + 'm': u'\u006D', + 'mabengali': u'\u09AE', + 'macron': u'\u00AF', + 'macronbelowcmb': u'\u0331', + 'macroncmb': u'\u0304', + 'macronlowmod': u'\u02CD', + 'macronmonospace': u'\uFFE3', + 'macute': u'\u1E3F', + 'madeva': u'\u092E', + 'magujarati': u'\u0AAE', + 'magurmukhi': u'\u0A2E', + 'mahapakhhebrew': u'\u05A4', + 'mahapakhlefthebrew': u'\u05A4', + 'mahiragana': u'\u307E', + 'maichattawalowleftthai': u'\uF895', + 'maichattawalowrightthai': u'\uF894', + 'maichattawathai': u'\u0E4B', + 'maichattawaupperleftthai': u'\uF893', + 'maieklowleftthai': u'\uF88C', + 'maieklowrightthai': u'\uF88B', + 'maiekthai': u'\u0E48', + 'maiekupperleftthai': u'\uF88A', + 'maihanakatleftthai': u'\uF884', + 'maihanakatthai': u'\u0E31', + 'maitaikhuleftthai': u'\uF889', + 'maitaikhuthai': u'\u0E47', + 'maitholowleftthai': u'\uF88F', + 'maitholowrightthai': u'\uF88E', + 'maithothai': u'\u0E49', + 'maithoupperleftthai': u'\uF88D', + 'maitrilowleftthai': u'\uF892', + 'maitrilowrightthai': u'\uF891', + 'maitrithai': u'\u0E4A', + 'maitriupperleftthai': u'\uF890', + 'maiyamokthai': u'\u0E46', + 'makatakana': u'\u30DE', + 'makatakanahalfwidth': u'\uFF8F', + 'male': u'\u2642', + 'mansyonsquare': u'\u3347', + 'maqafhebrew': u'\u05BE', + 'mars': u'\u2642', + 'masoracirclehebrew': u'\u05AF', + 'masquare': u'\u3383', + 'mbopomofo': u'\u3107', + 'mbsquare': u'\u33D4', + 'mcircle': u'\u24DC', + 'mcubedsquare': u'\u33A5', + 'mdotaccent': u'\u1E41', + 'mdotbelow': u'\u1E43', + 'meemarabic': u'\u0645', + 'meemfinalarabic': u'\uFEE2', + 'meeminitialarabic': u'\uFEE3', + 'meemmedialarabic': u'\uFEE4', + 'meemmeeminitialarabic': u'\uFCD1', + 'meemmeemisolatedarabic': u'\uFC48', + 'meetorusquare': u'\u334D', + 'mehiragana': u'\u3081', + 'meizierasquare': u'\u337E', + 'mekatakana': u'\u30E1', + 'mekatakanahalfwidth': u'\uFF92', + 'mem': u'\u05DE', + 'memdagesh': u'\uFB3E', + 'memdageshhebrew': u'\uFB3E', + 'memhebrew': u'\u05DE', + 'menarmenian': u'\u0574', + 'merkhahebrew': u'\u05A5', + 'merkhakefulahebrew': u'\u05A6', + 'merkhakefulalefthebrew': u'\u05A6', + 'merkhalefthebrew': u'\u05A5', + 'mhook': u'\u0271', + 'mhzsquare': u'\u3392', + 'middledotkatakanahalfwidth': u'\uFF65', + 'middot': u'\u00B7', + 'mieumacirclekorean': u'\u3272', + 'mieumaparenkorean': u'\u3212', + 'mieumcirclekorean': u'\u3264', + 'mieumkorean': u'\u3141', + 'mieumpansioskorean': u'\u3170', + 'mieumparenkorean': u'\u3204', + 'mieumpieupkorean': u'\u316E', + 'mieumsioskorean': u'\u316F', + 'mihiragana': u'\u307F', + 'mikatakana': u'\u30DF', + 'mikatakanahalfwidth': u'\uFF90', + 'minus': u'\u2212', + 'minusbelowcmb': u'\u0320', + 'minuscircle': u'\u2296', + 'minusmod': u'\u02D7', + 'minusplus': u'\u2213', + 'minute': u'\u2032', + 'miribaarusquare': u'\u334A', + 'mirisquare': u'\u3349', + 'mlonglegturned': u'\u0270', + 'mlsquare': u'\u3396', + 'mmcubedsquare': u'\u33A3', + 'mmonospace': u'\uFF4D', + 'mmsquaredsquare': u'\u339F', + 'mohiragana': u'\u3082', + 'mohmsquare': u'\u33C1', + 'mokatakana': u'\u30E2', + 'mokatakanahalfwidth': u'\uFF93', + 'molsquare': u'\u33D6', + 'momathai': u'\u0E21', + 'moverssquare': u'\u33A7', + 'moverssquaredsquare': u'\u33A8', + 'mparen': u'\u24A8', + 'mpasquare': u'\u33AB', + 'mssquare': u'\u33B3', + 'msuperior': u'\uF6EF', + 'mturned': u'\u026F', + 'mu': u'\u00B5', + 'mu1': u'\u00B5', + 'muasquare': u'\u3382', + 'muchgreater': u'\u226B', + 'muchless': u'\u226A', + 'mufsquare': u'\u338C', + 'mugreek': u'\u03BC', + 'mugsquare': u'\u338D', + 'muhiragana': u'\u3080', + 'mukatakana': u'\u30E0', + 'mukatakanahalfwidth': u'\uFF91', + 'mulsquare': u'\u3395', + 'multiply': u'\u00D7', + 'mumsquare': u'\u339B', + 'munahhebrew': u'\u05A3', + 'munahlefthebrew': u'\u05A3', + 'musicalnote': u'\u266A', + 'musicalnotedbl': u'\u266B', + 'musicflatsign': u'\u266D', + 'musicsharpsign': u'\u266F', + 'mussquare': u'\u33B2', + 'muvsquare': u'\u33B6', + 'muwsquare': u'\u33BC', + 'mvmegasquare': u'\u33B9', + 'mvsquare': u'\u33B7', + 'mwmegasquare': u'\u33BF', + 'mwsquare': u'\u33BD', + 'n': u'\u006E', + 'nabengali': u'\u09A8', + 'nabla': u'\u2207', + 'nacute': u'\u0144', + 'nadeva': u'\u0928', + 'nagujarati': u'\u0AA8', + 'nagurmukhi': u'\u0A28', + 'nahiragana': u'\u306A', + 'nakatakana': u'\u30CA', + 'nakatakanahalfwidth': u'\uFF85', + 'napostrophe': u'\u0149', + 'nasquare': u'\u3381', + 'nbopomofo': u'\u310B', + 'nbspace': u'\u00A0', + 'ncaron': u'\u0148', + 'ncedilla': u'\u0146', + 'ncircle': u'\u24DD', + 'ncircumflexbelow': u'\u1E4B', + 'ncommaaccent': u'\u0146', + 'ndotaccent': u'\u1E45', + 'ndotbelow': u'\u1E47', + 'nehiragana': u'\u306D', + 'nekatakana': u'\u30CD', + 'nekatakanahalfwidth': u'\uFF88', + 'newsheqelsign': u'\u20AA', + 'nfsquare': u'\u338B', + 'ngabengali': u'\u0999', + 'ngadeva': u'\u0919', + 'ngagujarati': u'\u0A99', + 'ngagurmukhi': u'\u0A19', + 'ngonguthai': u'\u0E07', + 'nhiragana': u'\u3093', + 'nhookleft': u'\u0272', + 'nhookretroflex': u'\u0273', + 'nieunacirclekorean': u'\u326F', + 'nieunaparenkorean': u'\u320F', + 'nieuncieuckorean': u'\u3135', + 'nieuncirclekorean': u'\u3261', + 'nieunhieuhkorean': u'\u3136', + 'nieunkorean': u'\u3134', + 'nieunpansioskorean': u'\u3168', + 'nieunparenkorean': u'\u3201', + 'nieunsioskorean': u'\u3167', + 'nieuntikeutkorean': u'\u3166', + 'nihiragana': u'\u306B', + 'nikatakana': u'\u30CB', + 'nikatakanahalfwidth': u'\uFF86', + 'nikhahitleftthai': u'\uF899', + 'nikhahitthai': u'\u0E4D', + 'nine': u'\u0039', + 'ninearabic': u'\u0669', + 'ninebengali': u'\u09EF', + 'ninecircle': u'\u2468', + 'ninecircleinversesansserif': u'\u2792', + 'ninedeva': u'\u096F', + 'ninegujarati': u'\u0AEF', + 'ninegurmukhi': u'\u0A6F', + 'ninehackarabic': u'\u0669', + 'ninehangzhou': u'\u3029', + 'nineideographicparen': u'\u3228', + 'nineinferior': u'\u2089', + 'ninemonospace': u'\uFF19', + 'nineoldstyle': u'\uF739', + 'nineparen': u'\u247C', + 'nineperiod': u'\u2490', + 'ninepersian': u'\u06F9', + 'nineroman': u'\u2178', + 'ninesuperior': u'\u2079', + 'nineteencircle': u'\u2472', + 'nineteenparen': u'\u2486', + 'nineteenperiod': u'\u249A', + 'ninethai': u'\u0E59', + 'nj': u'\u01CC', + 'njecyrillic': u'\u045A', + 'nkatakana': u'\u30F3', + 'nkatakanahalfwidth': u'\uFF9D', + 'nlegrightlong': u'\u019E', + 'nlinebelow': u'\u1E49', + 'nmonospace': u'\uFF4E', + 'nmsquare': u'\u339A', + 'nnabengali': u'\u09A3', + 'nnadeva': u'\u0923', + 'nnagujarati': u'\u0AA3', + 'nnagurmukhi': u'\u0A23', + 'nnnadeva': u'\u0929', + 'nohiragana': u'\u306E', + 'nokatakana': u'\u30CE', + 'nokatakanahalfwidth': u'\uFF89', + 'nonbreakingspace': u'\u00A0', + 'nonenthai': u'\u0E13', + 'nonuthai': u'\u0E19', + 'noonarabic': u'\u0646', + 'noonfinalarabic': u'\uFEE6', + 'noonghunnaarabic': u'\u06BA', + 'noonghunnafinalarabic': u'\uFB9F', + 'noonhehinitialarabic': u'\uFEE7\uFEEC', + 'nooninitialarabic': u'\uFEE7', + 'noonjeeminitialarabic': u'\uFCD2', + 'noonjeemisolatedarabic': u'\uFC4B', + 'noonmedialarabic': u'\uFEE8', + 'noonmeeminitialarabic': u'\uFCD5', + 'noonmeemisolatedarabic': u'\uFC4E', + 'noonnoonfinalarabic': u'\uFC8D', + 'notcontains': u'\u220C', + 'notelement': u'\u2209', + 'notelementof': u'\u2209', + 'notequal': u'\u2260', + 'notgreater': u'\u226F', + 'notgreaternorequal': u'\u2271', + 'notgreaternorless': u'\u2279', + 'notidentical': u'\u2262', + 'notless': u'\u226E', + 'notlessnorequal': u'\u2270', + 'notparallel': u'\u2226', + 'notprecedes': u'\u2280', + 'notsubset': u'\u2284', + 'notsucceeds': u'\u2281', + 'notsuperset': u'\u2285', + 'nowarmenian': u'\u0576', + 'nparen': u'\u24A9', + 'nssquare': u'\u33B1', + 'nsuperior': u'\u207F', + 'ntilde': u'\u00F1', + 'nu': u'\u03BD', + 'nuhiragana': u'\u306C', + 'nukatakana': u'\u30CC', + 'nukatakanahalfwidth': u'\uFF87', + 'nuktabengali': u'\u09BC', + 'nuktadeva': u'\u093C', + 'nuktagujarati': u'\u0ABC', + 'nuktagurmukhi': u'\u0A3C', + 'numbersign': u'\u0023', + 'numbersignmonospace': u'\uFF03', + 'numbersignsmall': u'\uFE5F', + 'numeralsigngreek': u'\u0374', + 'numeralsignlowergreek': u'\u0375', + 'numero': u'\u2116', + 'nun': u'\u05E0', + 'nundagesh': u'\uFB40', + 'nundageshhebrew': u'\uFB40', + 'nunhebrew': u'\u05E0', + 'nvsquare': u'\u33B5', + 'nwsquare': u'\u33BB', + 'nyabengali': u'\u099E', + 'nyadeva': u'\u091E', + 'nyagujarati': u'\u0A9E', + 'nyagurmukhi': u'\u0A1E', + 'o': u'\u006F', + 'oacute': u'\u00F3', + 'oangthai': u'\u0E2D', + 'obarred': u'\u0275', + 'obarredcyrillic': u'\u04E9', + 'obarreddieresiscyrillic': u'\u04EB', + 'obengali': u'\u0993', + 'obopomofo': u'\u311B', + 'obreve': u'\u014F', + 'ocandradeva': u'\u0911', + 'ocandragujarati': u'\u0A91', + 'ocandravowelsigndeva': u'\u0949', + 'ocandravowelsigngujarati': u'\u0AC9', + 'ocaron': u'\u01D2', + 'ocircle': u'\u24DE', + 'ocircumflex': u'\u00F4', + 'ocircumflexacute': u'\u1ED1', + 'ocircumflexdotbelow': u'\u1ED9', + 'ocircumflexgrave': u'\u1ED3', + 'ocircumflexhookabove': u'\u1ED5', + 'ocircumflextilde': u'\u1ED7', + 'ocyrillic': u'\u043E', + 'odblacute': u'\u0151', + 'odblgrave': u'\u020D', + 'odeva': u'\u0913', + 'odieresis': u'\u00F6', + 'odieresiscyrillic': u'\u04E7', + 'odotbelow': u'\u1ECD', + 'oe': u'\u0153', + 'oekorean': u'\u315A', + 'ogonek': u'\u02DB', + 'ogonekcmb': u'\u0328', + 'ograve': u'\u00F2', + 'ogujarati': u'\u0A93', + 'oharmenian': u'\u0585', + 'ohiragana': u'\u304A', + 'ohookabove': u'\u1ECF', + 'ohorn': u'\u01A1', + 'ohornacute': u'\u1EDB', + 'ohorndotbelow': u'\u1EE3', + 'ohorngrave': u'\u1EDD', + 'ohornhookabove': u'\u1EDF', + 'ohorntilde': u'\u1EE1', + 'ohungarumlaut': u'\u0151', + 'oi': u'\u01A3', + 'oinvertedbreve': u'\u020F', + 'okatakana': u'\u30AA', + 'okatakanahalfwidth': u'\uFF75', + 'okorean': u'\u3157', + 'olehebrew': u'\u05AB', + 'omacron': u'\u014D', + 'omacronacute': u'\u1E53', + 'omacrongrave': u'\u1E51', + 'omdeva': u'\u0950', + 'omega': u'\u03C9', + 'omega1': u'\u03D6', + 'omegacyrillic': u'\u0461', + 'omegalatinclosed': u'\u0277', + 'omegaroundcyrillic': u'\u047B', + 'omegatitlocyrillic': u'\u047D', + 'omegatonos': u'\u03CE', + 'omgujarati': u'\u0AD0', + 'omicron': u'\u03BF', + 'omicrontonos': u'\u03CC', + 'omonospace': u'\uFF4F', + 'one': u'\u0031', + 'onearabic': u'\u0661', + 'onebengali': u'\u09E7', + 'onecircle': u'\u2460', + 'onecircleinversesansserif': u'\u278A', + 'onedeva': u'\u0967', + 'onedotenleader': u'\u2024', + 'oneeighth': u'\u215B', + 'onefitted': u'\uF6DC', + 'onegujarati': u'\u0AE7', + 'onegurmukhi': u'\u0A67', + 'onehackarabic': u'\u0661', + 'onehalf': u'\u00BD', + 'onehangzhou': u'\u3021', + 'oneideographicparen': u'\u3220', + 'oneinferior': u'\u2081', + 'onemonospace': u'\uFF11', + 'onenumeratorbengali': u'\u09F4', + 'oneoldstyle': u'\uF731', + 'oneparen': u'\u2474', + 'oneperiod': u'\u2488', + 'onepersian': u'\u06F1', + 'onequarter': u'\u00BC', + 'oneroman': u'\u2170', + 'onesuperior': u'\u00B9', + 'onethai': u'\u0E51', + 'onethird': u'\u2153', + 'oogonek': u'\u01EB', + 'oogonekmacron': u'\u01ED', + 'oogurmukhi': u'\u0A13', + 'oomatragurmukhi': u'\u0A4B', + 'oopen': u'\u0254', + 'oparen': u'\u24AA', + 'openbullet': u'\u25E6', + 'option': u'\u2325', + 'ordfeminine': u'\u00AA', + 'ordmasculine': u'\u00BA', + 'orthogonal': u'\u221F', + 'oshortdeva': u'\u0912', + 'oshortvowelsigndeva': u'\u094A', + 'oslash': u'\u00F8', + 'oslashacute': u'\u01FF', + 'osmallhiragana': u'\u3049', + 'osmallkatakana': u'\u30A9', + 'osmallkatakanahalfwidth': u'\uFF6B', + 'ostrokeacute': u'\u01FF', + 'osuperior': u'\uF6F0', + 'otcyrillic': u'\u047F', + 'otilde': u'\u00F5', + 'otildeacute': u'\u1E4D', + 'otildedieresis': u'\u1E4F', + 'oubopomofo': u'\u3121', + 'overline': u'\u203E', + 'overlinecenterline': u'\uFE4A', + 'overlinecmb': u'\u0305', + 'overlinedashed': u'\uFE49', + 'overlinedblwavy': u'\uFE4C', + 'overlinewavy': u'\uFE4B', + 'overscore': u'\u00AF', + 'ovowelsignbengali': u'\u09CB', + 'ovowelsigndeva': u'\u094B', + 'ovowelsigngujarati': u'\u0ACB', + 'p': u'\u0070', + 'paampssquare': u'\u3380', + 'paasentosquare': u'\u332B', + 'pabengali': u'\u09AA', + 'pacute': u'\u1E55', + 'padeva': u'\u092A', + 'pagedown': u'\u21DF', + 'pageup': u'\u21DE', + 'pagujarati': u'\u0AAA', + 'pagurmukhi': u'\u0A2A', + 'pahiragana': u'\u3071', + 'paiyannoithai': u'\u0E2F', + 'pakatakana': u'\u30D1', + 'palatalizationcyrilliccmb': u'\u0484', + 'palochkacyrillic': u'\u04C0', + 'pansioskorean': u'\u317F', + 'paragraph': u'\u00B6', + 'parallel': u'\u2225', + 'parenleft': u'\u0028', + 'parenleftaltonearabic': u'\uFD3E', + 'parenleftbt': u'\uF8ED', + 'parenleftex': u'\uF8EC', + 'parenleftinferior': u'\u208D', + 'parenleftmonospace': u'\uFF08', + 'parenleftsmall': u'\uFE59', + 'parenleftsuperior': u'\u207D', + 'parenlefttp': u'\uF8EB', + 'parenleftvertical': u'\uFE35', + 'parenright': u'\u0029', + 'parenrightaltonearabic': u'\uFD3F', + 'parenrightbt': u'\uF8F8', + 'parenrightex': u'\uF8F7', + 'parenrightinferior': u'\u208E', + 'parenrightmonospace': u'\uFF09', + 'parenrightsmall': u'\uFE5A', + 'parenrightsuperior': u'\u207E', + 'parenrighttp': u'\uF8F6', + 'parenrightvertical': u'\uFE36', + 'partialdiff': u'\u2202', + 'paseqhebrew': u'\u05C0', + 'pashtahebrew': u'\u0599', + 'pasquare': u'\u33A9', + 'patah': u'\u05B7', + 'patah11': u'\u05B7', + 'patah1d': u'\u05B7', + 'patah2a': u'\u05B7', + 'patahhebrew': u'\u05B7', + 'patahnarrowhebrew': u'\u05B7', + 'patahquarterhebrew': u'\u05B7', + 'patahwidehebrew': u'\u05B7', + 'pazerhebrew': u'\u05A1', + 'pbopomofo': u'\u3106', + 'pcircle': u'\u24DF', + 'pdotaccent': u'\u1E57', + 'pe': u'\u05E4', + 'pecyrillic': u'\u043F', + 'pedagesh': u'\uFB44', + 'pedageshhebrew': u'\uFB44', + 'peezisquare': u'\u333B', + 'pefinaldageshhebrew': u'\uFB43', + 'peharabic': u'\u067E', + 'peharmenian': u'\u057A', + 'pehebrew': u'\u05E4', + 'pehfinalarabic': u'\uFB57', + 'pehinitialarabic': u'\uFB58', + 'pehiragana': u'\u307A', + 'pehmedialarabic': u'\uFB59', + 'pekatakana': u'\u30DA', + 'pemiddlehookcyrillic': u'\u04A7', + 'perafehebrew': u'\uFB4E', + 'percent': u'\u0025', + 'percentarabic': u'\u066A', + 'percentmonospace': u'\uFF05', + 'percentsmall': u'\uFE6A', + 'period': u'\u002E', + 'periodarmenian': u'\u0589', + 'periodcentered': u'\u00B7', + 'periodhalfwidth': u'\uFF61', + 'periodinferior': u'\uF6E7', + 'periodmonospace': u'\uFF0E', + 'periodsmall': u'\uFE52', + 'periodsuperior': u'\uF6E8', + 'perispomenigreekcmb': u'\u0342', + 'perpendicular': u'\u22A5', + 'perthousand': u'\u2030', + 'peseta': u'\u20A7', + 'pfsquare': u'\u338A', + 'phabengali': u'\u09AB', + 'phadeva': u'\u092B', + 'phagujarati': u'\u0AAB', + 'phagurmukhi': u'\u0A2B', + 'phi': u'\u03C6', + 'phi1': u'\u03D5', + 'phieuphacirclekorean': u'\u327A', + 'phieuphaparenkorean': u'\u321A', + 'phieuphcirclekorean': u'\u326C', + 'phieuphkorean': u'\u314D', + 'phieuphparenkorean': u'\u320C', + 'philatin': u'\u0278', + 'phinthuthai': u'\u0E3A', + 'phisymbolgreek': u'\u03D5', + 'phook': u'\u01A5', + 'phophanthai': u'\u0E1E', + 'phophungthai': u'\u0E1C', + 'phosamphaothai': u'\u0E20', + 'pi': u'\u03C0', + 'pieupacirclekorean': u'\u3273', + 'pieupaparenkorean': u'\u3213', + 'pieupcieuckorean': u'\u3176', + 'pieupcirclekorean': u'\u3265', + 'pieupkiyeokkorean': u'\u3172', + 'pieupkorean': u'\u3142', + 'pieupparenkorean': u'\u3205', + 'pieupsioskiyeokkorean': u'\u3174', + 'pieupsioskorean': u'\u3144', + 'pieupsiostikeutkorean': u'\u3175', + 'pieupthieuthkorean': u'\u3177', + 'pieuptikeutkorean': u'\u3173', + 'pihiragana': u'\u3074', + 'pikatakana': u'\u30D4', + 'pisymbolgreek': u'\u03D6', + 'piwrarmenian': u'\u0583', + 'plus': u'\u002B', + 'plusbelowcmb': u'\u031F', + 'pluscircle': u'\u2295', + 'plusminus': u'\u00B1', + 'plusmod': u'\u02D6', + 'plusmonospace': u'\uFF0B', + 'plussmall': u'\uFE62', + 'plussuperior': u'\u207A', + 'pmonospace': u'\uFF50', + 'pmsquare': u'\u33D8', + 'pohiragana': u'\u307D', + 'pointingindexdownwhite': u'\u261F', + 'pointingindexleftwhite': u'\u261C', + 'pointingindexrightwhite': u'\u261E', + 'pointingindexupwhite': u'\u261D', + 'pokatakana': u'\u30DD', + 'poplathai': u'\u0E1B', + 'postalmark': u'\u3012', + 'postalmarkface': u'\u3020', + 'pparen': u'\u24AB', + 'precedes': u'\u227A', + 'prescription': u'\u211E', + 'primemod': u'\u02B9', + 'primereversed': u'\u2035', + 'product': u'\u220F', + 'projective': u'\u2305', + 'prolongedkana': u'\u30FC', + 'propellor': u'\u2318', + 'propersubset': u'\u2282', + 'propersuperset': u'\u2283', + 'proportion': u'\u2237', + 'proportional': u'\u221D', + 'psi': u'\u03C8', + 'psicyrillic': u'\u0471', + 'psilipneumatacyrilliccmb': u'\u0486', + 'pssquare': u'\u33B0', + 'puhiragana': u'\u3077', + 'pukatakana': u'\u30D7', + 'pvsquare': u'\u33B4', + 'pwsquare': u'\u33BA', + 'q': u'\u0071', + 'qadeva': u'\u0958', + 'qadmahebrew': u'\u05A8', + 'qafarabic': u'\u0642', + 'qaffinalarabic': u'\uFED6', + 'qafinitialarabic': u'\uFED7', + 'qafmedialarabic': u'\uFED8', + 'qamats': u'\u05B8', + 'qamats10': u'\u05B8', + 'qamats1a': u'\u05B8', + 'qamats1c': u'\u05B8', + 'qamats27': u'\u05B8', + 'qamats29': u'\u05B8', + 'qamats33': u'\u05B8', + 'qamatsde': u'\u05B8', + 'qamatshebrew': u'\u05B8', + 'qamatsnarrowhebrew': u'\u05B8', + 'qamatsqatanhebrew': u'\u05B8', + 'qamatsqatannarrowhebrew': u'\u05B8', + 'qamatsqatanquarterhebrew': u'\u05B8', + 'qamatsqatanwidehebrew': u'\u05B8', + 'qamatsquarterhebrew': u'\u05B8', + 'qamatswidehebrew': u'\u05B8', + 'qarneyparahebrew': u'\u059F', + 'qbopomofo': u'\u3111', + 'qcircle': u'\u24E0', + 'qhook': u'\u02A0', + 'qmonospace': u'\uFF51', + 'qof': u'\u05E7', + 'qofdagesh': u'\uFB47', + 'qofdageshhebrew': u'\uFB47', + 'qofhatafpatah': u'\u05E7\u05B2', + 'qofhatafpatahhebrew': u'\u05E7\u05B2', + 'qofhatafsegol': u'\u05E7\u05B1', + 'qofhatafsegolhebrew': u'\u05E7\u05B1', + 'qofhebrew': u'\u05E7', + 'qofhiriq': u'\u05E7\u05B4', + 'qofhiriqhebrew': u'\u05E7\u05B4', + 'qofholam': u'\u05E7\u05B9', + 'qofholamhebrew': u'\u05E7\u05B9', + 'qofpatah': u'\u05E7\u05B7', + 'qofpatahhebrew': u'\u05E7\u05B7', + 'qofqamats': u'\u05E7\u05B8', + 'qofqamatshebrew': u'\u05E7\u05B8', + 'qofqubuts': u'\u05E7\u05BB', + 'qofqubutshebrew': u'\u05E7\u05BB', + 'qofsegol': u'\u05E7\u05B6', + 'qofsegolhebrew': u'\u05E7\u05B6', + 'qofsheva': u'\u05E7\u05B0', + 'qofshevahebrew': u'\u05E7\u05B0', + 'qoftsere': u'\u05E7\u05B5', + 'qoftserehebrew': u'\u05E7\u05B5', + 'qparen': u'\u24AC', + 'quarternote': u'\u2669', + 'qubuts': u'\u05BB', + 'qubuts18': u'\u05BB', + 'qubuts25': u'\u05BB', + 'qubuts31': u'\u05BB', + 'qubutshebrew': u'\u05BB', + 'qubutsnarrowhebrew': u'\u05BB', + 'qubutsquarterhebrew': u'\u05BB', + 'qubutswidehebrew': u'\u05BB', + 'question': u'\u003F', + 'questionarabic': u'\u061F', + 'questionarmenian': u'\u055E', + 'questiondown': u'\u00BF', + 'questiondownsmall': u'\uF7BF', + 'questiongreek': u'\u037E', + 'questionmonospace': u'\uFF1F', + 'questionsmall': u'\uF73F', + 'quotedbl': u'\u0022', + 'quotedblbase': u'\u201E', + 'quotedblleft': u'\u201C', + 'quotedblmonospace': u'\uFF02', + 'quotedblprime': u'\u301E', + 'quotedblprimereversed': u'\u301D', + 'quotedblright': u'\u201D', + 'quoteleft': u'\u2018', + 'quoteleftreversed': u'\u201B', + 'quotereversed': u'\u201B', + 'quoteright': u'\u2019', + 'quoterightn': u'\u0149', + 'quotesinglbase': u'\u201A', + 'quotesingle': u'\u0027', + 'quotesinglemonospace': u'\uFF07', + 'r': u'\u0072', + 'raarmenian': u'\u057C', + 'rabengali': u'\u09B0', + 'racute': u'\u0155', + 'radeva': u'\u0930', + 'radical': u'\u221A', + 'radicalex': u'\uF8E5', + 'radoverssquare': u'\u33AE', + 'radoverssquaredsquare': u'\u33AF', + 'radsquare': u'\u33AD', + 'rafe': u'\u05BF', + 'rafehebrew': u'\u05BF', + 'ragujarati': u'\u0AB0', + 'ragurmukhi': u'\u0A30', + 'rahiragana': u'\u3089', + 'rakatakana': u'\u30E9', + 'rakatakanahalfwidth': u'\uFF97', + 'ralowerdiagonalbengali': u'\u09F1', + 'ramiddlediagonalbengali': u'\u09F0', + 'ramshorn': u'\u0264', + 'ratio': u'\u2236', + 'rbopomofo': u'\u3116', + 'rcaron': u'\u0159', + 'rcedilla': u'\u0157', + 'rcircle': u'\u24E1', + 'rcommaaccent': u'\u0157', + 'rdblgrave': u'\u0211', + 'rdotaccent': u'\u1E59', + 'rdotbelow': u'\u1E5B', + 'rdotbelowmacron': u'\u1E5D', + 'referencemark': u'\u203B', + 'reflexsubset': u'\u2286', + 'reflexsuperset': u'\u2287', + 'registered': u'\u00AE', + 'registersans': u'\uF8E8', + 'registerserif': u'\uF6DA', + 'reharabic': u'\u0631', + 'reharmenian': u'\u0580', + 'rehfinalarabic': u'\uFEAE', + 'rehiragana': u'\u308C', + 'rehyehaleflamarabic': u'\u0631\uFEF3\uFE8E\u0644', + 'rekatakana': u'\u30EC', + 'rekatakanahalfwidth': u'\uFF9A', + 'resh': u'\u05E8', + 'reshdageshhebrew': u'\uFB48', + 'reshhatafpatah': u'\u05E8\u05B2', + 'reshhatafpatahhebrew': u'\u05E8\u05B2', + 'reshhatafsegol': u'\u05E8\u05B1', + 'reshhatafsegolhebrew': u'\u05E8\u05B1', + 'reshhebrew': u'\u05E8', + 'reshhiriq': u'\u05E8\u05B4', + 'reshhiriqhebrew': u'\u05E8\u05B4', + 'reshholam': u'\u05E8\u05B9', + 'reshholamhebrew': u'\u05E8\u05B9', + 'reshpatah': u'\u05E8\u05B7', + 'reshpatahhebrew': u'\u05E8\u05B7', + 'reshqamats': u'\u05E8\u05B8', + 'reshqamatshebrew': u'\u05E8\u05B8', + 'reshqubuts': u'\u05E8\u05BB', + 'reshqubutshebrew': u'\u05E8\u05BB', + 'reshsegol': u'\u05E8\u05B6', + 'reshsegolhebrew': u'\u05E8\u05B6', + 'reshsheva': u'\u05E8\u05B0', + 'reshshevahebrew': u'\u05E8\u05B0', + 'reshtsere': u'\u05E8\u05B5', + 'reshtserehebrew': u'\u05E8\u05B5', + 'reversedtilde': u'\u223D', + 'reviahebrew': u'\u0597', + 'reviamugrashhebrew': u'\u0597', + 'revlogicalnot': u'\u2310', + 'rfishhook': u'\u027E', + 'rfishhookreversed': u'\u027F', + 'rhabengali': u'\u09DD', + 'rhadeva': u'\u095D', + 'rho': u'\u03C1', + 'rhook': u'\u027D', + 'rhookturned': u'\u027B', + 'rhookturnedsuperior': u'\u02B5', + 'rhosymbolgreek': u'\u03F1', + 'rhotichookmod': u'\u02DE', + 'rieulacirclekorean': u'\u3271', + 'rieulaparenkorean': u'\u3211', + 'rieulcirclekorean': u'\u3263', + 'rieulhieuhkorean': u'\u3140', + 'rieulkiyeokkorean': u'\u313A', + 'rieulkiyeoksioskorean': u'\u3169', + 'rieulkorean': u'\u3139', + 'rieulmieumkorean': u'\u313B', + 'rieulpansioskorean': u'\u316C', + 'rieulparenkorean': u'\u3203', + 'rieulphieuphkorean': u'\u313F', + 'rieulpieupkorean': u'\u313C', + 'rieulpieupsioskorean': u'\u316B', + 'rieulsioskorean': u'\u313D', + 'rieulthieuthkorean': u'\u313E', + 'rieultikeutkorean': u'\u316A', + 'rieulyeorinhieuhkorean': u'\u316D', + 'rightangle': u'\u221F', + 'righttackbelowcmb': u'\u0319', + 'righttriangle': u'\u22BF', + 'rihiragana': u'\u308A', + 'rikatakana': u'\u30EA', + 'rikatakanahalfwidth': u'\uFF98', + 'ring': u'\u02DA', + 'ringbelowcmb': u'\u0325', + 'ringcmb': u'\u030A', + 'ringhalfleft': u'\u02BF', + 'ringhalfleftarmenian': u'\u0559', + 'ringhalfleftbelowcmb': u'\u031C', + 'ringhalfleftcentered': u'\u02D3', + 'ringhalfright': u'\u02BE', + 'ringhalfrightbelowcmb': u'\u0339', + 'ringhalfrightcentered': u'\u02D2', + 'rinvertedbreve': u'\u0213', + 'rittorusquare': u'\u3351', + 'rlinebelow': u'\u1E5F', + 'rlongleg': u'\u027C', + 'rlonglegturned': u'\u027A', + 'rmonospace': u'\uFF52', + 'rohiragana': u'\u308D', + 'rokatakana': u'\u30ED', + 'rokatakanahalfwidth': u'\uFF9B', + 'roruathai': u'\u0E23', + 'rparen': u'\u24AD', + 'rrabengali': u'\u09DC', + 'rradeva': u'\u0931', + 'rragurmukhi': u'\u0A5C', + 'rreharabic': u'\u0691', + 'rrehfinalarabic': u'\uFB8D', + 'rrvocalicbengali': u'\u09E0', + 'rrvocalicdeva': u'\u0960', + 'rrvocalicgujarati': u'\u0AE0', + 'rrvocalicvowelsignbengali': u'\u09C4', + 'rrvocalicvowelsigndeva': u'\u0944', + 'rrvocalicvowelsigngujarati': u'\u0AC4', + 'rsuperior': u'\uF6F1', + 'rtblock': u'\u2590', + 'rturned': u'\u0279', + 'rturnedsuperior': u'\u02B4', + 'ruhiragana': u'\u308B', + 'rukatakana': u'\u30EB', + 'rukatakanahalfwidth': u'\uFF99', + 'rupeemarkbengali': u'\u09F2', + 'rupeesignbengali': u'\u09F3', + 'rupiah': u'\uF6DD', + 'ruthai': u'\u0E24', + 'rvocalicbengali': u'\u098B', + 'rvocalicdeva': u'\u090B', + 'rvocalicgujarati': u'\u0A8B', + 'rvocalicvowelsignbengali': u'\u09C3', + 'rvocalicvowelsigndeva': u'\u0943', + 'rvocalicvowelsigngujarati': u'\u0AC3', + 's': u'\u0073', + 'sabengali': u'\u09B8', + 'sacute': u'\u015B', + 'sacutedotaccent': u'\u1E65', + 'sadarabic': u'\u0635', + 'sadeva': u'\u0938', + 'sadfinalarabic': u'\uFEBA', + 'sadinitialarabic': u'\uFEBB', + 'sadmedialarabic': u'\uFEBC', + 'sagujarati': u'\u0AB8', + 'sagurmukhi': u'\u0A38', + 'sahiragana': u'\u3055', + 'sakatakana': u'\u30B5', + 'sakatakanahalfwidth': u'\uFF7B', + 'sallallahoualayhewasallamarabic': u'\uFDFA', + 'samekh': u'\u05E1', + 'samekhdagesh': u'\uFB41', + 'samekhdageshhebrew': u'\uFB41', + 'samekhhebrew': u'\u05E1', + 'saraaathai': u'\u0E32', + 'saraaethai': u'\u0E41', + 'saraaimaimalaithai': u'\u0E44', + 'saraaimaimuanthai': u'\u0E43', + 'saraamthai': u'\u0E33', + 'saraathai': u'\u0E30', + 'saraethai': u'\u0E40', + 'saraiileftthai': u'\uF886', + 'saraiithai': u'\u0E35', + 'saraileftthai': u'\uF885', + 'saraithai': u'\u0E34', + 'saraothai': u'\u0E42', + 'saraueeleftthai': u'\uF888', + 'saraueethai': u'\u0E37', + 'saraueleftthai': u'\uF887', + 'sarauethai': u'\u0E36', + 'sarauthai': u'\u0E38', + 'sarauuthai': u'\u0E39', + 'sbopomofo': u'\u3119', + 'scaron': u'\u0161', + 'scarondotaccent': u'\u1E67', + 'scedilla': u'\u015F', + 'schwa': u'\u0259', + 'schwacyrillic': u'\u04D9', + 'schwadieresiscyrillic': u'\u04DB', + 'schwahook': u'\u025A', + 'scircle': u'\u24E2', + 'scircumflex': u'\u015D', + 'scommaaccent': u'\u0219', + 'sdotaccent': u'\u1E61', + 'sdotbelow': u'\u1E63', + 'sdotbelowdotaccent': u'\u1E69', + 'seagullbelowcmb': u'\u033C', + 'second': u'\u2033', + 'secondtonechinese': u'\u02CA', + 'section': u'\u00A7', + 'seenarabic': u'\u0633', + 'seenfinalarabic': u'\uFEB2', + 'seeninitialarabic': u'\uFEB3', + 'seenmedialarabic': u'\uFEB4', + 'segol': u'\u05B6', + 'segol13': u'\u05B6', + 'segol1f': u'\u05B6', + 'segol2c': u'\u05B6', + 'segolhebrew': u'\u05B6', + 'segolnarrowhebrew': u'\u05B6', + 'segolquarterhebrew': u'\u05B6', + 'segoltahebrew': u'\u0592', + 'segolwidehebrew': u'\u05B6', + 'seharmenian': u'\u057D', + 'sehiragana': u'\u305B', + 'sekatakana': u'\u30BB', + 'sekatakanahalfwidth': u'\uFF7E', + 'semicolon': u'\u003B', + 'semicolonarabic': u'\u061B', + 'semicolonmonospace': u'\uFF1B', + 'semicolonsmall': u'\uFE54', + 'semivoicedmarkkana': u'\u309C', + 'semivoicedmarkkanahalfwidth': u'\uFF9F', + 'sentisquare': u'\u3322', + 'sentosquare': u'\u3323', + 'seven': u'\u0037', + 'sevenarabic': u'\u0667', + 'sevenbengali': u'\u09ED', + 'sevencircle': u'\u2466', + 'sevencircleinversesansserif': u'\u2790', + 'sevendeva': u'\u096D', + 'seveneighths': u'\u215E', + 'sevengujarati': u'\u0AED', + 'sevengurmukhi': u'\u0A6D', + 'sevenhackarabic': u'\u0667', + 'sevenhangzhou': u'\u3027', + 'sevenideographicparen': u'\u3226', + 'seveninferior': u'\u2087', + 'sevenmonospace': u'\uFF17', + 'sevenoldstyle': u'\uF737', + 'sevenparen': u'\u247A', + 'sevenperiod': u'\u248E', + 'sevenpersian': u'\u06F7', + 'sevenroman': u'\u2176', + 'sevensuperior': u'\u2077', + 'seventeencircle': u'\u2470', + 'seventeenparen': u'\u2484', + 'seventeenperiod': u'\u2498', + 'seventhai': u'\u0E57', + 'sfthyphen': u'\u00AD', + 'shaarmenian': u'\u0577', + 'shabengali': u'\u09B6', + 'shacyrillic': u'\u0448', + 'shaddaarabic': u'\u0651', + 'shaddadammaarabic': u'\uFC61', + 'shaddadammatanarabic': u'\uFC5E', + 'shaddafathaarabic': u'\uFC60', + 'shaddafathatanarabic': u'\u0651\u064B', + 'shaddakasraarabic': u'\uFC62', + 'shaddakasratanarabic': u'\uFC5F', + 'shade': u'\u2592', + 'shadedark': u'\u2593', + 'shadelight': u'\u2591', + 'shademedium': u'\u2592', + 'shadeva': u'\u0936', + 'shagujarati': u'\u0AB6', + 'shagurmukhi': u'\u0A36', + 'shalshelethebrew': u'\u0593', + 'shbopomofo': u'\u3115', + 'shchacyrillic': u'\u0449', + 'sheenarabic': u'\u0634', + 'sheenfinalarabic': u'\uFEB6', + 'sheeninitialarabic': u'\uFEB7', + 'sheenmedialarabic': u'\uFEB8', + 'sheicoptic': u'\u03E3', + 'sheqel': u'\u20AA', + 'sheqelhebrew': u'\u20AA', + 'sheva': u'\u05B0', + 'sheva115': u'\u05B0', + 'sheva15': u'\u05B0', + 'sheva22': u'\u05B0', + 'sheva2e': u'\u05B0', + 'shevahebrew': u'\u05B0', + 'shevanarrowhebrew': u'\u05B0', + 'shevaquarterhebrew': u'\u05B0', + 'shevawidehebrew': u'\u05B0', + 'shhacyrillic': u'\u04BB', + 'shimacoptic': u'\u03ED', + 'shin': u'\u05E9', + 'shindagesh': u'\uFB49', + 'shindageshhebrew': u'\uFB49', + 'shindageshshindot': u'\uFB2C', + 'shindageshshindothebrew': u'\uFB2C', + 'shindageshsindot': u'\uFB2D', + 'shindageshsindothebrew': u'\uFB2D', + 'shindothebrew': u'\u05C1', + 'shinhebrew': u'\u05E9', + 'shinshindot': u'\uFB2A', + 'shinshindothebrew': u'\uFB2A', + 'shinsindot': u'\uFB2B', + 'shinsindothebrew': u'\uFB2B', + 'shook': u'\u0282', + 'sigma': u'\u03C3', + 'sigma1': u'\u03C2', + 'sigmafinal': u'\u03C2', + 'sigmalunatesymbolgreek': u'\u03F2', + 'sihiragana': u'\u3057', + 'sikatakana': u'\u30B7', + 'sikatakanahalfwidth': u'\uFF7C', + 'siluqhebrew': u'\u05BD', + 'siluqlefthebrew': u'\u05BD', + 'similar': u'\u223C', + 'sindothebrew': u'\u05C2', + 'siosacirclekorean': u'\u3274', + 'siosaparenkorean': u'\u3214', + 'sioscieuckorean': u'\u317E', + 'sioscirclekorean': u'\u3266', + 'sioskiyeokkorean': u'\u317A', + 'sioskorean': u'\u3145', + 'siosnieunkorean': u'\u317B', + 'siosparenkorean': u'\u3206', + 'siospieupkorean': u'\u317D', + 'siostikeutkorean': u'\u317C', + 'six': u'\u0036', + 'sixarabic': u'\u0666', + 'sixbengali': u'\u09EC', + 'sixcircle': u'\u2465', + 'sixcircleinversesansserif': u'\u278F', + 'sixdeva': u'\u096C', + 'sixgujarati': u'\u0AEC', + 'sixgurmukhi': u'\u0A6C', + 'sixhackarabic': u'\u0666', + 'sixhangzhou': u'\u3026', + 'sixideographicparen': u'\u3225', + 'sixinferior': u'\u2086', + 'sixmonospace': u'\uFF16', + 'sixoldstyle': u'\uF736', + 'sixparen': u'\u2479', + 'sixperiod': u'\u248D', + 'sixpersian': u'\u06F6', + 'sixroman': u'\u2175', + 'sixsuperior': u'\u2076', + 'sixteencircle': u'\u246F', + 'sixteencurrencydenominatorbengali': u'\u09F9', + 'sixteenparen': u'\u2483', + 'sixteenperiod': u'\u2497', + 'sixthai': u'\u0E56', + 'slash': u'\u002F', + 'slashmonospace': u'\uFF0F', + 'slong': u'\u017F', + 'slongdotaccent': u'\u1E9B', + 'smileface': u'\u263A', + 'smonospace': u'\uFF53', + 'sofpasuqhebrew': u'\u05C3', + 'softhyphen': u'\u00AD', + 'softsigncyrillic': u'\u044C', + 'sohiragana': u'\u305D', + 'sokatakana': u'\u30BD', + 'sokatakanahalfwidth': u'\uFF7F', + 'soliduslongoverlaycmb': u'\u0338', + 'solidusshortoverlaycmb': u'\u0337', + 'sorusithai': u'\u0E29', + 'sosalathai': u'\u0E28', + 'sosothai': u'\u0E0B', + 'sosuathai': u'\u0E2A', + 'space': u'\u0020', + 'spacehackarabic': u'\u0020', + 'spade': u'\u2660', + 'spadesuitblack': u'\u2660', + 'spadesuitwhite': u'\u2664', + 'sparen': u'\u24AE', + 'squarebelowcmb': u'\u033B', + 'squarecc': u'\u33C4', + 'squarecm': u'\u339D', + 'squarediagonalcrosshatchfill': u'\u25A9', + 'squarehorizontalfill': u'\u25A4', + 'squarekg': u'\u338F', + 'squarekm': u'\u339E', + 'squarekmcapital': u'\u33CE', + 'squareln': u'\u33D1', + 'squarelog': u'\u33D2', + 'squaremg': u'\u338E', + 'squaremil': u'\u33D5', + 'squaremm': u'\u339C', + 'squaremsquared': u'\u33A1', + 'squareorthogonalcrosshatchfill': u'\u25A6', + 'squareupperlefttolowerrightfill': u'\u25A7', + 'squareupperrighttolowerleftfill': u'\u25A8', + 'squareverticalfill': u'\u25A5', + 'squarewhitewithsmallblack': u'\u25A3', + 'srsquare': u'\u33DB', + 'ssabengali': u'\u09B7', + 'ssadeva': u'\u0937', + 'ssagujarati': u'\u0AB7', + 'ssangcieuckorean': u'\u3149', + 'ssanghieuhkorean': u'\u3185', + 'ssangieungkorean': u'\u3180', + 'ssangkiyeokkorean': u'\u3132', + 'ssangnieunkorean': u'\u3165', + 'ssangpieupkorean': u'\u3143', + 'ssangsioskorean': u'\u3146', + 'ssangtikeutkorean': u'\u3138', + 'ssuperior': u'\uF6F2', + 'sterling': u'\u00A3', + 'sterlingmonospace': u'\uFFE1', + 'strokelongoverlaycmb': u'\u0336', + 'strokeshortoverlaycmb': u'\u0335', + 'subset': u'\u2282', + 'subsetnotequal': u'\u228A', + 'subsetorequal': u'\u2286', + 'succeeds': u'\u227B', + 'suchthat': u'\u220B', + 'suhiragana': u'\u3059', + 'sukatakana': u'\u30B9', + 'sukatakanahalfwidth': u'\uFF7D', + 'sukunarabic': u'\u0652', + 'summation': u'\u2211', + 'sun': u'\u263C', + 'superset': u'\u2283', + 'supersetnotequal': u'\u228B', + 'supersetorequal': u'\u2287', + 'svsquare': u'\u33DC', + 'syouwaerasquare': u'\u337C', + 't': u'\u0074', + 'tabengali': u'\u09A4', + 'tackdown': u'\u22A4', + 'tackleft': u'\u22A3', + 'tadeva': u'\u0924', + 'tagujarati': u'\u0AA4', + 'tagurmukhi': u'\u0A24', + 'taharabic': u'\u0637', + 'tahfinalarabic': u'\uFEC2', + 'tahinitialarabic': u'\uFEC3', + 'tahiragana': u'\u305F', + 'tahmedialarabic': u'\uFEC4', + 'taisyouerasquare': u'\u337D', + 'takatakana': u'\u30BF', + 'takatakanahalfwidth': u'\uFF80', + 'tatweelarabic': u'\u0640', + 'tau': u'\u03C4', + 'tav': u'\u05EA', + 'tavdages': u'\uFB4A', + 'tavdagesh': u'\uFB4A', + 'tavdageshhebrew': u'\uFB4A', + 'tavhebrew': u'\u05EA', + 'tbar': u'\u0167', + 'tbopomofo': u'\u310A', + 'tcaron': u'\u0165', + 'tccurl': u'\u02A8', + 'tcedilla': u'\u0163', + 'tcheharabic': u'\u0686', + 'tchehfinalarabic': u'\uFB7B', + 'tchehinitialarabic': u'\uFB7C', + 'tchehmedialarabic': u'\uFB7D', + 'tchehmeeminitialarabic': u'\uFB7C\uFEE4', + 'tcircle': u'\u24E3', + 'tcircumflexbelow': u'\u1E71', + 'tcommaaccent': u'\u0163', + 'tdieresis': u'\u1E97', + 'tdotaccent': u'\u1E6B', + 'tdotbelow': u'\u1E6D', + 'tecyrillic': u'\u0442', + 'tedescendercyrillic': u'\u04AD', + 'teharabic': u'\u062A', + 'tehfinalarabic': u'\uFE96', + 'tehhahinitialarabic': u'\uFCA2', + 'tehhahisolatedarabic': u'\uFC0C', + 'tehinitialarabic': u'\uFE97', + 'tehiragana': u'\u3066', + 'tehjeeminitialarabic': u'\uFCA1', + 'tehjeemisolatedarabic': u'\uFC0B', + 'tehmarbutaarabic': u'\u0629', + 'tehmarbutafinalarabic': u'\uFE94', + 'tehmedialarabic': u'\uFE98', + 'tehmeeminitialarabic': u'\uFCA4', + 'tehmeemisolatedarabic': u'\uFC0E', + 'tehnoonfinalarabic': u'\uFC73', + 'tekatakana': u'\u30C6', + 'tekatakanahalfwidth': u'\uFF83', + 'telephone': u'\u2121', + 'telephoneblack': u'\u260E', + 'telishagedolahebrew': u'\u05A0', + 'telishaqetanahebrew': u'\u05A9', + 'tencircle': u'\u2469', + 'tenideographicparen': u'\u3229', + 'tenparen': u'\u247D', + 'tenperiod': u'\u2491', + 'tenroman': u'\u2179', + 'tesh': u'\u02A7', + 'tet': u'\u05D8', + 'tetdagesh': u'\uFB38', + 'tetdageshhebrew': u'\uFB38', + 'tethebrew': u'\u05D8', + 'tetsecyrillic': u'\u04B5', + 'tevirhebrew': u'\u059B', + 'tevirlefthebrew': u'\u059B', + 'thabengali': u'\u09A5', + 'thadeva': u'\u0925', + 'thagujarati': u'\u0AA5', + 'thagurmukhi': u'\u0A25', + 'thalarabic': u'\u0630', + 'thalfinalarabic': u'\uFEAC', + 'thanthakhatlowleftthai': u'\uF898', + 'thanthakhatlowrightthai': u'\uF897', + 'thanthakhatthai': u'\u0E4C', + 'thanthakhatupperleftthai': u'\uF896', + 'theharabic': u'\u062B', + 'thehfinalarabic': u'\uFE9A', + 'thehinitialarabic': u'\uFE9B', + 'thehmedialarabic': u'\uFE9C', + 'thereexists': u'\u2203', + 'therefore': u'\u2234', + 'theta': u'\u03B8', + 'theta1': u'\u03D1', + 'thetasymbolgreek': u'\u03D1', + 'thieuthacirclekorean': u'\u3279', + 'thieuthaparenkorean': u'\u3219', + 'thieuthcirclekorean': u'\u326B', + 'thieuthkorean': u'\u314C', + 'thieuthparenkorean': u'\u320B', + 'thirteencircle': u'\u246C', + 'thirteenparen': u'\u2480', + 'thirteenperiod': u'\u2494', + 'thonangmonthothai': u'\u0E11', + 'thook': u'\u01AD', + 'thophuthaothai': u'\u0E12', + 'thorn': u'\u00FE', + 'thothahanthai': u'\u0E17', + 'thothanthai': u'\u0E10', + 'thothongthai': u'\u0E18', + 'thothungthai': u'\u0E16', + 'thousandcyrillic': u'\u0482', + 'thousandsseparatorarabic': u'\u066C', + 'thousandsseparatorpersian': u'\u066C', + 'three': u'\u0033', + 'threearabic': u'\u0663', + 'threebengali': u'\u09E9', + 'threecircle': u'\u2462', + 'threecircleinversesansserif': u'\u278C', + 'threedeva': u'\u0969', + 'threeeighths': u'\u215C', + 'threegujarati': u'\u0AE9', + 'threegurmukhi': u'\u0A69', + 'threehackarabic': u'\u0663', + 'threehangzhou': u'\u3023', + 'threeideographicparen': u'\u3222', + 'threeinferior': u'\u2083', + 'threemonospace': u'\uFF13', + 'threenumeratorbengali': u'\u09F6', + 'threeoldstyle': u'\uF733', + 'threeparen': u'\u2476', + 'threeperiod': u'\u248A', + 'threepersian': u'\u06F3', + 'threequarters': u'\u00BE', + 'threequartersemdash': u'\uF6DE', + 'threeroman': u'\u2172', + 'threesuperior': u'\u00B3', + 'threethai': u'\u0E53', + 'thzsquare': u'\u3394', + 'tihiragana': u'\u3061', + 'tikatakana': u'\u30C1', + 'tikatakanahalfwidth': u'\uFF81', + 'tikeutacirclekorean': u'\u3270', + 'tikeutaparenkorean': u'\u3210', + 'tikeutcirclekorean': u'\u3262', + 'tikeutkorean': u'\u3137', + 'tikeutparenkorean': u'\u3202', + 'tilde': u'\u02DC', + 'tildebelowcmb': u'\u0330', + 'tildecmb': u'\u0303', + 'tildecomb': u'\u0303', + 'tildedoublecmb': u'\u0360', + 'tildeoperator': u'\u223C', + 'tildeoverlaycmb': u'\u0334', + 'tildeverticalcmb': u'\u033E', + 'timescircle': u'\u2297', + 'tipehahebrew': u'\u0596', + 'tipehalefthebrew': u'\u0596', + 'tippigurmukhi': u'\u0A70', + 'titlocyrilliccmb': u'\u0483', + 'tiwnarmenian': u'\u057F', + 'tlinebelow': u'\u1E6F', + 'tmonospace': u'\uFF54', + 'toarmenian': u'\u0569', + 'tohiragana': u'\u3068', + 'tokatakana': u'\u30C8', + 'tokatakanahalfwidth': u'\uFF84', + 'tonebarextrahighmod': u'\u02E5', + 'tonebarextralowmod': u'\u02E9', + 'tonebarhighmod': u'\u02E6', + 'tonebarlowmod': u'\u02E8', + 'tonebarmidmod': u'\u02E7', + 'tonefive': u'\u01BD', + 'tonesix': u'\u0185', + 'tonetwo': u'\u01A8', + 'tonos': u'\u0384', + 'tonsquare': u'\u3327', + 'topatakthai': u'\u0E0F', + 'tortoiseshellbracketleft': u'\u3014', + 'tortoiseshellbracketleftsmall': u'\uFE5D', + 'tortoiseshellbracketleftvertical': u'\uFE39', + 'tortoiseshellbracketright': u'\u3015', + 'tortoiseshellbracketrightsmall': u'\uFE5E', + 'tortoiseshellbracketrightvertical': u'\uFE3A', + 'totaothai': u'\u0E15', + 'tpalatalhook': u'\u01AB', + 'tparen': u'\u24AF', + 'trademark': u'\u2122', + 'trademarksans': u'\uF8EA', + 'trademarkserif': u'\uF6DB', + 'tretroflexhook': u'\u0288', + 'triagdn': u'\u25BC', + 'triaglf': u'\u25C4', + 'triagrt': u'\u25BA', + 'triagup': u'\u25B2', + 'ts': u'\u02A6', + 'tsadi': u'\u05E6', + 'tsadidagesh': u'\uFB46', + 'tsadidageshhebrew': u'\uFB46', + 'tsadihebrew': u'\u05E6', + 'tsecyrillic': u'\u0446', + 'tsere': u'\u05B5', + 'tsere12': u'\u05B5', + 'tsere1e': u'\u05B5', + 'tsere2b': u'\u05B5', + 'tserehebrew': u'\u05B5', + 'tserenarrowhebrew': u'\u05B5', + 'tserequarterhebrew': u'\u05B5', + 'tserewidehebrew': u'\u05B5', + 'tshecyrillic': u'\u045B', + 'tsuperior': u'\uF6F3', + 'ttabengali': u'\u099F', + 'ttadeva': u'\u091F', + 'ttagujarati': u'\u0A9F', + 'ttagurmukhi': u'\u0A1F', + 'tteharabic': u'\u0679', + 'ttehfinalarabic': u'\uFB67', + 'ttehinitialarabic': u'\uFB68', + 'ttehmedialarabic': u'\uFB69', + 'tthabengali': u'\u09A0', + 'tthadeva': u'\u0920', + 'tthagujarati': u'\u0AA0', + 'tthagurmukhi': u'\u0A20', + 'tturned': u'\u0287', + 'tuhiragana': u'\u3064', + 'tukatakana': u'\u30C4', + 'tukatakanahalfwidth': u'\uFF82', + 'tusmallhiragana': u'\u3063', + 'tusmallkatakana': u'\u30C3', + 'tusmallkatakanahalfwidth': u'\uFF6F', + 'twelvecircle': u'\u246B', + 'twelveparen': u'\u247F', + 'twelveperiod': u'\u2493', + 'twelveroman': u'\u217B', + 'twentycircle': u'\u2473', + 'twentyhangzhou': u'\u5344', + 'twentyparen': u'\u2487', + 'twentyperiod': u'\u249B', + 'two': u'\u0032', + 'twoarabic': u'\u0662', + 'twobengali': u'\u09E8', + 'twocircle': u'\u2461', + 'twocircleinversesansserif': u'\u278B', + 'twodeva': u'\u0968', + 'twodotenleader': u'\u2025', + 'twodotleader': u'\u2025', + 'twodotleadervertical': u'\uFE30', + 'twogujarati': u'\u0AE8', + 'twogurmukhi': u'\u0A68', + 'twohackarabic': u'\u0662', + 'twohangzhou': u'\u3022', + 'twoideographicparen': u'\u3221', + 'twoinferior': u'\u2082', + 'twomonospace': u'\uFF12', + 'twonumeratorbengali': u'\u09F5', + 'twooldstyle': u'\uF732', + 'twoparen': u'\u2475', + 'twoperiod': u'\u2489', + 'twopersian': u'\u06F2', + 'tworoman': u'\u2171', + 'twostroke': u'\u01BB', + 'twosuperior': u'\u00B2', + 'twothai': u'\u0E52', + 'twothirds': u'\u2154', + 'u': u'\u0075', + 'uacute': u'\u00FA', + 'ubar': u'\u0289', + 'ubengali': u'\u0989', + 'ubopomofo': u'\u3128', + 'ubreve': u'\u016D', + 'ucaron': u'\u01D4', + 'ucircle': u'\u24E4', + 'ucircumflex': u'\u00FB', + 'ucircumflexbelow': u'\u1E77', + 'ucyrillic': u'\u0443', + 'udattadeva': u'\u0951', + 'udblacute': u'\u0171', + 'udblgrave': u'\u0215', + 'udeva': u'\u0909', + 'udieresis': u'\u00FC', + 'udieresisacute': u'\u01D8', + 'udieresisbelow': u'\u1E73', + 'udieresiscaron': u'\u01DA', + 'udieresiscyrillic': u'\u04F1', + 'udieresisgrave': u'\u01DC', + 'udieresismacron': u'\u01D6', + 'udotbelow': u'\u1EE5', + 'ugrave': u'\u00F9', + 'ugujarati': u'\u0A89', + 'ugurmukhi': u'\u0A09', + 'uhiragana': u'\u3046', + 'uhookabove': u'\u1EE7', + 'uhorn': u'\u01B0', + 'uhornacute': u'\u1EE9', + 'uhorndotbelow': u'\u1EF1', + 'uhorngrave': u'\u1EEB', + 'uhornhookabove': u'\u1EED', + 'uhorntilde': u'\u1EEF', + 'uhungarumlaut': u'\u0171', + 'uhungarumlautcyrillic': u'\u04F3', + 'uinvertedbreve': u'\u0217', + 'ukatakana': u'\u30A6', + 'ukatakanahalfwidth': u'\uFF73', + 'ukcyrillic': u'\u0479', + 'ukorean': u'\u315C', + 'umacron': u'\u016B', + 'umacroncyrillic': u'\u04EF', + 'umacrondieresis': u'\u1E7B', + 'umatragurmukhi': u'\u0A41', + 'umonospace': u'\uFF55', + 'underscore': u'\u005F', + 'underscoredbl': u'\u2017', + 'underscoremonospace': u'\uFF3F', + 'underscorevertical': u'\uFE33', + 'underscorewavy': u'\uFE4F', + 'union': u'\u222A', + 'universal': u'\u2200', + 'uogonek': u'\u0173', + 'uparen': u'\u24B0', + 'upblock': u'\u2580', + 'upperdothebrew': u'\u05C4', + 'upsilon': u'\u03C5', + 'upsilondieresis': u'\u03CB', + 'upsilondieresistonos': u'\u03B0', + 'upsilonlatin': u'\u028A', + 'upsilontonos': u'\u03CD', + 'uptackbelowcmb': u'\u031D', + 'uptackmod': u'\u02D4', + 'uragurmukhi': u'\u0A73', + 'uring': u'\u016F', + 'ushortcyrillic': u'\u045E', + 'usmallhiragana': u'\u3045', + 'usmallkatakana': u'\u30A5', + 'usmallkatakanahalfwidth': u'\uFF69', + 'ustraightcyrillic': u'\u04AF', + 'ustraightstrokecyrillic': u'\u04B1', + 'utilde': u'\u0169', + 'utildeacute': u'\u1E79', + 'utildebelow': u'\u1E75', + 'uubengali': u'\u098A', + 'uudeva': u'\u090A', + 'uugujarati': u'\u0A8A', + 'uugurmukhi': u'\u0A0A', + 'uumatragurmukhi': u'\u0A42', + 'uuvowelsignbengali': u'\u09C2', + 'uuvowelsigndeva': u'\u0942', + 'uuvowelsigngujarati': u'\u0AC2', + 'uvowelsignbengali': u'\u09C1', + 'uvowelsigndeva': u'\u0941', + 'uvowelsigngujarati': u'\u0AC1', + 'v': u'\u0076', + 'vadeva': u'\u0935', + 'vagujarati': u'\u0AB5', + 'vagurmukhi': u'\u0A35', + 'vakatakana': u'\u30F7', + 'vav': u'\u05D5', + 'vavdagesh': u'\uFB35', + 'vavdagesh65': u'\uFB35', + 'vavdageshhebrew': u'\uFB35', + 'vavhebrew': u'\u05D5', + 'vavholam': u'\uFB4B', + 'vavholamhebrew': u'\uFB4B', + 'vavvavhebrew': u'\u05F0', + 'vavyodhebrew': u'\u05F1', + 'vcircle': u'\u24E5', + 'vdotbelow': u'\u1E7F', + 'vecyrillic': u'\u0432', + 'veharabic': u'\u06A4', + 'vehfinalarabic': u'\uFB6B', + 'vehinitialarabic': u'\uFB6C', + 'vehmedialarabic': u'\uFB6D', + 'vekatakana': u'\u30F9', + 'venus': u'\u2640', + 'verticalbar': u'\u007C', + 'verticallineabovecmb': u'\u030D', + 'verticallinebelowcmb': u'\u0329', + 'verticallinelowmod': u'\u02CC', + 'verticallinemod': u'\u02C8', + 'vewarmenian': u'\u057E', + 'vhook': u'\u028B', + 'vikatakana': u'\u30F8', + 'viramabengali': u'\u09CD', + 'viramadeva': u'\u094D', + 'viramagujarati': u'\u0ACD', + 'visargabengali': u'\u0983', + 'visargadeva': u'\u0903', + 'visargagujarati': u'\u0A83', + 'vmonospace': u'\uFF56', + 'voarmenian': u'\u0578', + 'voicediterationhiragana': u'\u309E', + 'voicediterationkatakana': u'\u30FE', + 'voicedmarkkana': u'\u309B', + 'voicedmarkkanahalfwidth': u'\uFF9E', + 'vokatakana': u'\u30FA', + 'vparen': u'\u24B1', + 'vtilde': u'\u1E7D', + 'vturned': u'\u028C', + 'vuhiragana': u'\u3094', + 'vukatakana': u'\u30F4', + 'w': u'\u0077', + 'wacute': u'\u1E83', + 'waekorean': u'\u3159', + 'wahiragana': u'\u308F', + 'wakatakana': u'\u30EF', + 'wakatakanahalfwidth': u'\uFF9C', + 'wakorean': u'\u3158', + 'wasmallhiragana': u'\u308E', + 'wasmallkatakana': u'\u30EE', + 'wattosquare': u'\u3357', + 'wavedash': u'\u301C', + 'wavyunderscorevertical': u'\uFE34', + 'wawarabic': u'\u0648', + 'wawfinalarabic': u'\uFEEE', + 'wawhamzaabovearabic': u'\u0624', + 'wawhamzaabovefinalarabic': u'\uFE86', + 'wbsquare': u'\u33DD', + 'wcircle': u'\u24E6', + 'wcircumflex': u'\u0175', + 'wdieresis': u'\u1E85', + 'wdotaccent': u'\u1E87', + 'wdotbelow': u'\u1E89', + 'wehiragana': u'\u3091', + 'weierstrass': u'\u2118', + 'wekatakana': u'\u30F1', + 'wekorean': u'\u315E', + 'weokorean': u'\u315D', + 'wgrave': u'\u1E81', + 'whitebullet': u'\u25E6', + 'whitecircle': u'\u25CB', + 'whitecircleinverse': u'\u25D9', + 'whitecornerbracketleft': u'\u300E', + 'whitecornerbracketleftvertical': u'\uFE43', + 'whitecornerbracketright': u'\u300F', + 'whitecornerbracketrightvertical': u'\uFE44', + 'whitediamond': u'\u25C7', + 'whitediamondcontainingblacksmalldiamond': u'\u25C8', + 'whitedownpointingsmalltriangle': u'\u25BF', + 'whitedownpointingtriangle': u'\u25BD', + 'whiteleftpointingsmalltriangle': u'\u25C3', + 'whiteleftpointingtriangle': u'\u25C1', + 'whitelenticularbracketleft': u'\u3016', + 'whitelenticularbracketright': u'\u3017', + 'whiterightpointingsmalltriangle': u'\u25B9', + 'whiterightpointingtriangle': u'\u25B7', + 'whitesmallsquare': u'\u25AB', + 'whitesmilingface': u'\u263A', + 'whitesquare': u'\u25A1', + 'whitestar': u'\u2606', + 'whitetelephone': u'\u260F', + 'whitetortoiseshellbracketleft': u'\u3018', + 'whitetortoiseshellbracketright': u'\u3019', + 'whiteuppointingsmalltriangle': u'\u25B5', + 'whiteuppointingtriangle': u'\u25B3', + 'wihiragana': u'\u3090', + 'wikatakana': u'\u30F0', + 'wikorean': u'\u315F', + 'wmonospace': u'\uFF57', + 'wohiragana': u'\u3092', + 'wokatakana': u'\u30F2', + 'wokatakanahalfwidth': u'\uFF66', + 'won': u'\u20A9', + 'wonmonospace': u'\uFFE6', + 'wowaenthai': u'\u0E27', + 'wparen': u'\u24B2', + 'wring': u'\u1E98', + 'wsuperior': u'\u02B7', + 'wturned': u'\u028D', + 'wynn': u'\u01BF', + 'x': u'\u0078', + 'xabovecmb': u'\u033D', + 'xbopomofo': u'\u3112', + 'xcircle': u'\u24E7', + 'xdieresis': u'\u1E8D', + 'xdotaccent': u'\u1E8B', + 'xeharmenian': u'\u056D', + 'xi': u'\u03BE', + 'xmonospace': u'\uFF58', + 'xparen': u'\u24B3', + 'xsuperior': u'\u02E3', + 'y': u'\u0079', + 'yaadosquare': u'\u334E', + 'yabengali': u'\u09AF', + 'yacute': u'\u00FD', + 'yadeva': u'\u092F', + 'yaekorean': u'\u3152', + 'yagujarati': u'\u0AAF', + 'yagurmukhi': u'\u0A2F', + 'yahiragana': u'\u3084', + 'yakatakana': u'\u30E4', + 'yakatakanahalfwidth': u'\uFF94', + 'yakorean': u'\u3151', + 'yamakkanthai': u'\u0E4E', + 'yasmallhiragana': u'\u3083', + 'yasmallkatakana': u'\u30E3', + 'yasmallkatakanahalfwidth': u'\uFF6C', + 'yatcyrillic': u'\u0463', + 'ycircle': u'\u24E8', + 'ycircumflex': u'\u0177', + 'ydieresis': u'\u00FF', + 'ydotaccent': u'\u1E8F', + 'ydotbelow': u'\u1EF5', + 'yeharabic': u'\u064A', + 'yehbarreearabic': u'\u06D2', + 'yehbarreefinalarabic': u'\uFBAF', + 'yehfinalarabic': u'\uFEF2', + 'yehhamzaabovearabic': u'\u0626', + 'yehhamzaabovefinalarabic': u'\uFE8A', + 'yehhamzaaboveinitialarabic': u'\uFE8B', + 'yehhamzaabovemedialarabic': u'\uFE8C', + 'yehinitialarabic': u'\uFEF3', + 'yehmedialarabic': u'\uFEF4', + 'yehmeeminitialarabic': u'\uFCDD', + 'yehmeemisolatedarabic': u'\uFC58', + 'yehnoonfinalarabic': u'\uFC94', + 'yehthreedotsbelowarabic': u'\u06D1', + 'yekorean': u'\u3156', + 'yen': u'\u00A5', + 'yenmonospace': u'\uFFE5', + 'yeokorean': u'\u3155', + 'yeorinhieuhkorean': u'\u3186', + 'yerahbenyomohebrew': u'\u05AA', + 'yerahbenyomolefthebrew': u'\u05AA', + 'yericyrillic': u'\u044B', + 'yerudieresiscyrillic': u'\u04F9', + 'yesieungkorean': u'\u3181', + 'yesieungpansioskorean': u'\u3183', + 'yesieungsioskorean': u'\u3182', + 'yetivhebrew': u'\u059A', + 'ygrave': u'\u1EF3', + 'yhook': u'\u01B4', + 'yhookabove': u'\u1EF7', + 'yiarmenian': u'\u0575', + 'yicyrillic': u'\u0457', + 'yikorean': u'\u3162', + 'yinyang': u'\u262F', + 'yiwnarmenian': u'\u0582', + 'ymonospace': u'\uFF59', + 'yod': u'\u05D9', + 'yoddagesh': u'\uFB39', + 'yoddageshhebrew': u'\uFB39', + 'yodhebrew': u'\u05D9', + 'yodyodhebrew': u'\u05F2', + 'yodyodpatahhebrew': u'\uFB1F', + 'yohiragana': u'\u3088', + 'yoikorean': u'\u3189', + 'yokatakana': u'\u30E8', + 'yokatakanahalfwidth': u'\uFF96', + 'yokorean': u'\u315B', + 'yosmallhiragana': u'\u3087', + 'yosmallkatakana': u'\u30E7', + 'yosmallkatakanahalfwidth': u'\uFF6E', + 'yotgreek': u'\u03F3', + 'yoyaekorean': u'\u3188', + 'yoyakorean': u'\u3187', + 'yoyakthai': u'\u0E22', + 'yoyingthai': u'\u0E0D', + 'yparen': u'\u24B4', + 'ypogegrammeni': u'\u037A', + 'ypogegrammenigreekcmb': u'\u0345', + 'yr': u'\u01A6', + 'yring': u'\u1E99', + 'ysuperior': u'\u02B8', + 'ytilde': u'\u1EF9', + 'yturned': u'\u028E', + 'yuhiragana': u'\u3086', + 'yuikorean': u'\u318C', + 'yukatakana': u'\u30E6', + 'yukatakanahalfwidth': u'\uFF95', + 'yukorean': u'\u3160', + 'yusbigcyrillic': u'\u046B', + 'yusbigiotifiedcyrillic': u'\u046D', + 'yuslittlecyrillic': u'\u0467', + 'yuslittleiotifiedcyrillic': u'\u0469', + 'yusmallhiragana': u'\u3085', + 'yusmallkatakana': u'\u30E5', + 'yusmallkatakanahalfwidth': u'\uFF6D', + 'yuyekorean': u'\u318B', + 'yuyeokorean': u'\u318A', + 'yyabengali': u'\u09DF', + 'yyadeva': u'\u095F', + 'z': u'\u007A', + 'zaarmenian': u'\u0566', + 'zacute': u'\u017A', + 'zadeva': u'\u095B', + 'zagurmukhi': u'\u0A5B', + 'zaharabic': u'\u0638', + 'zahfinalarabic': u'\uFEC6', + 'zahinitialarabic': u'\uFEC7', + 'zahiragana': u'\u3056', + 'zahmedialarabic': u'\uFEC8', + 'zainarabic': u'\u0632', + 'zainfinalarabic': u'\uFEB0', + 'zakatakana': u'\u30B6', + 'zaqefgadolhebrew': u'\u0595', + 'zaqefqatanhebrew': u'\u0594', + 'zarqahebrew': u'\u0598', + 'zayin': u'\u05D6', + 'zayindagesh': u'\uFB36', + 'zayindageshhebrew': u'\uFB36', + 'zayinhebrew': u'\u05D6', + 'zbopomofo': u'\u3117', + 'zcaron': u'\u017E', + 'zcircle': u'\u24E9', + 'zcircumflex': u'\u1E91', + 'zcurl': u'\u0291', + 'zdot': u'\u017C', + 'zdotaccent': u'\u017C', + 'zdotbelow': u'\u1E93', + 'zecyrillic': u'\u0437', + 'zedescendercyrillic': u'\u0499', + 'zedieresiscyrillic': u'\u04DF', + 'zehiragana': u'\u305C', + 'zekatakana': u'\u30BC', + 'zero': u'\u0030', + 'zeroarabic': u'\u0660', + 'zerobengali': u'\u09E6', + 'zerodeva': u'\u0966', + 'zerogujarati': u'\u0AE6', + 'zerogurmukhi': u'\u0A66', + 'zerohackarabic': u'\u0660', + 'zeroinferior': u'\u2080', + 'zeromonospace': u'\uFF10', + 'zerooldstyle': u'\uF730', + 'zeropersian': u'\u06F0', + 'zerosuperior': u'\u2070', + 'zerothai': u'\u0E50', + 'zerowidthjoiner': u'\uFEFF', + 'zerowidthnonjoiner': u'\u200C', + 'zerowidthspace': u'\u200B', + 'zeta': u'\u03B6', + 'zhbopomofo': u'\u3113', + 'zhearmenian': u'\u056A', + 'zhebrevecyrillic': u'\u04C2', + 'zhecyrillic': u'\u0436', + 'zhedescendercyrillic': u'\u0497', + 'zhedieresiscyrillic': u'\u04DD', + 'zihiragana': u'\u3058', + 'zikatakana': u'\u30B8', + 'zinorhebrew': u'\u05AE', + 'zlinebelow': u'\u1E95', + 'zmonospace': u'\uFF5A', + 'zohiragana': u'\u305E', + 'zokatakana': u'\u30BE', + 'zparen': u'\u24B5', + 'zretroflexhook': u'\u0290', + 'zstroke': u'\u01B6', + 'zuhiragana': u'\u305A', + 'zukatakana': u'\u30BA', } #--end diff --git a/venv/Lib/site-packages/pdfminer/latin_enc.py b/venv/Lib/site-packages/pdfminer/latin_enc.py index add8e97..52dadc1 100644 --- a/venv/Lib/site-packages/pdfminer/latin_enc.py +++ b/venv/Lib/site-packages/pdfminer/latin_enc.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ Standard encoding tables used in PDF. @@ -7,7 +7,6 @@ This table is extracted from PDF Reference Manual 1.6, pp.925 """ - ENCODING = [ # (name, std, mac, win, pdf) ('A', 65, 65, 65, 65), @@ -163,6 +162,7 @@ ENCODING = [ ('mu', None, 181, 181, 181), ('multiply', None, None, 215, 215), ('n', 110, 110, 110, 110), + ('nbspace', None, 202, 160, None), ('nine', 57, 57, 57, 57), ('ntilde', None, 150, 241, 241), ('numbersign', 35, 35, 35, 35), diff --git a/venv/Lib/site-packages/pdfminer/layout.py b/venv/Lib/site-packages/pdfminer/layout.py index e22d980..9aff3d9 100644 --- a/venv/Lib/site-packages/pdfminer/layout.py +++ b/venv/Lib/site-packages/pdfminer/layout.py @@ -1,17 +1,22 @@ -import logging -from itertools import combinations - -from .utils import (INF, get_bound, uniq, fsplit, drange, bbox2str, matrix2str, apply_matrix_pt, - trailiter) - - -logger = logging.getLogger(__name__) +#!/usr/bin/env python +from .utils import INF +from .utils import Plane +from .utils import get_bound +from .utils import uniq +from .utils import csort +from .utils import fsplit +from .utils import bbox2str +from .utils import matrix2str +from .utils import apply_matrix_pt +## IndexAssigner +## class IndexAssigner: def __init__(self, index=0): self.index = index + return def run(self, obj): if isinstance(obj, LTTextBox): @@ -20,13 +25,21 @@ class IndexAssigner: elif isinstance(obj, LTTextGroup): for x in obj: self.run(x) + return +## LAParams +## class LAParams: - def __init__(self, line_overlap=0.5, char_margin=2.0, line_margin=0.5, word_margin=0.1, - boxes_flow=0.5, detect_vertical=False, all_texts=False, paragraph_indent=None, - heuristic_word_margin=False): + def __init__(self, + line_overlap=0.5, + char_margin=2.0, + line_margin=0.5, + word_margin=0.1, + boxes_flow=0.5, + detect_vertical=False, + all_texts=False): self.line_overlap = line_overlap self.char_margin = char_margin self.line_margin = line_margin @@ -34,30 +47,24 @@ class LAParams: self.boxes_flow = boxes_flow self.detect_vertical = detect_vertical self.all_texts = all_texts - # If this setting is not None, horizontal text boxes will be split by paragraphs, using - # the indent of their first line for the split. The numerical argument is the treshold that - # the line's x-pos must reach to be considered "indented". - self.paragraph_indent = paragraph_indent - # In many cases, the whole word_margin mechanism is useless because space characters are - # already included in the text. In fact, it's even harmful because it sometimes causes - # spurious space characters to be inserted. when heuristic_word_margin is enabled, text - # lines already containing space characters will have their word margin multiplied by 5 to - # avoid this spurious space problem. We don't skip space insertion altogether because it's - # possible that a layout peculiarity causes a big space not to contain the space character - # itself, and we want to count those. - self.heuristic_word_margin = heuristic_word_margin + return def __repr__(self): return ('' % (self.char_margin, self.line_margin, self.word_margin, self.all_texts)) +## LTItem +## class LTItem: def analyze(self, laparams): """Perform the layout analysis.""" + return +## LTText +## class LTText: def __repr__(self): @@ -68,28 +75,43 @@ class LTText: raise NotImplementedError +## LTComponent +## class LTComponent(LTItem): def __init__(self, bbox): LTItem.__init__(self) self.set_bbox(bbox) + return def __repr__(self): - return ('<%s %s>' % (self.__class__.__name__, bbox2str(self.bbox))) + return ('<%s %s>' % + (self.__class__.__name__, bbox2str(self.bbox))) + + # Disable comparison. + def __lt__(self, _): + raise ValueError + def __le__(self, _): + raise ValueError + def __gt__(self, _): + raise ValueError + def __ge__(self, _): + raise ValueError def set_bbox(self, bbox): - (x0,y0,x1,y1) = bbox + (x0, y0, x1, y1) = bbox self.x0 = x0 self.y0 = y0 self.x1 = x1 self.y1 = y1 self.width = x1-x0 self.height = y1-y0 - self.bbox = (x0, y0, x1, y1) + self.bbox = bbox + return def is_empty(self): return self.width <= 0 or self.height <= 0 - + def is_hoverlap(self, obj): assert isinstance(obj, LTComponent) return obj.x0 <= self.x1 and self.x0 <= obj.x1 @@ -127,30 +149,41 @@ class LTComponent(LTItem): return 0 +## LTCurve +## class LTCurve(LTComponent): def __init__(self, linewidth, pts): LTComponent.__init__(self, get_bound(pts)) self.pts = pts self.linewidth = linewidth + return def get_pts(self): - return ','.join( '%.3f,%.3f' % p for p in self.pts ) + return ','.join('%.3f,%.3f' % p for p in self.pts) +## LTLine +## class LTLine(LTCurve): def __init__(self, linewidth, p0, p1): LTCurve.__init__(self, linewidth, [p0, p1]) + return +## LTRect +## class LTRect(LTCurve): - def __init__(self, linewidth, rect): - (x0,y0,x1,y1) = rect - LTCurve.__init__(self, linewidth, [(x0,y0), (x1,y0), (x1,y1), (x0,y1)]) + def __init__(self, linewidth, bbox): + (x0, y0, x1, y1) = bbox + LTCurve.__init__(self, linewidth, [(x0, y0), (x1, y0), (x1, y1), (x0, y1)]) + return +## LTImage +## class LTImage(LTComponent): def __init__(self, name, stream, bbox): @@ -164,6 +197,7 @@ class LTImage(LTComponent): self.colorspace = stream.get_any(('CS', 'ColorSpace')) if not isinstance(self.colorspace, list): self.colorspace = [self.colorspace] + return def __repr__(self): return ('<%s(%s) %s %r>' % @@ -171,18 +205,24 @@ class LTImage(LTComponent): bbox2str(self.bbox), self.srcsize)) -class LTAnon(LTItem, LTText): +## LTAnno +## +class LTAnno(LTItem, LTText): def __init__(self, text): self._text = text + return def get_text(self): return self._text +## LTChar +## class LTChar(LTComponent, LTText): - def __init__(self, matrix, font, fontsize, scaling, rise, text, textwidth, textdisp): + def __init__(self, matrix, font, fontsize, scaling, rise, + text, textwidth, textdisp): LTText.__init__(self) self._text = text self.matrix = matrix @@ -192,9 +232,9 @@ class LTChar(LTComponent, LTText): if font.is_vertical(): # vertical width = font.get_width() * fontsize - (vx,vy) = textdisp + (vx, vy) = textdisp if vx is None: - vx = width/2 + vx = width * 0.5 else: vx = vx * fontsize * .001 vy = (1000 - vy) * fontsize * .001 @@ -209,23 +249,24 @@ class LTChar(LTComponent, LTText): ty = descent + rise bll = (0, ty) bur = (self.adv, ty+height) - (a,b,c,d,e,f) = self.matrix + (a, b, c, d, e, f) = self.matrix self.upright = (0 < a*d*scaling and b*c <= 0) - (x0,y0) = apply_matrix_pt(self.matrix, bll) - (x1,y1) = apply_matrix_pt(self.matrix, bur) + (x0, y0) = apply_matrix_pt(self.matrix, bll) + (x1, y1) = apply_matrix_pt(self.matrix, bur) if x1 < x0: - (x0,x1) = (x1,x0) + (x0, x1) = (x1, x0) if y1 < y0: - (y0,y1) = (y1,y0) - LTComponent.__init__(self, (x0,y0,x1,y1)) + (y0, y1) = (y1, y0) + LTComponent.__init__(self, (x0, y0, x1, y1)) if font.is_vertical(): self.size = self.width else: self.size = self.height + return def __repr__(self): return ('<%s %s matrix=%s font=%r adv=%s text=%r>' % - (self.__class__.__name__, bbox2str(self.bbox), + (self.__class__.__name__, bbox2str(self.bbox), matrix2str(self.matrix), self.fontname, self.adv, self.get_text())) @@ -236,12 +277,15 @@ class LTChar(LTComponent, LTText): """Returns True if two characters can coexist in the same line.""" return True - + +## LTContainer +## class LTContainer(LTComponent): def __init__(self, bbox): LTComponent.__init__(self, bbox) self._objs = [] + return def __iter__(self): return iter(self._objs) @@ -251,265 +295,210 @@ class LTContainer(LTComponent): def add(self, obj): self._objs.append(obj) + return def extend(self, objs): for obj in objs: self.add(obj) + return def analyze(self, laparams): for obj in self._objs: obj.analyze(laparams) - + return + +## LTExpandableContainer +## class LTExpandableContainer(LTContainer): def __init__(self): - LTContainer.__init__(self, (+INF,+INF,-INF,-INF)) + LTContainer.__init__(self, (+INF, +INF, -INF, -INF)) + return def add(self, obj): LTContainer.add(self, obj) self.set_bbox((min(self.x0, obj.x0), min(self.y0, obj.y0), max(self.x1, obj.x1), max(self.y1, obj.y1))) + return +## LTTextContainer +## class LTTextContainer(LTExpandableContainer, LTText): def __init__(self): LTText.__init__(self) LTExpandableContainer.__init__(self) + return def get_text(self): - return ''.join( obj.get_text() for obj in self if isinstance(obj, LTText) ) - + return ''.join(obj.get_text() for obj in self if isinstance(obj, LTText)) + +## LTTextLine +## class LTTextLine(LTTextContainer): + def __init__(self, word_margin): + LTTextContainer.__init__(self) + self.word_margin = word_margin + return + def __repr__(self): - return ('<%s %s %r>' % (self.__class__.__name__, bbox2str(self.bbox), self.get_text())) - - def _insert_anon_spaces(self, word_margin): - raise NotImplementedError() - - def add(self, obj): - assert isinstance(obj, LTChar) - LTTextContainer.add(self, obj) - + return ('<%s %s %r>' % + (self.__class__.__name__, bbox2str(self.bbox), + self.get_text())) + def analyze(self, laparams): LTTextContainer.analyze(self, laparams) - word_margin = laparams.word_margin - if laparams.heuristic_word_margin and any(obj.get_text() == ' ' for obj in self._objs): - word_margin *= 5 - if word_margin: - self._insert_anon_spaces(word_margin) - LTContainer.add(self, LTAnon('\n')) - - def is_empty(self): - # We consider a text line with no text (only whitespace) to be empty, and thus ignored - # for textbox grouping so that we don't falsely consider a textbox a bunch of lines with - # an empty line in the middle. - if LTTextContainer.is_empty(self): - return True - return not self.get_text().strip() - + LTContainer.add(self, LTAnno('\n')) + return + def find_neighbors(self, plane, ratio): - raise NotImplementedError() + raise NotImplementedError + class LTTextLineHorizontal(LTTextLine): - def __init__(self): - LTTextLine.__init__(self) - self._chars_by_height = None + def __init__(self, word_margin): + LTTextLine.__init__(self, word_margin) + self._x1 = +INF + return - def _insert_anon_spaces(self, word_margin): - insertpos = [] - for i, (prev, obj) in enumerate(trailiter(self._objs, skipfirst=True)): - if prev.get_text() == ' ' or obj.get_text() == ' ': - continue - margin = word_margin * obj.width - if prev.x1 < obj.x0-margin: - insertpos.append(i+1) # +1 because our index is one behind because of trailiter - # we invert insertpos so that inserting a char in the beginning doesn't affect the rest of - # insertions. - for pos in reversed(insertpos): - self._objs.insert(pos, LTAnon(' ')) - def add(self, obj): + if isinstance(obj, LTChar) and self.word_margin: + margin = self.word_margin * max(obj.width, obj.height) + if self._x1 < obj.x0-margin: + LTContainer.add(self, LTAnno(' ')) + self._x1 = obj.x1 LTTextLine.add(self, obj) - self._chars_by_height = None - + return + def find_neighbors(self, plane, ratio): - h = ratio*self.height - objs = plane.find((self.x0, self.y0-h, self.x1, self.y1+h)) - # We use line_margin (ratio) as the threshold for line-height diff, which is somewhat - # wrong, but in effect, the two number pretty much always go together. Well, future will - # tell. - max_height_diff = ratio - acceptable = lambda obj: isinstance(obj, LTTextLineHorizontal) and\ - abs(obj.median_charheight - self.median_charheight) < max_height_diff - return [obj for obj in objs if acceptable(obj)] - - @property - def median_charheight(self): - if not self._chars_by_height: - chars = [o for o in self._objs if isinstance(o, LTChar)] - self._chars_by_height = sorted(chars, key=lambda c: c.height) - if self._chars_by_height: - return self._chars_by_height[len(self._chars_by_height) // 2].height - else: - return 0 - + d = ratio*self.height + objs = plane.find((self.x0, self.y0-d, self.x1, self.y1+d)) + return [obj for obj in objs + if (isinstance(obj, LTTextLineHorizontal) and + abs(obj.height-self.height) < d and + (abs(obj.x0-self.x0) < d or + abs(obj.x1-self.x1) < d))] + class LTTextLineVertical(LTTextLine): - def _insert_anon_spaces(self, word_margin): - insertpos = [] - for i, (prev, obj) in enumerate(trailiter(self._objs, skipfirst=True)): - margin = word_margin * obj.height - if obj.y1+margin < prev.y0: - insertpos.append(i+1) - for pos in reversed(insertpos): - self._objs.insert(pos, LTAnon(' ')) - - def find_neighbors(self, plane, ratio): - w = ratio*self.width - objs = plane.find((self.x0-w, self.y0, self.x1+w, self.y1)) - return [ obj for obj in objs if isinstance(obj, LTTextLineVertical) ] - + def __init__(self, word_margin): + LTTextLine.__init__(self, word_margin) + self._y0 = -INF + return + def add(self, obj): + if isinstance(obj, LTChar) and self.word_margin: + margin = self.word_margin * max(obj.width, obj.height) + if obj.y1+margin < self._y0: + LTContainer.add(self, LTAnno(' ')) + self._y0 = obj.y0 + LTTextLine.add(self, obj) + return + + def find_neighbors(self, plane, ratio): + d = ratio*self.width + objs = plane.find((self.x0-d, self.y0, self.x1+d, self.y1)) + return [obj for obj in objs + if (isinstance(obj, LTTextLineVertical) and + abs(obj.width-self.width) < d and + (abs(obj.y0-self.y0) < d or + abs(obj.y1-self.y1) < d))] + + +## LTTextBox +## ## A set of text objects that are grouped within ## a certain rectangular area. - +## class LTTextBox(LTTextContainer): def __init__(self): LTTextContainer.__init__(self) - self.index = None + self.index = -1 + return def __repr__(self): return ('<%s(%s) %s %r>' % (self.__class__.__name__, self.index, bbox2str(self.bbox), self.get_text())) + class LTTextBoxHorizontal(LTTextBox): - - def __init__(self): - LTTextBox.__init__(self) - self._avg_lineheight = None - - def add(self, obj): - LTTextBox.add(self, obj) - self._avg_lineheight = None - + def analyze(self, laparams): LTTextBox.analyze(self, laparams) - self._sort_lines() - - def _pos_in_box(self, obj): - if self._avg_lineheight is None: - self._avg_lineheight = sum(o.height for o in self._objs) / len(self._objs) - x = obj.x0 - self.x0 - y = self.y1 - obj.y1 - # gridy is a y pos rounded using half the average line height. This way, we can be - # confident that lines that have almost the same Y-pos will have the same gridy - gridy = round(y / (self._avg_lineheight / 2)) - return x, y, gridy - - def _sort_lines(self): - # Sorting lines in our textbox is not so easy. It's possible that we get some lines that - # are obviously the same, but one of them is slightly higher or lower. In these cases, - # simply sorting by Y-pos will be wrong. That's why we take the average line height to - # "snap" our y-pos to some kind of grid. Then we sort by "snapped" ypos, using X pos as - # a tie breaker. - def sortkey(obj): - x, y, gridy = self._pos_in_box(obj) - return (gridy, x) - - self._objs = sorted(self._objs, key=sortkey) - + self._objs = csort(self._objs, key=lambda obj: -obj.y1) + return + def get_writing_mode(self): return 'lr-tb' - - def paragraphs(self, indent_treshold): - # Check if some lines in the box are indented and if yes, split our textbox in multiple - # paragraphs and return the result. - if len(self._objs) <= 5: - # to avoid falsely separating non-paragraphs (like titles for example), we only consider - # boxes of 6 lines or more. - return [self] - self._sort_lines() - paragraphs = [] - current_paragraph = LTTextBoxHorizontal() - prevgridy = None - wasindented = False - for obj in self._objs: - x, y, gridy = self._pos_in_box(obj) - if gridy != prevgridy: - isinsdented = x > indent_treshold - if isinsdented and (not wasindented) and (len(current_paragraph) > 1): - paragraphs.append(current_paragraph) - current_paragraph = LTTextBoxHorizontal() - wasindented = isinsdented - prevgridy = gridy - current_paragraph.add(obj) - if current_paragraph: - paragraphs.append(current_paragraph) - if len(paragraphs) > 1: - return paragraphs - else: - return [self] - + class LTTextBoxVertical(LTTextBox): def analyze(self, laparams): LTTextBox.analyze(self, laparams) - self._objs = sorted(self._objs, key=lambda obj: -obj.x1) + self._objs = csort(self._objs, key=lambda obj: -obj.x1) + return def get_writing_mode(self): return 'tb-rl' +## LTTextGroup +## class LTTextGroup(LTTextContainer): def __init__(self, objs): LTTextContainer.__init__(self) self.extend(objs) + return + class LTTextGroupLRTB(LTTextGroup): - + def analyze(self, laparams): LTTextGroup.analyze(self, laparams) # reorder the objects from top-left to bottom-right. - self._objs = sorted(self._objs, key=lambda obj: + self._objs = csort(self._objs, key=lambda obj: (1-laparams.boxes_flow)*(obj.x0) - (1+laparams.boxes_flow)*(obj.y0+obj.y1)) + return + class LTTextGroupTBRL(LTTextGroup): - + def analyze(self, laparams): LTTextGroup.analyze(self, laparams) # reorder the objects from top-right to bottom-left. - self._objs = sorted(self._objs, key=lambda obj: + self._objs = csort(self._objs, key=lambda obj: -(1+laparams.boxes_flow)*(obj.x0+obj.x1) - -(1-laparams.boxes_flow)*(obj.y1)) + - (1-laparams.boxes_flow)*(obj.y1)) + return +## LTLayoutContainer +## class LTLayoutContainer(LTContainer): def __init__(self, bbox): LTContainer.__init__(self, bbox) self.groups = None - - def get_textlines(self, laparams, objs): - assert objs - obj1 = objs[0] + return + + # group_objects: group text object to textlines. + def group_objects(self, laparams, objs): + obj0 = None line = None - for obj0, obj1 in trailiter(objs, skipfirst=True): - k = 0 - if (obj0.is_compatible(obj1) and obj0.is_voverlap(obj1) and - min(obj0.height, obj1.height) * laparams.line_overlap < obj0.voverlap(obj1) and - obj0.hdistance(obj1) < max(obj0.width, obj1.width) * laparams.char_margin): - # obj0 and obj1 is horizontally aligned: + for obj1 in objs: + if obj0 is not None: + # halign: obj0 and obj1 is horizontally aligned. # # +------+ - - - # | obj0 | - - +------+ - @@ -519,12 +508,14 @@ class LTLayoutContainer(LTContainer): # # |<--->| # (char_margin) - k |= 1 - if (laparams.detect_vertical and - obj0.is_compatible(obj1) and obj0.is_hoverlap(obj1) and - min(obj0.width, obj1.width) * laparams.line_overlap < obj0.hoverlap(obj1) and - obj0.vdistance(obj1) < max(obj0.height, obj1.height) * laparams.char_margin): - # obj0 and obj1 is vertically aligned: + halign = (obj0.is_compatible(obj1) and + obj0.is_voverlap(obj1) and + (min(obj0.height, obj1.height) * laparams.line_overlap < + obj0.voverlap(obj1)) and + (obj0.hdistance(obj1) < + max(obj0.width, obj1.width) * laparams.char_margin)) + + # valign: obj0 and obj1 is vertically aligned. # # +------+ # | obj0 | @@ -538,38 +529,49 @@ class LTLayoutContainer(LTContainer): # # |<-->| # (line_overlap) - k |= 2 - if ( (k & 1 and isinstance(line, LTTextLineHorizontal)) or - (k & 2 and isinstance(line, LTTextLineVertical)) ): - line.add(obj1) - elif line is not None: - yield line - line = None - else: - if k == 2: - line = LTTextLineVertical() - line.add(obj0) + valign = (laparams.detect_vertical and + obj0.is_compatible(obj1) and + obj0.is_hoverlap(obj1) and + (min(obj0.width, obj1.width) * laparams.line_overlap < + obj0.hoverlap(obj1)) and + (obj0.vdistance(obj1) < + max(obj0.height, obj1.height) * laparams.char_margin)) + + if ((halign and isinstance(line, LTTextLineHorizontal)) or + (valign and isinstance(line, LTTextLineVertical))): line.add(obj1) - elif k == 1: - line = LTTextLineHorizontal() - line.add(obj0) - line.add(obj1) - else: - line = LTTextLineHorizontal() - line.add(obj0) + elif line is not None: yield line line = None + else: + if valign and not halign: + line = LTTextLineVertical(laparams.word_margin) + line.add(obj0) + line.add(obj1) + elif halign and not valign: + line = LTTextLineHorizontal(laparams.word_margin) + line.add(obj0) + line.add(obj1) + else: + line = LTTextLineHorizontal(laparams.word_margin) + line.add(obj0) + yield line + line = None + obj0 = obj1 if line is None: - line = LTTextLineHorizontal() - line.add(obj1) + line = LTTextLineHorizontal(laparams.word_margin) + line.add(obj0) yield line + return - def get_textboxes(self, laparams, lines): - plane = Plane(lines) + # group_textlines: group neighboring lines to textboxes. + def group_textlines(self, laparams, lines): + plane = Plane(self.bbox) + plane.extend(lines) boxes = {} for line in lines: neighbors = line.find_neighbors(plane, laparams.line_margin) - assert line in neighbors, line + if line not in neighbors: continue members = [] for obj1 in neighbors: members.append(obj1) @@ -584,110 +586,126 @@ class LTLayoutContainer(LTContainer): boxes[obj] = box done = set() for line in lines: + if line not in boxes: continue box = boxes[line] - if box in done: continue + if box in done: + continue done.add(box) - if laparams.paragraph_indent and isinstance(box, LTTextBoxHorizontal): - paragraphs = box.paragraphs(laparams.paragraph_indent) - for p in paragraphs: - yield p - else: + if not box.is_empty(): yield box + return + # group_textboxes: group textboxes hierarchically. def group_textboxes(self, laparams, boxes): + assert boxes + def dist(obj1, obj2): """A distance function between two TextBoxes. - + Consider the bounding rectangle for obj1 and obj2. - Return its area less the areas of obj1 and obj2, + Return its area less the areas of obj1 and obj2, shown as 'www' below. This value may be negative. - +------+..........+ (x1,y1) + +------+..........+ (x1, y1) | obj1 |wwwwwwwwww: +------+www+------+ :wwwwwwwwww| obj2 | - (x0,y0) +..........+------+ + (x0, y0) +..........+------+ """ - x0 = min(obj1.x0,obj2.x0) - y0 = min(obj1.y0,obj2.y0) - x1 = max(obj1.x1,obj2.x1) - y1 = max(obj1.y1,obj2.y1) + x0 = min(obj1.x0, obj2.x0) + y0 = min(obj1.y0, obj2.y0) + x1 = max(obj1.x1, obj2.x1) + y1 = max(obj1.y1, obj2.y1) return ((x1-x0)*(y1-y0) - obj1.width*obj1.height - obj2.width*obj2.height) + def isany(obj1, obj2): """Check if there's any other object between obj1 and obj2. """ - x0 = min(obj1.x0,obj2.x0) - y0 = min(obj1.y0,obj2.y0) - x1 = max(obj1.x1,obj2.x1) - y1 = max(obj1.y1,obj2.y1) - objs = set(plane.find((x0,y0,x1,y1))) - return objs.difference((obj1,obj2)) - if len(boxes) > 100: - # Grouping this many boxes would take too long and it doesn't make much sense to do so - # considering the type of grouping (nesting 2-sized subgroups) that is done here. - logger.warning("Too many boxes (%d) to group, skipping.", len(boxes)) - return boxes + x0 = min(obj1.x0, obj2.x0) + y0 = min(obj1.y0, obj2.y0) + x1 = max(obj1.x1, obj2.x1) + y1 = max(obj1.y1, obj2.y1) + objs = set(plane.find((x0, y0, x1, y1))) + return objs.difference((obj1, obj2)) + + def key_obj(t): + (c,d,_,_) = t + return (c,d) + # XXX this still takes O(n^2) :( dists = [] - for obj1, obj2 in combinations(boxes, 2): - dists.append((0, dist(obj1, obj2), obj1, obj2)) - # we sort by dist and our tuple is (c,dist,obj1,obj2) - sortkey = lambda tup: tup[:2] - dists.sort(key=sortkey) - plane = Plane(boxes) + for i in range(len(boxes)): + obj1 = boxes[i] + for j in range(i+1, len(boxes)): + obj2 = boxes[j] + dists.append((0, dist(obj1, obj2), obj1, obj2)) + # We could use dists.sort(), but it would randomize the test result. + dists = csort(dists, key=key_obj) + plane = Plane(self.bbox) + plane.extend(boxes) while dists: - (c,d,obj1,obj2) = dists.pop(0) + (c, d, obj1, obj2) = dists.pop(0) if c == 0 and isany(obj1, obj2): - dists.append((1,d,obj1,obj2)) + dists.append((1, d, obj1, obj2)) continue if (isinstance(obj1, (LTTextBoxVertical, LTTextGroupTBRL)) or isinstance(obj2, (LTTextBoxVertical, LTTextGroupTBRL))): - group = LTTextGroupTBRL([obj1,obj2]) + group = LTTextGroupTBRL([obj1, obj2]) else: - group = LTTextGroupLRTB([obj1,obj2]) + group = LTTextGroupLRTB([obj1, obj2]) plane.remove(obj1) plane.remove(obj2) - dists = [(c,d,o1,o2) for (c,d,o1,o2) in dists if o1 in plane and o2 in plane] + dists = [ (c,d,obj1,obj2) for (c,d,obj1,obj2) in dists + if (obj1 in plane and obj2 in plane) ] for other in plane: - dists.append((0, dist(group,other), group, other)) - dists.sort(key=sortkey) + dists.append((0, dist(group, other), group, other)) + dists = csort(dists, key=key_obj) plane.add(group) - assert len(plane) in {0, 1} + assert len(plane) == 1 return list(plane) - + def analyze(self, laparams): # textobjs is a list of LTChar objects, i.e. # it has all the individual characters in the page. - (textobjs, otherobjs) = fsplit(lambda obj: isinstance(obj, LTChar), self._objs) + (textobjs, otherobjs) = fsplit(lambda obj: isinstance(obj, LTChar), self) for obj in otherobjs: obj.analyze(laparams) if not textobjs: return - textlines = list(self.get_textlines(laparams, textobjs)) - assert len(textobjs) <= sum( len(line._objs) for line in textlines ) + textlines = list(self.group_objects(laparams, textobjs)) (empties, textlines) = fsplit(lambda obj: obj.is_empty(), textlines) for obj in empties: obj.analyze(laparams) - textboxes = list(self.get_textboxes(laparams, textlines)) - assert len(textlines) == sum( len(box._objs) for box in textboxes ) - groups = self.group_textboxes(laparams, textboxes) - assigner = IndexAssigner() - for group in groups: - group.analyze(laparams) - assigner.run(group) - textboxes.sort(key=lambda box:box.index) + textboxes = list(self.group_textlines(laparams, textlines)) + if -1 <= laparams.boxes_flow and laparams.boxes_flow <= +1 and textboxes: + self.groups = self.group_textboxes(laparams, textboxes) + assigner = IndexAssigner() + for group in self.groups: + group.analyze(laparams) + assigner.run(group) + textboxes.sort(key=lambda box: box.index) + else: + def getkey(box): + if isinstance(box, LTTextBoxVertical): + return (0, -box.x1, box.y0) + else: + return (1, box.y0, box.x0) + textboxes.sort(key=getkey) self._objs = textboxes + otherobjs + empties - self.groups = groups + return +## LTFigure +## class LTFigure(LTLayoutContainer): def __init__(self, name, bbox, matrix): self.name = name self.matrix = matrix - (x,y,w,h) = bbox - bbox = get_bound( apply_matrix_pt(matrix, (p,q)) - for (p,q) in ((x,y), (x+w,y), (x,y+h), (x+w,y+h)) ) + (x, y, w, h) = bbox + bbox = get_bound(apply_matrix_pt(matrix, (p, q)) + for (p, q) in ((x, y), (x+w, y), (x, y+h), (x+w, y+h))) LTLayoutContainer.__init__(self, bbox) + return def __repr__(self): return ('<%s(%s) %s matrix=%s>' % @@ -698,84 +716,20 @@ class LTFigure(LTLayoutContainer): if not laparams.all_texts: return LTLayoutContainer.analyze(self, laparams) + return +## LTPage +## class LTPage(LTLayoutContainer): def __init__(self, pageid, bbox, rotate=0): LTLayoutContainer.__init__(self, bbox) self.pageid = pageid self.rotate = rotate + return def __repr__(self): return ('<%s(%r) %s rotate=%r>' % (self.__class__.__name__, self.pageid, bbox2str(self.bbox), self.rotate)) - -## Plane -## -## A set-like data structure for objects placed on a plane. -## Can efficiently find objects in a certain rectangular area. -## It maintains two parallel lists of objects, each of -## which is sorted by its x or y coordinate. -## -class Plane: - - def __init__(self, objs=None, gridsize=50): - self._objs = [] - self._grid = {} - self.gridsize = gridsize - if objs is not None: - for obj in objs: - self.add(obj) - - def __repr__(self): - return ('' % list(self)) - - def __iter__(self): - return iter(self._objs) - - def __len__(self): - return len(self._objs) - - def __contains__(self, obj): - return obj in self._objs - - def _getrange(self, area): - (x0,y0,x1,y1) = area - for y in drange(y0, y1, self.gridsize): - for x in drange(x0, x1, self.gridsize): - yield (x,y) - - # add(obj): place an object. - def add(self, obj): - for k in self._getrange((obj.x0, obj.y0, obj.x1, obj.y1)): - if k not in self._grid: - r = [] - self._grid[k] = r - else: - r = self._grid[k] - r.append(obj) - self._objs.append(obj) - - # remove(obj): displace an object. - def remove(self, obj): - for k in self._getrange((obj.x0, obj.y0, obj.x1, obj.y1)): - try: - self._grid[k].remove(obj) - except (KeyError, ValueError): - pass - self._objs.remove(obj) - - # find(): finds objects that are in a certain area. - def find(self, area): - (x0,y0,x1,y1) = area - done = set() - for k in self._getrange((x0,y0,x1,y1)): - if k not in self._grid: continue - for obj in self._grid[k]: - if obj in done: continue - done.add(obj) - if (obj.x1 <= x0 or x1 <= obj.x0 or - obj.y1 <= y0 or y1 <= obj.y0): continue - yield obj diff --git a/venv/Lib/site-packages/pdfminer/lzw.py b/venv/Lib/site-packages/pdfminer/lzw.py index e259862..203ee50 100644 --- a/venv/Lib/site-packages/pdfminer/lzw.py +++ b/venv/Lib/site-packages/pdfminer/lzw.py @@ -1,13 +1,13 @@ -import io -import logging - - -logger = logging.getLogger(__name__) +#!/usr/bin/env python +from io import BytesIO class CorruptDataError(Exception): pass + +## LZWDecoder +## class LZWDecoder: def __init__(self, fp): @@ -17,6 +17,7 @@ class LZWDecoder: self.nbits = 9 self.table = None self.prevbuf = None + return def readbits(self, bits): v = 0 @@ -27,37 +28,34 @@ class LZWDecoder: # |-----8-bits-----| # |-bpos-|-bits-| | # | |----r----| - v = (v<>(r-bits)) & ((1<> (r-bits)) & ((1 << bits)-1)) self.bpos += bits break else: # |-----8-bits-----| # |-bpos-|---bits----... # | |----r----| - v = (v<>> lzwdecode(bytes.fromhex('800b6050220c0c8501')) + b'-----A---B' + """ + fp = BytesIO(data) return b''.join(LZWDecoder(fp).run()) + +if __name__ == '__main__': + import doctest + print('pdfminer.lzw', doctest.testmod()) diff --git a/venv/Lib/site-packages/pdfminer/pdfcolor.py b/venv/Lib/site-packages/pdfminer/pdfcolor.py index 9f1e6ee..e93f7df 100644 --- a/venv/Lib/site-packages/pdfminer/pdfcolor.py +++ b/venv/Lib/site-packages/pdfminer/pdfcolor.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python from .psparser import LIT @@ -7,25 +8,27 @@ LITERAL_DEVICE_GRAY = LIT('DeviceGray') LITERAL_DEVICE_RGB = LIT('DeviceRGB') LITERAL_DEVICE_CMYK = LIT('DeviceCMYK') + class PDFColorSpace: def __init__(self, name, ncomponents): self.name = name self.ncomponents = ncomponents + return def __repr__(self): return '' % (self.name, self.ncomponents) PREDEFINED_COLORSPACE = dict( - (name, PDFColorSpace(name,n)) for (name,n) in { - 'CalRGB': 3, - 'CalGray': 1, - 'Lab': 3, - 'DeviceRGB': 3, - 'DeviceCMYK': 4, - 'DeviceGray': 1, - 'Separation': 1, - 'Indexed': 1, - 'Pattern': 1, - }.items()) + (name, PDFColorSpace(name, n)) for (name, n) in { + 'CalRGB': 3, + 'CalGray': 1, + 'Lab': 3, + 'DeviceRGB': 3, + 'DeviceCMYK': 4, + 'DeviceGray': 1, + 'Separation': 1, + 'Indexed': 1, + 'Pattern': 1, + }.items()) diff --git a/venv/Lib/site-packages/pdfminer/pdfdevice.py b/venv/Lib/site-packages/pdfminer/pdfdevice.py index a04c692..70223ce 100644 --- a/venv/Lib/site-packages/pdfminer/pdfdevice.py +++ b/venv/Lib/site-packages/pdfminer/pdfdevice.py @@ -1,48 +1,64 @@ -import sys -from .utils import mult_matrix, translate_matrix -from .utils import htmlescape, bbox2str +#!/usr/bin/env python +from .utils import mult_matrix +from .utils import translate_matrix +from .utils import q +from .utils import bbox2str +from .utils import isnumber from .pdffont import PDFUnicodeNotDefined +## PDFDevice +## class PDFDevice: def __init__(self, rsrcmgr): self.rsrcmgr = rsrcmgr self.ctm = None + return def __repr__(self): return '' def close(self): - pass + return def set_ctm(self, ctm): self.ctm = ctm + return def begin_tag(self, tag, props=None): - pass + return + def end_tag(self): - pass + return + def do_tag(self, tag, props=None): - pass + return def begin_page(self, page, ctm): - pass + return + def end_page(self, page): - pass + return + def begin_figure(self, name, bbox, matrix): - pass + return + def end_figure(self, name): - pass + return def paint_path(self, graphicstate, stroke, fill, evenodd, path): - pass + return + def render_image(self, name, stream): - pass + return + def render_string(self, textstate, seq): - pass + return +## PDFTextDevice +## class PDFTextDevice(PDFDevice): def render_string(self, textstate, seq): @@ -64,39 +80,40 @@ class PDFTextDevice(PDFDevice): textstate.linematrix = self.render_string_horizontal( seq, matrix, textstate.linematrix, font, fontsize, scaling, charspace, wordspace, rise, dxscale) - - def render_string_horizontal(self, seq, matrix, point, font, fontsize, scaling, charspace, - wordspace, rise, dxscale): - (x,y) = point + return + + def render_string_horizontal(self, seq, matrix, pos, + font, fontsize, scaling, charspace, wordspace, rise, dxscale): + (x, y) = pos needcharspace = False for obj in seq: - if isinstance(obj, (int, float)): + if isnumber(obj): x -= obj*dxscale needcharspace = True else: for cid in font.decode(obj): if needcharspace: x += charspace - x += self.render_char(translate_matrix(matrix, (x,y)), + x += self.render_char(translate_matrix(matrix, (x, y)), font, fontsize, scaling, rise, cid) if cid == 32 and wordspace: x += wordspace needcharspace = True return (x, y) - def render_string_vertical(self, seq, matrix, point, font, fontsize, scaling, charspace, - wordspace, rise, dxscale): - (x,y) = point + def render_string_vertical(self, seq, matrix, pos, + font, fontsize, scaling, charspace, wordspace, rise, dxscale): + (x, y) = pos needcharspace = False for obj in seq: - if isinstance(obj, (int, float)): + if isnumber(obj): y -= obj*dxscale needcharspace = True else: for cid in font.decode(obj): if needcharspace: y += charspace - y += self.render_char(translate_matrix(matrix, (x,y)), + y += self.render_char(translate_matrix(matrix, (x, y)), font, fontsize, scaling, rise, cid) if cid == 32 and wordspace: y += wordspace @@ -107,6 +124,8 @@ class PDFTextDevice(PDFDevice): return 0 +## TagExtractor +## class TagExtractor(PDFDevice): def __init__(self, rsrcmgr, outfp): @@ -114,12 +133,13 @@ class TagExtractor(PDFDevice): self.outfp = outfp self.pageno = 0 self._stack = [] + return def render_string(self, textstate, seq): font = textstate.font text = '' for obj in seq: - if not isinstance(obj, str): + if not isinstance(obj, bytes): continue chars = font.decode(obj) for cid in chars: @@ -128,29 +148,35 @@ class TagExtractor(PDFDevice): text += char except PDFUnicodeNotDefined: pass - self.outfp.write(htmlescape(text, self.outfp.encoding)) + self.outfp.write(q(text)) + return def begin_page(self, page, ctm): self.outfp.write('' % (self.pageno, bbox2str(page.mediabox), page.rotate)) + return def end_page(self, page): self.outfp.write('\n') self.pageno += 1 + return def begin_tag(self, tag, props=None): s = '' if isinstance(props, dict): - s = ''.join( ' %s="%s"' % (htmlescape(k), htmlescape(str(v))) for (k,v) - in sorted(props.items()) ) - self.outfp.write('<%s%s>' % (htmlescape(tag.name), s)) + s = ''.join(' %s="%s"' % (q(k), q(str(v))) for (k, v) + in sorted(props.items())) + self.outfp.write('<%s%s>' % (q(tag.name), s)) self._stack.append(tag) + return def end_tag(self): assert self._stack tag = self._stack.pop(-1) - self.outfp.write('' % htmlescape(tag.name)) + self.outfp.write('' % q(tag.name)) + return def do_tag(self, tag, props=None): self.begin_tag(tag, props) self._stack.pop(-1) + return diff --git a/venv/Lib/site-packages/pdfminer/pdffont.py b/venv/Lib/site-packages/pdfminer/pdffont.py index a6bd589..9653649 100644 --- a/venv/Lib/site-packages/pdfminer/pdffont.py +++ b/venv/Lib/site-packages/pdfminer/pdffont.py @@ -1,18 +1,33 @@ -#!/usr/bin/env python3 - +#!/usr/bin/env python import sys -import io import struct -from .cmapdb import CMapDB, CMapParser, FileUnicodeMap, CMap -from .encodingdb import EncodingDB, name2unicode +from io import BytesIO +from .cmapdb import CMapDB +from .cmapdb import CMapParser +from .cmapdb import FileUnicodeMap +from .cmapdb import CMap +from .encodingdb import EncodingDB +from .encodingdb import name2unicode from .psparser import PSStackParser from .psparser import PSEOF -from .psparser import LIT, KWD, handle_error -from .psparser import PSLiteral, literal_name -from .pdftypes import (PDFException, resolve1, int_value, num_value, list_value, dict_value, - stream_value) +from .psparser import LIT +from .psparser import KWD +from .psparser import STRICT +from .psparser import PSLiteral +from .psparser import literal_name +from .pdftypes import PDFException +from .pdftypes import resolve1 +from .pdftypes import int_value +from .pdftypes import num_value +from .pdftypes import bytes_value +from .pdftypes import list_value +from .pdftypes import dict_value +from .pdftypes import stream_value from .fontmetrics import FONT_METRICS -from .utils import apply_matrix_norm, nunpack, choplist +from .utils import apply_matrix_norm +from .utils import nunpack +from .utils import choplist +from .utils import isnumber def get_widths(seq): @@ -22,13 +37,13 @@ def get_widths(seq): if isinstance(v, list): if r: char1 = r[-1] - for (i,w) in enumerate(v): + for (i, w) in enumerate(v): widths[char1+i] = w r = [] - elif isinstance(v, int): + elif isnumber(v): r.append(v) if len(r) == 3: - (char1,char2,w) = r + (char1, char2, w) = r for i in range(char1, char2+1): widths[i] = w r = [] @@ -37,6 +52,7 @@ def get_widths(seq): #assert get_widths([1,2,3]) == {1:3, 2:3} #assert get_widths([1,[2,3],6,[7,8]]) == {1:2,2:3, 6:7,7:8} + def get_widths2(seq): widths = {} r = [] @@ -44,22 +60,24 @@ def get_widths2(seq): if isinstance(v, list): if r: char1 = r[-1] - for (i,(w,vx,vy)) in enumerate(choplist(3,v)): - widths[char1+i] = (w,(vx,vy)) + for (i, (w, vx, vy)) in enumerate(choplist(3, v)): + widths[char1+i] = (w, (vx, vy)) r = [] - elif isinstance(v, int): + elif isnumber(v): r.append(v) if len(r) == 5: - (char1,char2,w,vx,vy) = r + (char1, char2, w, vx, vy) = r for i in range(char1, char2+1): - widths[i] = (w,(vx,vy)) + widths[i] = (w, (vx, vy)) r = [] return widths #assert get_widths2([1]) == {} -#assert get_widths2([1,2,3,4,5]) == {1:(3,(4,5)), 2:(3,(4,5))} -#assert get_widths2([1,[2,3,4,5],6,[7,8,9]]) == {1:(2,(3,4)), 6:(7,(8,9))} +#assert get_widths2([1,2,3,4,5]) == {1:(3, (4,5)), 2:(3, (4,5))} +#assert get_widths2([1,[2,3,4,5],6,[7,8,9]]) == {1:(2, (3,4)), 6:(7, (8,9))} +## FontMetricsDB +## class FontMetricsDB: @classmethod @@ -67,26 +85,29 @@ class FontMetricsDB: return FONT_METRICS[fontname] +## Type1FontHeaderParser +## class Type1FontHeaderParser(PSStackParser): - KEYWORD_BEGIN = KWD('begin') - KEYWORD_END = KWD('end') - KEYWORD_DEF = KWD('def') - KEYWORD_PUT = KWD('put') - KEYWORD_DICT = KWD('dict') - KEYWORD_ARRAY = KWD('array') - KEYWORD_READONLY = KWD('readonly') - KEYWORD_FOR = KWD('for') - KEYWORD_FOR = KWD('for') + KEYWORD_BEGIN = KWD(b'begin') + KEYWORD_END = KWD(b'end') + KEYWORD_DEF = KWD(b'def') + KEYWORD_PUT = KWD(b'put') + KEYWORD_DICT = KWD(b'dict') + KEYWORD_ARRAY = KWD(b'array') + KEYWORD_READONLY = KWD(b'readonly') + KEYWORD_FOR = KWD(b'for') + KEYWORD_FOR = KWD(b'for') def __init__(self, data): PSStackParser.__init__(self, data) self._cid2unicode = {} + return def get_encoding(self): while 1: try: - (cid,name) = self.nextobject() + (cid, name) = self.nextobject() except PSEOF: break try: @@ -94,27 +115,31 @@ class Type1FontHeaderParser(PSStackParser): except KeyError: pass return self._cid2unicode - + def do_keyword(self, pos, token): if token is self.KEYWORD_PUT: - ((_,key),(_,value)) = self.pop(2) + ((_, key), (_, value)) = self.pop(2) if (isinstance(key, int) and isinstance(value, PSLiteral)): self.add_results((key, literal_name(value))) + return + + +NIBBLES = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'e', 'e-', None, '-') + - ## CFFFont ## (Format specified in Adobe Technical Note: #5176 ## "The Compact Font Format Specification") ## -NIBBLES = ('0','1','2','3','4','5','6','7','8','9','.','e','e-',None,'-') def getdict(data): d = {} - fp = io.BytesIO(data) + fp = BytesIO(data) stack = [] while 1: c = fp.read(1) - if not c: break + if not c: + break b0 = ord(c) if b0 <= 21: d[b0] = stack @@ -136,19 +161,21 @@ def getdict(data): else: b1 = ord(fp.read(1)) if 247 <= b0 and b0 <= 250: - value = ((b0-247)<<8)+b1+108 + value = ((b0-247) << 8)+b1+108 elif 251 <= b0 and b0 <= 254: - value = -((b0-251)<<8)-b1-108 + value = -((b0-251) << 8)-b1-108 else: b2 = ord(fp.read(1)) - if 128 <= b1: b1 -= 256 + if 128 <= b1: + b1 -= 256 if b0 == 28: - value = b1<<8 | b2 + value = b1 << 8 | b2 else: - value = b1<<24 | b2<<16 | struct.unpack('>H', fp.read(2))[0] + value = b1 << 24 | b2 << 16 | struct.unpack('>H', fp.read(2))[0] stack.append(value) return d + class CFFFont: STANDARD_STRINGS = ( @@ -230,18 +257,19 @@ class CFFFont: 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold', - ) + ) class INDEX: def __init__(self, fp): self.fp = fp self.offsets = [] - (count, offsize) = struct.unpack(b'>HB', self.fp.read(3)) + (count, offsize) = struct.unpack('>HB', self.fp.read(3)) for i in range(count+1): self.offsets.append(nunpack(self.fp.read(offsize))) self.base = self.fp.tell()-1 self.fp.seek(self.base+self.offsets[-1]) + return def __repr__(self): return '' % len(self) @@ -254,13 +282,13 @@ class CFFFont: return self.fp.read(self.offsets[i+1]-self.offsets[i]) def __iter__(self): - return iter( self[i] for i in range(len(self)) ) + return iter(self[i] for i in range(len(self))) def __init__(self, name, fp): self.name = name self.fp = fp # Header - (_major,_minor,hdrsize,offsize) = struct.unpack(b'BBBB', self.fp.read(4)) + (_major, _minor, hdrsize, offsize) = struct.unpack('BBBB', self.fp.read(4)) self.fp.read(hdrsize-4) # Name INDEX self.name_index = self.INDEX(self.fp) @@ -286,17 +314,17 @@ class CFFFont: format = self.fp.read(1) if format == b'\x00': # Format 0 - (n,) = struct.unpack(b'B', self.fp.read(1)) - for (code,gid) in enumerate(struct.unpack(b'B'*n, self.fp.read(n))): + (n,) = struct.unpack('B', self.fp.read(1)) + for (code, gid) in enumerate(struct.unpack('B'*n, self.fp.read(n))): self.code2gid[code] = gid self.gid2code[gid] = code elif format == b'\x01': # Format 1 - (n,) = struct.unpack(b'B', self.fp.read(1)) + (n,) = struct.unpack('B', self.fp.read(1)) code = 0 for i in range(n): - (first,nleft) = struct.unpack(b'BB', self.fp.read(2)) - for gid in range(first,first+nleft+1): + (first, nleft) = struct.unpack('BB', self.fp.read(2)) + for gid in range(first, first+nleft+1): self.code2gid[code] = gid self.gid2code[gid] = code code += 1 @@ -307,33 +335,34 @@ class CFFFont: self.gid2name = {} self.fp.seek(charset_pos) format = self.fp.read(1) - if format == '\x00': + if format == b'\x00': # Format 0 n = self.nglyphs-1 - for (gid,sid) in enumerate(struct.unpack(b'>'+b'H'*n, self.fp.read(2*n))): + for (gid, sid) in enumerate(struct.unpack('>'+'H'*n, self.fp.read(2*n))): gid += 1 name = self.getstr(sid) self.name2gid[name] = gid self.gid2name[gid] = name - elif format == '\x01': + elif format == b'\x01': # Format 1 - (n,) = struct.unpack(b'B', self.fp.read(1)) + (n,) = struct.unpack('B', self.fp.read(1)) sid = 0 for i in range(n): - (first,nleft) = struct.unpack(b'BB', self.fp.read(2)) - for gid in range(first,first+nleft+1): + (first, nleft) = struct.unpack('BB', self.fp.read(2)) + for gid in range(first, first+nleft+1): name = self.getstr(sid) self.name2gid[name] = gid self.gid2name[gid] = name sid += 1 - elif format == '\x02': + elif format == b'\x02': # Format 2 assert 0 else: raise ValueError('unsupported charset format: %r' % format) - #print self.code2gid - #print self.name2gid + #print(self.code2gid) + #print(self.name2gid) #assert 0 + return def getstr(self, sid): if sid < len(self.STANDARD_STRINGS): @@ -341,19 +370,23 @@ class CFFFont: return self.string_index[sid-len(self.STANDARD_STRINGS)] +## TrueTypeFont +## class TrueTypeFont: - class CMapNotFound(Exception): pass + class CMapNotFound(Exception): + pass def __init__(self, name, fp): self.name = name self.fp = fp self.tables = {} self.fonttype = fp.read(4) - (ntables, _1, _2, _3) = struct.unpack(b'>HHHH', fp.read(8)) + (ntables, _1, _2, _3) = struct.unpack('>HHHH', fp.read(8)) for _ in range(ntables): - (name, tsum, offset, length) = struct.unpack(b'>4sLLL', fp.read(16)) + (name, tsum, offset, length) = struct.unpack('>4sLLL', fp.read(16)) self.tables[name] = (offset, length) + return def create_unicode_map(self): if 'cmap' not in self.tables: @@ -361,50 +394,51 @@ class TrueTypeFont: (base_offset, length) = self.tables['cmap'] fp = self.fp fp.seek(base_offset) - (version, nsubtables) = struct.unpack(b'>HH', fp.read(4)) + (version, nsubtables) = struct.unpack('>HH', fp.read(4)) subtables = [] for i in range(nsubtables): - subtables.append(struct.unpack(b'>HHL', fp.read(8))) + subtables.append(struct.unpack('>HHL', fp.read(8))) char2gid = {} # Only supports subtable type 0, 2 and 4. for (_1, _2, st_offset) in subtables: fp.seek(base_offset+st_offset) - (fmttype, fmtlen, fmtlang) = struct.unpack(b'>HHH', fp.read(6)) + (fmttype, fmtlen, fmtlang) = struct.unpack('>HHH', fp.read(6)) if fmttype == 0: - char2gid.update(enumerate(struct.unpack(b'>256B', fp.read(256)))) + char2gid.update(enumerate(struct.unpack('>256B', fp.read(256)))) elif fmttype == 2: - subheaderkeys = struct.unpack(b'>256H', fp.read(512)) + subheaderkeys = struct.unpack('>256H', fp.read(512)) firstbytes = [0]*8192 - for (i,k) in enumerate(subheaderkeys): - firstbytes[k/8] = i - nhdrs = max(subheaderkeys)/8 + 1 + for (i, k) in enumerate(subheaderkeys): + firstbytes[k//8] = i + nhdrs = max(subheaderkeys)//8 + 1 hdrs = [] for i in range(nhdrs): - (firstcode,entcount,delta,offset) = struct.unpack(b'>HHhH', fp.read(8)) - hdrs.append((i,firstcode,entcount,delta,fp.tell()-2+offset)) - for (i,firstcode,entcount,delta,pos) in hdrs: - if not entcount: continue + (firstcode, entcount, delta, offset) = struct.unpack('>HHhH', fp.read(8)) + hdrs.append((i, firstcode, entcount, delta, fp.tell()-2+offset)) + for (i, firstcode, entcount, delta, pos) in hdrs: + if not entcount: + continue first = firstcode + (firstbytes[i] << 8) fp.seek(pos) for c in range(entcount): - gid = struct.unpack(b'>H', fp.read(2)) + gid = struct.unpack('>H', fp.read(2)) if gid: gid += delta char2gid[first+c] = gid elif fmttype == 4: - (segcount, _1, _2, _3) = struct.unpack(b'>HHHH', fp.read(8)) - segcount /= 2 - ecs = struct.unpack(b'>%dH' % segcount, fp.read(2*segcount)) + (segcount, _1, _2, _3) = struct.unpack('>HHHH', fp.read(8)) + segcount //= 2 + ecs = struct.unpack('>%dH' % segcount, fp.read(2*segcount)) fp.read(2) - scs = struct.unpack(b'>%dH' % segcount, fp.read(2*segcount)) - idds = struct.unpack(b'>%dh' % segcount, fp.read(2*segcount)) + scs = struct.unpack('>%dH' % segcount, fp.read(2*segcount)) + idds = struct.unpack('>%dh' % segcount, fp.read(2*segcount)) pos = fp.tell() - idrs = struct.unpack(b'>%dH' % segcount, fp.read(2*segcount)) - for (ec,sc,idd,idr) in zip(ecs, scs, idds, idrs): + idrs = struct.unpack('>%dH' % segcount, fp.read(2*segcount)) + for (ec, sc, idd, idr) in zip(ecs, scs, idds, idrs): if idr: fp.seek(pos+idr) for c in range(sc, ec+1): - char2gid[c] = (struct.unpack(b'>H', fp.read(2))[0] + idd) & 0xffff + char2gid[c] = (struct.unpack('>H', fp.read(2))[0] + idd) & 0xffff else: for c in range(sc, ec+1): char2gid[c] = (c + idd) & 0xffff @@ -412,21 +446,25 @@ class TrueTypeFont: assert 0 # create unicode map unicode_map = FileUnicodeMap() - for (char,gid) in char2gid.items(): + for (char, gid) in char2gid.items(): unicode_map.add_cid2unichr(gid, char) return unicode_map ## Fonts ## +class PDFFontError(PDFException): + pass -class PDFFontError(PDFException): pass -class PDFUnicodeNotDefined(PDFFontError): pass + +class PDFUnicodeNotDefined(PDFFontError): + pass LITERAL_STANDARD_ENCODING = LIT('StandardEncoding') LITERAL_TYPE1C = LIT('Type1C') +# PDFFont class PDFFont: def __init__(self, descriptor, widths, default_width=None): @@ -441,8 +479,9 @@ class PDFFont: self.italic_angle = num_value(descriptor.get('ItalicAngle', 0)) self.default_width = default_width or num_value(descriptor.get('MissingWidth', 0)) self.leading = num_value(descriptor.get('Leading', 0)) - self.bbox = list_value(descriptor.get('FontBBox', (0,0,0,0))) + self.bbox = list_value(descriptor.get('FontBBox', (0, 0, 0, 0))) self.hscale = self.vscale = .001 + return def __repr__(self): return '' @@ -453,14 +492,12 @@ class PDFFont: def is_multibyte(self): return False - def decode(self, s): - if isinstance(s, str): - return list(map(ord, s)) - else: # it's already bytes - return s + def decode(self, data): + return list(data) def get_ascent(self): return self.ascent * self.vscale + def get_descent(self): return self.descent * self.vscale @@ -469,6 +506,7 @@ class PDFFont: if w == 0: w = -self.default_width return w * self.hscale + def get_height(self): h = self.bbox[3]-self.bbox[1] if h == 0: @@ -476,15 +514,22 @@ class PDFFont: return h * self.vscale def char_width(self, cid): - return self.widths.get(cid, self.default_width) * self.hscale + try: + return self.widths[cid] * self.hscale + except KeyError: + try: + return self.widths[self.to_unichr(cid)] * self.hscale + except (KeyError, PDFUnicodeNotDefined): + return self.default_width * self.hscale def char_disp(self, cid): return 0 def string_width(self, s): - return sum( self.char_width(cid) for cid in self.decode(s) ) + return sum(self.char_width(cid) for cid in self.decode(s)) +# PDFSimpleFont class PDFSimpleFont(PDFFont): def __init__(self, descriptor, widths, spec): @@ -505,8 +550,9 @@ class PDFSimpleFont(PDFFont): if 'ToUnicode' in spec: strm = stream_value(spec['ToUnicode']) self.unicode_map = FileUnicodeMap() - CMapParser(self.unicode_map, io.BytesIO(strm.get_data())).run() + CMapParser(self.unicode_map, BytesIO(strm.get_data())).run() PDFFont.__init__(self, descriptor, widths) + return def to_unichr(self, cid): if self.unicode_map: @@ -519,97 +565,112 @@ class PDFSimpleFont(PDFFont): except KeyError: raise PDFUnicodeNotDefined(None, cid) + +# PDFType1Font class PDFType1Font(PDFSimpleFont): def __init__(self, rsrcmgr, spec): try: self.basefont = literal_name(spec['BaseFont']) except KeyError: - handle_error(PDFFontError, 'BaseFont is missing') + if STRICT: + raise PDFFontError('BaseFont is missing') self.basefont = 'unknown' try: (descriptor, widths) = FontMetricsDB.get_metrics(self.basefont) except KeyError: descriptor = dict_value(spec.get('FontDescriptor', {})) firstchar = int_value(spec.get('FirstChar', 0)) - lastchar = int_value(spec.get('LastChar', 255)) + #lastchar = int_value(spec.get('LastChar', 255)) widths = list_value(spec.get('Widths', [0]*256)) - widths = dict( (i+firstchar,w) for (i,w) in enumerate(widths) ) + widths = dict((i+firstchar, w) for (i, w) in enumerate(widths)) PDFSimpleFont.__init__(self, descriptor, widths, spec) if 'Encoding' not in spec and 'FontFile' in descriptor: # try to recover the missing encoding info from the font file. self.fontfile = stream_value(descriptor.get('FontFile')) length1 = int_value(self.fontfile['Length1']) data = self.fontfile.get_data()[:length1] - parser = Type1FontHeaderParser(io.BytesIO(data)) + parser = Type1FontHeaderParser(BytesIO(data)) self.cid2unicode = parser.get_encoding() + return def __repr__(self): return '' % self.basefont + +# PDFTrueTypeFont class PDFTrueTypeFont(PDFType1Font): def __repr__(self): return '' % self.basefont + +# PDFType3Font class PDFType3Font(PDFSimpleFont): def __init__(self, rsrcmgr, spec): firstchar = int_value(spec.get('FirstChar', 0)) - lastchar = int_value(spec.get('LastChar', 0)) + #lastchar = int_value(spec.get('LastChar', 0)) widths = list_value(spec.get('Widths', [0]*256)) - widths = dict( (i+firstchar,w) for (i,w) in enumerate(widths)) + widths = dict((i+firstchar, w) for (i, w) in enumerate(widths)) if 'FontDescriptor' in spec: descriptor = dict_value(spec['FontDescriptor']) else: - descriptor = {'Ascent':0, 'Descent':0, - 'FontBBox':spec['FontBBox']} + descriptor = {'Ascent': 0, 'Descent': 0, + 'FontBBox': spec['FontBBox']} PDFSimpleFont.__init__(self, descriptor, widths, spec) self.matrix = tuple(list_value(spec.get('FontMatrix'))) - (_,self.descent,_,self.ascent) = self.bbox - (self.hscale,self.vscale) = apply_matrix_norm(self.matrix, (1,1)) + (_, self.descent, _, self.ascent) = self.bbox + (self.hscale, self.vscale) = apply_matrix_norm(self.matrix, (1, 1)) + return def __repr__(self): return '' +# PDFCIDFont class PDFCIDFont(PDFFont): def __init__(self, rsrcmgr, spec): try: self.basefont = literal_name(spec['BaseFont']) except KeyError: - handle_error(PDFFontError, 'BaseFont is missing') + if STRICT: + raise PDFFontError('BaseFont is missing') self.basefont = 'unknown' self.cidsysteminfo = dict_value(spec.get('CIDSystemInfo', {})) - self.cidcoding = '%s-%s' % (self.cidsysteminfo.get('Registry', 'unknown'), - self.cidsysteminfo.get('Ordering', 'unknown')) + registry = bytes_value(self.cidsysteminfo.get('Registry', b'unknown')) + ordering = bytes_value(self.cidsysteminfo.get('Ordering', b'unknown')) + self.cidcoding = (registry + b'-' + ordering).decode('ascii') try: name = literal_name(spec['Encoding']) except KeyError: - handle_error(PDFFontError, 'Encoding is unspecified') + if STRICT: + raise PDFFontError('Encoding is unspecified') name = 'unknown' try: self.cmap = CMapDB.get_cmap(name) except CMapDB.CMapNotFound as e: - handle_error(PDFFontError, str(e)) + if STRICT: + raise PDFFontError(e) self.cmap = CMap() try: descriptor = dict_value(spec['FontDescriptor']) except KeyError: - handle_error(PDFFontError, 'FontDescriptor is missing') + if STRICT: + raise PDFFontError('FontDescriptor is missing') descriptor = {} ttf = None if 'FontFile2' in descriptor: self.fontfile = stream_value(descriptor.get('FontFile2')) ttf = TrueTypeFont(self.basefont, - io.BytesIO(self.fontfile.get_data())) + BytesIO(self.fontfile.get_data())) self.unicode_map = None if 'ToUnicode' in spec: strm = stream_value(spec['ToUnicode']) self.unicode_map = FileUnicodeMap() - CMapParser(self.unicode_map, io.BytesIO(strm.get_data())).run() - elif self.cidcoding == 'Adobe-Identity': + CMapParser(self.unicode_map, BytesIO(strm.get_data())).run() + elif self.cidcoding in ('Adobe-Identity', 'Adobe-UCS'): if ttf: try: self.unicode_map = ttf.create_unicode_map() @@ -625,10 +686,10 @@ class PDFCIDFont(PDFFont): if self.vertical: # writing mode: vertical widths = get_widths2(list_value(spec.get('W2', []))) - self.disps = dict( (cid,(vx,vy)) for (cid,(_,(vx,vy))) in widths.items() ) - (vy,w) = spec.get('DW2', [880, -1000]) - self.default_disp = (None,vy) - widths = dict( (cid,w) for (cid,(w,_)) in widths.items() ) + self.disps = dict((cid, (vx, vy)) for (cid, (_, (vx, vy))) in widths.items()) + (vy, w) = spec.get('DW2', [880, -1000]) + self.default_disp = (None, vy) + widths = dict((cid, w) for (cid, (w, _)) in widths.items()) default_width = w else: # writing mode: horizontal @@ -637,6 +698,7 @@ class PDFCIDFont(PDFFont): widths = get_widths(list_value(spec.get('W', []))) default_width = spec.get('DW', 1000) PDFFont.__init__(self, descriptor, widths, default_width=default_width) + return def __repr__(self): return '' % (self.basefont, self.cidcoding) @@ -647,8 +709,8 @@ class PDFCIDFont(PDFFont): def is_multibyte(self): return True - def decode(self, bytes): - return self.cmap.decode(bytes) + def decode(self, data): + return self.cmap.decode(data) def char_disp(self, cid): "Returns an integer for horizontal fonts, a tuple for vertical fonts." @@ -663,13 +725,14 @@ class PDFCIDFont(PDFFont): raise PDFUnicodeNotDefined(self.cidcoding, cid) +# main def main(argv): for fname in argv[1:]: - fp = io.open(fname, 'rb') - #font = TrueTypeFont(fname, fp) - font = CFFFont(fname, fp) - print(font) - fp.close() + with open(fname, 'rb') as fp: + #font = TrueTypeFont(fname, fp) + font = CFFFont(fname, fp) + print(font) + return if __name__ == '__main__': sys.exit(main(sys.argv)) diff --git a/venv/Lib/site-packages/pdfminer/pdfinterp.py b/venv/Lib/site-packages/pdfminer/pdfinterp.py index fbdfdcf..807a7e1 100644 --- a/venv/Lib/site-packages/pdfminer/pdfinterp.py +++ b/venv/Lib/site-packages/pdfminer/pdfinterp.py @@ -1,28 +1,44 @@ -import io +#!/usr/bin/env python import re import logging - -from .cmapdb import CMapDB, CMap -from .psparser import PSTypeError, PSEOF -from .psparser import PSKeyword, literal_name, keyword_name +from io import BytesIO +from .cmapdb import CMapDB +from .cmapdb import CMap +from .psparser import PSTypeError +from .psparser import PSEOF +from .psparser import PSKeyword +from .psparser import literal_name +from .psparser import keyword_name from .psparser import PSStackParser -from .psparser import LIT, KWD, handle_error -from .pdftypes import (PDFException, PDFStream, PDFObjRef, resolve1, list_value, dict_value, - stream_value) -from .pdffont import PDFFontError, PDFType1Font, PDFTrueTypeFont, PDFType3Font, PDFCIDFont -from .pdfparser import PDFDocument, PDFParser -from .pdfcolor import PDFColorSpace, PREDEFINED_COLORSPACE +from .psparser import LIT +from .psparser import KWD +from .psparser import STRICT +from .pdftypes import PDFException +from .pdftypes import PDFStream +from .pdftypes import PDFObjRef +from .pdftypes import resolve1 +from .pdftypes import list_value +from .pdftypes import dict_value +from .pdftypes import stream_value +from .pdffont import PDFFontError +from .pdffont import PDFType1Font +from .pdffont import PDFTrueTypeFont +from .pdffont import PDFType3Font +from .pdffont import PDFCIDFont +from .pdfcolor import PDFColorSpace +from .pdfcolor import PREDEFINED_COLORSPACE from .utils import choplist -from .utils import mult_matrix, MATRIX_IDENTITY - - -logger = logging.getLogger(__name__) +from .utils import mult_matrix +from .utils import MATRIX_IDENTITY ## Exceptions ## -class PDFResourceError(PDFException): pass -class PDFInterpreterError(PDFException): pass +class PDFResourceError(PDFException): + pass + +class PDFInterpreterError(PDFException): + pass ## Constants @@ -34,6 +50,8 @@ LITERAL_FORM = LIT('Form') LITERAL_IMAGE = LIT('Image') +## PDFTextState +## class PDFTextState: def __init__(self): @@ -48,6 +66,7 @@ class PDFTextState: self.reset() # self.matrix is set # self.linematrix is set + return def __repr__(self): return ('>sys.stderr, 'Td(%r,%r): %r' % (tx,ty,self.textstate) + #print('Td(%r,%r): %r' % (tx, ty, self.textstate), file=sys.stderr) + return + # text-move def do_TD(self, tx, ty): - (a,b,c,d,e,f) = self.textstate.matrix - self.textstate.matrix = (a,b,c,d,tx*a+ty*c+e,tx*b+ty*d+f) + (a, b, c, d, e, f) = self.textstate.matrix + self.textstate.matrix = (a, b, c, d, tx*a+ty*c+e, tx*b+ty*d+f) self.textstate.leading = ty self.textstate.linematrix = (0, 0) - #print >>sys.stderr, 'TD(%r,%r): %r' % (tx,ty,self.textstate) + #print('TD(%r,%r): %r' % (tx, ty, self.textstate), file=sys.stderr) + return + # textmatrix - def do_Tm(self, a,b,c,d,e,f): - self.textstate.matrix = (a,b,c,d,e,f) + def do_Tm(self, a, b, c, d, e, f): + self.textstate.matrix = (a, b, c, d, e, f) self.textstate.linematrix = (0, 0) + return + # nextline def do_T_a(self): - (a,b,c,d,e,f) = self.textstate.matrix - self.textstate.matrix = (a,b,c,d,self.textstate.leading*c+e,self.textstate.leading*d+f) + (a, b, c, d, e, f) = self.textstate.matrix + self.textstate.matrix = (a, b, c, d, self.textstate.leading*c+e, self.textstate.leading*d+f) self.textstate.linematrix = (0, 0) + return # show-pos def do_TJ(self, seq): - #print >>sys.stderr, 'TJ(%r): %r' % (seq,self.textstate) + #print('TJ(%r): %r' % (seq, self.textstate), file=sys.stderr) if self.textstate.font is None: - handle_error(PDFInterpreterError, 'No font specified!') + if STRICT: + raise PDFInterpreterError('No font specified!') return self.device.render_string(self.textstate, seq) + return + # show def do_Tj(self, s): self.do_TJ([s]) + return + # quote def do__q(self, s): self.do_T_a() self.do_TJ([s]) + return + # doublequote def do__w(self, aw, ac, s): self.do_Tw(aw) self.do_Tc(ac) self.do_TJ([s]) + return # inline image - def do_BI(self): # never called - pass - def do_ID(self): # never called - pass + def do_BI(self): # never called + return + + def do_ID(self): # never called + return + def do_EI(self, obj): - try: - if 'W' in obj and 'H' in obj: - iobjid = str(id(obj)) - self.device.begin_figure(iobjid, (0,0,1,1), MATRIX_IDENTITY) - self.device.render_image(iobjid, obj) - self.device.end_figure(iobjid) - except TypeError: - # Sometimes, 'obj' is a PSLiteral. I'm not sure why, but I'm guessing it's because it's - # malformed or something. We can just ignore the thing. - logger.warning("Malformed inline image") + if 'W' in obj and 'H' in obj: + iobjid = str(id(obj)) + self.device.begin_figure(iobjid, (0, 0, 1, 1), MATRIX_IDENTITY) + self.device.render_image(iobjid, obj) + self.device.end_figure(iobjid) + return # invoke an XObject def do_Do(self, xobjid): @@ -604,15 +801,16 @@ class PDFPageInterpreter: try: xobj = stream_value(self.xobjmap[xobjid]) except KeyError: - handle_error(PDFInterpreterError, 'Undefined xobject id: %r' % xobjid) + if STRICT: + raise PDFInterpreterError('Undefined xobject id: %r' % xobjid) return - logger.debug('Processing xobj: %r', xobj) + if self.debug: logging.info('Processing xobj: %r' % xobj) subtype = xobj.get('Subtype') if subtype is LITERAL_FORM and 'BBox' in xobj: interpreter = self.dup() bbox = list_value(xobj['BBox']) matrix = list_value(xobj.get('Matrix', MATRIX_IDENTITY)) - # According to PDF reference 1.7 section 4.9.1, XObjects in + # According to PDF reference 1.7 section 4.9.1, XObjects in # earlier PDFs (prior to v1.2) use the page's Resources entry # instead of having their own Resources entry. resources = dict_value(xobj.get('Resources')) or self.resources.copy() @@ -620,36 +818,41 @@ class PDFPageInterpreter: interpreter.render_contents(resources, [xobj], ctm=mult_matrix(matrix, self.ctm)) self.device.end_figure(xobjid) elif subtype is LITERAL_IMAGE and 'Width' in xobj and 'Height' in xobj: - self.device.begin_figure(xobjid, (0,0,1,1), MATRIX_IDENTITY) + self.device.begin_figure(xobjid, (0, 0, 1, 1), MATRIX_IDENTITY) self.device.render_image(xobjid, xobj) self.device.end_figure(xobjid) else: # unsupported xobject type. pass + return def process_page(self, page): - logger.debug('Processing page: %r', page) - (x0,y0,x1,y1) = page.mediabox + if self.debug: logging.info('Processing page: %r' % page) + (x0, y0, x1, y1) = page.mediabox if page.rotate == 90: - ctm = (0,-1,1,0, -y0,x1) + ctm = (0, -1, 1, 0, -y0, x1) elif page.rotate == 180: - ctm = (-1,0,0,-1, x1,y1) + ctm = (-1, 0, 0, -1, x1, y1) elif page.rotate == 270: - ctm = (0,1,-1,0, y1,-x0) + ctm = (0, 1, -1, 0, y1, -x0) else: - ctm = (1,0,0,1, -x0,-y0) + ctm = (1, 0, 0, 1, -x0, -y0) self.device.begin_page(page, ctm) self.render_contents(page.resources, page.contents, ctm=ctm) self.device.end_page(page) + return # render_contents(resources, streams, ctm) # Render the content streams. # This method may be called recursively. def render_contents(self, resources, streams, ctm=MATRIX_IDENTITY): - logger.debug('render_contents: resources=%r, streams=%r, ctm=%r', resources, streams, ctm) + if self.debug: + logging.info('render_contents: resources=%r, streams=%r, ctm=%r' % + (resources, streams, ctm)) self.init_resources(resources) self.init_state(ctm) self.execute(list_value(streams)) + return def execute(self, streams): try: @@ -659,50 +862,28 @@ class PDFPageInterpreter: return while 1: try: - (_,obj) = parser.nextobject() + (_, obj) = parser.nextobject() except PSEOF: break if isinstance(obj, PSKeyword): - name = keyword_name(obj) - method = 'do_%s' % name.replace('*','_a').replace('"','_w').replace("'",'_q') + name = keyword_name(obj).decode('ascii') + method = 'do_%s' % name.replace('*', '_a').replace('"', '_w').replace("'", '_q') if hasattr(self, method): func = getattr(self, method) nargs = func.__code__.co_argcount-1 if nargs: args = self.pop(nargs) - # logger.debug('exec: %s %r', name, args) + if self.debug: + logging.debug('exec: %s %r' % (name, args)) if len(args) == nargs: func(*args) else: - # logger.debug('exec: %s', name) + if self.debug: + logging.debug('exec: %s' % name) func() else: - handle_error(PDFInterpreterError, 'Unknown operator: %r' % name) + if STRICT: + raise PDFInterpreterError('Unknown operator: %r' % name) else: self.push(obj) - - -class PDFTextExtractionNotAllowed(PDFInterpreterError): pass - -def process_pdf(rsrcmgr, device, fp, pagenos=None, maxpages=0, password='', - caching=True, check_extractable=True): - # Create a PDF parser object associated with the file object. - parser = PDFParser(fp) - # Create a PDF document object that stores the document structure. - doc = PDFDocument(caching=caching) - # Connect the parser and document objects. - parser.set_document(doc) - doc.set_parser(parser) - # Supply the document password for initialization. - # (If no password is set, give an empty string.) - doc.initialize(password) - # Check if the document allows text extraction. If not, abort. - if check_extractable and not doc.is_extractable: - raise PDFTextExtractionNotAllowed('Text extraction is not allowed: %r' % fp) - # Create a PDF interpreter object. - interpreter = PDFPageInterpreter(rsrcmgr, device) - # Process each page contained in the document. - for (pageno,page) in enumerate(doc.get_pages()): - if pagenos and (pageno not in pagenos): continue - interpreter.process_page(page) - if maxpages and maxpages <= pageno+1: break + return diff --git a/venv/Lib/site-packages/pdfminer/pdfparser.py b/venv/Lib/site-packages/pdfminer/pdfparser.py index dd2b670..61eb1dc 100644 --- a/venv/Lib/site-packages/pdfminer/pdfparser.py +++ b/venv/Lib/site-packages/pdfminer/pdfparser.py @@ -1,630 +1,26 @@ -import io -import re -import struct -import hashlib as md5 +#!/usr/bin/env python import logging - -from .psparser import PSStackParser, PSSyntaxError, PSEOF, literal_name, LIT, KWD, handle_error -from .pdftypes import (PDFException, PDFTypeError, PDFNotImplementedError, PDFStream, PDFObjRef, - resolve1, decipher_all, int_value, str_value, list_value, dict_value, stream_value) -from .arcfour import Arcfour -from .utils import choplist, nunpack, decode_text, ObjIdRange - - -logger = logging.getLogger(__name__) +from io import BytesIO +from .psparser import PSStackParser +from .psparser import PSSyntaxError +from .psparser import PSEOF +from .psparser import KWD +from .psparser import STRICT +from .pdftypes import PDFException +from .pdftypes import PDFStream +from .pdftypes import PDFObjRef +from .pdftypes import int_value +from .pdftypes import dict_value ## Exceptions ## -class PDFSyntaxError(PDFException): pass -class PDFNoValidXRef(PDFSyntaxError): pass -class PDFNoOutlines(PDFException): pass -class PDFDestinationNotFound(PDFException): pass -class PDFAlreadyParsed(PDFException): pass -class PDFEncryptionError(PDFException): pass -class PDFPasswordIncorrect(PDFEncryptionError): pass - -# some predefined literals and keywords. -LITERAL_OBJSTM = LIT('ObjStm') -LITERAL_XREF = LIT('XRef') -LITERAL_PAGE = LIT('Page') -LITERAL_PAGES = LIT('Pages') -LITERAL_CATALOG = LIT('Catalog') - - -class PDFBaseXRef: - - def get_trailer(self): - raise NotImplementedError - - def get_objids(self): - return [] - - def get_pos(self, objid): - raise KeyError(objid) - - -class PDFXRef(PDFBaseXRef): - - def __init__(self): - self.offsets = {} - self.trailer = {} - - def load(self, parser): - while 1: - try: - (pos, line) = parser.nextline() - if not line.strip(): continue - except PSEOF: - raise PDFNoValidXRef('Unexpected EOF - file corrupted?') - if not line: - raise PDFNoValidXRef('Premature eof: %r' % parser) - if line.startswith('trailer'): - parser.setpos(pos) - break - f = line.strip().split(' ') - if len(f) != 2: - raise PDFNoValidXRef('Trailer not found: %r: line=%r' % (parser, line)) - try: - (start, nobjs) = list(map(int, f)) - except ValueError: - raise PDFNoValidXRef('Invalid line: %r: line=%r' % (parser, line)) - for objid in range(start, start+nobjs): - try: - (_, line) = parser.nextline() - except PSEOF: - raise PDFNoValidXRef('Unexpected EOF - file corrupted?') - f = line.strip().split(' ') - if len(f) != 3: - raise PDFNoValidXRef('Invalid XRef format: %r, line=%r' % (parser, line)) - (pos, genno, use) = f - if use != 'n': continue - self.offsets[objid] = (int(genno), int(pos)) - logger.debug('xref objects: %r', self.offsets) - self.load_trailer(parser) - - KEYWORD_TRAILER = KWD('trailer') - def load_trailer(self, parser): - try: - (_,kwd) = parser.nexttoken() - assert kwd is self.KEYWORD_TRAILER - (_,dic) = parser.nextobject() - except PSEOF: - x = parser.pop(1) - if not x: - raise PDFNoValidXRef('Unexpected EOF - file corrupted') - (_,dic) = x[0] - self.trailer.update(dict_value(dic)) - - PDFOBJ_CUE = re.compile(r'^(\d+)\s+(\d+)\s+obj\b') - - def load_fallback(self, parser, debug=0): - parser.setpos(0) - while 1: - try: - (pos, line) = parser.nextline() - except PSEOF: - break - if line.startswith('trailer'): - parser.setpos(pos) - self.load_trailer(parser) - logger.debug('trailer: %r', self.get_trailer()) - break - m = self.PDFOBJ_CUE.match(line) - if not m: continue - (objid, genno) = m.groups() - self.offsets[int(objid)] = (0, pos) - - def get_trailer(self): - return self.trailer - - def get_objids(self): - return iter(self.offsets.keys()) - - def get_pos(self, objid): - try: - (genno, pos) = self.offsets[objid] - except KeyError: - raise - return (None, pos) - - -class PDFXRefStream(PDFBaseXRef): - - def __init__(self): - self.data = None - self.entlen = None - self.fl1 = self.fl2 = self.fl3 = None - self.objid_ranges = [] - - def __repr__(self): - return '' % (self.fl1, self.fl2, self.fl3) - - def load(self, parser): - (_,objid) = parser.nexttoken() # ignored - (_,genno) = parser.nexttoken() # ignored - (_,kwd) = parser.nexttoken() - (_,stream) = parser.nextobject() - if not isinstance(stream, PDFStream) or stream['Type'] is not LITERAL_XREF: - raise PDFNoValidXRef('Invalid PDF stream spec.') - size = stream['Size'] - index_array = stream.get('Index', (0,size)) - if len(index_array) % 2 != 0: - raise PDFSyntaxError('Invalid index number') - self.objid_ranges.extend( ObjIdRange(start, nobjs) - for (start,nobjs) in choplist(2, index_array) ) - (self.fl1, self.fl2, self.fl3) = stream['W'] - self.data = stream.get_data() - self.entlen = self.fl1+self.fl2+self.fl3 - self.trailer = stream.attrs - if logger.getEffectiveLevel() <= logging.DEBUG: - logger.debug('xref stream: objid=%s, fields=%d,%d,%d', - ', '.join(map(repr, self.objid_ranges)), self.fl1, self.fl2, self.fl3) - - def get_trailer(self): - return self.trailer - - def get_objids(self): - for objid_range in self.objid_ranges: - for x in range(objid_range.get_start_id(), objid_range.get_end_id()+1): - yield x - - def get_pos(self, objid): - offset = 0 - found = False - for objid_range in self.objid_ranges: - if objid >= objid_range.get_start_id() and objid <= objid_range.get_end_id(): - offset += objid - objid_range.get_start_id() - found = True - break - else: - offset += objid_range.get_nobjs() - if not found: raise KeyError(objid) - i = self.entlen * offset - ent = self.data[i:i+self.entlen] - f1 = nunpack(ent[:self.fl1], 1) - if f1 == 1: - pos = nunpack(ent[self.fl1:self.fl1+self.fl2]) - genno = nunpack(ent[self.fl1+self.fl2:]) - return (None, pos) - elif f1 == 2: - objid = nunpack(ent[self.fl1:self.fl1+self.fl2]) - index = nunpack(ent[self.fl1+self.fl2:]) - return (objid, index) - # this is a free object - raise KeyError(objid) - - -class PDFPage: - - """An object that holds the information about a page. - - A PDFPage object is merely a convenience class that has a set - of keys and values, which describe the properties of a page - and point to its contents. - - Attributes: - doc: a PDFDocument object. - pageid: any Python object that can uniquely identify the page. - attrs: a dictionary of page attributes. - contents: a list of PDFStream objects that represents the page content. - lastmod: the last modified time of the page. - resources: a list of resources used by the page. - mediabox: the physical size of the page. - cropbox: the crop rectangle of the page. - rotate: the page rotation (in degree). - annots: the page annotations. - beads: a chain that represents natural reading order. - """ - - def __init__(self, doc, pageid, attrs): - """Initialize a page object. - - doc: a PDFDocument object. - pageid: any Python object that can uniquely identify the page. - attrs: a dictionary of page attributes. - """ - self.doc = doc - self.pageid = pageid - self.attrs = dict_value(attrs) - self.lastmod = resolve1(self.attrs.get('LastModified')) - self.resources = resolve1(self.attrs['Resources']) - self.mediabox = resolve1(self.attrs['MediaBox']) - if 'CropBox' in self.attrs: - self.cropbox = resolve1(self.attrs['CropBox']) - else: - self.cropbox = self.mediabox - self.rotate = (self.attrs.get('Rotate', 0)+360) % 360 - self.annots = self.attrs.get('Annots') - self.beads = self.attrs.get('B') - if 'Contents' in self.attrs: - contents = resolve1(self.attrs['Contents']) - else: - contents = [] - if not isinstance(contents, list): - contents = [ contents ] - self.contents = contents - - def __repr__(self): - return '' % (self.resources, self.mediabox) - - -class PDFDocument: - """PDFDocument object represents a PDF document. - - Since a PDF file can be very big, normally it is not loaded at - once. So PDF document has to cooperate with a PDF parser in order to - dynamically import the data as processing goes. - - Typical usage: - doc = PDFDocument() - doc.set_parser(parser) - doc.initialize(password) - obj = doc.getobj(objid) - - """ - - KEYWORD_OBJ = KWD('obj') - - def __init__(self, caching=True): - self.caching = caching - self.xrefs = [] - self.info = [] - self.catalog = None - self.encryption = None - self.decipher = None - self._parser = None - self._cached_objs = {} - self._parsed_objs = {} - self._parsed_everything = False - - def _parse_next_object(self, parser): - # This is a bit awkward and I suspect that it could be a lot more elegant, but it would - # require refactoring the parsing process and I don't want to do that yet. - stack = [] - _, token = parser.nexttoken() - while token is not self.KEYWORD_OBJ: - stack.append(token) - _, token = parser.nexttoken() - objid = stack[-2] - genno = stack[-1] - _, obj = parser.nextobject() - return objid, genno, obj - - def _parse_objstream(self, stream): - # ObjStm have a special organization. First, the param "N" tells how many objs we have in - # there. Then, they start with a list of (objids, genno) pairs, and then the actual objects - # come in. - parser = PDFStreamParser(stream.get_data()) - parser.set_document(self) - objcount = stream['N'] - objids = [] - for i in range(objcount): - _, objid = parser.nextobject() - _, genno = parser.nextobject() - objids.append(objid) - # Now we should be at the point where we read objects - for objid in objids: - _, obj = parser.nextobject() - self._cached_objs[objid] = obj - - def _parse_whole(self, parser): - while True: - try: - objid, genno, obj = self._parse_next_object(parser) - self._cached_objs[objid] = obj - if isinstance(obj, PDFStream) and obj.get('Type') is LITERAL_OBJSTM: - obj.set_objid(objid, genno) - self._parse_objstream(obj) - except PSEOF: - break - - def _parse_everything(self): - # Sometimes, we have malformed xref, but we still want to manage to read the PDF. In cases - # like these, the last resort is to read all objects at once so that our object reference - # can finally be resolved. This is slower than the normal method, so ony use this when the - # xref tables are corrupt/wrong/whatever. - if self._parsed_everything: - raise PDFAlreadyParsed() - parser = self._parser - parser.setpos(0) - parser.reset() - self._parse_whole(parser) - self._parsed_everything = True - - def _getobj(self, objid): - if not self.xrefs: - raise PDFException('PDFDocument is not initialized') - # logger.debug('getobj: objid=%r', objid) - if objid in self._cached_objs: - genno = 0 - obj = self._cached_objs[objid] - else: - strmid, index = self.find_obj_ref(objid) - if index is None: - handle_error(PDFSyntaxError, 'Cannot locate objid=%r' % objid) - # return null for a nonexistent reference. - return None - if strmid: - stream = self.getobj(strmid) - if stream is None: - return None - stream = stream_value(stream) - if stream.get('Type') is not LITERAL_OBJSTM: - handle_error(PDFSyntaxError, 'Not a stream object: %r' % stream) - try: - n = stream['N'] - except KeyError: - handle_error(PDFSyntaxError, 'N is not defined: %r' % stream) - n = 0 - if strmid in self._parsed_objs: - objs = self._parsed_objs[strmid] - else: - parser = PDFStreamParser(stream.get_data()) - parser.set_document(self) - objs = [] - try: - while True: - _, obj = parser.nextobject() - objs.append(obj) - except PSEOF: - pass - if self.caching: - self._parsed_objs[strmid] = objs - genno = 0 - i = n*2+index - try: - obj = objs[i] - except IndexError: - raise PDFSyntaxError('Invalid object number: objid=%r' % (objid)) - if isinstance(obj, PDFStream): - obj.set_objid(objid, 0) - else: - try: - self._parser.setpos(index) - except PSEOF: - handle_error(PSEOF, 'Parser index out of bounds') - return None - (_,objid1) = self._parser.nexttoken() # objid - (_,genno) = self._parser.nexttoken() # genno - (_,kwd) = self._parser.nexttoken() - # #### hack around malformed pdf files - #assert objid1 == objid, (objid, objid1) - if objid1 != objid: - x = [] - while kwd is not self.KEYWORD_OBJ: - (_,kwd) = self._parser.nexttoken() - x.append(kwd) - if x: - objid1 = x[-2] - genno = x[-1] - # #### end hack around malformed pdf files - if kwd is not self.KEYWORD_OBJ: - raise PDFSyntaxError('Invalid object spec: offset=%r' % index) - try: - (_,obj) = self._parser.nextobject() - if isinstance(obj, PDFStream): - obj.set_objid(objid, genno) - except PSEOF: - return None - # logger.debug('register: objid=%r: %r', objid, obj) - if self.caching: - self._cached_objs[objid] = obj - if self.decipher: - obj = decipher_all(self.decipher, objid, genno, obj) - return obj - - def set_parser(self, parser): - "Set the document to use a given PDFParser object." - if self._parser: - return - self._parser = parser - # Retrieve the information of each header that was appended - # (maybe multiple times) at the end of the document. - self.xrefs = parser.read_xref() - for xref in self.xrefs: - trailer = xref.get_trailer() - if not trailer: continue - # If there's an encryption info, remember it. - if 'Encrypt' in trailer: - #assert not self.encryption - self.encryption = (list_value(trailer['ID']), - dict_value(trailer['Encrypt'])) - if 'Info' in trailer: - self.info.append(dict_value(trailer['Info'])) - if 'Root' in trailer: - # Every PDF file must have exactly one /Root dictionary. - self.catalog = dict_value(trailer['Root']) - break - else: - raise PDFSyntaxError('No /Root object! - Is this really a PDF?') - if self.catalog.get('Type') is not LITERAL_CATALOG: - handle_error(PDFSyntaxError, 'Catalog not found!') - - # initialize(password='') - # Perform the initialization with a given password. - # This step is mandatory even if there's no password associated - # with the document. - PASSWORD_PADDING = b'(\xbfN^Nu\x8aAd\x00NV\xff\xfa\x01\x08..\x00\xb6\xd0h>\x80/\x0c\xa9\xfedSiz' - def initialize(self, password=''): - if not self.encryption: - self.is_printable = self.is_modifiable = self.is_extractable = True - return - (docid, param) = self.encryption - if literal_name(param.get('Filter')) != 'Standard': - raise PDFEncryptionError('Unknown filter: param=%r' % param) - V = int_value(param.get('V', 0)) - if not (V == 1 or V == 2): - raise PDFEncryptionError('Unknown algorithm: param=%r' % param) - length = int_value(param.get('Length', 40)) # Key length (bits) - O = str_value(param['O']) - R = int_value(param['R']) # Revision - if 5 <= R: - raise PDFEncryptionError('Unknown revision: %r' % R) - U = str_value(param['U']) - P = int_value(param['P']) - self.is_printable = bool(P & 4) - self.is_modifiable = bool(P & 8) - self.is_extractable = bool(P & 16) - # Algorithm 3.2 - # XXX is latin-1 the correct encoding??? - password = password.encode('latin-1') - password = (password+self.PASSWORD_PADDING)[:32] # 1 - hash = md5.md5(password) # 2 - hash.update(O) # 3 - hash.update(struct.pack('' % (self.objid) - def resolve(self): - return self.doc.getobj(self.objid) + def resolve(self, default=None): + try: + return self.doc.getobj(self.objid) + except PDFObjectNotFound: + return default # resolve -def resolve1(x): +def resolve1(x, default=None): """Resolves an object. If this is an array or dictionary, it may still contains some indirect objects inside. """ while isinstance(x, PDFObjRef): - x = x.resolve() + x = x.resolve(default=default) return x -def resolve_all(x): + +def resolve_all(x, default=None): """Recursively resolves the given object and all the internals. - + Make sure there is no indirect reference within the nested object. This procedure might be slow. """ while isinstance(x, PDFObjRef): - x = x.resolve() + x = x.resolve(default=default) if isinstance(x, list): - x = [ resolve_all(v) for v in x ] + x = [resolve_all(v, default=default) for v in x] elif isinstance(x, dict): - for (k,v) in x.items(): - x[k] = resolve_all(v) + for (k, v) in x.items(): + x[k] = resolve_all(v, default=default) return x + def decipher_all(decipher, objid, genno, x): """Recursively deciphers the given object. """ - if isinstance(x, str): - x = x.encode('latin-1') if isinstance(x, bytes): return decipher(objid, genno, x) if isinstance(x, list): - x = [ decipher_all(decipher, objid, genno, v) for v in x ] + x = [decipher_all(decipher, objid, genno, v) for v in x] elif isinstance(x, dict): - for (k,v) in x.items(): + for (k, v) in x.items(): x[k] = decipher_all(decipher, objid, genno, v) return x -# Type cheking -def typecheck_value(x, type, strict=STRICT): + +# Type checking +def int_value(x): x = resolve1(x) - if not isinstance(x, type): - handle_error(PDFTypeError, 'Wrong type: %r required: %r' % (x, type), strict=strict) - default_type = type[0] if isinstance(type, tuple) else type - return default_type() + if not isinstance(x, int): + if STRICT: + raise PDFTypeError('Integer required: %r' % x) + return 0 + return x + + +def float_value(x): + x = resolve1(x) + if not isinstance(x, float): + if STRICT: + raise PDFTypeError('Float required: %r' % x) + return 0.0 + return x + + +def num_value(x): + x = resolve1(x) + if not isnumber(x): + if STRICT: + raise PDFTypeError('Int or Float required: %r' % x) + return 0 + return x + + +def bytes_value(x): + x = resolve1(x) + if not isinstance(x, bytes): + if STRICT: + raise PDFTypeError('Bytes required: %r' % x) + return b'' + return x + + +def list_value(x): + x = resolve1(x) + if not isinstance(x, (list, tuple)): + if STRICT: + raise PDFTypeError('List required: %r' % x) + return [] + return x + + +def dict_value(x): + x = resolve1(x) + if not isinstance(x, dict): + if STRICT: + raise PDFTypeError('Dict required: %r' % x) + return {} return x -int_value = partial(typecheck_value, type=int) -float_value = partial(typecheck_value, type=float) -num_value = partial(typecheck_value, type=(int, float)) -str_value = partial(typecheck_value, type=(str, bytes)) -list_value = partial(typecheck_value, type=(list, tuple)) -dict_value = partial(typecheck_value, type=dict) def stream_value(x): x = resolve1(x) if not isinstance(x, PDFStream): - handle_error(PDFTypeError, 'PDFStream required: %r' % x) - return PDFStream({}, b'') + if STRICT: + raise PDFTypeError('PDFStream required: %r' % x) + return PDFStream({}, '') return x +## PDFStream type +## class PDFStream(PDFObject): def __init__(self, attrs, rawdata, decipher=None): @@ -121,10 +186,12 @@ class PDFStream(PDFObject): self.data = None self.objid = None self.genno = None + return def set_objid(self, objid, genno): self.objid = objid self.genno = genno + return def __repr__(self): if self.data is None: @@ -136,13 +203,13 @@ class PDFStream(PDFObject): def __contains__(self, name): return name in self.attrs - + def __getitem__(self, name): return self.attrs[name] - + def get(self, name, default=None): return self.attrs.get(name, default) - + def get_any(self, names, default=None): for name in names: if name in self.attrs: @@ -151,33 +218,37 @@ class PDFStream(PDFObject): def get_filters(self): filters = self.get_any(('F', 'Filter')) - if not filters: return [] - if isinstance(filters, list): return filters - return [ filters ] + params = self.get_any(('DP', 'DecodeParms', 'FDecodeParms'), {}) + if not filters: + return [] + if not isinstance(filters, list): + filters = [filters] + if not isinstance(params, list): + # Make sure the parameters list is the same as filters. + params = [params]*len(filters) + if STRICT and len(params) != len(filters): + raise PDFException("Parameters len filter mismatch") + return zip(filters, params) def decode(self): - assert self.data is None and self.rawdata != None + assert self.data is None and self.rawdata is not None data = self.rawdata if self.decipher: # Handle encryption - data = self.decipher(self.objid, self.genno, data) + data = self.decipher(self.objid, self.genno, data, self.attrs) filters = self.get_filters() if not filters: self.data = data self.rawdata = None return - for f in filters: - # Yeah, we can have references to an object containing a literal. - f = resolve1(f) - if f is None: - # Oops, broken reference. use FlateDecode since it's the most popular. - f = LIT('FlateDecode') + for (f,params) in filters: if f in LITERALS_FLATE_DECODE: # will get errors if the document is encrypted. try: data = zlib.decompress(data) except zlib.error as e: - handle_error(PDFException, 'Invalid zlib bytes: %r, %r' % (e, data)) + if STRICT: + raise PDFException('Invalid zlib bytes: %r, %r' % (e, data)) data = b'' elif f in LITERALS_LZW_DECODE: data = lzwdecode(data) @@ -187,20 +258,18 @@ class PDFStream(PDFObject): data = asciihexdecode(data) elif f in LITERALS_RUNLENGTH_DECODE: data = rldecode(data) - elif f in LITERALS_DCT_DECODE: - # /DCTDecode is essentially a jpeg image. There's nothing to "decode" per se, simply - # use the data as jpeg data. - pass elif f in LITERALS_CCITTFAX_DECODE: - #data = ccittfaxdecode(data) - raise PDFNotImplementedError('Unsupported filter: %r' % f) + data = ccittfaxdecode(data, params) + elif f in LITERALS_DCT_DECODE: + # This is probably a JPG stream - it does not need to be decoded twice. + # Just return the stream to the user. + pass elif f == LITERAL_CRYPT: # not yet.. raise PDFNotImplementedError('/Crypt filter is unsupported') else: raise PDFNotImplementedError('Unsupported filter: %r' % f) # apply predictors - params = self.get_any(('DP', 'DecodeParms', 'FDecodeParms'), {}) if 'Predictor' in params: pred = int_value(params['Predictor']) if pred == 1: @@ -211,14 +280,12 @@ class PDFStream(PDFObject): colors = int_value(params.get('Colors', 1)) columns = int_value(params.get('Columns', 1)) bitspercomponent = int_value(params.get('BitsPerComponent', 8)) - try: - data = apply_png_predictor(pred, colors, columns, bitspercomponent, data) - except ValueError: # predictor not supported - data = b'' + data = apply_png_predictor(pred, colors, columns, bitspercomponent, data) else: raise PDFNotImplementedError('Unsupported predictor: %r' % pred) self.data = data self.rawdata = None + return def get_data(self): if self.data is None: diff --git a/venv/Lib/site-packages/pdfminer/psparser.py b/venv/Lib/site-packages/pdfminer/psparser.py index 179fb18..ba0aa73 100644 --- a/venv/Lib/site-packages/pdfminer/psparser.py +++ b/venv/Lib/site-packages/pdfminer/psparser.py @@ -1,38 +1,51 @@ +#!/usr/bin/env python import re import logging - from .utils import choplist -from . import pslexer -STRICT = False +STRICT = 0 ## PS Exceptions ## -class PSException(Exception): pass -class PSEOF(PSException): pass -class PSSyntaxError(PSException): pass -class PSTypeError(PSException): pass -class PSValueError(PSException): pass +class PSException(Exception): + pass + + +class PSEOF(PSException): + pass + + +class PSSyntaxError(PSException): + pass + + +class PSTypeError(PSException): + pass + + +class PSValueError(PSException): + pass -def handle_error(exctype, msg, strict=STRICT): - if strict: - raise exctype(msg) - else: - logging.warning(msg) ## Basic PostScript Types ## +## PSObject +## class PSObject: """Base class for all PS or PDF-related data types.""" + pass + +## PSLiteral +## class PSLiteral(PSObject): """A class that represents a PostScript literal. - + Postscript literals are used as identifiers, such as variable names, property names and dictionary keys. Literals are case sensitive and denoted by a preceding @@ -44,40 +57,47 @@ class PSLiteral(PSObject): def __init__(self, name): self.name = name + return def __repr__(self): - return '/%s' % self.name + return '/%r' % self.name +## PSKeyword +## class PSKeyword(PSObject): """A class that represents a PostScript keyword. - + PostScript keywords are a dozen of predefined words. Commands and directives in PostScript are expressed by keywords. They are also used to denote the content boundaries. - + Note: Do not create an instance of PSKeyword directly. Always use PSKeywordTable.intern(). """ def __init__(self, name): self.name = name + return def __repr__(self): - return self.name + return self.name.decode('ascii') +## PSSymbolTable +## class PSSymbolTable: """A utility class for storing PSLiteral/PSKeyword objects. Interned objects can be checked its identity with "is" operator. """ - + def __init__(self, klass): self.dict = {} self.klass = klass + return def intern(self, name): if name in self.dict: @@ -91,145 +111,461 @@ PSLiteralTable = PSSymbolTable(PSLiteral) PSKeywordTable = PSSymbolTable(PSKeyword) LIT = PSLiteralTable.intern KWD = PSKeywordTable.intern -KEYWORD_PROC_BEGIN = KWD('{') -KEYWORD_PROC_END = KWD('}') -KEYWORD_ARRAY_BEGIN = KWD('[') -KEYWORD_ARRAY_END = KWD(']') -KEYWORD_DICT_BEGIN = KWD('<<') -KEYWORD_DICT_END = KWD('>>') +KEYWORD_PROC_BEGIN = KWD(b'{') +KEYWORD_PROC_END = KWD(b'}') +KEYWORD_ARRAY_BEGIN = KWD(b'[') +KEYWORD_ARRAY_END = KWD(b']') +KEYWORD_DICT_BEGIN = KWD(b'<<') +KEYWORD_DICT_END = KWD(b'>>') def literal_name(x): if not isinstance(x, PSLiteral): - handle_error(PSTypeError, 'Literal required: %r' % x) - return str(x) + if STRICT: + raise PSTypeError('Literal required: %r' % (x,)) + else: + return str(x) return x.name + def keyword_name(x): if not isinstance(x, PSKeyword): - handle_error(PSTypeError, 'Keyword required: %r' % x) - return str(x) + if STRICT: + raise PSTypeError('Keyword required: %r' % (x,)) + else: + return str(x) return x.name -## About PSParser, bytes and strings and all that -## -## Most of the contents (well, maybe not in size, but in "parsing effort") of a PDF file is text, -## but in some cases, namely streams, there's binary data involved. What we do is that we read the -## data as latin-1. When binary data is encountered, we have to re-encode it as latin-1 as well. +## PSBaseParser +## +EOL = re.compile(br'[\r\n]') +SPC = re.compile(br'\s') +NONSPC = re.compile(br'\S') +HEX = re.compile(br'[0-9a-fA-F]') +END_LITERAL = re.compile(br'[#/%\[\]()<>{}\s]') +END_HEX_STRING = re.compile(br'[^\s0-9a-fA-F]') +HEX_PAIR = re.compile(br'[0-9a-fA-F]{2}|.') +END_NUMBER = re.compile(br'[^0-9]') +END_KEYWORD = re.compile(br'[#/%\[\]()<>{}\s]') +END_STRING = re.compile(br'[()\134]') +OCT_STRING = re.compile(br'[0-7]') +ESC_STRING = { + b'b': b'\x08', b't': b'\x09', b'n': b'\x0a', b'f': b'\x0c', + b'r': b'\x0d', b'(': b'(', b')': b')', b'\\': b'\\' +} -## About reading all data at once -## There used to be a buffering mechanism in place, but it made everything rather complicated and -## all this string buffering operations, especially with the ply lexer, ended up being rather slow. -## We read the whole thing in memory now. Sure, some PDFs are rather large, but computers today -## have lots of memory. At first, I wanted to use a mmap, but these are binary and making them work -## with the ply lexer was very complicated. Maybe one day. -EOL = re.compile(r'\r\n|\r|\n', re.MULTILINE) class PSBaseParser: """Most basic PostScript parser that performs only tokenization. """ - def __init__(self, fp): - data = fp.read() - if isinstance(data, bytes): - data = data.decode('latin-1') - self.data = data - self.lex = pslexer.lexer.clone() - self.lex.input(data) + BUFSIZ = 4096 + + debug = 0 + + def __init__(self, fp): + self.fp = fp + self.seek(0) + return + + def __repr__(self): + return '<%s: %r, bufpos=%d>' % (self.__class__.__name__, self.fp, self.bufpos) - def _convert_token(self, token): - # converts `token` which comes from pslexer to a normal token. - if token.type in {'KEYWORD', 'OPERATOR'}: - if token.value == 'true': - return True - elif token.value == 'false': - return False - else: - return KWD(token.value) - elif token.type == 'LITERAL': - return LIT(token.value) - else: - return token.value - def flush(self): - pass + return def close(self): self.flush() - del self.lex - del self.data - - def setpos(self, newpos): - if newpos >= self.lex.lexlen: - raise PSEOF() - self.lex.lexpos = newpos - - def nextline(self): - m = EOL.search(self.data, pos=self.lex.lexpos) - if m is None: - raise PSEOF() - start = self.lex.lexpos - s = self.data[start:m.end()] - self.lex.lexpos = m.end() - return (start, s) - - def nexttoken(self): - token = self.lex.token() - if token is None: - raise PSEOF() - tokenpos = token.lexpos - return (tokenpos, self._convert_token(token)) - + return + def tell(self): + return self.bufpos+self.charpos + + def poll(self, pos=None, n=80): + pos0 = self.fp.tell() + if not pos: + pos = self.bufpos+self.charpos + self.fp.seek(pos) + logging.info('poll(%d): %r' % (pos, self.fp.read(n))) + self.fp.seek(pos0) + return + + def seek(self, pos): + """Seeks the parser to the given position. + """ + if self.debug: + logging.debug('seek: %r' % pos) + self.fp.seek(pos) + # reset the status for nextline() + self.bufpos = pos + self.buf = b'' + self.charpos = 0 + # reset the status for nexttoken() + self._parse1 = self._parse_main + self._curtoken = b'' + self._curtokenpos = 0 + self._tokens = [] + return + + def fillbuf(self): + if self.charpos < len(self.buf): + return + # fetch next chunk. + self.bufpos = self.fp.tell() + self.buf = self.fp.read(self.BUFSIZ) + if not self.buf: + raise PSEOF('Unexpected EOF') + self.charpos = 0 + return + + def nextline(self): + """Fetches a next line that ends either with \\r or \\n. + """ + linebuf = b'' + linepos = self.bufpos + self.charpos + eol = False + while 1: + self.fillbuf() + if eol: + c = self.buf[self.charpos:self.charpos+1] + # handle b'\r\n' + if c == b'\n': + linebuf += c + self.charpos += 1 + break + m = EOL.search(self.buf, self.charpos) + if m: + linebuf += self.buf[self.charpos:m.end(0)] + self.charpos = m.end(0) + if linebuf[-1:] == b'\r': + eol = True + else: + break + else: + linebuf += self.buf[self.charpos:] + self.charpos = len(self.buf) + if self.debug: + logging.debug('nextline: %r, %r' % (linepos, linebuf)) + return (linepos, linebuf) + + def revreadlines(self): + """Fetches a next line backward. + + This is used to locate the trailers at the end of a file. + """ + self.fp.seek(0, 2) + pos = self.fp.tell() + buf = b'' + while 0 < pos: + prevpos = pos + pos = max(0, pos-self.BUFSIZ) + self.fp.seek(pos) + s = self.fp.read(prevpos-pos) + if not s: + break + while 1: + n = max(s.rfind(b'\r'), s.rfind(b'\n')) + if n == -1: + buf = s + buf + break + yield s[n:]+buf + s = s[:n] + buf = b'' + return + + def _parse_main(self, s, i): + m = NONSPC.search(s, i) + if not m: + return len(s) + j = m.start(0) + c = s[j:j+1] + self._curtokenpos = self.bufpos+j + if c == b'%': + self._curtoken = b'%' + self._parse1 = self._parse_comment + return j+1 + elif c == b'/': + self._curtoken = b'' + self._parse1 = self._parse_literal + return j+1 + elif c in b'-+' or c.isdigit(): + self._curtoken = c + self._parse1 = self._parse_number + return j+1 + elif c == b'.': + self._curtoken = c + self._parse1 = self._parse_float + return j+1 + elif c.isalpha(): + self._curtoken = c + self._parse1 = self._parse_keyword + return j+1 + elif c == b'(': + self._curtoken = b'' + self.paren = 1 + self._parse1 = self._parse_string + return j+1 + elif c == b'<': + self._curtoken = b'' + self._parse1 = self._parse_wopen + return j+1 + elif c == b'>': + self._curtoken = b'' + self._parse1 = self._parse_wclose + return j+1 + else: + self._add_token(KWD(c)) + return j+1 + + def _add_token(self, obj): + self._tokens.append((self._curtokenpos, obj)) + return + + def _parse_comment(self, s, i): + m = EOL.search(s, i) + if not m: + self._curtoken += s[i:] + return (self._parse_comment, len(s)) + j = m.start(0) + self._curtoken += s[i:j] + self._parse1 = self._parse_main + # We ignore comments. + #self._tokens.append(self._curtoken) + return j + + def _parse_literal(self, s, i): + m = END_LITERAL.search(s, i) + if not m: + self._curtoken += s[i:] + return len(s) + j = m.start(0) + self._curtoken += s[i:j] + c = s[j:j+1] + if c == b'#': + self.hex = b'' + self._parse1 = self._parse_literal_hex + return j+1 + + try: + # Try to interpret the token as a utf-8 string + utoken = self._curtoken.decode('utf-8') + except UnicodeDecodeError: + # We failed, there is possibly a corrupt PDF here. + if STRICT: raise + utoken = "" + self._add_token(LIT(utoken)) + self._parse1 = self._parse_main + return j + + def _parse_literal_hex(self, s, i): + c = s[i:i+1] + if HEX.match(c) and len(self.hex) < 2: + self.hex += c + return i+1 + if self.hex: + try: + self._curtoken += bytes([int(self.hex, 16)]) + except ValueError: + pass + self._parse1 = self._parse_literal + return i + + def _parse_number(self, s, i): + m = END_NUMBER.search(s, i) + if not m: + self._curtoken += s[i:] + return len(s) + j = m.start(0) + self._curtoken += s[i:j] + c = s[j:j+1] + if c == b'.': + self._curtoken += c + self._parse1 = self._parse_float + return j+1 + try: + self._add_token(int(self._curtoken)) + except ValueError: + pass + self._parse1 = self._parse_main + return j + + def _parse_float(self, s, i): + m = END_NUMBER.search(s, i) + if not m: + self._curtoken += s[i:] + return len(s) + j = m.start(0) + self._curtoken += s[i:j] + try: + self._add_token(float(self._curtoken)) + except ValueError: + pass + self._parse1 = self._parse_main + return j + + def _parse_keyword(self, s, i): + m = END_KEYWORD.search(s, i) + if not m: + self._curtoken += s[i:] + return len(s) + j = m.start(0) + self._curtoken += s[i:j] + if self._curtoken == b'true': + token = True + elif self._curtoken == b'false': + token = False + else: + token = KWD(self._curtoken) + self._add_token(token) + self._parse1 = self._parse_main + return j + + def _parse_string(self, s, i): + m = END_STRING.search(s, i) + if not m: + self._curtoken += s[i:] + return len(s) + j = m.start(0) + self._curtoken += s[i:j] + c = s[j:j+1] + if c == b'\\': + self.oct = b'' + self._parse1 = self._parse_string_1 + return j+1 + if c == b'(': + self.paren += 1 + self._curtoken += c + return j+1 + if c == b')': + self.paren -= 1 + if self.paren: # WTF, they said balanced parens need no special treatment. + self._curtoken += c + return j+1 + self._add_token(self._curtoken) + self._parse1 = self._parse_main + return j+1 + + def _parse_string_1(self, s, i): + c = s[i:i+1] + if OCT_STRING.match(c) and len(self.oct) < 3: + self.oct += c + return i+1 + if self.oct: + try: + self._curtoken += bytes([int(self.oct, 8)]) + except ValueError: + pass + self._parse1 = self._parse_string + return i + if c in ESC_STRING: + self._curtoken += ESC_STRING[c] + self._parse1 = self._parse_string + return i+1 + + def _parse_wopen(self, s, i): + c = s[i:i+1] + if c == b'<': + self._add_token(KEYWORD_DICT_BEGIN) + self._parse1 = self._parse_main + i += 1 + else: + self._parse1 = self._parse_hexstring + return i + + def _parse_wclose(self, s, i): + c = s[i:i+1] + if c == b'>': + self._add_token(KEYWORD_DICT_END) + i += 1 + self._parse1 = self._parse_main + return i + + def _parse_hexstring(self, s, i): + m = END_HEX_STRING.search(s, i) + if not m: + self._curtoken += s[i:] + return len(s) + j = m.start(0) + self._curtoken += s[i:j] + try: + token = HEX_PAIR.sub(lambda m: bytes([int(m.group(0), 16)]), + SPC.sub(b'', self._curtoken)) + self._add_token(token) + except ValueError: + pass + self._parse1 = self._parse_main + return j + + def nexttoken(self): + while not self._tokens: + self.fillbuf() + self.charpos = self._parse1(self.buf, self.charpos) + token = self._tokens.pop(0) + if self.debug: + logging.debug('nexttoken: %r' % (token,)) + return token + + +## PSStackParser +## class PSStackParser(PSBaseParser): def __init__(self, fp): PSBaseParser.__init__(self, fp) self.reset() + return def reset(self): self.context = [] self.curtype = None self.curstack = [] self.results = [] + return - def setpos(self, newpos): - PSBaseParser.setpos(self, newpos) + def seek(self, pos): + PSBaseParser.seek(self, pos) self.reset() + return def push(self, *objs): self.curstack.extend(objs) - + return + def pop(self, n): objs = self.curstack[-n:] self.curstack[-n:] = [] return objs - + def popall(self): objs = self.curstack self.curstack = [] return objs - + def add_results(self, *objs): - # logging.debug('add_results: %r', objs) + if self.debug: + logging.debug('add_results: %r' % (objs,)) self.results.extend(objs) + return def start_type(self, pos, type): self.context.append((pos, self.curtype, self.curstack)) (self.curtype, self.curstack) = (type, []) - # logging.debug('start_type: pos=%r, type=%r', pos, type) - + if self.debug: + logging.debug('start_type: pos=%r, type=%r' % (pos, type)) + return + def end_type(self, type): if self.curtype != type: raise PSTypeError('Type mismatch: %r != %r' % (self.curtype, type)) - objs = [ obj for (_,obj) in self.curstack ] + objs = [obj for (_, obj) in self.curstack] (pos, self.curtype, self.curstack) = self.context.pop() - # logging.debug('end_type: pos=%r, type=%r, objs=%r', pos, type, objs) + if self.debug: + logging.debug('end_type: pos=%r, type=%r, objs=%r' % (pos, type, objs)) return (pos, objs) def do_keyword(self, pos, token): - pass + return def nextobject(self): """Yields a list of objects. @@ -239,8 +575,8 @@ class PSStackParser(PSBaseParser): """ while not self.results: (pos, token) = self.nexttoken() - #print (pos,token), (self.curtype, self.curstack) - if isinstance(token, (int, float, bool, str, bytes, PSLiteral)): + #print((pos,token), (self.curtype, self.curstack)) + if isinstance(token, (int, float, bool, bytes, PSLiteral)): # normal token self.push((pos, token)) elif token == KEYWORD_ARRAY_BEGIN: @@ -250,8 +586,9 @@ class PSStackParser(PSBaseParser): # end array try: self.push(self.end_type('a')) - except PSTypeError as e: - handle_error(type(e), str(e)) + except PSTypeError: + if STRICT: + raise elif token == KEYWORD_DICT_BEGIN: # begin dictionary self.start_type(pos, 'd') @@ -260,12 +597,13 @@ class PSStackParser(PSBaseParser): try: (pos, objs) = self.end_type('d') if len(objs) % 2 != 0: - handle_error(PSSyntaxError, 'Invalid dictionary construct: %r' % objs) + raise PSSyntaxError('Invalid dictionary construct: %r' % (objs,)) # construct a Python dictionary. - d = dict( (literal_name(k), v) for (k,v) in choplist(2, objs) if v is not None ) + d = dict((literal_name(k), v) for (k, v) in choplist(2, objs) if v is not None) self.push((pos, d)) - except PSTypeError as e: - handle_error(type(e), str(e)) + except PSTypeError: + if STRICT: + raise elif token == KEYWORD_PROC_BEGIN: # begin proc self.start_type(pos, 'p') @@ -273,15 +611,118 @@ class PSStackParser(PSBaseParser): # end proc try: self.push(self.end_type('p')) - except PSTypeError as e: - handle_error(type(e), str(e)) + except PSTypeError: + if STRICT: + raise else: - logging.debug('do_keyword: pos=%r, token=%r, stack=%r', pos, token, self.curstack) + if self.debug: + logging.debug('do_keyword: pos=%r, token=%r, stack=%r' % \ + (pos, token, self.curstack)) self.do_keyword(pos, token) if self.context: continue else: self.flush() obj = self.results.pop(0) - logging.debug('nextobject: %r', obj) + if self.debug: + logging.debug('nextobject: %r' % (obj,)) return obj + + +import unittest + + +## Simplistic Test cases +## +class TestPSBaseParser(unittest.TestCase): + + TESTDATA = br'''%!PS +begin end + " @ # +/a/BCD /Some_Name /foo#5f#xbaa +0 +1 -2 .5 1.234 +(abc) () (abc ( def ) ghi) +(def\040\0\0404ghi) (bach\\slask) (foo\nbaa) +(this % is not a comment.) +(foo +baa) +(foo\ +baa) +<> <20> < 40 4020 > + +func/a/b{(c)do*}def +[ 1 (z) ! ] +<< /foo (bar) >> +''' + + TOKENS = [ + (5, KWD(b'begin')), (11, KWD(b'end')), (16, KWD(b'"')), (19, KWD(b'@')), + (21, KWD(b'#')), (23, LIT('a')), (25, LIT('BCD')), (30, LIT('Some_Name')), + (41, LIT('foo_xbaa')), (54, 0), (56, 1), (59, -2), (62, 0.5), + (65, 1.234), (71, b'abc'), (77, b''), (80, b'abc ( def ) ghi'), + (98, b'def \x00 4ghi'), (118, b'bach\\slask'), (132, b'foo\nbaa'), + (143, b'this % is not a comment.'), (170, b'foo\nbaa'), (180, b'foobaa'), + (191, b''), (194, b' '), (199, b'@@ '), (211, b'\xab\xcd\x00\x124\x05'), + (226, KWD(b'func')), (230, LIT('a')), (232, LIT('b')), + (234, KWD(b'{')), (235, b'c'), (238, KWD(b'do*')), (241, KWD(b'}')), + (242, KWD(b'def')), (246, KWD(b'[')), (248, 1), (250, b'z'), (254, KWD(b'!')), + (256, KWD(b']')), (258, KWD(b'<<')), (261, LIT('foo')), (266, b'bar'), + (272, KWD(b'>>')) + ] + + OBJS = [ + (23, LIT('a')), (25, LIT('BCD')), (30, LIT('Some_Name')), + (41, LIT('foo_xbaa')), (54, 0), (56, 1), (59, -2), (62, 0.5), + (65, 1.234), (71, b'abc'), (77, b''), (80, b'abc ( def ) ghi'), + (98, b'def \x00 4ghi'), (118, b'bach\\slask'), (132, b'foo\nbaa'), + (143, b'this % is not a comment.'), (170, b'foo\nbaa'), (180, b'foobaa'), + (191, b''), (194, b' '), (199, b'@@ '), (211, b'\xab\xcd\x00\x124\x05'), + (230, LIT('a')), (232, LIT('b')), (234, [b'c']), (246, [1, b'z']), + (258, {'foo': b'bar'}), + ] + + def get_tokens(self, s): + from io import BytesIO + + class MyParser(PSBaseParser): + def flush(self): + self.add_results(*self.popall()) + parser = MyParser(BytesIO(s)) + r = [] + try: + while 1: + r.append(parser.nexttoken()) + except PSEOF: + pass + return r + + def get_objects(self, s): + from io import BytesIO + + class MyParser(PSStackParser): + def flush(self): + self.add_results(*self.popall()) + parser = MyParser(BytesIO(s)) + r = [] + try: + while 1: + r.append(parser.nextobject()) + except PSEOF: + pass + return r + + def test_1(self): + tokens = self.get_tokens(self.TESTDATA) + print(tokens) + self.assertEqual(tokens, self.TOKENS) + return + + def test_2(self): + objs = self.get_objects(self.TESTDATA) + print(objs) + self.assertEqual(objs, self.OBJS) + return + +if __name__ == '__main__': + unittest.main() diff --git a/venv/Lib/site-packages/pdfminer/rijndael.py b/venv/Lib/site-packages/pdfminer/rijndael.py index f846cc0..28854c4 100644 --- a/venv/Lib/site-packages/pdfminer/rijndael.py +++ b/venv/Lib/site-packages/pdfminer/rijndael.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python + """ Python implementation of Rijndael encryption algorithm. This code is in the public domain. @@ -8,689 +10,696 @@ by Philip J. Erdelsky: """ -import sys import struct -def KEYLENGTH(keybits): return (keybits)//8 -def RKLENGTH(keybits): return (keybits)//8+28 -def NROUNDS(keybits): return (keybits)//32+6 + +def KEYLENGTH(keybits): + return (keybits)//8 + + +def RKLENGTH(keybits): + return (keybits)//8+28 + + +def NROUNDS(keybits): + return (keybits)//32+6 Te0 = [ - 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, - 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, - 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, - 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, - 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, - 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, - 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, - 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, - 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, - 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, - 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, - 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, - 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, - 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, - 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, - 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, - 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, - 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, - 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, - 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, - 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, - 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, - 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, - 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, - 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, - 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, - 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, - 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, - 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, - 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, - 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, - 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, - 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, - 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, - 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, - 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, - 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, - 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, - 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, - 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, - 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, - 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, - 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, - 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, - 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, - 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, - 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, - 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, - 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, - 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, - 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, - 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, - 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, - 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, - 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, - 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, - 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, - 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, - 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, - 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, - 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, - 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, - 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, - 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, - ] + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +] Te1 = [ - 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, - 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, - 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, - 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, - 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, - 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, - 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, - 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, - 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, - 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, - 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, - 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, - 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, - 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, - 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, - 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, - 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, - 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, - 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, - 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, - 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, - 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, - 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, - 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, - 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, - 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, - 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, - 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, - 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, - 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, - 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, - 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, - 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, - 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, - 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, - 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, - 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, - 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, - 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, - 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, - 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, - 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, - 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, - 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, - 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, - 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, - 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, - 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, - 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, - 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, - 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, - 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, - 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, - 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, - 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, - 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, - 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, - 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, - 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, - 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, - 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, - 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, - 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, - 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, - ] + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +] Te2 = [ - 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, - 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, - 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, - 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, - 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, - 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, - 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, - 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, - 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, - 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, - 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, - 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, - 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, - 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, - 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, - 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, - 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, - 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, - 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, - 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, - 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, - 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, - 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, - 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, - 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, - 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, - 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, - 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, - 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, - 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, - 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, - 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, - 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, - 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, - 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, - 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, - 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, - 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, - 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, - 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, - 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, - 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, - 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, - 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, - 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, - 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, - 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, - 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, - 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, - 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, - 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, - 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, - 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, - 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, - 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, - 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, - 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, - 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, - 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, - 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, - 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, - 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, - 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, - 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, - ] + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +] Te3 = [ - 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, - 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, - 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, - 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, - 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, - 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, - 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, - 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, - 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, - 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, - 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, - 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, - 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, - 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, - 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, - 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, - 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, - 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, - 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, - 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, - 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, - 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, - 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, - 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, - 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, - 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, - 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, - 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, - 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, - 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, - 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, - 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, - 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, - 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, - 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, - 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, - 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, - 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, - 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, - 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, - 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, - 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, - 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, - 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, - 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, - 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, - 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, - 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, - 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, - 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, - 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, - 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, - 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, - 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, - 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, - 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, - 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, - 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, - 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, - 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, - 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, - 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, - 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, - 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, - ] + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +] Te4 = [ - 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, - 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, - 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, - 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, - 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, - 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, - 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, - 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, - 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, - 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, - 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, - 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, - 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, - 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, - 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, - 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, - 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, - 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, - 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, - 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, - 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, - 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, - 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, - 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, - 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, - 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, - 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, - 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, - 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, - 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, - 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, - 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, - 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, - 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, - 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, - 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, - 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, - 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, - 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, - 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, - 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, - 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, - 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, - 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, - 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, - 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, - 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, - 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, - 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, - 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, - 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, - 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, - 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, - 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, - 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, - 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, - 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, - 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, - 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, - 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, - 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, - 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, - 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, - 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, - ] + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +] Td0 = [ - 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, - 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, - 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, - 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, - 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, - 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, - 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, - 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, - 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, - 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, - 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, - 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, - 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, - 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, - 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, - 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, - 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, - 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, - 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, - 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, - 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, - 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, - 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, - 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, - 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, - 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, - 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, - 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, - 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, - 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, - 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, - 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, - 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, - 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, - 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, - 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, - 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, - 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, - 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, - 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, - 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, - 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, - 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, - 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, - 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, - 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, - 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, - 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, - 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, - 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, - 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, - 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, - 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, - 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, - 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, - 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, - 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, - 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, - 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, - 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, - 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, - 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, - 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, - 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, - ] + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +] Td1 = [ - 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, - 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, - 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, - 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, - 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, - 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, - 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, - 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, - 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, - 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, - 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, - 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, - 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, - 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, - 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, - 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, - 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, - 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, - 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, - 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, - 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, - 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, - 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, - 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, - 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, - 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, - 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, - 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, - 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, - 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, - 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, - 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, - 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, - 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, - 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, - 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, - 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, - 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, - 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, - 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, - 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, - 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, - 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, - 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, - 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, - 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, - 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, - 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, - 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, - 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, - 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, - 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, - 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, - 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, - 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, - 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, - 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, - 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, - 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, - 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, - 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, - 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, - 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, - 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, - ] + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +] Td2 = [ - 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, - 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, - 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, - 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, - 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, - 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, - 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, - 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, - 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, - 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, - 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, - 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, - 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, - 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, - 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, - 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, - 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, - 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, - 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, - 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, - 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, - 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, - 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, - 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, - 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, - 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, - 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, - 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, - 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, - 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, - 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, - 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, - 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, - 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, - 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, - 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, - 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, - 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, - 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, - 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, - 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, - 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, - 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, - 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, - 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, - 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, - 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, - 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, - 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, - 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, - 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, - 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, - 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, - 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, - 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, - 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, - 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, - 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, - 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, - 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, - 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, - 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, - 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, - 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, - ] + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +] Td3 = [ - 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, - 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, - 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, - 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, - 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, - 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, - 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, - 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, - 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, - 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, - 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, - 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, - 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, - 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, - 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, - 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, - 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, - 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, - 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, - 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, - 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, - 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, - 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, - 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, - 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, - 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, - 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, - 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, - 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, - 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, - 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, - 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, - 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, - 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, - 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, - 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, - 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, - 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, - 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, - 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, - 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, - 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, - 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, - 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, - 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, - 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, - 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, - 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, - 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, - 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, - 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, - 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, - 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, - 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, - 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, - 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, - 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, - 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, - 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, - 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, - 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, - 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, - 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, - 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, - ] + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +] Td4 = [ - 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, - 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, - 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, - 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, - 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, - 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, - 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, - 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, - 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, - 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, - 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, - 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, - 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, - 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, - 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, - 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, - 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, - 0x86868686, 0x68686868, 0x98989898, 0x16161616, - 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, - 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, - 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, - 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, - 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, - 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, - 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, - 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, - 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, - 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, - 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, - 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, - 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, - 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, - 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, - 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, - 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, - 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, - 0x96969696, 0xacacacac, 0x74747474, 0x22222222, - 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, - 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, - 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, - 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, - 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, - 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, - 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, - 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, - 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, - 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, - 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, - 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, - 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, - 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, - 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, - 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, - 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, - 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, - 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, - 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, - 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, - 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, - 0x83838383, 0x53535353, 0x99999999, 0x61616161, - 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, - 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, - 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, - 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, - ] + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +] rcon = [ - 0x01000000, 0x02000000, 0x04000000, 0x08000000, - 0x10000000, 0x20000000, 0x40000000, 0x80000000, - 0x1B000000, 0x36000000, - # 128-bit blocks, Rijndael never uses more than 10 rcon values - ] + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, + # 128-bit blocks, Rijndael never uses more than 10 rcon values +] if len(struct.pack('L',0)) == 4: # 32bit @@ -701,6 +710,7 @@ else: def GETU32(x): return struct.unpack('>I', x)[0] def PUTU32(x): return struct.pack('>I', x) + # Expand the cipher key into the encryption key schedule. # # @return the number of rounds for the given cipher key size. @@ -1030,24 +1040,48 @@ def rijndaelDecrypt(rk, nrounds, ciphertext): # decrypt(key, fin, fout, keybits=256) class RijndaelDecryptor: + + """ + >>> key = bytes.fromhex('00010203050607080a0b0c0d0f101112') + >>> ciphertext = bytes.fromhex('d8f532538289ef7d06b506a4fd5be9c9') + >>> RijndaelDecryptor(key, 128).decrypt(ciphertext).hex() + '506812a45f08c889b97f5980038b8359' + """ + def __init__(self, key, keybits=256): assert len(key) == KEYLENGTH(keybits) (self.rk, self.nrounds) = rijndaelSetupDecrypt(key, keybits) assert len(self.rk) == RKLENGTH(keybits) assert self.nrounds == NROUNDS(keybits) + return def decrypt(self, ciphertext): assert len(ciphertext) == 16 return rijndaelDecrypt(self.rk, self.nrounds, ciphertext) + # encrypt(key, fin, fout, keybits=256) class RijndaelEncryptor: + + """ + >>> key = bytes.fromhex('00010203050607080a0b0c0d0f101112') + >>> plaintext = bytes.fromhex('506812a45f08c889b97f5980038b8359') + >>> RijndaelEncryptor(key, 128).encrypt(plaintext).hex() + 'd8f532538289ef7d06b506a4fd5be9c9' + """ + def __init__(self, key, keybits=256): assert len(key) == KEYLENGTH(keybits) (self.rk, self.nrounds) = rijndaelSetupEncrypt(key, keybits) assert len(self.rk) == RKLENGTH(keybits) assert self.nrounds == NROUNDS(keybits) + return def encrypt(self, plaintext): assert len(plaintext) == 16 return rijndaelEncrypt(self.rk, self.nrounds, plaintext) + + +if __name__ == '__main__': + import doctest + print('pdfminer.rijndael', doctest.testmod()) diff --git a/venv/Lib/site-packages/pdfminer/runlength.py b/venv/Lib/site-packages/pdfminer/runlength.py index 2a38c37..299f0af 100644 --- a/venv/Lib/site-packages/pdfminer/runlength.py +++ b/venv/Lib/site-packages/pdfminer/runlength.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python # # RunLength decoder (Adobe version) implementation based on PDF Reference # version 1.4 section 3.3.4. @@ -6,10 +6,8 @@ # * public domain * # -import sys - def rldecode(data): - """ + r""" RunLength decoder (Adobe version) implementation based on PDF Reference version 1.4 section 3.3.4: The RunLengthDecode filter decodes data that has been encoded in a @@ -21,22 +19,30 @@ def rldecode(data): 129 to 255, the following single byte is to be copied 257 - length (2 to 128) times during decompression. A length value of 128 denotes EOD. + >>> s = b'\x05123456\xfa7\x04abcde\x80junk' + >>> rldecode(s) + b'1234567777777abcde' """ - decoded = [] - i=0 + decoded = b'' + i = 0 while i < len(data): - #print "data[%d]=:%d:" % (i,ord(data[i])) - length = ord(data[i]) + #print('data[%d]=:%d:' % (i,ord(data[i]))) + length = data[i] if length == 128: break if length >= 0 and length < 128: run = data[i+1:(i+1)+(length+1)] - #print "length=%d, run=%s" % (length+1,run) - decoded.append(run) + #print('length=%d, run=%s' % (length+1,run)) + decoded += run i = (i+1) + (length+1) if length > 128: - run = data[i+1]*(257-length) - #print "length=%d, run=%s" % (257-length,run) - decoded.append(run) + run = data[i+1:i+2]*(257-length) + #print('length=%d, run=%s' % (257-length,run)) + decoded += run i = (i+1) + 1 - return ''.join(decoded) + return decoded + + +if __name__ == '__main__': + import doctest + print('pdfminer.runlength', doctest.testmod()) diff --git a/venv/Lib/site-packages/pdfminer/utils.py b/venv/Lib/site-packages/pdfminer/utils.py index 56b2d64..1ff446e 100644 --- a/venv/Lib/site-packages/pdfminer/utils.py +++ b/venv/Lib/site-packages/pdfminer/utils.py @@ -1,3 +1,7 @@ +#!/usr/bin/env python +""" +Miscellaneous Routines. +""" import struct from sys import maxsize as INF @@ -7,46 +11,41 @@ from sys import maxsize as INF def apply_png_predictor(pred, colors, columns, bitspercomponent, data): if bitspercomponent != 8: # unsupported - raise ValueError(bitspercomponent) + raise ValueError("Unsupported `bitspercomponent': %d"%bitspercomponent) nbytes = colors*columns*bitspercomponent//8 i = 0 buf = b'' line0 = b'\x00' * columns - while i < len(data): - pred = data[i] + for i in range(0, len(data), nbytes+1): + ft = data[i:i+1] i += 1 line1 = data[i:i+nbytes] - i += nbytes - if pred == 0: + line2 = b'' + if ft == b'\x00': # PNG none - buf += line1 - elif pred == 1: + line2 += line1 + elif ft == b'\x01': # PNG sub (UNTESTED) c = 0 - bufline = [] for b in line1: c = (c+b) & 255 - bufline.append(c) - buf += bytes(bufline) - elif pred == 2: + line2 += bytes([c]) + elif ft == b'\x02': # PNG up - bufline = [] - for (a,b) in zip(line0,line1): + for (a, b) in zip(line0, line1): c = (a+b) & 255 - bufline.append(c) - buf += bytes(bufline) - elif pred == 3: + line2 += bytes([c]) + elif ft == b'\x03': # PNG average (UNTESTED) c = 0 - bufline = [] - for (a,b) in zip(line0,line1): + for (a, b) in zip(line0, line1): c = ((c+a+b)//2) & 255 - bufline.append(c) - buf += bytes(bufline) + line2 += bytes([c]) else: # unsupported - raise ValueError(pred) - line0 = line1 + raise ValueError("Unsupported predictor value: %d"%ft) + buf += line2 + line0 = line2 return buf @@ -54,44 +53,62 @@ def apply_png_predictor(pred, colors, columns, bitspercomponent, data): ## MATRIX_IDENTITY = (1, 0, 0, 1, 0, 0) -def mult_matrix(matrix1, matrix2): + +def mult_matrix(m1, m0): + (a1, b1, c1, d1, e1, f1) = m1 + (a0, b0, c0, d0, e0, f0) = m0 """Returns the multiplication of two matrices.""" - (a1,b1,c1,d1,e1,f1) = matrix1 - (a0,b0,c0,d0,e0,f0) = matrix2 return (a0*a1+c0*b1, b0*a1+d0*b1, a0*c1+c0*d1, b0*c1+d0*d1, a0*e1+c0*f1+e0, b0*e1+d0*f1+f0) -def translate_matrix(matrix, point): - """Translates a matrix by (x,y).""" - (a,b,c,d,e,f) = matrix - (x,y) = point - return (a,b,c,d,x*a+y*c+e,x*b+y*d+f) -def apply_matrix_pt(matrix, point): +def translate_matrix(m, v): + """Translates a matrix by (x, y).""" + (a, b, c, d, e, f) = m + (x, y) = v + return (a, b, c, d, x*a+y*c+e, x*b+y*d+f) + + +def apply_matrix_pt(m, v): + (a, b, c, d, e, f) = m + (x, y) = v """Applies a matrix to a point.""" - (a,b,c,d,e,f) = matrix - (x,y) = point return (a*x+c*y+e, b*x+d*y+f) -def apply_matrix_norm(matrix, norm): + +def apply_matrix_norm(m, v): """Equivalent to apply_matrix_pt(M, (p,q)) - apply_matrix_pt(M, (0,0))""" - (a,b,c,d,e,f) = matrix - (p,q) = norm + (a, b, c, d, e, f) = m + (p, q) = v return (a*p+c*q, b*p+d*q) ## Utility functions ## +# isnumber +def isnumber(x): + return isinstance(x, (int, float)) + # uniq def uniq(objs): """Eliminates duplicated elements.""" done = set() for obj in objs: - if obj in done: continue + if obj in done: + continue done.add(obj) yield obj + return + + +# csort +def csort(objs, key): + """Order-preserving sorting function.""" + idxs = { obj:i for (i, obj) in enumerate(objs) } + return sorted(objs, key=lambda obj: (key(obj), idxs[obj])) + # fsplit def fsplit(pred, objs): @@ -103,7 +120,8 @@ def fsplit(pred, objs): t.append(obj) else: f.append(obj) - return (t,f) + return (t, f) + # drange def drange(v0, v1, d): @@ -111,16 +129,18 @@ def drange(v0, v1, d): assert v0 < v1 return range(int(v0)//d, int(v1+d)//d) + # get_bound def get_bound(pts): """Compute a minimal rectangle that covers all the points.""" (x0, y0, x1, y1) = (INF, INF, -INF, -INF) - for (x,y) in pts: + for (x, y) in pts: x0 = min(x0, x) y0 = min(y0, y) x1 = max(x1, x) y1 = max(y1, y) - return (x0,y0,x1,y1) + return (x0, y0, x1, y1) + # pick def pick(seq, func, maxobj=None): @@ -129,9 +149,10 @@ def pick(seq, func, maxobj=None): for obj in seq: score = func(obj) if maxscore is None or maxscore < score: - (maxscore,maxobj) = (score,obj) + (maxscore, maxobj) = (score, obj) return maxobj + # choplist def choplist(n, seq): """Groups every n elements of the list.""" @@ -141,129 +162,172 @@ def choplist(n, seq): if len(r) == n: yield tuple(r) r = [] + return -def trailiter(iterable, skipfirst=False): - """Yields (prev_element, element), starting with (None, first_element). - - If skipfirst is True, there will be no (None, item1) element and we'll start - directly with (item1, item2). - """ - it = iter(iterable) - if skipfirst: - prev = next(it) - else: - prev = None - for item in it: - yield prev, item - prev = item # nunpack -def nunpack(b, default=0): +def nunpack(s, default=0): """Unpacks 1 to 4 byte integers (big endian).""" - if isinstance(b, str): - b = b.encode('latin-1') - l = len(b) + l = len(s) if not l: return default elif l == 1: - return b[0] + return s[0] elif l == 2: - return struct.unpack(b'>H', b)[0] + return struct.unpack('>H', s)[0] elif l == 3: - return struct.unpack(b'>L', b'\x00'+b)[0] + return struct.unpack('>L', b'\x00'+s)[0] elif l == 4: - return struct.unpack(b'>L', b)[0] + return struct.unpack('>L', s)[0] else: raise TypeError('invalid length: %d' % l) -# decode_text -PDFDocEncoding = ''.join( chr(x) for x in ( - 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, - 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, - 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0017, 0x0017, - 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, - 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, - 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, - 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, - 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, - 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, - 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, - 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, - 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, - 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, - 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, - 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, - 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, - 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, - 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, - 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, - 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, - 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, - 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, - 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, - 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, - 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, - 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, - 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, - 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, - 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, - 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, - 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, - 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, -)) -def decode_text(s): - """Decodes a PDFDocEncoding string to Unicode.""" - if s.startswith('\xfe\xff'): - return str(s[2:], 'utf-16be', 'ignore') - else: - return ''.join( PDFDocEncoding[ord(c)] for c in s ) -def htmlescape(s, encoding='ascii'): - """Escapes a string for SGML/XML/HTML""" - s = s.replace('&','&').replace('>','>').replace('<','<').replace('"','"') - # Additionally to basic replaces, we also make sure that all characters are convertible to our - # target encoding. If they're not, they're replaced by XML entities. - encoded = s.encode(encoding, errors='xmlcharrefreplace') - return encoded.decode(encoding) +# decode_text +PDFDocEncoding = ''.join(chr(x) for x in ( + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0017, 0x0017, + 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000, + 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, + 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, + 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, + 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000, + 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, + 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, + 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff, +)) + + +def decode_text(s): + """Decodes a PDFDocEncoding bytes to Unicode.""" + if s.startswith(b'\xfe\xff'): + return s[2:].decode('utf-16be', 'ignore') + else: + return ''.join(PDFDocEncoding[c] for c in s) + +def q(s): + """Quotes html string.""" + return (s.replace('&','&') + .replace('<','<') + .replace('>','>') + .replace('"','"')) def bbox2str(bbox): - (x0,y0,x1,y1) = bbox + (x0, y0, x1, y1) = bbox return '%.3f,%.3f,%.3f,%.3f' % (x0, y0, x1, y1) -def matrix2str(matrix): - (a,b,c,d,e,f) = matrix - return '[%.2f,%.2f,%.2f,%.2f, (%.2f,%.2f)]' % (a,b,c,d,e,f) -def set_debug_logging(): - import logging, sys - logging.basicConfig(level=logging.DEBUG, stream=sys.stderr) +def matrix2str(m): + (a, b, c, d, e, f) = m + return '[%.2f,%.2f,%.2f,%.2f, (%.2f,%.2f)]' % (a, b, c, d, e, f) -class ObjIdRange: - "A utility class to represent a range of object IDs." - - def __init__(self, start, nobjs): - self.start = start - self.nobjs = nobjs +## Plane +## +## A set-like data structure for objects placed on a plane. +## Can efficiently find objects in a certain rectangular area. +## It maintains two parallel lists of objects, each of +## which is sorted by its x or y coordinate. +## +class Plane: + + def __init__(self, bbox, gridsize=50): + self._seq = [] # preserve the object order. + self._objs = set() + self._grid = {} + self.gridsize = gridsize + (self.x0, self.y0, self.x1, self.y1) = bbox + return def __repr__(self): - return '' % (self.get_start_id(), self.get_end_id()) + return ('' % list(self)) - def get_start_id(self): - return self.start + def __iter__(self): + return ( obj for obj in self._seq if obj in self._objs ) - def get_end_id(self): - return self.start + self.nobjs - 1 + def __len__(self): + return len(self._objs) - def get_nobjs(self): - return self.nobjs + def __contains__(self, obj): + return obj in self._objs + def _getrange(self, bbox): + (x0, y0, x1, y1) = bbox + if (x1 <= self.x0 or self.x1 <= x0 or + y1 <= self.y0 or self.y1 <= y0): return + x0 = max(self.x0, x0) + y0 = max(self.y0, y0) + x1 = min(self.x1, x1) + y1 = min(self.y1, y1) + for y in drange(y0, y1, self.gridsize): + for x in drange(x0, x1, self.gridsize): + yield (x, y) + return -# create_bmp -def create_bmp(data, bits, width, height): - info = struct.pack('&2 + exit 33 +fi + deactivate () { + unset -f pydoc >/dev/null 2>&1 || true + # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH:+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" export PATH unset _OLD_VIRTUAL_PATH fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" export PYTHONHOME unset _OLD_VIRTUAL_PYTHONHOME fi - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r - fi + # The hash command must be called to get it to forget past + # commands. Without forgetting past commands the $PATH changes + # we made may not be respected + hash -r 2>/dev/null - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" export PS1 unset _OLD_VIRTUAL_PS1 fi unset VIRTUAL_ENV - if [ ! "$1" = "nondestructive" ] ; then + if [ ! "${1-}" = "nondestructive" ] ; then # Self destruct! unset -f deactivate fi @@ -37,7 +44,10 @@ deactivate () { # unset irrelevant variables deactivate nondestructive -VIRTUAL_ENV="C:\Users\ChérifBALDE\Desktop\En cours\myclass_api\venv" +VIRTUAL_ENV='C:\Users\cheri\Documents\myclass.com\Siteweb\Production\Ela_back\MySy_Back_Office\venv' +if ([ "$OSTYPE" = "cygwin" ] || [ "$OSTYPE" = "msys" ]) && $(command -v cygpath &> /dev/null) ; then + VIRTUAL_ENV=$(cygpath -u "$VIRTUAL_ENV") +fi export VIRTUAL_ENV _OLD_VIRTUAL_PATH="$PATH" @@ -45,32 +55,29 @@ PATH="$VIRTUAL_ENV/Scripts:$PATH" export PATH # unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "${PYTHONHOME:-}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" unset PYTHONHOME fi -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - if [ "x(venv) " != x ] ; then - PS1="(venv) ${PS1:-}" +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1-}" + if [ "x" != x ] ; then + PS1="() ${PS1-}" else - if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then - # special case for Aspen magic directories - # see http://www.zetadev.com/software/aspen/ - PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" - else - PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" - fi + PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1-}" fi export PS1 fi -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r -fi +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc || true + +pydoc () { + python -m pydoc "$@" +} + +# The hash command must be called to get it to forget past +# commands. Without forgetting past commands the $PATH changes +# we made may not be respected +hash -r 2>/dev/null diff --git a/venv/Scripts/activate.bat b/venv/Scripts/activate.bat index c9388cf..8f73594 100644 --- a/venv/Scripts/activate.bat +++ b/venv/Scripts/activate.bat @@ -1,45 +1,39 @@ @echo off -rem This file is UTF-8 encoded, so we need to update the current code page while executing it -for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do ( - set "_OLD_CODEPAGE=%%a" -) -if defined _OLD_CODEPAGE ( - "%SystemRoot%\System32\chcp.com" 65001 > nul -) - -set "VIRTUAL_ENV=C:\Users\ChérifBALDE\Desktop\En cours\myclass_api\venv" - -if not defined PROMPT ( - set "PROMPT=$P$G" -) +set "VIRTUAL_ENV=C:\Users\cheri\Documents\myclass.com\Siteweb\Production\Ela_back\MySy_Back_Office\venv" if defined _OLD_VIRTUAL_PROMPT ( set "PROMPT=%_OLD_VIRTUAL_PROMPT%" -) - -if defined _OLD_VIRTUAL_PYTHONHOME ( - set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" -) - -set "_OLD_VIRTUAL_PROMPT=%PROMPT%" -set "PROMPT=(venv) %PROMPT%" - -if defined PYTHONHOME ( - set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%" - set PYTHONHOME= -) - -if defined _OLD_VIRTUAL_PATH ( - set "PATH=%_OLD_VIRTUAL_PATH%" ) else ( - set "_OLD_VIRTUAL_PATH=%PATH%" + if not defined PROMPT ( + set "PROMPT=$P$G" + ) + if not defined VIRTUAL_ENV_DISABLE_PROMPT ( + set "_OLD_VIRTUAL_PROMPT=%PROMPT%" + ) ) +if not defined VIRTUAL_ENV_DISABLE_PROMPT ( + if "" NEQ "" ( + set "PROMPT=() %PROMPT%" + ) else ( + for %%d in ("%VIRTUAL_ENV%") do set "PROMPT=(%%~nxd) %PROMPT%" + ) +) + +REM Don't use () to avoid problems with them in %PATH% +if defined _OLD_VIRTUAL_PYTHONHOME goto ENDIFVHOME + set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%" +:ENDIFVHOME + +set PYTHONHOME= + +REM if defined _OLD_VIRTUAL_PATH ( +if not defined _OLD_VIRTUAL_PATH goto ENDIFVPATH1 + set "PATH=%_OLD_VIRTUAL_PATH%" +:ENDIFVPATH1 +REM ) else ( +if defined _OLD_VIRTUAL_PATH goto ENDIFVPATH2 + set "_OLD_VIRTUAL_PATH=%PATH%" +:ENDIFVPATH2 set "PATH=%VIRTUAL_ENV%\Scripts;%PATH%" - -:END -if defined _OLD_CODEPAGE ( - "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul - set "_OLD_CODEPAGE=" -) diff --git a/venv/Scripts/deactivate.bat b/venv/Scripts/deactivate.bat index 1205c61..7bbc568 100644 --- a/venv/Scripts/deactivate.bat +++ b/venv/Scripts/deactivate.bat @@ -1,21 +1,19 @@ @echo off -if defined _OLD_VIRTUAL_PROMPT ( - set "PROMPT=%_OLD_VIRTUAL_PROMPT%" -) -set _OLD_VIRTUAL_PROMPT= - -if defined _OLD_VIRTUAL_PYTHONHOME ( - set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" - set _OLD_VIRTUAL_PYTHONHOME= -) - -if defined _OLD_VIRTUAL_PATH ( - set "PATH=%_OLD_VIRTUAL_PATH%" -) - -set _OLD_VIRTUAL_PATH= - set VIRTUAL_ENV= -:END +REM Don't use () to avoid problems with them in %PATH% +if not defined _OLD_VIRTUAL_PROMPT goto ENDIFVPROMPT + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" + set _OLD_VIRTUAL_PROMPT= +:ENDIFVPROMPT + +if not defined _OLD_VIRTUAL_PYTHONHOME goto ENDIFVHOME + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" + set _OLD_VIRTUAL_PYTHONHOME= +:ENDIFVHOME + +if not defined _OLD_VIRTUAL_PATH goto ENDIFVPATH + set "PATH=%_OLD_VIRTUAL_PATH%" + set _OLD_VIRTUAL_PATH= +:ENDIFVPATH diff --git a/venv/Scripts/pip-script.py b/venv/Scripts/pip-script.py deleted file mode 100644 index 9f5e34a..0000000 --- a/venv/Scripts/pip-script.py +++ /dev/null @@ -1,12 +0,0 @@ -#!"C:\Users\ChérifBALDE\Desktop\En cours\myclass_api\venv\Scripts\python.exe" -x -# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip' -__requires__ = 'pip==19.0.3' -import re -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit( - load_entry_point('pip==19.0.3', 'console_scripts', 'pip')() - ) diff --git a/venv/Scripts/pip.exe b/venv/Scripts/pip.exe index b1487b7..7451f03 100644 Binary files a/venv/Scripts/pip.exe and b/venv/Scripts/pip.exe differ diff --git a/venv/Scripts/pip.exe.manifest b/venv/Scripts/pip.exe.manifest deleted file mode 100644 index dd6f562..0000000 --- a/venv/Scripts/pip.exe.manifest +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - diff --git a/venv/Scripts/pip3-script.py b/venv/Scripts/pip3-script.py deleted file mode 100644 index ee3f14a..0000000 --- a/venv/Scripts/pip3-script.py +++ /dev/null @@ -1,12 +0,0 @@ -#!"C:\Users\ChérifBALDE\Desktop\En cours\myclass_api\venv\Scripts\python.exe" -x -# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3' -__requires__ = 'pip==19.0.3' -import re -import sys -from pkg_resources import load_entry_point - -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) - sys.exit( - load_entry_point('pip==19.0.3', 'console_scripts', 'pip3')() - ) diff --git a/venv/Scripts/pip3.exe b/venv/Scripts/pip3.exe index b1487b7..7451f03 100644 Binary files a/venv/Scripts/pip3.exe and b/venv/Scripts/pip3.exe differ diff --git a/venv/Scripts/pip3.exe.manifest b/venv/Scripts/pip3.exe.manifest deleted file mode 100644 index cdf9df4..0000000 --- a/venv/Scripts/pip3.exe.manifest +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - diff --git a/venv/Scripts/python.exe b/venv/Scripts/python.exe index 87bc9ee..2cbe63d 100644 Binary files a/venv/Scripts/python.exe and b/venv/Scripts/python.exe differ diff --git a/venv/Scripts/pythonw.exe b/venv/Scripts/pythonw.exe index cd3ecd2..e434afa 100644 Binary files a/venv/Scripts/pythonw.exe and b/venv/Scripts/pythonw.exe differ diff --git a/venv/pyvenv.cfg b/venv/pyvenv.cfg index 7c687bf..392a7ae 100644 --- a/venv/pyvenv.cfg +++ b/venv/pyvenv.cfg @@ -1,3 +1,8 @@ -home = C:\Users\ChérifBALDE\AppData\Local\Programs\Python\Python37-32 +home = C:\Users\cheri\AppData\Local\Programs\Python\Python311 +implementation = CPython +version_info = 3.11.0.final.0 +virtualenv = 20.13.0 include-system-site-packages = false -version = 3.7.4 +base-prefix = C:\Users\cheri\AppData\Local\Programs\Python\Python311 +base-exec-prefix = C:\Users\cheri\AppData\Local\Programs\Python\Python311 +base-executable = C:\Users\cheri\AppData\Local\Programs\Python\Python311\python.exe